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