VOID WSAAPI WsNcEntryDelete(IN PNSCATALOG_ENTRY CatalogEntry) { /* Check if a provider is loaded */ if (CatalogEntry->Provider) { /* Dereference it too */ WsNpDereference(CatalogEntry->Provider); CatalogEntry->Provider = NULL; } /* Delete us */ HeapFree(WsSockHeap, 0, CatalogEntry); }
VOID WSAAPI WsNqProvDelete(IN PNSQUERY_PROVIDER QueryProvider) { /* Check if we have a provider */ if (QueryProvider->Provider) { /* Dereference it */ WsNpDereference(QueryProvider->Provider); /* Clear it */ QueryProvider->Provider = NULL; } /* Delete us */ HeapFree(WsSockHeap, 0, QueryProvider); }
INT WSAAPI WsNcLoadProvider(IN PNSCATALOG Catalog, IN PNSCATALOG_ENTRY CatalogEntry) { INT ErrorCode = ERROR_SUCCESS; PNS_PROVIDER Provider; /* Lock the catalog */ WsNcLock(); /* Check if we have a provider already */ if (!CatalogEntry->Provider) { /* Allocate a provider */ if ((Provider = WsNpAllocate())) { /* Initialize it */ ErrorCode = WsNpInitialize(Provider, CatalogEntry->DllPath, &CatalogEntry->ProviderId); /* Ensure success */ if (ErrorCode == ERROR_SUCCESS) { /* Set the provider */ WsNcEntrySetProvider(CatalogEntry, Provider); } /* Dereference it */ WsNpDereference(Provider); } else { /* No memory */ ErrorCode = WSA_NOT_ENOUGH_MEMORY; } } /* Release the lock */ WsNcUnlock(); return ErrorCode; }