Método IWDFDevice3::MapIoSpace (wudfddi.h)

[Aviso: UMDF 2 é a versão mais recente do UMDF e substitui UMDF 1. Todos os novos drivers UMDF devem ser gravados usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Drivers universais do Windows devem usar UMDF 2. Para obter mais informações, consulte Introdução com UMDF.]

O método MapIoSpace mapeia o intervalo de endereços físico fornecido para o espaço de endereço do sistema e retorna um endereço pseudo-base.

Sintaxe

HRESULT MapIoSpace(
  [in]  PHYSICAL_ADDRESS    PhysicalAddress,
  [in]  SIZE_T              NumberOfBytes,
  [in]  MEMORY_CACHING_TYPE CacheType,
  [out] void                **pPseudoBaseAddress
);

Parâmetros

[in] PhysicalAddress

Especifica o endereço físico inicial de 64 bits do intervalo de E/S a ser mapeado.

[in] NumberOfBytes

Especifica um valor maior que zero, indicando o número de bytes a serem mapeados.

[in] CacheType

Especifica um valor MEMORY_CACHING_TYPE , que indica o atributo de cache a ser usado para mapear o intervalo de endereços físicos. O tipo de enumeração MEMORY_CACHING_TYPE é definido em Wudfwdm.h.

[out] pPseudoBaseAddress

O endereço de um local que recebe um ponteiro para o endereço pseudo-base.

Retornar valor

O método retornará S_OK se a operação for bem-sucedida. Caso contrário, esse método retornará um dos códigos de erro definidos em Winerror.h.

Comentários

Um driver deve chamar esse método durante a inicialização do dispositivo se receber recursos traduzidos do tipo CmResourceTypeMemory em uma estrutura CM_PARTIAL_RESOURCE_DESCRIPTOR . MapIoSpace mapeia o endereço físico retornado na lista de recursos para um endereço gerenciado por estrutura conhecido como o endereço pseudo-base.

Em seguida, o driver pode usar o endereço pseudo-base para acessar registros de dispositivo com funções READ_REGISTER_Xxx e WRITE_REGISTER_Xxx . Para obter um exemplo, consulte Leitura e gravação em registros de dispositivo em drivers UMDF 1.x.

Um driver que chama MapIoSpace deve definir a diretiva INF UmdfDirectHardwareAccess como AllowDirectHardwareAccess.

Se o driver definir a diretiva INF UmdfRegisterAccessMode como RegisterAccessUsingUserModeMapping, chamar MapIoSpace também mapeará o intervalo de endereços físicos fornecido para um intervalo de endereços base no modo de usuário que o driver poderá acessar posteriormente chamando GetHardwareRegisterMappedAddress.

Para obter mais informações sobre diretivas INF que os drivers UMDF podem usar, consulte Especificando diretivas WDF em arquivos INF.

O tipo PHYSICAL_ADDRESS é definido em Wudfwdm.h, da seguinte maneira:

typedef LARGE_INTEGER PHYSICAL_ADDRESS;

Exemplos

No exemplo de código a seguir, um driver UMDF usa sua função de retorno de chamada IPnpCallbackHardware2::OnPrepareHardware para examinar seus recursos de registro mapeados em memória e mapeá-los para o espaço de endereço no modo de usuário. Em seguida, o exemplo implementa um método WriteToDevice que acessa os locais de memória. Em seguida, o driver chama UnmapIoSpace de seu retorno de chamada IPnpCallbackHardware2::OnReleaseHardware . O arquivo INF do driver deve habilitar o recurso de acesso de hardware UMDF definindo a diretiva UmdfDirectHardwareAccess como AllowDirectHardwareAccess.


HRESULT
CMyDevice::OnPrepareHardware(
    __in IWDFDevice3 * pWdfDevice,
    __in IWDFCmResourceList * pRaw,
    __in IWDFCmResourceList * pTrans
    ) 
{
    PCM_PARTIAL_RESOURCE_DESCRIPTOR desc = NULL;
    PHYSICAL_ADDRESS regBasePA = {0};
    ULONG regLength = 0;
    BOOLEAN found = FALSE;
    HRESULT hr = S_OK;

    //
    // Scan the list to identify our resource.
    //
    for (i=0; i < pWdfResTranslated->GetCount(); i++) {
        desc = (PCM_PARTIAL_RESOURCE_DESCRIPTOR) pTrans->GetDescriptor(i);

        switch (desc->Type) {
            case CmResourceTypeMemory:
                //
                // See if this is the memory resource we’re looking for.
                // 
                if (desc->u.Memory.Length == 0x200) {
                    regsBasePA = desc->u.Memory.Start;
                    regsLength = desc->u.Memory.Length;
                    found = TRUE;                    
                }
                break;

            default:
                // Ignore all other descriptors.
                break;
        }
    }

    //
    // Map the resource. Store the register base in partner device
    // object for later access.
    //
    if (found) {
            hr = pWdfDevice->MapIoSpace(regBasePA,
                                           regLengthlength, 
                                           MmNonCached,
                                          (void **)&m_RegBase);
            if (SUCCEEDED(hr)) {
            //
            // Store the register range in partner object. This will 
            // be needed for unmapping.
            //
            m_RegLength = regLength;
        }
    }

    …
}

//
// UMDF driver uses one of the register access APIs such as
// WRITE_REGISTER_Xxx or READ_REGISTER_Xxx macros to access device register.
//
VOID
CMyQueue::WriteToDevice(
    __in IWDFDevice3* pWdfDevice,
    __in UCHAR Value
    )
{
    //
    // Write the UCHAR value at offset 2 from register base.
    //
    WRITE_REGISTER_UCHAR(pWdfDevice, 
                      (m_MyDevice->m_RegBase)+2, 
                       Value);
}

HRESULT
CMyDevice::OnReleaseHardware(
    __in IWDFDevice3 * pWdfDevice,
    __in IWDFCmResourceList * pTrans
    )
{
    //
    // Unmap registers memory resource.
    //
    pWdfDevice->UnmapIoSpace(m_RegBase, m_RegLength);

    return S_OK;
}


Requisitos

Requisito Valor
Fim do suporte Indisponível no UMDF 2.0 e posterior.
Plataforma de Destino Área de Trabalho
Versão mínima do UMDF 1.11
Cabeçalho wudfddi.h
DLL WUDFx.dll

Confira também

IWDFDevice3