2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS WinSock 2.2 Library
5 * PURPOSE: WinSock 2.2 Main Header
10 #define WINSOCK_ROOT "System\\CurrentControlSet\\Services\\WinSock2\\Parameters"
13 typedef enum _WSASYNCOPS
17 WsAsyncGetProtoByName
,
18 WsAsyncGetProtoByNumber
,
24 typedef struct _WSASYNCBLOCK
26 LIST_ENTRY AsyncQueue
;
61 } WSASYNCBLOCK
, *PWSASYNCBLOCK
;
63 typedef struct _WSASYNCCONTEXT
65 LIST_ENTRY AsyncQueue
;
67 LIST_ENTRY SocketList
;
68 } WSASYNCCONTEXT
, *PWSASYNCCONTEXT
;
70 typedef struct _WSPROTO_BUFFER
73 PCHAR Aliases
[MAXALIASES
];
75 } WSPROTO_BUFFER
, *PWSPROTO_BUFFER
;
77 typedef struct _TPROVIDER
80 WSPPROC_TABLE Service
;
82 } TPROVIDER
, *PTPROVIDER
;
84 typedef struct _TCATALOG_ENTRY
86 LIST_ENTRY CatalogLink
;
89 CHAR DllPath
[MAX_PATH
];
90 WSAPROTOCOL_INFOW ProtocolInfo
;
91 } TCATALOG_ENTRY
, *PTCATALOG_ENTRY
;
93 typedef struct _TCATALOG
95 LIST_ENTRY ProtocolList
;
100 RTL_CRITICAL_SECTION Lock
;
102 } TCATALOG
, *PTCATALOG
;
104 typedef struct _NSPROVIDER
111 } NSPROVIDER
, *PNS_PROVIDER
;
113 typedef struct _NSQUERY_PROVIDER
115 LIST_ENTRY QueryLink
;
116 PNS_PROVIDER Provider
;
118 } NSQUERY_PROVIDER
, *PNSQUERY_PROVIDER
;
120 typedef struct _NSCATALOG_ENTRY
122 LIST_ENTRY CatalogLink
;
124 PNS_PROVIDER Provider
;
130 BOOLEAN StoresServiceClassInfo
;
132 WCHAR DllPath
[MAX_PATH
];
133 } NSCATALOG_ENTRY
, *PNSCATALOG_ENTRY
;
135 typedef struct _NSCATALOG
137 LIST_ENTRY CatalogList
;
141 RTL_CRITICAL_SECTION Lock
;
142 } NSCATALOG
, *PNSCATALOG
;
144 typedef struct _NSQUERY
148 BOOLEAN ShuttingDown
;
149 LIST_ENTRY ProviderList
;
150 PNSQUERY_PROVIDER ActiveProvider
;
151 RTL_CRITICAL_SECTION Lock
;
152 PNSQUERY_PROVIDER CurrentProvider
;
153 LPWSAQUERYSETW QuerySet
;
157 } NSQUERY
, *PNSQUERY
;
159 typedef struct _WSPROCESS
164 HANDLE NotificationHelper
;
165 PTCATALOG ProtocolCatalog
;
166 PNSCATALOG NamespaceCatalog
;
167 HANDLE ProtocolCatalogEvent
;
168 HANDLE NamespaceCatalogEvent
;
171 RTL_CRITICAL_SECTION ThreadLock
;
172 } WSPROCESS
, *PWSPROCESS
;
174 typedef struct _WSTHREAD
177 WSATHREADID WahThreadId
;
179 LPWSPCANCELBLOCKINGCALL CancelBlockingCall
;
180 LPBLOCKINGCALLBACK BlockingCallback
;
181 FARPROC BlockingHook
;
191 } WSTHREAD
, *PWSTHREAD
;
193 typedef struct _WSSOCKET
199 PTCATALOG_ENTRY CatalogEntry
;
203 } WSSOCKET
, *PWSSOCKET
;
205 typedef struct _ENUM_CONTEXT
207 LPWSAQUERYSETW lpqsRestrictions
;
211 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
213 typedef struct _PROTOCOL_ENUM_CONTEXT
216 LPWSAPROTOCOL_INFOW ProtocolBuffer
;
221 } PROTOCOL_ENUM_CONTEXT
, *PPROTOCOL_ENUM_CONTEXT
;
223 typedef struct _WS_BUFFER
228 } WS_BUFFER
, *PWS_BUFFER
;
231 (WINAPI
*PNSCATALOG_ENUMERATE_PROC
)(
233 IN PNSCATALOG_ENTRY Entry
237 (WINAPI
*PTCATALOG_ENUMERATE_PROC
)(
239 IN PTCATALOG_ENTRY Entry
243 (WINAPI
*PWS_SOCK_POST_ROUTINE
)(
250 extern HINSTANCE WsDllHandle
;
251 extern HANDLE WsSockHeap
;
252 extern PWAH_HANDLE_TABLE WsSockHandleTable
;
253 extern PWSPROCESS CurrentWsProcess
;
254 extern DWORD GlobalTlsIndex
;
255 #define TlsIndex GlobalTlsIndex
256 extern BOOLEAN WsAsyncThreadInitialized
;
257 extern PWS_SOCK_POST_ROUTINE WsSockPostRoutine
;
261 AnsiDupFromUnicode(IN LPWSTR UnicodeString
);
265 UnicodeDupFromAnsi(IN LPSTR AnsiString
);
269 WsRasInitializeAutodial(VOID
);
273 WsRasUninitializeAutodial(VOID
);
277 WSAttemptAutodialName(IN CONST LPWSAQUERYSETW lpqsRestrictions
);
281 WSAttemptAutodialAddr(
282 IN CONST SOCKADDR FAR
*Name
,
288 WSNoteSuccessfulHostentLookup(
289 IN CONST CHAR FAR
*Name
,
290 IN CONST ULONG Address
295 MapUnicodeProtocolInfoToAnsi(IN LPWSAPROTOCOL_INFOW UnicodeInfo
,
296 OUT LPWSAPROTOCOL_INFOA AnsiInfo
);
300 MapAnsiQuerySetToUnicode(IN LPWSAQUERYSETA AnsiSet
,
301 IN OUT PSIZE_T SetSize
,
302 OUT LPWSAQUERYSETW UnicodeSet
);
306 MapUnicodeQuerySetToAnsi(OUT LPWSAQUERYSETW UnicodeSet
,
307 IN OUT PSIZE_T SetSize
,
308 IN LPWSAQUERYSETA AnsiSet
);
312 CopyQuerySetW(IN LPWSAQUERYSETW UnicodeSet
,
313 OUT LPWSAQUERYSETW
*UnicodeCopy
);
321 WsSlowPrologTid(OUT LPWSATHREADID
*ThreadId
);
325 WsSockGetSocket(IN SOCKET Handle
);
329 WsApiProlog(OUT PWSPROCESS
*Process
,
330 OUT PWSTHREAD
*Thread
);
334 WsOpenRegistryRoot(VOID
);
338 WsCreateStartupSynchronization(VOID
);
342 WsDestroyStartupSynchronization(VOID
);
346 WsSetupCatalogProtection(IN HKEY CatalogKey
,
347 IN HANDLE CatalogEvent
,
348 OUT LPDWORD UniqueId
);
352 WsCheckCatalogState(IN HANDLE Event
);
360 WsNcDelete(IN PNSCATALOG Catalog
);
364 WsNcInitializeFromRegistry(IN PNSCATALOG Catalog
,
366 IN HANDLE CatalogEvent
);
370 WsNcRefreshFromRegistry(IN PNSCATALOG Catalog
,
371 IN HANDLE CatalogEvent
);
375 WsNcUpdateNamespaceList(IN PNSCATALOG Catalog
,
376 IN PLIST_ENTRY List
);
380 WsNcMatchProtocols(IN DWORD NameSpace
,
381 IN LONG AddressFamily
,
382 IN LPWSAQUERYSETW QuerySet
);
386 WsNcLoadProvider(IN PNSCATALOG Catalog
,
387 IN PNSCATALOG_ENTRY CatalogEntry
);
391 WsNcGetCatalogFromProviderId(IN PNSCATALOG Catalog
,
392 IN LPGUID ProviderId
,
393 OUT PNSCATALOG_ENTRY
*CatalogEntry
);
397 WsNcEnumerateCatalogItems(IN PNSCATALOG Catalog
,
398 IN PNSCATALOG_ENUMERATE_PROC Callback
,
403 WsNcGetServiceClassInfo(IN PNSCATALOG Catalog
,
404 IN OUT LPDWORD BugSize
,
405 IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo
);
409 WsNcEntryAllocate(VOID
);
413 WsNcEntryInitializeFromRegistry(IN PNSCATALOG_ENTRY CatalogEntry
,
419 WsNcEntryDereference(IN PNSCATALOG_ENTRY CatalogEntry
);
423 WsNcEntrySetProvider(IN PNSCATALOG_ENTRY Entry
,
424 IN PNS_PROVIDER Provider
);
430 IN PNS_PROVIDER Provider
439 WsNqBeginEnumerationProc(
441 PNSCATALOG_ENTRY CatalogEntry
446 WsNqDelete(IN PNSQUERY NsQuery
);
450 WsNqInitialize(IN PNSQUERY NsQuery
);
454 WsNqLookupServiceBegin(
456 IN LPWSAQUERYSETW QuerySet
,
457 IN DWORD ControlFlags
,
458 IN PNSCATALOG Catalog
463 WsNqLookupServiceEnd(IN PNSQUERY NsQuery
);
467 WsNqLookupServiceNext(
471 OUT LPWSAQUERYSETW QuerySet
478 IN PNSQUERY_PROVIDER Provider
483 WsNqDereference(IN PNSQUERY Query
);
487 WsNqValidateAndReference(IN PNSQUERY Query
);
491 WsNqPreviousProvider(IN PNSQUERY Query
,
492 IN PNSQUERY_PROVIDER Provider
);
496 WsNqProvLookupServiceNext(
497 IN PNSQUERY_PROVIDER QueryProvider
,
500 LPWSAQUERYSETW QuerySet
505 WsNqProvLookupServiceEnd(IN PNSQUERY_PROVIDER QueryProvider
);
510 IN PNSQUERY_PROVIDER QueryProvider
,
511 IN PNS_PROVIDER Provider
516 WsNqProvAllocate(VOID
);
520 WsNqProvDelete(IN PNSQUERY_PROVIDER QueryProvider
);
524 WsNqProvLookupServiceBegin(
525 IN PNSQUERY_PROVIDER QueryProvider
,
526 IN LPWSAQUERYSETW QuerySet
,
527 IN LPWSASERVICECLASSINFOW ServiceClassInfo
,
533 WsNpDelete(IN PNS_PROVIDER Provider
);
537 WsNpLookupServiceBegin (
538 IN PNS_PROVIDER Provider
,
539 IN LPWSAQUERYSETW Restrictions
,
540 struct _WSAServiceClassInfoW
*,
541 IN DWORD ControlFlags
,
542 OUT PHANDLE LookupHandle
547 WsNpNSPCleanup(IN PNS_PROVIDER Provider
);
551 WsNpLookupServiceEnd(
552 IN PNS_PROVIDER Provider
,
553 IN HANDLE LookupHandle
559 IN PNS_PROVIDER Provider
,
561 IN LPGUID ProviderGuid
570 WsNpDereference(IN PNS_PROVIDER Provider
);
574 WsNpLookupServiceNext(
575 IN PNS_PROVIDER Provider
,
576 IN HANDLE LookupHandle
,
577 IN DWORD ControlFlags
,
578 OUT PDWORD BufferLength
,
579 OUT LPWSAQUERYSETW Results
584 WsTpDelete(IN PTPROVIDER Provider
);
589 IN PTPROVIDER Provider
,
600 IN PTPROVIDER Provider
,
602 LPWSAPROTOCOL_INFOW ProtocolInfo
607 WsTpDereference(IN PTPROVIDER Provider
);
611 WsThreadDelete(IN PWSTHREAD Thread
);
615 WsThreadDestroyCurrentThread(VOID
);
620 IN PWSPROCESS Process
,
626 WsThreadGetCurrentThread(
627 IN PWSPROCESS Process
,
633 WsThreadGetThreadId(IN PWSPROCESS Process
);
637 WsThreadStartup(VOID
);
641 WsThreadCleanup(VOID
);
645 WsThreadCancelBlockingCall(IN PWSTHREAD Thread
);
649 WsThreadUnhookBlockingHook(IN PWSTHREAD Thread
);
653 WsThreadSetBlockingHook(IN PWSTHREAD Thread
,
654 IN FARPROC BlockingHook
);
659 WsThreadBlobToHostent(IN PWSTHREAD Thread
,
664 WsThreadBlobToServent(IN PWSTHREAD Thread
,
669 WsThreadGetProtoBuffer(IN PWSTHREAD Thread
);
673 WsThreadAllocate(VOID
);
677 WsThreadDefaultBlockingHook(VOID
);
683 IN PWSPROCESS Process
688 WsTcFindIfsProviderForSocket(IN PTCATALOG TCatalog
, SOCKET Socket
);
692 WsTcEntryInitializeFromRegistry(IN PTCATALOG_ENTRY CatalogEntry
, IN HKEY
, unsigned long);
696 WsTcGetEntryFromAf(IN PTCATALOG TCatalog
, IN INT AddressFamily
, IN PTCATALOG_ENTRY
*CatalogEntry
);
700 WsTcEntryAllocate(VOID
);
704 WsTcEntrySetProvider(IN PTCATALOG_ENTRY CatalogEntry
, IN PTPROVIDER Provider
);
708 WsTcRefreshFromRegistry(IN PTCATALOG TCatalog
, PVOID
);
712 WsTcOpen(IN PTCATALOG TCatalog
, IN HKEY
);
716 WsTcFindProvider(IN PTCATALOG TCatalog
, IN LPGUID ProviderId
);
720 WsTcEnumerateCatalogItems(IN PTCATALOG Catalog
,
721 IN PTCATALOG_ENUMERATE_PROC Callback
,
726 WsTcEntryDereference(IN PTCATALOG_ENTRY CatalogEntry
);
734 WsTcDelete(IN PTCATALOG Catalog
);
738 WsTcGetEntryFromTriplet(IN PTCATALOG TCatalog
, IN INT AddressFamily
, IN INT SocketType
, IN INT Protocol
, IN DWORD StartId
, IN PTCATALOG_ENTRY
*CatalogEntry
);
742 WsTcUpdateProtocolList(IN PTCATALOG TCatalog
, PLIST_ENTRY ProtocolList
);
746 WsTcEntryDelete(IN PTCATALOG_ENTRY CatalogEntry
);
750 WsTcGetEntryFromCatalogEntryId(IN PTCATALOG TCatalog
, IN DWORD CatalogEntryId
, IN PTCATALOG_ENTRY
*CatalogEntry
);
754 WsTcLoadProvider(IN PTCATALOG TCatalog
, IN PTCATALOG_ENTRY CatalogEntry
);
758 WsTcInitializeFromRegistry(IN PTCATALOG TCatalog
, HKEY
, PVOID
);
770 WsSockDeleteSockets(IN LPVOID Context
,
771 IN PWAH_HANDLE Handle
);
775 WsSockDereference(IN PWSSOCKET Socket
);
779 WsSockAllocate(VOID
);
783 WsSockInitialize(IN PWSSOCKET Socket
,
784 IN PTCATALOG_ENTRY CatalogEntry
);
788 WsSockAssociateHandle(IN PWSSOCKET Socket
,
790 IN BOOLEAN IsProvider
);
794 WsSockDisassociateHandle(IN PWSSOCKET Socket
);
798 WsSockAddApiReference(IN SOCKET Handle
);
802 WsProcGetTCatalog(IN PWSPROCESS Process
);
806 WsProcDetachSocket(IN PWSPROCESS Process
,
807 IN PWAH_HANDLE Handle
);
811 WsProcGetAsyncHelper(IN PWSPROCESS Process
,
816 WsProcDelete(IN PWSPROCESS Process
);
824 WsProcGetNsCatalog(IN PWSPROCESS Process
);
828 WsProcSetVersion(IN PWSPROCESS Process
,
829 IN WORD VersionRequested
);
833 WsAsyncQueueRequest(IN PWSASYNCBLOCK AsyncBlock
);
837 WsAsyncCheckAndInitThread(VOID
);
841 WsAsyncCancelRequest(IN HANDLE TaskHandle
);
845 WsAsyncAllocateBlock(IN SIZE_T ExtraLength
);
849 WsAsyncTerminateThread(VOID
);
853 WsAsyncGlobalTerminate(VOID
);
857 WsAsyncGlobalInitialize(VOID
);
863 return CurrentWsProcess
;
870 /* Try to see if we're initialized. If not, do the full prolog */
871 return WsGetProcess() ? ERROR_SUCCESS
: WsSlowProlog();
876 WsQuickPrologTid(LPWSATHREADID
*Tid
)
878 /* Try to see if we're initialized. If not, do the full prolog */
879 if ((WsGetProcess()) && (*Tid
= WsThreadGetThreadId(WsGetProcess())))
881 return ERROR_SUCCESS
;
885 return WsSlowPrologTid(Tid
);