2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver DLL
5 * PURPOSE: Helper DLL management
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/09-2000 Created
13 CRITICAL_SECTION HelperDLLDatabaseLock;
14 LIST_ENTRY HelperDLLDatabaseListHead;
16 PWSHELPER_DLL CreateHelperDLL(
19 PWSHELPER_DLL HelperDLL;
21 HelperDLL = HeapAlloc(GlobalHeap, 0, sizeof(WSHELPER_DLL));
25 InitializeCriticalSection(&HelperDLL->Lock);
26 HelperDLL->hModule = NULL;
27 lstrcpyW(HelperDLL->LibraryName, LibraryName);
28 HelperDLL->Mapping = NULL;
30 EnterCriticalSection(&HelperDLLDatabaseLock);
31 InsertTailList(&HelperDLLDatabaseListHead, &HelperDLL->ListEntry);
32 LeaveCriticalSection(&HelperDLLDatabaseLock);
34 AFD_DbgPrint(MAX_TRACE, ("Returning helper at (0x%X).\n", HelperDLL));
41 PWSHELPER_DLL HelperDLL)
45 AFD_DbgPrint(MAX_TRACE, ("HelperDLL (0x%X).\n", HelperDLL));
47 EnterCriticalSection(&HelperDLLDatabaseLock);
48 RemoveEntryList(&HelperDLL->ListEntry);
49 LeaveCriticalSection(&HelperDLLDatabaseLock);
51 if (HelperDLL->hModule) {
52 Status = UnloadHelperDLL(HelperDLL);
57 if (HelperDLL->Mapping)
58 HeapFree(GlobalHeap, 0, HelperDLL->Mapping);
60 DeleteCriticalSection(&HelperDLL->Lock);
62 HeapFree(GlobalHeap, 0, HelperDLL);
68 PWSHELPER_DLL LocateHelperDLL(
69 LPWSAPROTOCOL_INFOW lpProtocolInfo)
71 PLIST_ENTRY CurrentEntry;
72 PWSHELPER_DLL HelperDLL;
75 EnterCriticalSection(&HelperDLLDatabaseLock);
76 CurrentEntry = HelperDLLDatabaseListHead.Flink;
77 while (CurrentEntry != &HelperDLLDatabaseListHead) {
78 HelperDLL = CONTAINING_RECORD(CurrentEntry,
82 for (i = 0; i < HelperDLL->Mapping->Rows; i++) {
83 if ((lpProtocolInfo->iAddressFamily == (INT) HelperDLL->Mapping->Mapping[i].AddressFamily) &&
84 (lpProtocolInfo->iSocketType == (INT) HelperDLL->Mapping->Mapping[i].SocketType) &&
85 ((lpProtocolInfo->iProtocol == (INT) HelperDLL->Mapping->Mapping[i].Protocol) ||
86 (lpProtocolInfo->iSocketType == SOCK_RAW))) {
87 LeaveCriticalSection(&HelperDLLDatabaseLock);
88 AFD_DbgPrint(MAX_TRACE, ("Returning helper DLL at (0x%X).\n", HelperDLL));
93 CurrentEntry = CurrentEntry->Flink;
95 LeaveCriticalSection(&HelperDLLDatabaseLock);
97 AFD_DbgPrint(MAX_TRACE, ("Could not locate helper DLL.\n"));
103 INT GetHelperDLLEntries(
104 PWSHELPER_DLL HelperDLL)
108 e = GetProcAddress(HelperDLL->hModule, "WSHAddressToString");
109 if (!e) return ERROR_BAD_PROVIDER;
110 ((PVOID) HelperDLL->EntryTable.lpWSHAddressToString) = e;
112 e = GetProcAddress(HelperDLL->hModule, "WSHEnumProtocols");
113 if (!e) return ERROR_BAD_PROVIDER;
114 ((PVOID) HelperDLL->EntryTable.lpWSHEnumProtocols) = e;
116 e = GetProcAddress(HelperDLL->hModule, "WSHGetBroadcastSockaddr");
117 if (!e) return ERROR_BAD_PROVIDER;
118 ((PVOID) HelperDLL->EntryTable.lpWSHGetBroadcastSockaddr) = e;
120 e = GetProcAddress(HelperDLL->hModule, "WSHGetProviderGuid");
121 if (!e) return ERROR_BAD_PROVIDER;
122 ((PVOID) HelperDLL->EntryTable.lpWSHGetProviderGuid) = e;
124 e = GetProcAddress(HelperDLL->hModule, "WSHGetSockaddrType");
125 if (!e) return ERROR_BAD_PROVIDER;
126 ((PVOID) HelperDLL->EntryTable.lpWSHGetSockaddrType) = e;
128 e = GetProcAddress(HelperDLL->hModule, "WSHGetSocketInformation");
129 if (!e) return ERROR_BAD_PROVIDER;
130 ((PVOID) HelperDLL->EntryTable.lpWSHGetSocketInformation) = e;
132 e = GetProcAddress(HelperDLL->hModule, "WSHGetWildcardSockaddr");
133 if (!e) return ERROR_BAD_PROVIDER;
134 ((PVOID) HelperDLL->EntryTable.lpWSHGetWildcardSockaddr) = e;
136 e = GetProcAddress(HelperDLL->hModule, "WSHGetWinsockMapping");
137 if (!e) return ERROR_BAD_PROVIDER;
138 ((PVOID) HelperDLL->EntryTable.lpWSHGetWinsockMapping) = e;
140 e = GetProcAddress(HelperDLL->hModule, "WSHGetWSAProtocolInfo");
141 if (!e) return ERROR_BAD_PROVIDER;
142 ((PVOID) HelperDLL->EntryTable.lpWSHGetWSAProtocolInfo) = e;
144 e = GetProcAddress(HelperDLL->hModule, "WSHIoctl");
145 if (!e) return ERROR_BAD_PROVIDER;
146 ((PVOID) HelperDLL->EntryTable.lpWSHIoctl) = e;
148 e = GetProcAddress(HelperDLL->hModule, "WSHJoinLeaf");
149 if (!e) return ERROR_BAD_PROVIDER;
150 ((PVOID) HelperDLL->EntryTable.lpWSHJoinLeaf) = e;
152 e = GetProcAddress(HelperDLL->hModule, "WSHNotify");
153 if (!e) return ERROR_BAD_PROVIDER;
154 ((PVOID) HelperDLL->EntryTable.lpWSHNotify) = e;
156 e = GetProcAddress(HelperDLL->hModule, "WSHOpenSocket");
157 if (!e) return ERROR_BAD_PROVIDER;
158 ((PVOID) HelperDLL->EntryTable.lpWSHOpenSocket) = e;
160 e = GetProcAddress(HelperDLL->hModule, "WSHOpenSocket2");
161 if (!e) return ERROR_BAD_PROVIDER;
162 ((PVOID) HelperDLL->EntryTable.lpWSHOpenSocket2) = e;
164 e = GetProcAddress(HelperDLL->hModule, "WSHSetSocketInformation");
165 if (!e) return ERROR_BAD_PROVIDER;
166 ((PVOID) HelperDLL->EntryTable.lpWSHSetSocketInformation) = e;
168 e = GetProcAddress(HelperDLL->hModule, "WSHStringToAddress");
169 if (!e) return ERROR_BAD_PROVIDER;
170 ((PVOID) HelperDLL->EntryTable.lpWSHStringToAddress) = e;
177 PWSHELPER_DLL HelperDLL)
179 INT Status = NO_ERROR;
181 AFD_DbgPrint(MAX_TRACE, ("Loading helper dll at (0x%X).\n", HelperDLL));
183 if (!HelperDLL->hModule) {
184 /* DLL is not loaded so load it now */
185 HelperDLL->hModule = LoadLibrary(HelperDLL->LibraryName);
187 AFD_DbgPrint(MAX_TRACE, ("hModule is (0x%X).\n", HelperDLL->hModule));
189 if (HelperDLL->hModule) {
190 Status = GetHelperDLLEntries(HelperDLL);
192 Status = ERROR_DLL_NOT_FOUND;
196 AFD_DbgPrint(MAX_TRACE, ("Status (%d).\n", Status));
203 PWSHELPER_DLL HelperDLL)
205 INT Status = NO_ERROR;
207 AFD_DbgPrint(MAX_TRACE, ("HelperDLL (0x%X) hModule (0x%X).\n", HelperDLL, HelperDLL->hModule));
209 if (HelperDLL->hModule) {
210 if (!FreeLibrary(HelperDLL->hModule)) {
211 Status = GetLastError();
213 HelperDLL->hModule = NULL;
220 VOID CreateHelperDLLDatabase(VOID)
222 PWSHELPER_DLL HelperDLL;
224 InitializeCriticalSection(&HelperDLLDatabaseLock);
226 InitializeListHead(&HelperDLLDatabaseListHead);
228 /* FIXME: Read helper DLL configuration from registry */
229 HelperDLL = CreateHelperDLL(L"wshtcpip.dll");
233 HelperDLL->Mapping = HeapAlloc(
236 3 * sizeof(WINSOCK_MAPPING) + 3 * sizeof(DWORD));
237 if (!HelperDLL->Mapping)
240 HelperDLL->Mapping->Rows = 3;
241 HelperDLL->Mapping->Columns = 3;
243 HelperDLL->Mapping->Mapping[0].AddressFamily = AF_INET;
244 HelperDLL->Mapping->Mapping[0].SocketType = SOCK_STREAM;
245 HelperDLL->Mapping->Mapping[0].Protocol = IPPROTO_TCP;
247 HelperDLL->Mapping->Mapping[1].AddressFamily = AF_INET;
248 HelperDLL->Mapping->Mapping[1].SocketType = SOCK_DGRAM;
249 HelperDLL->Mapping->Mapping[1].Protocol = IPPROTO_UDP;
251 HelperDLL->Mapping->Mapping[2].AddressFamily = AF_INET;
252 HelperDLL->Mapping->Mapping[2].SocketType = SOCK_RAW;
253 HelperDLL->Mapping->Mapping[2].Protocol = 0;
255 LoadHelperDLL(HelperDLL);
259 VOID DestroyHelperDLLDatabase(VOID)
261 PLIST_ENTRY CurrentEntry;
262 PLIST_ENTRY NextEntry;
263 PWSHELPER_DLL HelperDLL;
265 CurrentEntry = HelperDLLDatabaseListHead.Flink;
266 while (CurrentEntry != &HelperDLLDatabaseListHead) {
267 NextEntry = CurrentEntry->Flink;
269 HelperDLL = CONTAINING_RECORD(CurrentEntry,
273 DestroyHelperDLL(HelperDLL);
275 CurrentEntry = NextEntry;
278 DeleteCriticalSection(&HelperDLLDatabaseLock);