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 == HelperDLL->Mapping->Mapping[i].AddressFamily) &&
84 (lpProtocolInfo->iSocketType == HelperDLL->Mapping->Mapping[i].SocketType) &&
85 ((lpProtocolInfo->iProtocol == 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 #define GET_ENTRY_POINT(helper, exportname, identifier) { \
106 entry = GetProcAddress(helper->hModule, exportname); \
108 return ERROR_BAD_PROVIDER; \
109 ((PVOID)helper->EntryTable.##identifier) = entry; \
113 INT GetHelperDLLEntries(
114 PWSHELPER_DLL HelperDLL)
116 GET_ENTRY_POINT(HelperDLL, "WSHAddressToString", lpWSHAddressToString);
117 GET_ENTRY_POINT(HelperDLL, "WSHEnumProtocols", lpWSHEnumProtocols);
118 GET_ENTRY_POINT(HelperDLL, "WSHGetBroadcastSockaddr", lpWSHGetBroadcastSockaddr);
119 GET_ENTRY_POINT(HelperDLL, "WSHGetProviderGuid", lpWSHGetProviderGuid);
120 GET_ENTRY_POINT(HelperDLL, "WSHGetSockaddrType", lpWSHGetSockaddrType);
121 GET_ENTRY_POINT(HelperDLL, "WSHGetSocketInformation", lpWSHGetSocketInformation);
122 GET_ENTRY_POINT(HelperDLL, "WSHGetWildcardSockaddr", lpWSHGetWildcardSockaddr);
123 GET_ENTRY_POINT(HelperDLL, "WSHGetWinsockMapping", lpWSHGetWinsockMapping);
124 GET_ENTRY_POINT(HelperDLL, "WSHGetWSAProtocolInfo", lpWSHGetWSAProtocolInfo);
125 GET_ENTRY_POINT(HelperDLL, "WSHIoctl", lpWSHIoctl);
126 GET_ENTRY_POINT(HelperDLL, "WSHJoinLeaf", lpWSHJoinLeaf);
127 GET_ENTRY_POINT(HelperDLL, "WSHNotify", lpWSHNotify);
128 GET_ENTRY_POINT(HelperDLL, "WSHOpenSocket", lpWSHOpenSocket);
129 GET_ENTRY_POINT(HelperDLL, "WSHOpenSocket2", lpWSHOpenSocket2);
130 GET_ENTRY_POINT(HelperDLL, "WSHSetSocketInformation", lpWSHSetSocketInformation);
131 GET_ENTRY_POINT(HelperDLL, "WSHStringToAddress", lpWSHStringToAddress);
138 PWSHELPER_DLL HelperDLL)
140 INT Status = NO_ERROR;
142 AFD_DbgPrint(MAX_TRACE, ("Loading helper dll at (0x%X).\n", HelperDLL));
144 if (!HelperDLL->hModule) {
145 /* DLL is not loaded so load it now */
146 HelperDLL->hModule = LoadLibrary(HelperDLL->LibraryName);
148 AFD_DbgPrint(MAX_TRACE, ("hModule is (0x%X).\n", HelperDLL->hModule));
150 if (HelperDLL->hModule) {
151 Status = GetHelperDLLEntries(HelperDLL);
153 Status = ERROR_DLL_NOT_FOUND;
157 AFD_DbgPrint(MAX_TRACE, ("Status (%d).\n", Status));
164 PWSHELPER_DLL HelperDLL)
166 INT Status = NO_ERROR;
168 AFD_DbgPrint(MAX_TRACE, ("HelperDLL (0x%X) hModule (0x%X).\n", HelperDLL, HelperDLL->hModule));
170 if (HelperDLL->hModule) {
171 if (!FreeLibrary(HelperDLL->hModule)) {
172 Status = GetLastError();
174 HelperDLL->hModule = NULL;
181 VOID CreateHelperDLLDatabase(VOID)
183 PWSHELPER_DLL HelperDLL;
185 InitializeCriticalSection(&HelperDLLDatabaseLock);
187 InitializeListHead(&HelperDLLDatabaseListHead);
189 /* FIXME: Read helper DLL configuration from registry */
190 HelperDLL = CreateHelperDLL(L"wshtcpip.dll");
194 HelperDLL->Mapping = HeapAlloc(
197 3 * sizeof(WINSOCK_MAPPING) + 3 * sizeof(DWORD));
198 if (!HelperDLL->Mapping)
201 HelperDLL->Mapping->Rows = 3;
202 HelperDLL->Mapping->Columns = 3;
204 HelperDLL->Mapping->Mapping[0].AddressFamily = AF_INET;
205 HelperDLL->Mapping->Mapping[0].SocketType = SOCK_STREAM;
206 HelperDLL->Mapping->Mapping[0].Protocol = IPPROTO_TCP;
208 HelperDLL->Mapping->Mapping[1].AddressFamily = AF_INET;
209 HelperDLL->Mapping->Mapping[1].SocketType = SOCK_DGRAM;
210 HelperDLL->Mapping->Mapping[1].Protocol = IPPROTO_UDP;
212 HelperDLL->Mapping->Mapping[2].AddressFamily = AF_INET;
213 HelperDLL->Mapping->Mapping[2].SocketType = SOCK_RAW;
214 HelperDLL->Mapping->Mapping[2].Protocol = 0;
216 LoadHelperDLL(HelperDLL);
220 VOID DestroyHelperDLLDatabase(VOID)
222 PLIST_ENTRY CurrentEntry;
223 PLIST_ENTRY NextEntry;
224 PWSHELPER_DLL HelperDLL;
226 CurrentEntry = HelperDLLDatabaseListHead.Flink;
227 while (CurrentEntry != &HelperDLLDatabaseListHead) {
228 NextEntry = CurrentEntry->Flink;
230 HelperDLL = CONTAINING_RECORD(CurrentEntry,
234 DestroyHelperDLL(HelperDLL);
236 CurrentEntry = NextEntry;
239 DeleteCriticalSection(&HelperDLLDatabaseLock);