Compartilhar via


MarshalledBuffer_t

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

Essa classe é um wrapper para o CeOpenCallerBuffer, a CeCloseCallerBuffer, a CeAllocAsynchronousBuffere as funções CeFreeAsynchronousBuffer. Apenas usá-lo com incorporado ponteiros que foram ainda não esteja acesso-verificado ou empacotados pelo kernel.

Para duplicado uma reserva que já foi empacotada, use a função DuplicatedBuffer_t. Para obter assíncrono acessar para uma reserva que já foi empacotada, use a função AsynchronousBuffer_t.

Syntax

class MarshalledBuffer_t {
public:
   MarshalledBuffer_t()
        MarshalledBuffer_t()

      MarshalledBuffer_t(
            PVOID pSrcUnmarshalled,
            DWORD cbSrc,
            DWORD ArgumentDescriptor,
            BOOL  ForceDuplicate = TRUE,
            BOOL  Asynchronous = FALSE
      );

      MarshalledBuffer_t(
            PCVOID pSrcUnmarshalled,
          DWORD cbSrc,
            DWORD ArgumentDescriptor,
            BOOL  ForceDuplicate = TRUE,
            BOOL  Asynchronous = FALSE
      );

      HRESULT Marshal(
            PVOID pSrcUnmarshalled,
            DWORD cbSrc,
            DWORD ArgumentDescriptor,
            BOOL  ForceDuplicate = TRUE,
            BOOL  Asynchronous = FALSE
      );

      HRESULT Marshal(
            PCVOID pSrcUnmarshalled,
            DWORD cbSrc,
            DWORD ArgumentDescriptor,
            BOOL  ForceDuplicate = TRUE,
            BOOL  Asynchronous = FALSE
      );

      HRESULT Flush();
      HRESULT Unmarshal();
          LPVOID ptr() const;
          DWORD size() const;
};

Métodos

Métodos Descrição
MarshalledBuffer_t();
~MarshalledBuffer_t();

Acesso-verifica e controla um ponteiro reserva do processo de origem, para que ela pode ser acessada pelo atual processo. Expõe o ponteiro empacotado com o PTR acessador. Qualquer alocado recursos relacionado para o empacotamento é liberados somente por um chamar subseqüente para Desempacotar, ou o destrutor.

Em geral, você poderia usar ou o construtor usar como padrão e Empacotamento Para empacotar a reserva ou o construtor empacotamento. Use o antigo método se você precisar Um HRESULT. Da mesma forma, você pode permitir que o destrutor para recursos empacotamento versão ou usar Desempacotar. Se um HRESULT é exigido, use o Desempacotar função.

MarshalledBuffer_t(
    PVOID pSrcUnmarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor,
    BOOL  ForceDuplicate = TRUE,
    BOOL  Asynchronous = FALSE
);

Se empacotamento falha, PTR retorna NULL, e tamanho retursn zero.

Caso contrário, a reserva empacotada é acessível com PTR e tamanho.

Para obter mais informações, consulte CeOpenCallerBuffer e CeAllocAsynchronousBuffer.

MarshalledBuffer_t(
    PCVOID pSrcUnmarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor,
    BOOL  ForceDuplicate = TRUE,
    BOOL  Asynchronous = FALSE
);

Leva um construtor pSrcUnmarshalled. Esse método pode ser usado apenas com tipos ARG_I_ *.

AsynchronousBuffer_t {
    PVOID  pSrcMarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor
};

Leva um construtor pSrcMarshalled.

AsynchronousBuffer_t {
    PCVOID  pSrcMarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor
};

Leva um construtor pSrcMarshalled. Este método só pode ser usado com tipos ARG_I_ *.

DuplicatedBuffer_t {
    PVOID  pSrcMarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor
};

Leva um construtor pSrcMarshalled.

DuplicatedBuffer_t(
    PCVOID pSrcMarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor
);

Leva a const pSrcMarshalled. Esse método pode ser usado apenas com tipos ARG_I_ *.

HRESULT Marshal(
    PVOID pSrcUnmarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor,
    BOOL  ForceDuplicate = TRUE,
    BOOL  Asynchronous = FALSE
);

Uma vez um MarshalledBuffer é empacotado usando o construtor empacotamento ou a Empacotamento método, ele não pode ser reutilizado por chamado Empacotamento até depois Desempacotar é chamado. Tentar fazer isso retornará ERROR_ALREADY_EXISTS.

Se Empacotamento falhar, PTR retorna NULL, e tamanho Retorna zero.

Caso contrário, a reserva empacotada é acessível com PTR e tamanho.

Para obter mais informações, consulte CeOpenCallerBuffer e CeAllocAsynchronousBuffer.

HRESULT Marshal(
    PCVOID pSrcUnmarshalled,
    DWORD cbSrc,
    DWORD ArgumentDescriptor,
    BOOL  ForceDuplicate = TRUE,
    BOOL  Asynchronous = FALSE
);

Leva um construtor pSrcUnmarshalled. Esse método pode ser usado apenas com tipos ARG_I_ *.

HRESULT Flush();

Se a reserva já foi unmarshaled ou se ele não for um assíncrono reserva, este método falhará com ERROR_INVALID_PARAMETER.

Para obter mais informações, consulte CeFlushAsynchronousBuffer.

HRESULT Unmarshal();

Se a reserva já foi unmarshaled, este método falhará com ERROR_ALREADY_EXISTS.

Para obter mais informações, consulte CeCloseCallerBuffer.

LPVOID ptr() const;

Retorna um ponteiro para a reserva empacotada, ou NULL se a reserva não foi empacotada ou já foi unmarshaled.

DWORD size() const;

Retorna o tamanho da reserva empacotada ou zero se a reserva não foi empacotada ou já foi unmarshaled.

Remarks

Você pode escolher para otimizar grande assíncrono reserva acessa usando o sinalizador MARSHAL_FORCE_ALIAS. Se seu codificar é 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 parte das ArgumentDescriptor. Em todos os outras CPUs, MARSHAL_FORCE_ALIAS não tem nenhum efeito.

Não use o sinalizador MARSHAL_FORCE_ALIAS a menos que você esteja usando buffers maiores 16 KB.

Nas CPUs ARM que usam um praticamente marcados armazenar em cache, dentro de processo kernel, CeAllocAsynchronousBuffer Cria um duplicado copiar da memória no heap Por padrão. Em grandes buffers, criando o duplicado heap pode afetar 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 causas 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 o acessa memória se tornar mais lenta na origem e destino.

Em todas as CPUs, Dentro usuário-modo processos, CeAllocAsynchronousBuffer Sempre cria um duplicado da memória com VirtualCopy, independentemente se o sinalizador MARSHAL_FORCE_ALIAS é passado. Não é possível para forçar a criação de um alias do modo usuário.

Se você transmitir MARSHAL_FORCE_ALIAS para CeAllocAsynchronousBuffer, você deve também transmiti-lo quando você chamar CeFlushAsynchronousBuffer e CeFreeAsynchronousBuffer. Não passa pode causar o sistema fique sem resposta ou vazamentos recurso.

A seguinte tabela descreve os descritores.

Descritores Finalidade

ARG_I_PTR

Input-only ponteiro.

ARG_I_WSTR

Input-only seqüência de caracteres Unicode.

ARG_I_ASTR

Input-only seqüência de caracteres ASCII.

ARG_I_PDW

Input-only ponteiro para uma DWORD.

ARG_O_PTR

Ponteiro Output-only.

ARG_O_PDW

OUTPUT-only ponteiro para uma DWORD.

ARG_O_PI64

Valor de saída - Apenas ponteiro para uma 64 - bit.

ARG_IO_PTR

Entrada e saída ponteiro.

ARG_IO_PDW

Ponteiro E/S para uma DWORD.

ARG_IO_PI64

Ponteiro E/S para um 64-bit valor.

Requirements

Header marshal.hpp
Library coredll.lib
Windows Embedded CE Windows Embedded CE 6.0 and later

See Also

Reference

Kernel Buffer Marshaling Classes
CeOpenCallerBuffer
CeCloseCallerBuffer
CeAllocAsynchronousBuffer
CeFlushAsynchronousBuffer
CeFreeAsynchronousBuffer
DuplicatedBuffer_t
AsynchronousBuffer_t

Other Resources

Developing a Device Driver
Kernel Migration
Bringing Up a Hardware Platform