00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _INSTALL_H_
00019 #define _INSTALL_H_
00020
00021 #include <winsock2.h>
00022 #include <ws2spi.h>
00023
00024
00025 #define __in_z
00026
00027
00028
00029 #define WINSOCK_DLL "\\ws2_32.dll"
00030
00031
00032
00033
00034
00035
00036
00037
00038 extern HANDLE gLspHeap;
00039
00040
00041 extern GUID gProviderGuid;
00042
00043
00044 extern CRITICAL_SECTION gDebugCritSec;
00045
00046
00047 typedef
00048 void (*LPFN_GETLSPGUID) (GUID *lpGuid);
00049
00050
00051 typedef enum
00052 {
00053 LspCatalogBoth = 0,
00054 LspCatalog32Only,
00055 LspCatalog64Only
00056 } WINSOCK_CATALOG;
00057
00058
00059
00060
00061 typedef struct _EXT_WSPPROC_TABLE
00062 {
00063 LPFN_ACCEPTEX lpfnAcceptEx;
00064 LPFN_TRANSMITFILE lpfnTransmitFile;
00065 LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs;
00066 LPFN_TRANSMITPACKETS lpfnTransmitPackets;
00067 LPFN_CONNECTEX lpfnConnectEx;
00068 LPFN_DISCONNECTEX lpfnDisconnectEx;
00069 LPFN_WSARECVMSG lpfnWSARecvMsg;
00070 } EXT_WSPPROC_TABLE;
00071
00072
00073
00074
00075
00076
00077 typedef struct _PROVIDER
00078 {
00079 WSAPROTOCOL_INFOW NextProvider,
00080 LayerProvider;
00081 WSPPROC_TABLE NextProcTable;
00082 EXT_WSPPROC_TABLE NextProcTableExt;
00083
00084 DWORD LspDummyId;
00085
00086 WCHAR ProviderPathW[MAX_PATH],
00087 LibraryPathW[MAX_PATH];
00088 INT ProviderPathLen;
00089
00090 LPWSPSTARTUP fnWSPStartup;
00091 WSPDATA WinsockVersion;
00092 HMODULE Module;
00093
00094 INT StartupCount;
00095
00096 LIST_ENTRY SocketList;
00097
00098 CRITICAL_SECTION ProviderCritSec;
00099 } PROVIDER, * LPPROVIDER;
00100
00101
00102
00103
00104
00105
00106
00107
00108 BOOL
00109 FindLspEntries(
00110 PROVIDER **lspProviders,
00111 int *lspProviderCount,
00112 int *lpErrno
00113 );
00114
00115 PROVIDER *
00116 FindMatchingLspEntryForProtocolInfo(
00117 WSAPROTOCOL_INFOW *inInfo,
00118 PROVIDER *lspProviders,
00119 int lspCount,
00120 BOOL fromStartup = FALSE
00121 );
00122
00123
00124 int
00125 InitializeProvider(
00126 PROVIDER *provider,
00127 WORD wVersion,
00128 WSAPROTOCOL_INFOW *lpProtocolInfo,
00129 WSPUPCALLTABLE UpCallTable,
00130 int *Error
00131 );
00132
00133 BOOL
00134 LoadProviderPath(
00135 PROVIDER *loadProvider,
00136 int *lpErrno
00137 );
00138
00139
00140 int
00141 VerifyProcTable(
00142 LPWSPPROC_TABLE lpProcTable
00143 );
00144
00145
00146 LPWSAPROTOCOL_INFOW
00147 EnumerateProviders(
00148 WINSOCK_CATALOG Catalog,
00149 LPINT TotalProtocols
00150 );
00151
00152
00153 int
00154 EnumerateProvidersExisting(
00155 WINSOCK_CATALOG Catalog,
00156 WSAPROTOCOL_INFOW *ProtocolInfo,
00157 LPDWORD ProtocolInfoSize
00158 );
00159
00160
00161 void
00162 FreeProviders(
00163 LPWSAPROTOCOL_INFOW ProtocolInfo
00164 );
00165
00166
00167 void
00168 PrintProtocolInfo(
00169 WSAPROTOCOL_INFOW *ProtocolInfo
00170 );
00171
00172
00173 void *
00174 LspAlloc(
00175 SIZE_T size,
00176 int *lpErrno
00177 );
00178
00179
00180 void
00181 LspFree(
00182 LPVOID buf
00183 );
00184
00185
00186 int
00187 LspCreateHeap(
00188 int *lpErrno
00189 );
00190
00191
00192 void
00193 LspDestroyHeap(
00194 );
00195
00196
00197 #ifdef _PSDK_BLD
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 #ifndef CONTAINING_RECORD
00212 #define CONTAINING_RECORD(address, type, field) \
00213 ((type *)((PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field)))
00214 #endif
00215
00216
00217 #ifndef InitializeListHead
00218
00219
00220
00221
00222
00223
00224
00225 #define InitializeListHead(ListHead) (\
00226 (ListHead)->Flink = (ListHead)->Blink = (ListHead))
00227
00228
00229
00230
00231
00232
00233
00234
00235 #define IsListEmpty(ListHead) \
00236 ((ListHead)->Flink == (ListHead))
00237
00238
00239
00240
00241
00242
00243
00244
00245 #define RemoveHeadList(ListHead) \
00246 (ListHead)->Flink;\
00247 {RemoveEntryList((ListHead)->Flink)}
00248
00249
00250
00251
00252
00253
00254
00255
00256 #define RemoveTailList(ListHead) \
00257 (ListHead)->Blink;\
00258 {RemoveEntryList((ListHead)->Blink)}
00259
00260
00261
00262
00263
00264
00265
00266
00267 #define RemoveEntryList(Entry) {\
00268 PLIST_ENTRY _EX_Blink;\
00269 PLIST_ENTRY _EX_Flink;\
00270 _EX_Flink = (Entry)->Flink;\
00271 _EX_Blink = (Entry)->Blink;\
00272 _EX_Blink->Flink = _EX_Flink;\
00273 _EX_Flink->Blink = _EX_Blink;\
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 #define InsertTailList(ListHead,Entry) {\
00285 PLIST_ENTRY _EX_Blink;\
00286 PLIST_ENTRY _EX_ListHead;\
00287 _EX_ListHead = (ListHead);\
00288 _EX_Blink = _EX_ListHead->Blink;\
00289 (Entry)->Flink = _EX_ListHead;\
00290 (Entry)->Blink = _EX_Blink;\
00291 _EX_Blink->Flink = (Entry);\
00292 _EX_ListHead->Blink = (Entry);\
00293 }
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 #define InsertHeadList(ListHead,Entry) {\
00304 PLIST_ENTRY _EX_Flink;\
00305 PLIST_ENTRY _EX_ListHead;\
00306 _EX_ListHead = (ListHead);\
00307 _EX_Flink = _EX_ListHead->Flink;\
00308 (Entry)->Flink = _EX_Flink;\
00309 (Entry)->Blink = _EX_ListHead;\
00310 _EX_Flink->Blink = (Entry);\
00311 _EX_ListHead->Flink = (Entry);\
00312 }
00313
00314
00315
00316 BOOL IsNodeOnList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry);
00317
00318
00319 #endif //InitializeListHead
00320
00321
00322 #endif
00323
00324
00325
00326
00327
00328
00329
00330
00331 #ifdef ASSERT
00332 #undef ASSERT
00333 #endif
00334
00335 #ifdef DBG
00336
00337
00338 void
00339 dbgprint(
00340 char *format,
00341 ...
00342 );
00343
00344 #define ASSERT(exp) \
00345 if ( !(exp) ) \
00346 dbgprint("\n*** Assertion failed: %s\n" \
00347 "*** Source file: %s, line: %d\n\n", \
00348 #exp,__FILE__,__LINE__), DebugBreak()
00349 #else
00350
00351
00352 #define ASSERT(exp)
00353 #define dbgprint
00354
00355 #endif
00356
00357 #endif