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
));
71 /* Set non-null data */
72 Provider
->RefCount
= 1;
73 Provider
->Service
.cbSize
= sizeof(NSP_ROUTINE
);
82 WsNpInitialize(IN PNS_PROVIDER Provider
,
86 INT ErrorCode
= ERROR_SUCCESS
;
87 LPNSPSTARTUP NSPStartupProc
;
88 CHAR AnsiPath
[MAX_PATH
], ExpandedDllPath
[MAX_PATH
];
90 /* Convert the path to ANSI */
91 WideCharToMultiByte(CP_ACP
,
100 /* Expand the DLL Path */
101 ExpandEnvironmentStringsA(AnsiPath
,
106 Provider
->DllHandle
= LoadLibraryA(ExpandedDllPath
);
107 if (!Provider
->DllHandle
)
110 ErrorCode
= WSAEPROVIDERFAILEDINIT
;
114 /* Get the pointer to NSPStartup */
115 NSPStartupProc
= (LPNSPSTARTUP
)GetProcAddress(Provider
->DllHandle
,
120 ErrorCode
= WSAEPROVIDERFAILEDINIT
;
125 (*NSPStartupProc
)(ProviderId
, &Provider
->Service
);
127 /* Save the provider ID */
128 Provider
->ProviderId
= *ProviderId
;
133 if (Provider
->DllHandle
) FreeLibrary(Provider
->DllHandle
);
134 Provider
->DllHandle
= NULL
;
140 WsNpNSPCleanup(IN PNS_PROVIDER Provider
)
142 INT ErrorCode
= ERROR_SUCCESS
;
143 LPNSPCLEANUP lpNSPCleanup
= NULL
;
145 /* Make sure we have a loaded handle */
146 if (Provider
->DllHandle
)
148 /* Get the pointer and clear it */
149 lpNSPCleanup
= InterlockedExchangePointer((PVOID
*)&Provider
->Service
.NSPCleanup
,
151 /* If it's not NULL, call it */
152 if (lpNSPCleanup
) ErrorCode
= lpNSPCleanup(&Provider
->ProviderId
);
161 WsNpDelete(IN PNS_PROVIDER Provider
)
163 /* Make sure we have a loaded handle */
164 if (Provider
->DllHandle
)
167 WsNpNSPCleanup(Provider
);
169 /* Unload the library */
170 FreeLibrary(Provider
->DllHandle
);
171 Provider
->DllHandle
= NULL
;
175 HeapFree(WsSockHeap
, 0, Provider
);
180 WsNpDereference(IN PNS_PROVIDER Provider
)
182 /* Decrease the reference count and check if it's zero */
183 if (!InterlockedDecrement(&Provider
->RefCount
))
186 WsNpDelete(Provider
);
192 WsNqProvLookupServiceEnd(IN PNSQUERY_PROVIDER QueryProvider
)
194 /* Simply call the provider */
195 return WsNpLookupServiceEnd(QueryProvider
->Provider
,
196 QueryProvider
->LookupHandle
);
201 WsNqProvLookupServiceNext(IN PNSQUERY_PROVIDER QueryProvider
,
202 IN DWORD ControlFlags
,
203 IN PDWORD BufferLength
,
204 LPWSAQUERYSETW Results
)
206 /* Simply call the provider */
207 return WsNpLookupServiceNext(QueryProvider
->Provider
,
208 QueryProvider
->LookupHandle
,
216 WsNqProvLookupServiceBegin(IN PNSQUERY_PROVIDER QueryProvider
,
217 IN LPWSAQUERYSETW Restrictions
,
218 IN LPWSASERVICECLASSINFOW ServiceClassInfo
,
219 IN DWORD ControlFlags
)
221 /* Simply call the provider */
222 return WsNpLookupServiceBegin(QueryProvider
->Provider
,
226 &QueryProvider
->LookupHandle
);
231 WsNpLookupServiceEnd(IN PNS_PROVIDER Provider
,
232 IN HANDLE LookupHandle
)
235 return Provider
->Service
.NSPLookupServiceEnd(LookupHandle
);
240 WsNpLookupServiceNext(IN PNS_PROVIDER Provider
,
241 IN HANDLE LookupHandle
,
242 IN DWORD ControlFlags
,
243 OUT PDWORD BufferLength
,
244 OUT LPWSAQUERYSETW Results
)
247 return Provider
->Service
.NSPLookupServiceNext(LookupHandle
,
255 WsNpLookupServiceBegin(IN PNS_PROVIDER Provider
,
256 IN LPWSAQUERYSETW Restrictions
,
257 IN LPWSASERVICECLASSINFOW ServiceClassInfo
,
258 IN DWORD ControlFlags
,
259 OUT PHANDLE LookupHandle
)
262 return Provider
->Service
.NSPLookupServiceBegin(&Provider
->ProviderId
,