2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2 API
4 * FILE: dll/win32/ws2_32_new/src/nsprovid.c
5 * PURPOSE: Namespace Provider Object
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 /* INCLUDES ******************************************************************/
13 /* FUNCTIONS *****************************************************************/
17 WsNqProvAllocate(VOID
)
19 PNSQUERY_PROVIDER Provider
;
21 /* Allocate the object */
22 Provider
= HeapAlloc(WsSockHeap
, HEAP_ZERO_MEMORY
, sizeof(*Provider
));
30 WsNqProvInitialize(IN PNSQUERY_PROVIDER QueryProvider
,
31 IN PNS_PROVIDER Provider
)
33 /* Reference the provider */
34 InterlockedIncrement(&Provider
->RefCount
);
36 /* Set it as our own */
37 QueryProvider
->Provider
= Provider
;
45 WsNqProvDelete(IN PNSQUERY_PROVIDER QueryProvider
)
47 /* Check if we have a provider */
48 if (QueryProvider
->Provider
)
51 WsNpDereference(QueryProvider
->Provider
);
54 QueryProvider
->Provider
= NULL
;
58 HeapFree(WsSockHeap
, 0, QueryProvider
);
65 PNS_PROVIDER Provider
;
67 /* Allocate the object */
68 Provider
= HeapAlloc(WsSockHeap
, HEAP_ZERO_MEMORY
, sizeof(*Provider
));
70 /* Set non-null data */
71 Provider
->RefCount
= 1;
72 Provider
->Service
.cbSize
= sizeof(NSP_ROUTINE
);
80 WsNpInitialize(IN PNS_PROVIDER Provider
,
84 INT ErrorCode
= ERROR_SUCCESS
;
85 LPNSPSTARTUP NSPStartupProc
;
86 CHAR AnsiPath
[MAX_PATH
], ExpandedDllPath
[MAX_PATH
];
88 /* Convert the path to ANSI */
89 WideCharToMultiByte(CP_ACP
,
98 /* Expand the DLL Path */
99 ExpandEnvironmentStringsA(AnsiPath
,
104 Provider
->DllHandle
= LoadLibraryA(ExpandedDllPath
);
105 if (!Provider
->DllHandle
)
108 ErrorCode
= WSAEPROVIDERFAILEDINIT
;
112 /* Get the pointer to NSPStartup */
113 NSPStartupProc
= (LPNSPSTARTUP
)GetProcAddress(Provider
->DllHandle
,
118 ErrorCode
= WSAEPROVIDERFAILEDINIT
;
123 (*NSPStartupProc
)(ProviderId
, (LPNSP_ROUTINE
)&Provider
->Service
.cbSize
);
125 /* Save the provider ID */
126 Provider
->ProviderId
= *ProviderId
;
131 if (Provider
->DllHandle
) FreeLibrary(Provider
->DllHandle
);
137 WsNpNSPCleanup(IN PNS_PROVIDER Provider
)
139 INT ErrorCode
= ERROR_SUCCESS
;
140 LPNSPCLEANUP lpNSPCleanup
= NULL
;
142 /* Make sure we have a loaded handle */
143 if (Provider
->DllHandle
)
145 /* Get the pointer and clear it */
146 lpNSPCleanup
= InterlockedExchangePointer((PVOID
*)&Provider
->Service
.NSPCleanup
,
148 /* If it's not NULL, call it */
149 if (lpNSPCleanup
) ErrorCode
= lpNSPCleanup(&Provider
->ProviderId
);
158 WsNpDelete(IN PNS_PROVIDER Provider
)
160 /* Make sure we have a loaded handle */
161 if (Provider
->DllHandle
)
164 WsNpNSPCleanup(Provider
);
166 /* Unload the library */
167 FreeLibrary(Provider
->DllHandle
);
169 /* Clear the handle value */
170 Provider
->DllHandle
= NULL
;
176 WsNpDereference(IN PNS_PROVIDER Provider
)
178 /* Decrease the reference count and check if it's zero */
179 if (!InterlockedDecrement(&Provider
->RefCount
))
182 WsNpDelete(Provider
);
188 WsNqProvLookupServiceEnd(IN PNSQUERY_PROVIDER QueryProvider
)
190 /* Simply call the provider */
191 return WsNpLookupServiceEnd(QueryProvider
->Provider
,
192 QueryProvider
->LookupHandle
);
197 WsNqProvLookupServiceNext(IN PNSQUERY_PROVIDER QueryProvider
,
198 IN DWORD ControlFlags
,
199 IN PDWORD BufferLength
,
200 LPWSAQUERYSETW Results
)
202 /* Simply call the provider */
203 return WsNpLookupServiceNext(QueryProvider
->Provider
,
204 QueryProvider
->LookupHandle
,
212 WsNqProvLookupServiceBegin(IN PNSQUERY_PROVIDER QueryProvider
,
213 IN LPWSAQUERYSETW Restrictions
,
214 IN LPWSASERVICECLASSINFOW ServiceClassInfo
,
215 IN DWORD ControlFlags
)
217 /* Simply call the provider */
218 return WsNpLookupServiceBegin(QueryProvider
->Provider
,
222 &QueryProvider
->LookupHandle
);
227 WsNpLookupServiceEnd(IN PNS_PROVIDER Provider
,
228 IN HANDLE LookupHandle
)
231 return Provider
->Service
.NSPLookupServiceEnd(LookupHandle
);
236 WsNpLookupServiceNext(IN PNS_PROVIDER Provider
,
237 IN HANDLE LookupHandle
,
238 IN DWORD ControlFlags
,
239 OUT PDWORD BufferLength
,
240 OUT LPWSAQUERYSETW Results
)
243 return Provider
->Service
.NSPLookupServiceNext(LookupHandle
,
251 WsNpLookupServiceBegin(IN PNS_PROVIDER Provider
,
252 IN LPWSAQUERYSETW Restrictions
,
253 IN LPWSASERVICECLASSINFOW ServiceClassInfo
,
254 IN DWORD ControlFlags
,
255 OUT PHANDLE LookupHandle
)
258 return Provider
->Service
.NSPLookupServiceBegin(&Provider
->ProviderId
,