CeAllocAsynchronousBuffer
9/8/2008
Essa função re-marshals uma reserva que já foi empacotada por CeOpenCallerBuffer so that o servidor pode usá-la de forma assíncrona após o API chamar foi retornado. Chamar esta função sincronicamente antes de que retorna sua chamar API. Não é possível chamar esta função de forma assíncrona. Essa função aloca os recursos que devem ser liberados por um chamar subseqüente para CeFreeAsynchronousBuffer.
Para obter mais informações sobre parâmetro descritores Consulte MarshalledBuffer_t.
Syntax
HRESULT CeAllocAsynchronousBuffer(
PVOID * ppDestAsyncMarshalled,
PVOID pSrcSyncMarshalled,
DWORD cbSrc,
DWORD ArgumentDescriptor
);
Parameters
- ppDestAsyncMarshalled
[out] Recebe um ponteiro que o atual processo pode usar para acessar a reserva de forma assíncrona.
- pSrcSyncMarshalled
[no] Ponteiro para a reserva que já foi empacotado para síncrono acessar pelo atual processo.
- cbSrc
[no] Tamanho da reserva controlados, em bytes. Se a pasta ArgumentDescriptor é um WSTR ou ASTR, um tamanho de zero pode ser usado. Se o tamanho de uma seqüência de caracteres é não-zero, ele deve incluir um terminando NULL.
ArgumentDescriptor
[no] Descritor explicando o tipo de parâmetro a reserva é. De exemplo, ARG_I_WSTR ou ARG_O_PTR. ARG_DW não é um válido descritor de empacotamento.Se você estiver execução dentro de processo kernel e você estiver usando um microprocessador ARM com um praticamente marcados armazenar em cache, você pode transmitir MARSHAL_FORCE_ALIAS como o ArgumentDescriptor. Em todos os outras CPUs, dentro de processo kernel, CeAllocAsynchronousBuffer Sempre cria um alias para a memória com VirtualCopy. Nas CPUs ARM que usam um praticamente marcados armazenar em cache no processo de kernel, CeAllocAsynchronousBuffer Será cria um duplicado copiar da memória no heap Por padrão. Em grandes buffers, criando o duplicado heap pode ter um efeito no desempenho. Para evitar duplicação, transmitir o sinalizador MARSHAL_FORCE_ALIAS para causar CeAllocAsynchronousBuffer Para criar um alias, em vez disso. No entanto, a criação de memória de alias em ARM CPUs que usam um praticamente marcados causar armazenar em cache de origem e destino memória para serem acessados como uncached, até que o alias é destruída por CeFreeAsynchronousBuffer. Isso significa que acessa memória se tornar mais lento na origem e destino.
Não use o sinalizador MARSHAL_FORCE_ALIAS a menos que você esteja usando buffers maiores 16 KB.
Se você transmitir MARSHAL_FORCE_ALIAS para CeAllocAsynchronousBuffer, também transmiti-lo quando você chamar CeFlushAsynchronousBuffer e CeFreeAsynchronousBuffer. Não passa pode causar o sistema fique sem resposta ou vazamentos recurso.
Return Value
- E_ACCESSDENIED
A reserva origem foi um inválido endereço.
- E_INVALIDARG
O pSrcUnmarshalled parâmetro foi NULL, ou o comprimento era zero.
- E_OUTOFMEMORY
Falha de alocação de memória.
- S_OK
A alocação e duplicação, se necessário, com êxito.
Remarks
No modo kernel, você pode chamar CeAllocAsynchronousBuffer Em um parâmetro API que já foi empacotado pelo kernel. O AsynchronousBuffer_t classe também foi fornecido para essa finalidade. Entretanto se houver qualquer chance de que seu codificar irá executar no modo de usuário, não use CeAllocAsynchronousBuffer Ou AsynchronousBuffer_t dessa maneira. Em vez disso, use o usuário-modo instruções abaixo. Se você tentar chamar CeAllocAsynchronousBuffer Em um parâmetro API em modo de usuário, a reserva ficará inacessível depois retorna o chamada síncrona, ou a reserva pode ser reutilizada para outros fins.
Em modo de usuário, você pode definir a assinatura função da API para que o parâmetro que deve ser acessado de forma assíncrona é declarada como um valor ARG_DW para evitar o kernel do automaticamente empacotamento de parâmetro para você. Em seguida, chamar CeOpenCallerBuffer Para empacotar o parâmetro, e CeAllocAsynchronousBuffer subseqüentemente. Se você não poderá alteração assinatura de função, de exemplo, você não poderá alteração a assinatura do ReadFile e WriteFile funções exportadas pelo transmitir drivers, você não pode acessar a reserva de forma assíncrona em modo de usuário.
CeAllocAsynchronousBuffer não é exigido para buffers que tenham sido duplicados por CeAllocDuplicateBuffer. Você não precisa fazer nada na ordem usar os buffers de forma assíncrona. Esses buffers podem ser usados até que eles são fechados e liberados. No entanto, se você chamar CeAllocAsynchronousBuffer Em uma reserva duplicada, ele funciona. Nesse maiúsculas e minúsculas, você deve não chamar CeFreeDuplicateBuffer até depois de ter chamado CeFreeAsynchronousBuffer.
Essa função não aloca quaisquer recursos se a chamar falhar ou se a reserva origem foi NULL. Se a duplicação for exigido, mas nenhuma memória é alocada, o ponteiro retornado por CeFreeAsynchronousBuffer é NULL.
Essa função é protegida por __try/__except para que ele não lançar uma exceção ao acessar a entrada ponteiro pSrcSyncMarshalled.
Usar as macros teve êxito e falha para testar a valor de retorno desta função.
Requirements
Header | pkfuncs.h |
Library | coredll.lib |
Windows Embedded CE | Windows Embedded CE 6.0 and later |
See Also
Reference
Kernel Buffer Marshaling Functions
MarshalledBuffer_t
AsynchronousBuffer_t
CeOpenCallerBuffer
CeFreeAsynchronousBuffer
CeFlushAsynchronousBuffer