1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS WinSock 2 API 4 * FILE: dll/win32/ws2_32/src/nscatent.c 5 * PURPOSE: Namespace Catalog Entry Object 6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net) 7 */ 8 9 /* INCLUDES ******************************************************************/ 10 11 #include <ws2_32.h> 12 13 /* FUNCTIONS *****************************************************************/ 14 15 PNSCATALOG_ENTRY 16 WSAAPI 17 WsNcEntryAllocate(VOID) 18 { 19 PNSCATALOG_ENTRY CatalogEntry; 20 21 /* Allocate the catalog */ 22 CatalogEntry = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*CatalogEntry)); 23 if (CatalogEntry) 24 { 25 /* Set the default non-null members */ 26 CatalogEntry->RefCount = 1; 27 CatalogEntry->Enabled = TRUE; 28 CatalogEntry->AddressFamily = -1; 29 } 30 31 /* Return it */ 32 return CatalogEntry; 33 } 34 35 VOID 36 WSAAPI 37 WsNcEntryDelete(IN PNSCATALOG_ENTRY CatalogEntry) 38 { 39 /* Check if a provider is loaded */ 40 if (CatalogEntry->Provider) 41 { 42 /* Dereference it too */ 43 WsNpDereference(CatalogEntry->Provider); 44 CatalogEntry->Provider = NULL; 45 } 46 47 /* Delete us */ 48 HeapFree(WsSockHeap, 0, CatalogEntry); 49 } 50 51 VOID 52 WSAAPI 53 WsNcEntryDereference(IN PNSCATALOG_ENTRY CatalogEntry) 54 { 55 /* Dereference and check if it's now 0 */ 56 if (!(InterlockedDecrement(&CatalogEntry->RefCount))) 57 { 58 /* We can delete the Provider now */ 59 WsNcEntryDelete(CatalogEntry); 60 } 61 } 62 63 INT 64 WSAAPI 65 WsNcEntryInitializeFromRegistry(IN PNSCATALOG_ENTRY CatalogEntry, 66 IN HKEY ParentKey, 67 IN ULONG UniqueId) 68 { 69 INT ErrorCode; 70 CHAR CatalogEntryName[13]; 71 HKEY EntryKey; 72 ULONG RegType = REG_SZ; 73 ULONG RegSize = MAX_PATH; 74 ULONG RegValue; 75 76 /* Convert to a 00000xxx string */ 77 sprintf(CatalogEntryName, "%0""12""i", (int)UniqueId); 78 79 /* Open the Entry */ 80 ErrorCode = RegOpenKeyEx(ParentKey, 81 CatalogEntryName, 82 0, 83 KEY_READ, 84 &EntryKey); 85 if (ErrorCode != ERROR_SUCCESS) return ErrorCode; 86 /* Read the Library Path */ 87 ErrorCode = RegQueryValueExW(EntryKey, 88 L"LibraryPath", 89 0, 90 &RegType, 91 (LPBYTE)&CatalogEntry->DllPath, 92 &RegSize); 93 if (ErrorCode != ERROR_SUCCESS) goto out; 94 /* Query Display String Size*/ 95 ErrorCode = RegQueryValueExW(EntryKey, 96 L"DisplayString", 97 0, 98 NULL, 99 NULL, 100 &RegSize); 101 if (ErrorCode != ERROR_SUCCESS) goto out; 102 /* Allocate it */ 103 CatalogEntry->ProviderName = (LPWSTR)HeapAlloc(WsSockHeap, 0, RegSize); 104 105 /* Read it */ 106 ErrorCode = RegQueryValueExW(EntryKey, 107 L"DisplayString", 108 0, 109 &RegType, 110 (LPBYTE)CatalogEntry->ProviderName, 111 &RegSize); 112 if (ErrorCode != ERROR_SUCCESS) goto out; 113 /* Read the Provider Id */ 114 RegType = REG_BINARY; 115 RegSize = sizeof(GUID); 116 ErrorCode = RegQueryValueEx(EntryKey, 117 "ProviderId", 118 0, 119 &RegType, 120 (LPBYTE)&CatalogEntry->ProviderId, 121 &RegSize); 122 if (ErrorCode != ERROR_SUCCESS) goto out; 123 /* Read the Address Family */ 124 RegType = REG_DWORD; 125 RegSize = sizeof(DWORD); 126 ErrorCode = RegQueryValueEx(EntryKey, 127 "AddressFamily", 128 0, 129 &RegType, 130 (LPBYTE)&CatalogEntry->AddressFamily, 131 &RegSize); 132 if (ErrorCode != ERROR_SUCCESS) goto out; 133 /* Read the Namespace Id */ 134 ErrorCode = RegQueryValueEx(EntryKey, 135 "SupportedNamespace", 136 0, 137 &RegType, 138 (LPBYTE)&CatalogEntry->NamespaceId, 139 &RegSize); 140 if (ErrorCode != ERROR_SUCCESS) goto out; 141 /* Read the Enabled Flag */ 142 ErrorCode = RegQueryValueEx(EntryKey, 143 "Enabled", 144 0, 145 &RegType, 146 (LPBYTE)&RegValue, 147 &RegSize); 148 if (ErrorCode != ERROR_SUCCESS) goto out; 149 CatalogEntry->Enabled = RegValue != 0; 150 151 /* Read the Version */ 152 ErrorCode = RegQueryValueEx(EntryKey, 153 "Version", 154 0, 155 &RegType, 156 (LPBYTE)&CatalogEntry->Version, 157 &RegSize); 158 if (ErrorCode != ERROR_SUCCESS) goto out; 159 /* Read the Support Service Class Info Flag */ 160 ErrorCode = RegQueryValueEx(EntryKey, 161 "StoresServiceClassInfo", 162 0, 163 &RegType, 164 (LPBYTE)&RegValue, 165 &RegSize); 166 CatalogEntry->StoresServiceClassInfo = RegValue != 0; 167 out: 168 /* Done */ 169 RegCloseKey(EntryKey); 170 return ErrorCode; 171 } 172 173 VOID 174 WSAAPI 175 WsNcEntrySetProvider(IN PNSCATALOG_ENTRY Entry, 176 IN PNS_PROVIDER Provider) 177 { 178 /* Reference the provider */ 179 InterlockedIncrement(&Provider->RefCount); 180 181 /* Set it */ 182 Entry->Provider = Provider; 183 } 184