Compartilhar via


Access Checking for Windows Embedded CE 6.0 Driver Migration

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

No Windows CE 5.0 e versões anteriores, MapCallerPtr foi usado para validar uma região da memória apontada pelo parâmetro ponteiro. MapCallerPtr Foi usado nos controles E/S (IOCTLs) para um driver para validar um parâmetro ponteiro passado por um processo de chamada. Drivers de dispositivo em Windows CE 5.0 executou com um privilégio relativamente alto e teve suficiente acessar a memória. MapCallerPtr foi usado para verificar os parâmetros ponteiro bem como incorporado ponteiros.

No Windows CE 5.0 e versões anteriores, MapPtrToProcess foi usada por um driver de dispositivo para obter acessar para os dados na espaço de endereço de um aplicativo.

In Windows Embedded CE 6.0, the kernel performs a full access check on buffer pointer parameters. Isso leva a responsabilidade de ponteiro validação de parâmetro Away from um driver de dispositivo. No entanto, um driver ainda deve verificar que o chamador tem acessar a memória corrigida pelo incorporado ponteiros.

É possível para um mal-intencionado aplicativo para transmitir um ponteiro incorporado para espaço de endereço um kernel e ter um driver ler ou gravação para a reserva, potencialmente modificando o kernel. Um driver deve usar o CeOpenCallerBuffer e CeCloseCallerBuffer funções para verificar que o chamador tem acessar para a memória que é apontada pelo incorporado ponteiros.

CeOpenCallerBuffer pode ser chamado com o ForceDuplicate parâmetro definido como TRUE. Isso aloca uma reserva temporária heap no atual processo. Se você escolher para copiar um buffer de entrada para fins de segurança e use CeOpenCallerBuffer Para acessar verificação, você pode definir ForceDuplicate para TRUE. Isso permite que você executar tanto o copiar buffer de entrada o caixa de seleção de acesso com chamar uma função.

O seguinte exemplo de código mostra algumas das alterações codificar associado com a verificação acessar.

struct MyStruct {
UCHAR *pEmbedded;
DWORD dwSize;
};
// Pre-Windows Embedded CE 6.0
// In XXX_IOControl() Function of the Stream Interface Driver
g_pMappedEmbedded = MapCallerPtr(pInput->pEmbedded, dwSize);
// Fail if g_pMappedEmbedded == NULL
// Now in Windows Embedded CE 6.0
HRESULT hr = E_WASNEVERSET;
hr = CeOpenCallerBuffer((PVOID*) &g_pMappedEmbedded, pInput->pEmbedded, pInput->dwSize, ARG_I_PTR, FALSE);
// Fail if FAILED(hr) == true
// When done with pointer
hr = CeCloseCallerBuffer((PVOID)  g_pMappedEmbedded,   pInput->pEmbedded, pInput->dwSize, ARG_I_PTR);

See Also

Other Resources

Migrating a Windows Embedded CE Driver to Windows Embedded CE 6.0
MapCallerPtr