função WSCInstallProviderAndChains64_32 (ws2spi.h)
A função WSCInstallProviderAndChains64_32 instala o provedor de transporte especificado e suas cadeias de protocolo específicas nos bancos de dados de configuração do sistema Winsock 2 de 32 e 64 bits em um computador de 64 bits. Essa função garante que as cadeias de protocolo sejam ordenadas no início das informações de configuração do provedor de transporte, tornando desnecessária uma chamada separada para WSCWriteProviderOrder .
Sintaxe
int WSCInstallProviderAndChains64_32(
[in] LPGUID lpProviderId,
[in] const LPWSTR lpszProviderDllPath,
[in] const LPWSTR lpszProviderDllPath32,
[in] const LPWSTR lpszLspName,
[in] DWORD dwServiceFlags,
[in] LPWSAPROTOCOL_INFOW lpProtocolInfoList,
[in] DWORD dwNumberOfEntries,
[out, optional] LPDWORD lpdwCatalogEntryId,
[out] LPINT lpErrno
);
Parâmetros
[in] lpProviderId
Um ponteiro para um GUID (identificador global exclusivo) para o provedor.
[in] lpszProviderDllPath
Um ponteiro para uma cadeia de caracteres Unicode que contém o caminho de carga para a DLL de 64 bits do provedor. Essa cadeia de caracteres observa as regras usuais para resolução de caminho e pode conter cadeias de caracteres de ambiente inseridas (como %SystemRoot%). Essas cadeias de caracteres de ambiente são expandidas quando o Ws2_32.dll deve carregar posteriormente a DLL do provedor em nome de um aplicativo. Depois que todas as cadeias de caracteres de ambiente inseridas forem expandidas, o Ws2_32.dll passará a cadeia de caracteres resultante para a função LoadLibrary que carrega o provedor na memória. Para obter mais informações, consulte LoadLibrary.
[in] lpszProviderDllPath32
Um ponteiro para uma cadeia de caracteres Unicode que contém o caminho totalmente qualificado para a DLL de 32 bits do provedor. Essa cadeia de caracteres observa as regras usuais para resolução de caminho e pode conter cadeias de caracteres de ambiente inseridas (como %SystemRoot%). Essas cadeias de caracteres de ambiente são expandidas quando o Ws2_32.dll carrega posteriormente a DLL do provedor em nome de um aplicativo. Depois que todas as cadeias de caracteres de ambiente inseridas são expandidas, o Ws2_32.dll passa a cadeia de caracteres resultante para a função LoadLibrary para carregar o provedor na memória. Para obter mais informações, consulte LoadLibrary.
[in] lpszLspName
Um ponteiro para uma cadeia de caracteres Unicode que contém o nome do LSP (provedor de serviços em camadas).
[in] dwServiceFlags
Os sinalizadores de serviço para o tipo de entrada de catálogo de protocolo em camadas a ser criado. Uma entrada de protocolo em camadas é uma estrutura WSAProtocol_Info com o membro ChainLen definido como 0. A entrada de catálogo real para o LSP fará referência à ID dessa entrada de protocolo em camadas em seu membro ProtocolChain .
[in] lpProtocolInfoList
Um ponteiro para uma matriz de estruturas de WSAProtocol_Info . Cada estrutura define um protocolo, família de endereços e tipo de soquete com suporte do provedor. Os membros da estrutura WSAPROTOCOL_INFO examinada são iProtocol, iAddressFamily e iSocketType.
[in] dwNumberOfEntries
O número de entradas na matriz lpProtocolInfoList .
[out, optional] lpdwCatalogEntryId
Um ponteiro para a entrada de protocolo em camadas recém-instalada para o provedor de transporte no banco de dados de configuração do sistema Winsock 2. Essa foi a ID usada para criar as entradas da cadeia de protocolos instaladas no catálogo do LSP.
[out] lpErrno
Um ponteiro para o código de erro gerado pela chamada se a função falhar.
Retornar valor
Se WSCInstallProviderAndChains64_32 for bem-sucedido, ele retornará zero. Caso contrário, ele retornará SOCKET_ERROR e um código de erro específico será retornado no parâmetro lpErrno .
Código do erro | Significado |
---|---|
Um ou mais argumentos não estão em uma parte válida do espaço de endereço do usuário. | |
Um ou mais argumentos são inválidos. Esse erro é retornado para as seguintes condições: o parâmetro lpProviderId é **NULL**, o parâmetro lpszProviderDllPath é inválido ou o comprimento do caminho é muito grande (**MAX_PATH** foi excedido), o parâmetro lpszLspName é inválido ou o comprimento do nome é muito grande (**WSAPROTOCOL_LEN** é excedido), o lpProtocolInfoList é definido como um null** não**e o dwNumberOfEntries o parâmetro é zero, uma ID de provedor duplicada ou o nome do provedor de serviço em camadas já existe no catálogo ou uma correspondência não pode ser encontrada para o protocolo, a família de endereços e o tipo de soquete especificados. | |
|
O provedor não tem a funcionalidade necessária. Um provedor não IFS deve implementar todas as funções de extensão Winsock 2 (AcceptEx, ConnectEx, DisconnectEx, TransmitFile, TransmitPackets e LPFN_WSARECVMSG (WSARecvMsg)). |
Uma instalação do provedor já está em andamento. | |
A memória não pode ser alocada para buffers. | |
Ocorreu um erro não detectável. Esse erro é retornado em várias condições, incluindo o seguinte: o provedor já está instalado, o parâmetro lpProtocolInfoList era **NULL** e não foi encontrado nenhum provedor base, o comprimento máximo da cadeia de protocolo (**MAX_PROTOCOL_CHAIN**) foi atingido, o usuário não tem os privilégios administrativos necessários para gravar no registro winsock ou ocorreu uma falha ao criar ou instalar uma entrada de catálogo. | |
Uma chamada do sistema que nunca deve falhar falhou. |
Comentários
WSCInstallProviderAndChains64_32 é uma versão aprimorada da função de WSCInstallProvider64_32 básica usada para instalar um único provedor de serviços de transporte. Se um provedor de serviços em camadas estiver sendo instalado, WSCInstallProviderAndChains64_32 deverá ser usado. WSCInstallProviderAndChains64_32 pode instalar um protocolo em camadas e uma ou mais cadeias de protocolo com uma única chamada de função. Para realizar o mesmo trabalho usando WSCInstallProvider64_32 exigiria várias chamadas de função.
Winsock 2 acomoda protocolos em camadas. Um protocolo em camadas é aquele que implementa apenas funções de comunicação de nível mais alto enquanto depende de uma pilha de transporte subjacente para a troca real de dados com um ponto de extremidade remoto. Um exemplo de um protocolo em camadas seria uma camada de segurança que adiciona um protocolo ao processo de estabelecimento de conexão para executar a autenticação e estabelecer um esquema de criptografia mutuamente acordado. Esse protocolo de segurança geralmente exigiria os serviços de um protocolo de transporte confiável subjacente, como TCP ou SPX. O termo protocolo base refere-se a um protocolo como TCP ou SPX que é capaz de executar comunicações de dados com um ponto de extremidade remoto. O termo protocolo em camadas é usado para descrever um protocolo que não pode ficar sozinho. Em seguida, uma cadeia de protocolos seria definida como um ou mais protocolos em camadas amarrados e ancorados por um protocolo base. Um protocolo base tem o membro ChainLen da estrutura WSAProtocol_Info definido como BASE_PROTOCOL que é definido como 1. Um protocolo em camadas tem o membro ChainLen da estrutura WSAPROTOCOL_INFO definido como LAYERED_PROTOCOL que é definido como zero. Uma cadeia de protocolos tem o membro ChainLen da estrutura WSAPROTOCOL_INFO definido como maior que 1.
WSCInstallProviderAndChains64_32 é a versão de 64 bits do WSCInstallProviderAndChains. Ele instala o provedor nos catálogos de 32 e 64 bits em plataformas de 64 bits. Isso significa que, em plataformas de 64 bits, dois catálogos winsock são mantidos e que os processos de 32 e 64 bits são capazes de carregar o LSP instalado com essa função.
Em um computador de 64 bits, todas as chamadas não projetadas especificamente para 32 bits (por exemplo, todas as funções que não terminam em "32") operam no catálogo nativo de 64 bits. Os processos executados em um computador de 64 bits devem usar WSCInstallProviderAndChains64_32 para operar no catálogo de 32 bits, bem como no catálogo de 64 bits, preservando a compatibilidade. As definições e a semântica das chamadas específicas de 32 bits são as mesmas que seus equivalentes nativos.
Se lpProtocolInfoList estiver definido como NULL, essa função criará cadeias de protocolo em que o provedor está em camadas sobre o protocolo base para cada tipo de protocolo exclusivo, conforme definido pela família de endereços, tipo de soquete e protocolo. Isso elimina a criação de entradas de provedor duplicadas inacessíveis.
Se lpProtocolInfoList for definido como um valor não NULL , essa função criará cadeias de protocolo obtendo a entrada mais alta nas informações de configuração que correspondem à tupla {família de endereços, tipo de soquete, protocolo} de cada elemento na matriz fornecida. Novamente, somente a tupla {família de endereços, tipo de soquete, protocolo} é considerada; todos os outros membros e duplicatas são ignorados.
Após a conclusão bem-sucedida dessa chamada, todas as chamadas subsequentes para WSAEnumProtocols, WSCEnumProtocols ou WSCEnumProtocols32 retornarão as entradas de cadeia de protocolo recém-criadas. Lembre-se de que, em ambientes windows, somente instâncias de Ws_32.dll criadas chamando WSAStartup após a conclusão bem-sucedida de WSCInstallProviderAndChains64_32 incluirão as novas entradas quando WSAEnumProtocols, WSCEnumProtocols e WSCEnumProtocols32 retornarem.
Com êxito, WSCInstallProviderAndChains64_32 tentará alertar todos os aplicativos interessados que se registraram para notificação da alteração chamando WSAProviderConfigChange.
A função WSCInstallProviderAndChains64_32 só pode ser chamada por um usuário conectado como membro do grupo Administradores. Se WSCInstallProviderAndChains64_32 for chamado por um usuário que não é membro do grupo Administradores, a chamada de função falhará e WSANO_RECOVERY será retornada no parâmetro lpErrno . Para computadores que executam o Windows Vista ou o Windows Server 2008, essa função também pode falhar devido ao UAC (controle de conta de usuário). Se um aplicativo que contém essa função for executado por um usuário conectado como membro do grupo Administradores diferente do Administrador interno, essa chamada falhará, a menos que o aplicativo tenha sido marcado no arquivo de manifesto com um requestedExecutionLevel definido para exigirAdministrator. Se o aplicativo no Windows Vista ou no Windows Server 2008 não tiver esse arquivo de manifesto, um usuário conectado como membro do grupo Administradores que não seja o Administrador interno deverá executar o aplicativo em um shell avançado como administrador interno (administrador de RunAs) para que essa função tenha êxito.
Qualquer instalação de arquivo ou configuração específica do provedor deve ser executada pelo aplicativo de chamada.
Provedores IFS e não IFS
Um provedor IFS é aquele que retorna identificadores nativos do sistema operacional. Normalmente, esses identificadores são associados a drivers de protocolo no modo kernel. Por exemplo, o TCP/IPv4 base, UDP/IPv4, TCP/IPv6 e UDP/IPv6 são provedores IFS, pois essas entradas correspondem a um componente do modo kernel. Os identificadores IFS podem ser usados em chamadas de função **ReadFile**, **WriteFile**e **CancelIo**. Um provedor de serviços em camadas que é um provedor IFS simplesmente retorna o identificador de soquete criado do provedor inferior (que também deve ser um provedor IFS) diretamente para o aplicativo de chamada. Um LSP IFS não pode interceptar notificações de conclusão para chamadas winsock.Um provedor não IFS é aquele que cria um identificador intermediário com WPUCreateSocketHandle e retorna esse identificador para o chamador. Isso permite que um LSP não IFS intercepte eventos de envio e de conclusão antes que os aplicativos de chamada permitam o pós-processamento (por exemplo, descriptografando uma parte de dados recebida). Identificadores de soquete não IFS podem ser usados em chamadas para ReadFile e WriteFile, mas não podem ser usados com CancelIo. O único método garantido de cancelar uma operação em um identificador não IFS é fechando o soquete com closesocket.
Caminhos para DLLs de provedor de 32 bits e 64 bits
lpszProviderDllPath representa o caminho totalmente qualificado para a versão de 64 bits da DLL do provedor. Esse parâmetro pode conter cadeias de caracteres de ambiente inseridas (como %SystemRoot%).lpszProviderDllPath32 representa o caminho totalmente qualificado para a versão de 32 bits da DLL do provedor. Esse parâmetro pode conter cadeias de caracteres de ambiente inseridas (como %SystemRoot%).
Se lpszProviderDllPath32 for NULL, lpszProviderDllPath será o caminho para provedores de 32 e 64 bits. Quando um processo de 32 bits em um computador de 64 bits está em execução (por exemplo, quando um aplicativo Winsock carrega a versão de 32 bits de um LSP), ele tenta carregar o provedor de 32 bits especificado em lpszProviderDllPath. Se lpszProviderDllPath32 for NULL, o parâmetro lpszProviderDllPath deverá ser definido como %windir%\system32< dllname>. Se esse não for o caso, a chamada falhará com WSAEINVAL. Se o caminho em lpszProviderDllPath for %windir%\system32< dllname> quando lpszProviderDllPath32 for NULL, a chamada será redirecionada (usando o redirecionador do sistema de arquivos) para o diretório retornado por GetSystemWow64Directory em que o LSP de 32 bits deve residir. Para a edição windows XP de 64 bits, Windows Server 2003 e Windows Vista, esse diretório é %windir%\syswow64.
Requisitos
Cliente mínimo com suporte | Windows Vista [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte | Windows Server 2008 [somente aplicativos da área de trabalho] |
Plataforma de Destino | Windows |
Cabeçalho | ws2spi.h |
Biblioteca | Ws2_32.lib |
DLL | Ws2_32.dll |
Confira também
Configuração e instalação do transporte