Compartilhar via


Gravando drivers de impressora de 64 bits

Importante

Recomendamos que você use o driver de classe de caixa de entrada IPP da Microsoft, juntamente com aplicativos de suporte de impressão (PSA), para personalizar a experiência de impressão em Windows 10 e 11 para o desenvolvimento de dispositivos de impressora.

Para obter mais informações, consulte o Guia de design do aplicativo de suporte de impressão.

Se você estiver escrevendo um driver de 64 bits ou escrevendo um driver que possa ser compilado para ser executado em sistemas de 32 bits e 64 bits, siga as diretrizes de portabilidade de 64 bits em Portabilidade do Driver para o Windows de 64 bits. Este tópico descreve algumas das limitações e problemas que você pode encontrar ao escrever um driver de impressora de 64 bits.

Para obter mais informações sobre como usar decorações para identificar a arquitetura de 64 bits, consulte os seguintes tópicos:

Limitações em identificadores de contexto do dispositivo

Se um aplicativo de 32 bits estiver em execução em uma versão de 64 bits do sistema operacional Microsoft Windows, um plug-in de driver de impressora em execução no contexto do processo de conversão de Splwow64.exe não deverá chamar a função CreateDC do GDI; essa chamada falhará.

Problemas com a gravação de drivers de 64 bits

No código do driver de 32 bits existente, tenha cuidado com conversões entre tipos de ponteiro e tipos inteiros, como DWORD ou ULONG. Se você tiver experiência em escrever código para computadores de 32 bits, poderá ser usado para assumir que um valor de ponteiro se encaixe em um DWORD ou ULONG. Para código de 64 bits, essa suposição é perigosa. Se você converter um ponteiro para digitar DWORD ou ULONG, um ponteiro de 64 bits poderá ser truncado.

Em vez disso, converta o ponteiro para digitar DWORD_PTR ou ULONG_PTR. Um inteiro sem sinal do tipo DWORD_PTR ou ULONG_PTR é sempre grande o suficiente para armazenar todo o ponteiro, independentemente de o código ser compilado para um computador de 32 ou 64 bits.

Por exemplo, o campo de ponteiro pDrvOptItems.UserData na estrutura OEMCUIPPARAM é do tipo ULONG_PTR. O exemplo de código a seguir mostra o que não fazer se você copiar um valor de ponteiro de 64 bits para esse campo.

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG)pData;  // Wrong

O exemplo de código anterior converte o ponteiro pData para o tipo ULONG, que pode truncar o valor do ponteiro se sizeof(pData) >sizeof(ULONG). A abordagem correta é converter o ponteiro para ULONG_PTR, conforme mostrado no exemplo de código a seguir.

PUSERDATA pData;
OEMCUIPPARAM->pDrvOptItems.UserData = (ULONG_PTR)pData;  // Correct

O exemplo de código anterior preserva todos os 64 bits do valor do ponteiro.

Funções embutidas de 64 bits, como PtrToUlong e UlongToPtr, convertem com segurança entre tipos de ponteiro e inteiro sem depender de suposições sobre os tamanhos relativos desses tipos. Se um tipo for menor que o outro, ele deverá ser estendido ao converter para o tipo mais longo. Se o tipo mais curto for estendido preenchendo com o bit de sinal ou com zeros, cada função Win64 poderá lidar com essas situações. Considere o exemplo de código a seguir.

ULONG ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = ULONG(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // wrong

Você deve substituir o exemplo de código anterior pelo exemplo de código a seguir.

ULONG_PTR ulHWPhysAddr[NUM_PHYS_ADDRS];
ulSlotPhysAddr[0] = PtrToUlong(pulPhysHWBuffer) + HW_BUFFER_SIZE;  // correct

O segundo exemplo de código é preferencial mesmo que

ulSlotPhysAddr

pode representar o valor de um registro de hardware com apenas 32 bits de comprimento em vez de 64 bits de comprimento. Para obter uma lista de todas as novas funções auxiliares do Win64 para converter entre tipos de ponteiro e inteiro, consulte Novos Tipos de Dados.