funzione WSCInstallProviderAndChains64_32 (ws2spi.h)
La funzione WSCInstallProviderAndChains64_32 installa il provider di trasporto specificato e le relative catene di protocollo specifiche in entrambi i database di configurazione di sistema a 32 bit e a 64 bit in un computer a 64 bit. Questa funzione garantisce che le catene di protocolli vengano ordinate all'inizio delle informazioni di configurazione del provider di trasporto, eseguendo una chiamata separata a WSCWriteProviderOrder non necessaria.
Sintassi
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
);
Parametri
[in] lpProviderId
Puntatore a un identificatore univoco globale (GUID) per il provider.
[in] lpszProviderDllPath
Puntatore a una stringa Unicode contenente il percorso di caricamento della DLL a 64 bit del provider. Questa stringa osserva le normali regole per la risoluzione del percorso e può contenere stringhe di ambiente incorporate (ad esempio %SystemRoot%). Tali stringhe di ambiente vengono espanse quando la Ws2_32.dll deve successivamente caricare la DLL del provider per conto di un'applicazione. Dopo aver espanso tutte le stringhe di ambiente incorporate, la Ws2_32.dll passa la stringa risultante alla funzione LoadLibrary che carica il provider in memoria. Per altre informazioni, vedere LoadLibrary.
[in] lpszProviderDllPath32
Puntatore a una stringa Unicode contenente il percorso completo della DLL a 32 bit del provider. Questa stringa osserva le normali regole per la risoluzione del percorso e può contenere stringhe di ambiente incorporate (ad esempio %SystemRoot%). Tali stringhe di ambiente vengono espanse quando il Ws2_32.dllcarica successivamente la DLL del provider per conto di un'applicazione. Dopo aver espanso tutte le stringhe di ambiente incorporate, la Ws2_32.dll passa la stringa risultante nella funzione LoadLibrary per caricare il provider in memoria. Per altre informazioni, vedere LoadLibrary.
[in] lpszLspName
Puntatore a una stringa Unicode contenente il nome del provider di servizi a livelli.
[in] dwServiceFlags
Flag di servizio per il tipo di voce del catalogo protocolli a livelli da creare. Una voce del protocollo a livelli è una struttura WSAProtocol_Info con il membro ChainLen impostato su 0. La voce del catalogo effettiva per il provider di servizi di rete farà riferimento all'ID di questa voce del protocollo a livelli nel membro ProtocolChain .
[in] lpProtocolInfoList
Puntatore a una matrice di strutture WSAProtocol_Info . Ogni struttura definisce un protocollo, una famiglia di indirizzi e un tipo socket supportato dal provider. I membri della struttura WSAPROTOCOL_INFO esaminati sono iProtocol, iAddressFamily e iSocketType.
[in] dwNumberOfEntries
Numero di voci nella matrice lpProtocolInfoList .
[out, optional] lpdwCatalogEntryId
Puntatore alla voce del protocollo a livelli appena installata per il provider di trasporto nel database di configurazione del sistema Winsock 2. Questo è l'ID usato per compilare le voci della catena di protocolli installate nel catalogo per il provider di servizi di rete.
[out] lpErrno
Puntatore al codice di errore generato dalla chiamata se la funzione ha esito negativo.
Valore restituito
Se WSCInstallProviderAndChains64_32 ha esito positivo, restituisce zero. In caso contrario, restituisce SOCKET_ERROR e viene restituito un codice di errore specifico nel parametro lpErrno .
Codice di errore | Significato |
---|---|
Uno o più argomenti non si trovano in una parte valida dello spazio degli indirizzi utente. | |
Uno o più argomenti non sono validi. Questo errore viene restituito per le condizioni seguenti: il parametro lpProviderId è **NULL**, il parametro lpszProviderDllPath non è valido o la lunghezza del percorso è troppo grande (**MAX_PATH** è stato superato), il parametro lpszLspName non è valido o la lunghezza del nome è troppo grande (**WSAPROTOCOL_LEN** ** viene superata), lpProtocolInfoList è impostato su un parametro non**NULL** e il dwNumberOfEntries parametro è zero, un ID provider duplicato o il nome del provider di servizi a livelli esiste già nel catalogo o non è possibile trovare una corrispondenza per il protocollo, la famiglia di indirizzi e il tipo di socket specificati. | |
|
Il provider manca di funzionalità necessarie. Un provider non IFS deve implementare tutte le funzioni di estensione Winsock 2 (AcceptEx, ConnectEx, DisconnectEx, TransmitFile, TransmitPackets e LPFN_WSARECVMSG (WSARecvMsg)). |
Un'installazione del provider è già in corso. | |
Impossibile allocare memoria per i buffer. | |
Si è verificato un errore non recuperabile. Questo errore viene restituito in diverse condizioni, tra cui quanto segue: il provider è già installato, il parametro lpProtocolInfoList è stato **NULL** e non è stato trovato alcun provider di base, la lunghezza massima della catena di protocollo (**MAX_PROTOCOL_CHAIN**) è stata raggiunta, l'utente non dispone dei privilegi amministrativi necessari per scrivere nel Registro Winsock o si è verificato un errore durante la creazione o l'installazione di una voce del catalogo. | |
Una chiamata di sistema che non deve mai avere esito negativo. |
Commenti
WSCInstallProviderAndChains64_32 è una versione avanzata della funzione di WSCInstallProvider64_32 di base usata per installare un singolo provider di servizi di trasporto. Se viene installato un provider di servizi a livelli, WSCInstallProviderAndChains64_32 deve essere usato. WSCInstallProviderAndChains64_32 può installare un protocollo a livelli e una o più catene di protocolli con una singola chiamata a funzione. Per eseguire lo stesso lavoro usando WSCInstallProvider64_32 richiederebbe più chiamate di funzione.
Winsock 2 supporta protocolli a livelli. Un protocollo a livelli è uno che implementa solo funzioni di comunicazione di livello superiore mentre si basa su uno stack di trasporto sottostante per lo scambio effettivo di dati con un endpoint remoto. Un esempio di protocollo a livelli è un livello di sicurezza che aggiunge un protocollo al processo di creazione della connessione per eseguire l'autenticazione e stabilire uno schema di crittografia concordato reciprocamente. Tale protocollo di sicurezza richiede in genere i servizi di un protocollo di trasporto affidabile sottostante, ad esempio TCP o SPX. Il termine protocollo di base fa riferimento a un protocollo come TCP o SPX che è in grado di eseguire comunicazioni dati con un endpoint remoto. Il termine protocollo a livelli viene usato per descrivere un protocollo che non può essere autonomo. Una catena di protocolli verrebbe quindi definita come uno o più protocolli a livelli incatenati e ancorati da un protocollo di base. Un protocollo di base ha il membro ChainLen della struttura WSAProtocol_Info impostata su BASE_PROTOCOL definita come 1. Un protocollo a livelli ha il membro ChainLen della struttura WSAPROTOCOL_INFO impostata su LAYERED_PROTOCOL definita come zero. Una catena di protocolli ha il membro ChainLen della struttura WSAPROTOCOL_INFO impostata su maggiore di 1.
WSCInstallProviderAndChains64_32 è la versione a 64 bit di WSCInstallProviderAndChains. Installa il provider sia nei cataloghi a 32 bit che a 64 bit in piattaforme a 64 bit. Ciò significa che in piattaforme a 64 bit, vengono mantenuti due cataloghi Winsock e che sia i processi a 32 bit che a 64 bit sono in grado di caricare il servizio LSP installato con questa funzione.
In un computer a 64 bit tutte le chiamate non sono progettate in modo specifico per 32 bit (ad esempio tutte le funzioni che non terminano in "32") operano nel catalogo a 64 bit nativo. I processi eseguiti in un computer a 64 bit devono usare WSCInstallProviderAndChains64_32 per funzionare sia sul catalogo a 32 bit sia sul catalogo a 64 bit, mantenendo la compatibilità. Le definizioni e la semantica delle chiamate a 32 bit specifiche sono uguali a quelle native.
Se lpProtocolInfoList è impostato su NULL, questa funzione crea catene di protocolli in cui il provider viene sottoposto a livelli sul protocollo di base per ogni tipo di protocollo univoco come definito dalla famiglia di indirizzi, dal tipo di socket e dal protocollo. In questo modo viene eliminata la creazione di voci del provider duplicati inaccessibile.
Se lpProtocolInfoList è impostato su un valore non NULL , questa funzione crea catene di protocolli ottenendo la voce più in alto nelle informazioni di configurazione che corrispondono alla tupla {address family, socket type, protocol} di ogni elemento della matrice specificata. Anche in questo caso, viene considerata solo la tupla {address family, socket type, protocol} ; tutti gli altri membri e duplicati vengono ignorati.
Al termine di questa chiamata, tutte le chiamate successive a WSAEnumProtocols, WSCEnumProtocols o WSCEnumProtocols32 restituiranno le voci della catena di protocolli appena creata. Tenere presente che negli ambienti Windows, solo le istanze di Ws_32.dll create chiamando WSAStartup dopo il completamento di WSCInstallProviderAndChains64_32 includeranno le nuove voci quando WSAEnumProtocols, WSCEnumProtocols e WSCEnumProtocols32 restituisce.
In caso di esito positivo, WSCInstallProviderAndChains64_32 tenterà di avvisare tutte le applicazioni interessate registrate per la notifica della modifica chiamando WSAProviderConfigChange.
La funzione WSCInstallProviderAndChains64_32 può essere chiamata solo da un utente connesso come membro del gruppo Administrators. Se WSCInstallProviderAndChains64_32 viene chiamato da un utente che non è membro del gruppo Administrators, la chiamata alla funzione avrà esito negativo e WSANO_RECOVERY viene restituita nel parametro lpErrno . Per i computer che eseguono Windows Vista o Windows Server 2008, questa funzione può anche non riuscire a causa del controllo dell'account utente. Se un'applicazione contenente questa funzione viene eseguita da un utente connesso come membro del gruppo Administrators diverso dall'amministratore predefinito, questa chiamata avrà esito negativo a meno che l'applicazione non sia stata contrassegnata nel file manifesto con un set requestedExecutionLevel per richiedereAdministrator. Se l'applicazione in Windows Vista o Windows Server 2008 manca questo file manifesto, un utente ha eseguito l'accesso come membro del gruppo Administrators diverso dall'amministratore predefinito deve quindi eseguire l'applicazione in una shell avanzata come amministratore predefinito (amministratore RunAs) per questa funzione.
Qualsiasi installazione di file o configurazione specifica del provider deve essere eseguita dall'applicazione chiamante.
Provider IFS e non IFS
Un provider IFS è uno che restituisce handle del sistema operativo nativo. In genere questi handle sono associati ai driver del protocollo in modalità kernel. Ad esempio, la base TCP/IPv4, UDP/IPv4, TCP/IPv6 e UDP/IPv6 sono provider IFS come queste voci corrispondono a un componente della modalità kernel. Gli handle IFS possono essere usati nelle chiamate di funzione **ReadFile**, **WriteFile**e **CancelIo**. Un provider di servizi a livelli che è un provider IFS restituisce semplicemente l'handle socket creato dal provider inferiore (che deve essere anche un provider IFS) direttamente all'applicazione chiamante. Un LSP IFS non può intercettare le notifiche di completamento per le chiamate Winsock.Un provider non IFS è uno che crea un handle intermedio con WPUCreateSocketHandle e restituisce questo handle al chiamante. Ciò consente a un LSP non IFS di intercettare e ricevere eventi di completamento prima che le applicazioni chiamanti consentano l'elaborazione post-elaborazione, ad esempio decrittografando un blocco ricevuto di dati. Gli handle socket non IFS possono essere usati nelle chiamate a ReadFile e WriteFile, ma non possono essere usati con CancelIo. L'unico metodo garantito per annullare un'operazione in un handle non IFS è chiudere il socket con closesocket.
Percorsi per DLL provider a 32 bit e a 64 bit
lpszProviderDllPath rappresenta il percorso completo della versione a 64 bit della DLL del provider. Questo parametro può contenere stringhe di ambiente incorporate, ad esempio %SystemRoot%.lpszProviderDllPath32 rappresenta il percorso completo della versione a 32 bit della DLL del provider. Questo parametro può contenere stringhe di ambiente incorporate, ad esempio %SystemRoot%.
Se lpszProviderDllPath32 è NULL, lpszProviderDllPath è il percorso per i provider a 32 e a 64 bit. Quando un processo a 32 bit in un computer a 64 bit è in esecuzione (ad esempio, quando un'applicazione Winsock carica la versione a 32 bit di un LSP), tenta di caricare il provider a 32 bit specificato in lpszProviderDllPath. Se lpszProviderDllPath32 è NULL, il parametro lpszProviderDllPath deve essere impostato su %windir%\system32< dllname>. In caso contrario, la chiamata ha esito negativo con WSAEINVAL. Se il percorso in lpszProviderDllPath è %windir%\system32< dllname> quando lpszProviderDllPath32 è NULL, la chiamata verrà reindirizzata (usando il reindirizzamento del file system) alla directory restituita da GetSystemWow64Directory in cui deve risiedere l'LSP a 32 bit. Per l'edizione a 64 bit di Windows XP, Windows Server 2003 e Windows Vista, questa directory è %windir%\syswow64.
Requisiti
Client minimo supportato | Windows Vista [solo app desktop] |
Server minimo supportato | Windows Server 2008 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | ws2spi.h |
Libreria | Ws2_32.lib |
DLL | Ws2_32.dll |
Vedi anche
Configurazione e installazione del trasporto