función WSCInstallProviderAndChains64_32 (ws2spi.h)

La función WSCInstallProviderAndChains64_32 instala el proveedor de transporte especificado y sus cadenas de protocolo específicas en las bases de datos de configuración del sistema Winsock 2 de 32 y 64 bits en un equipo de 64 bits. Esta función garantiza que las cadenas de protocolo se ordenen al principio de la información de configuración del proveedor de transporte, haciendo una llamada independiente a WSCWriteProviderOrder innecesaria.

Sintaxis

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

Puntero a un identificador único global (GUID) para el proveedor.

[in] lpszProviderDllPath

Puntero a una cadena Unicode que contiene la ruta de acceso de carga al archivo DLL de 64 bits del proveedor. Esta cadena observa las reglas habituales para la resolución de rutas de acceso y puede contener cadenas de entorno incrustadas (como %SystemRoot%). Estas cadenas de entorno se expanden cuando el Ws2_32.dll posteriormente debe cargar el archivo DLL del proveedor en nombre de una aplicación. Una vez expandidas las cadenas de entorno incrustadas, el Ws2_32.dll pasa la cadena resultante a la función LoadLibrary que carga el proveedor en memoria. Para obtener más información, consulte LoadLibrary.

**Nota** Si lpszProviderDllPath32 está establecido en **NULL**, lpszProviderDllPath debe establecerse en %windir%\system32\<dllname>. Si no es así, se produce un error en la llamada y devuelve el código de error WSAEINVAL .
 

[in] lpszProviderDllPath32

Puntero a una cadena Unicode que contiene la ruta de acceso completa al archivo DLL de 32 bits del proveedor. Esta cadena observa las reglas habituales para la resolución de rutas de acceso y puede contener cadenas de entorno incrustadas (como %SystemRoot%). Estas cadenas de entorno se expanden cuando el Ws2_32.dll carga posteriormente el archivo DLL del proveedor en nombre de una aplicación. Una vez expandidas las cadenas de entorno incrustadas, el Ws2_32.dll pasa la cadena resultante a la función LoadLibrary para cargar el proveedor en memoria. Para obtener más información, consulte LoadLibrary.

**Nota** Si este parámetro se establece en **NULL**, el proveedor de 64 bits debe existir en la carpeta %windir%\system32 y el proveedor de 32 bits debe residir en la carpeta %windir%\syswow64 .
 

[in] lpszLspName

Puntero a una cadena Unicode que contiene el nombre del proveedor de servicios en capas (LSP).

[in] dwServiceFlags

Marcas de servicio para el tipo de entrada de catálogo de protocolos superpuestas que se va a crear. Una entrada de protocolo superpuesta es una estructura WSAProtocol_Info con el miembro ChainLen establecido en 0. La entrada de catálogo real del LSP hará referencia al identificador de esta entrada de protocolo superpuesta en su miembro ProtocolChain .

Valor Significado
XP1_IFS_HANDLES
La entrada de catálogo es para un LSP del sistema de archivos instalable (IFS), que devuelve identificadores de socket específicos de IFS. Un LSP ifS no puede interceptar la finalización de llamadas de Winsock y no tiene que implementar todas las funciones de Winsock.

[in] lpProtocolInfoList

Puntero a una matriz de estructuras de WSAProtocol_Info . Cada estructura define un protocolo, una familia de direcciones y un tipo de socket admitido por el proveedor. Los miembros de la estructura WSAPROTOCOL_INFO que se examinan son iProtocol, iAddressFamily e iSocketType.

[in] dwNumberOfEntries

Número de entradas de la matriz lpProtocolInfoList .

[out, optional] lpdwCatalogEntryId

Puntero a la entrada de protocolo superpuesta recién instalada para el proveedor de transporte en la base de datos de configuración del sistema Winsock 2. Este fue el identificador que se usó para compilar las entradas de cadena de protocolo instaladas en el catálogo para el LSP.

[out] lpErrno

Puntero al código de error generado por la llamada si se produce un error en la función.

Valor devuelto

Si WSCInstallProviderAndChains64_32 se realiza correctamente, devuelve cero. De lo contrario, devuelve SOCKET_ERROR y se devuelve un código de error específico en el parámetro lpErrno .

Código de error Significado
WSAEFAULT
Uno o varios de los argumentos no están en una parte válida del espacio de direcciones del usuario.
WSAEINVAL
Uno o varios argumentos no son válidos. Este error se devuelve para las condiciones siguientes: el parámetro lpProviderId es **NULL**, el parámetro lpszProviderDllPath no es válido o la longitud de la ruta de acceso es demasiado grande (**MAX_PATH** se ha superado), el parámetro lpszLspName no es válido o la longitud del nombre es demasiado grande (**WSAPROTOCOL_LEN** se supera), lpProtocolInfoList se establece en un valor distinto de**NULL** y dwNumberOfEntries . el parámetro es cero, ya existe un identificador de proveedor duplicado o el nombre del proveedor de servicios en capas en el catálogo o no se puede encontrar una coincidencia para el protocolo, la familia de direcciones y el tipo de socket especificados.
WSAEINVALIDPROCTABLE
Falta la funcionalidad necesaria del proveedor. Un proveedor que no sea IFS debe implementar todas las funciones de extensión winsock 2 (AcceptEx, ConnectEx, DisconnectEx, TransmitFile, TransmitPackets y LPFN_WSARECVMSG (WSARecvMsg)).
WSAEINPROGRESS
Ya hay una instalación del proveedor en curso.
WSAENOBUFS
No se puede asignar memoria para los búferes.
WSANO_RECOVERY
Error irrecuperable. Este error se devuelve en varias condiciones, incluido lo siguiente: el proveedor ya está instalado, el parámetro lpProtocolInfoList era **NULL** y no se encontró ningún proveedor base, se alcanzó la longitud máxima de la cadena de protocolo (**MAX_PROTOCOL_CHAIN**), el usuario carece de los privilegios administrativos necesarios para escribir en el registro winsock o se produjo un error al crear o instalar una entrada de catálogo.
WSASYSCALLFAILURE
No se pudo realizar una llamada del sistema que nunca debería producir un error.

Comentarios

WSCInstallProviderAndChains64_32 es una versión mejorada de la función básica WSCInstallProvider64_32 que se usa para instalar un único proveedor de servicios de transporte. Si se está instalando un proveedor de servicios en capas, se debe usar WSCInstallProviderAndChains64_32 . WSCInstallProviderAndChains64_32 puede instalar un protocolo en capas y una o varias cadenas de protocolos con una sola llamada de función. Para realizar el mismo trabajo mediante WSCInstallProvider64_32 requeriría varias llamadas de función.

Winsock 2 admite protocolos superpuestas. Un protocolo en capas es aquel que implementa solo funciones de comunicaciones de nivel superior mientras se basa en una pila de transporte subyacente para el intercambio real de datos con un punto de conexión remoto. Un ejemplo de un protocolo en capas sería una capa de seguridad que agrega un protocolo al proceso de establecimiento de conexión para realizar la autenticación y establecer un esquema de cifrado acordado mutuamente. Por lo general, este protocolo de seguridad requeriría los servicios de un protocolo de transporte confiable subyacente, como TCP o SPX. El término protocolo base hace referencia a un protocolo como TCP o SPX que es capaz de realizar comunicaciones de datos con un punto de conexión remoto. El término protocolo en capas se usa para describir un protocolo que no puede ser independiente. A continuación, una cadena de protocolos se definiría como uno o varios protocolos superpuestas y anclados por un protocolo base. Un protocolo base tiene el miembro ChainLen de la estructura WSAProtocol_Info establecida en BASE_PROTOCOL que se define como 1. Un protocolo superpuesta tiene el miembro ChainLen de la estructura WSAPROTOCOL_INFO establecida en LAYERED_PROTOCOL que se define como cero. Una cadena de protocolos tiene el miembro ChainLen de la estructura WSAPROTOCOL_INFO establecida en mayor que 1.

WSCInstallProviderAndChains64_32 es la versión de 64 bits de WSCInstallProviderAndChains. Instala el proveedor en los catálogos de 32 y 64 bits en plataformas de 64 bits. Esto significa que en las plataformas de 64 bits, se mantienen dos catálogos de Winsock y que los procesos de 32 y 64 bits pueden cargar el LSP instalado con esta función.

En un equipo de 64 bits, todas las llamadas no diseñadas específicamente para 32 bits (por ejemplo, todas las funciones que no terminan en "32") funcionan en el catálogo nativo de 64 bits. Los procesos que se ejecutan en un equipo de 64 bits deben usar WSCInstallProviderAndChains64_32 para funcionar tanto en el catálogo de 32 bits como en el catálogo de 64 bits, conservando la compatibilidad. Las definiciones y la semántica de las llamadas específicas de 32 bits son las mismas que sus equivalentes nativos.

**Nota** En plataformas de 64 bits, no hay ninguna función **WSCInstallProviderAndChains** para instalar solo en el catálogo de 64 bits. En las plataformas de 64 bits, debe haber una versión de 32 y 64 bits del LSP instalada. Para los proveedores que solo deben instalarse en el catálogo winsock de 64 bits, se puede usar la función WSCInstallProvider .
 

Si lpProtocolInfoList se establece en NULL, esta función crea cadenas de protocolo en las que el proveedor se superpone sobre el protocolo base para cada tipo de protocolo único tal y como se define en la familia de direcciones, el tipo de socket y el protocolo. Esto elimina la creación de entradas de proveedor duplicadas inaccesibles.

Si lpProtocolInfoList se establece en un valor distinto de NULL , esta función crea cadenas de protocolo obteniendo la entrada más alta en la información de configuración que coincide con la tupla {address family, socket type, protocol} de cada elemento de la matriz proporcionada. De nuevo, solo se considera la tupla {familia de direcciones, tipo de socket, protocolo} ; se omiten todos los demás miembros y duplicados.

Una vez completada correctamente esta llamada, las llamadas posteriores a WSAEnumProtocols, WSCEnumProtocols o WSCEnumProtocols32 devolverán las entradas de cadena de protocolo recién creadas. Tenga en cuenta que, en entornos windows, solo las instancias de Ws_32.dll creadas mediante una llamada a WSAStartup después de completar correctamente WSCInstallProviderAndChains64_32 incluirán las nuevas entradas cuando WSAEnumProtocols, WSCEnumProtocols y WSCEnumProtocols32 devuelvan.

Nota La función WSAEnumProtocols no enumera una entrada de protocolo superpuesta mientras WSCEnumProtocols y WSCEnumProtocols32 sí lo hacen.

 

Si se ejecuta correctamente, WSCInstallProviderAndChains64_32 intentará alertar a todas las aplicaciones interesadas que se hayan registrado para notificar el cambio mediante una llamada a WSAProviderConfigChange.

Un usuario que ha iniciado sesión como miembro del grupo Administradores solo puede llamar a la función WSCInstallProviderAndChains64_32 . Si un usuario llama a WSCInstallProviderAndChains64_32 que no es miembro del grupo Administradores, se producirá un error en la llamada de función y se devolverá WSANO_RECOVERY en el parámetro lpErrno . En el caso de los equipos que ejecutan Windows Vista o Windows Server 2008, esta función también puede producir un error debido al control de cuentas de usuario (UAC). Si un usuario inicia sesión como miembro del grupo Administradores que no sea el administrador integrado, esta llamada producirá un error a menos que la aplicación se haya marcado en el archivo de manifiesto con un valor requestedExecutionLevel establecido en requireAdministrator. Si la aplicación en Windows Vista o Windows Server 2008 carece de este archivo de manifiesto, un usuario que ha iniciado sesión como miembro del grupo Administradores que no sea el administrador integrado debe ejecutar la aplicación en un shell mejorado como administrador integrado (administrador de RunAs) para que esta función se realice correctamente.

La aplicación que realiza la llamada debe realizar cualquier instalación de archivos o configuración específica del proveedor.

Proveedores IFS y no IFS

Un proveedor IFS es aquel que devuelve identificadores de sistema operativo nativos. Normalmente, estos identificadores están asociados a controladores de protocolo de modo kernel. Por ejemplo, el TCP/IPv4 base, UDP/IPv4, TCP/IPv6 y UDP/IPv6 son proveedores IFS, ya que estas entradas corresponden a un componente de modo kernel. Los identificadores IFS se pueden usar en las llamadas de función **ReadFile**, **WriteFile**y **CancelIo**. Un proveedor de servicios en capas que es un proveedor IFS simplemente devuelve el identificador de socket creado desde el proveedor inferior (que también debe ser un proveedor IFS) directamente a la aplicación que realiza la llamada. Un LSP de IFS no puede interceptar las notificaciones de finalización para las llamadas de Winsock.

Un proveedor que no es IFS es uno que crea un identificador intermedio con WPUCreateSocketHandle y devuelve este identificador al autor de la llamada. Esto permite que un LSP que no sea IFS intercepte eventos de envío y recepción de finalización antes de que las aplicaciones que llaman permitan el procesamiento posterior (por ejemplo, descifrar un fragmento de datos recibido). Los identificadores de socket que no son IFS se pueden usar en llamadas a ReadFile y WriteFile, pero no se pueden usar con CancelIo. El único método garantizado para cancelar una operación en un identificador que no sea IFS es cerrando el socket con closesocket.

Rutas de acceso para archivos DLL de proveedor de 32 y 64 bits

lpszProviderDllPath representa la ruta de acceso completa a la versión de 64 bits del archivo DLL del proveedor. Este parámetro puede contener cadenas de entorno incrustadas (como %SystemRoot%).

lpszProviderDllPath32 representa la ruta de acceso completa a la versión de 32 bits del archivo DLL del proveedor. Este parámetro puede contener cadenas de entorno incrustadas (como %SystemRoot%).

Si lpszProviderDllPath32 es NULL, lpszProviderDllPath es la ruta de acceso para proveedores de 32 y 64 bits. Cuando se ejecuta un proceso de 32 bits en un equipo de 64 bits (por ejemplo, cuando una aplicación Winsock carga la versión de 32 bits de un LSP), intenta cargar el proveedor de 32 bits especificado en lpszProviderDllPath. Si lpszProviderDllPath32 es NULL, el parámetro lpszProviderDllPath debe establecerse en %windir%\system32< dllname>. Si no es así, se produce un error en la llamada con WSAEINVAL. Si la ruta de acceso en lpszProviderDllPath es %windir%\system32< dllname> cuando lpszProviderDllPath32 es NULL, la llamada se redirigirá (mediante el redirector del sistema de archivos) al directorio devuelto por GetSystemWow64Directory donde debe residir el LSP de 32 bits. Para la edición de Windows XP de 64 bits, Windows Server 2003 y Windows Vista, este directorio es %windir%\syswow64.

Requisitos

   
Cliente mínimo compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado ws2spi.h
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

LoadLibrary

Configuración e instalación de transporte

Proveedores de servicios de transporte

WPUCreateSocketHandle

WSAStartup

WSCEnumProtocols

WSCEnumProtocols32

WSCInstallProvider64_32

WSCInstallProviderAndChains

WSCWriteProviderOrder