// // Function: GetCatalogIdForProviderGuid // // Description: // This routine finds the WInsock catalog entry for the GUID and returns the // catalog ID for that entry. // DWORD GetCatalogIdForProviderGuid( GUID *Guid, WSAPROTOCOL_INFOW *Catalog, int CatalogCount ) { WSAPROTOCOL_INFOW *match = NULL; match = FindProviderByGuid( Guid, Catalog, CatalogCount ); if ( NULL != match ) { return match->dwCatalogEntryId; } return 0; }
// // Function: InstallProvider // // Description: // This is a wrapper for the WSCInstallProvider function. Depending on // which catalog is specified, this routine calls the correct install // routine. // int InstallProvider( WINSOCK_CATALOG Catalog, // Which catalog are we operating on GUID *Guid, // GUID under which provider will be installed WCHAR *lpwszLspPath, // Path to LSP's DLL WSAPROTOCOL_INFOW *pProvider, // Array of provider structures to install INT iProviderCount // Number of providers in array ) { WSAPROTOCOL_INFOW *pEnumProviders = NULL, *pEntry = NULL; INT iEnumProviderCount, ErrorCode, rc = SOCKET_ERROR; #ifdef _WIN64 if ( LspCatalog32Only == Catalog ) { // Can't install only in 32-bit catalog from 64-bit fprintf( stderr, "InstallProvider: Error! It is not possible to install only " "in 32-bit catalog from 64-bit process!\n\n" ); goto cleanup; } else if ( LspCatalog64Only == Catalog ) { // Just need to call WSCInstallProvider rc = WSCInstallProvider( Guid, lpwszLspPath, pProvider, iProviderCount, &ErrorCode ); } else { // To install in both we must call WSCInstallProviderPath64_32 rc = WSCInstallProvider64_32( Guid, lpwszLspPath, pProvider, iProviderCount, &ErrorCode ); } #else if ( LspCatalog32Only == Catalog ) { // From a 32-bit process we can only install into 32-bit catalog rc = WSCInstallProvider( Guid, lpwszLspPath, pProvider, iProviderCount, &ErrorCode ); } else { // From a 32-bit process, we can't touch the 64-bit catalog at all fprintf( stderr, "InstallProvider: Error! It is not possible to install into " "the 64-bit catalog from a 32-bit process!\n\n" ); goto cleanup; } #endif if ( SOCKET_ERROR == rc ) { fprintf( stderr, "InstallProvider: WSCInstallProvider* failed: %d\n", ErrorCode ); goto cleanup; } // Go back and enumerate what we just installed pEnumProviders = EnumerateProviders( Catalog, &iEnumProviderCount ); if ( NULL == pEnumProviders ) { fprintf( stderr, "InstallProvider: EnumerateProviders failed!\n" ); goto cleanup; } // Make sure our entry is in the catalog pEntry = FindProviderByGuid( Guid, pEnumProviders, iEnumProviderCount ); if ( pEntry ) { printf( "Installed: [%4d] %S\n", pEntry->dwCatalogEntryId, pEntry->szProtocol ); } cleanup: if ( NULL != pEnumProviders ) FreeProviders( pEnumProviders ); return rc; }