Compartilhar via


Marshalling for Windows Embedded CE 6.0 Driver Migration

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Em Windows CE 5.0 e versões anteriores, a função MapCallerPtr também realizadas Empacotamentos para ponteiros. Um driver chamado MapCallerPtr Parâmetros assim como incorporado ponteiros tanto para validação e Empacotamentos.

Windows Embedded CE 6.0, Empacotamentos é dependente em se um ponteiro é sincronicamente usados ou de forma assíncrona. Se um ponteiro parâmetro ou ponteiro incorporado for sincronicamente usado, o espaço de endereço do processo de chamada é acessível para a duração de uma chamar para o driver. Isso elimina quaisquer requisitos de Empacotamentos. O ponteiro da processo de chamada pode ser usado inalterado, o driver, que pode, em seguida, acessar a memória do chamador diretamente. Esse método de Empacotamentos é conhecido como acesso direto.

No entanto, se for usado um ponteiro de forma assíncrona, é crítico que a reserva chamador é acessível quando espaço de endereço do chamador não disponível. Isso significa que acesso direto não é possível para qualquer tipo de assíncrono trabalho depois de chamar foi retornado. Windows Embedded CE 6.0 inclui o CeAllocAsynchronousBuffer e CeFreeAsynchronousBuffer funções para drivers parâmetros ponteiro empacotar e incorporado ponteiros quando assíncrono acessar é exigido. De exemplo, quando um segmento such as o ist requer acessar para a reserva do chamador, as controle funções auxiliar pode escolher entre a duplicação e serrilhado Empacotamentos mecanismos. Isso é dependentes no tamanho da reserva envolvida. Se a reserva for pequena o suficiente, o kernel duplica a reserva. No entanto, isso pode afetar desempenho, e se a reserva é muito grande para duplicado, o irá kernel alias a reserva em vez disso.

O seguinte exemplo de código mostra algumas da associar alterações codificar com empacotamentos quando forem ponteiros exigido para serem acessados de forma assíncrona.

// Pre-Windows Embedded CE 6.0 = MapCallerPtr
//Now in Windows Embedded CE 6.0
// In XXX_IOControl after CeOpenCallerPtr generates
// g_pMappedEmbedded
hr = CeAllocAsynchronousBuffer((PVOID*) &g_pMarshalled, g_pMappedEmbedded, pInput->dwSize, ARG_I_PTR);
// Fail if FAILED(hr) == true
//
// When done with pointer
hr = CeFreeAsynchronousBuffer((PVOID)g_pMarshalled, g_pMappedEmbedded, pInput->dwSize, ARG_I_PTR);
// Now call CeCloseCallerBuffer as usual

See Also

Other Resources

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