00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _INSTLSP_H_
00022 #define _INSTLSP_H_
00023
00024 #include <winsock2.h>
00025 #include <mswsock.h>
00026 #include <ws2spi.h>
00027 #include <objbase.h>
00028 #include <rpc.h>
00029 #include <rpcdce.h>
00030 #include <sporder.h>
00031 #include <winnt.h>
00032 #include <windows.h>
00033 #include <strsafe.h>
00034 #ifndef _PSDK_BLD
00035 #include "lspcommon.h"
00036 #else
00037 #include "..\common\lspcommon.h"
00038 #endif
00039 #include <stdio.h>
00040 #include <stdlib.h>
00041
00042 #define DEFAULT_LSP_NAME "Test LSP2"
00043
00044 #define LAYERED_CHAIN ( BASE_PROTOCOL + 1 )
00045
00046 #define UPDATE_LSP_ENTRY 0
00047
00048 #define MAX(a,b) ( (a) > (b) ? (a) : (b) )
00049 #define MIN(a,b) ( (a) < (b) ? (a) : (b) )
00050
00051 typedef int (WSAAPI * LPWSCINSTALLPROVIDERANDCHAINS)(
00052 LPGUID lpProviderId,
00053 LPWSTR lpszProviderDllPath,
00054 LPWSTR lpszLspName,
00055 DWORD dwServiceFlags,
00056 LPWSAPROTOCOL_INFOW lpProtocolInfoList,
00057 DWORD dwNumberOfEntries,
00058 LPDWORD lpdwCatalogEntryId,
00059 LPINT lpErrno
00060 );
00061
00062
00063
00064 typedef struct _LSP_ENTRY
00065 {
00066 WCHAR wszLspDll[ MAX_PATH ];
00067 WSAPROTOCOL_INFOW DummyEntry;
00068
00069 BOOL OrphanedEntries;
00070
00071
00072 WSAPROTOCOL_INFOW *LayeredEntries;
00073 int Count;
00074
00075 int *LayerChanged;
00076
00077
00078 GUID *LayeredGuids;
00079
00080
00081
00082 int LayeredGuidCount;
00083
00084 int MaxChainLength;
00085
00086 int LspOrder;
00087
00088
00089
00090 int DependentCount;
00091 int *DependentLspIndexArray;
00092
00093 } LSP_ENTRY;
00094
00095
00096
00097
00098
00099
00100 extern LPWSCUPDATEPROVIDER fnWscUpdateProvider,
00101 fnWscUpdateProvider32;
00102 extern HMODULE gModule;
00103 extern GUID gProviderGuid;
00104
00105
00106
00107
00108
00109
00110
00111
00112 int
00113 InstallLsp(
00114 WINSOCK_CATALOG eCatalog,
00115 __in_z char *lpszLspName,
00116 __in_z char *lpszLspPathAndFile,
00117 DWORD dwCatalogIdArrayCount,
00118 DWORD *pdwCatalogIdArray,
00119 BOOL IfsProvider,
00120 BOOL InstallOverAll
00121 );
00122
00123
00124 int
00125 InstallProvider(
00126 WINSOCK_CATALOG Catalog,
00127 GUID *Guid,
00128 __in_z WCHAR *lpwszLspPath,
00129 WSAPROTOCOL_INFOW *pProvider,
00130 INT iProviderCount
00131 );
00132
00133 int
00134 InstallProviderVista(
00135 WINSOCK_CATALOG eCatalog,
00136 __in_z WCHAR *lpszLspName,
00137 __in_z WCHAR *lpszLspPathAndFile,
00138 GUID *providerGuid,
00139 DWORD dwCatalogIdArrayCount,
00140 DWORD *pdwCatalogIdArray,
00141 BOOL IfsProvider,
00142 BOOL InstallOverAll
00143 );
00144
00145
00146 WSAPROTOCOL_INFOW *
00147 CreateDummyEntry(
00148 WINSOCK_CATALOG Catalog,
00149 INT CatalogId,
00150 __in_z WCHAR *lpwszLspName,
00151 BOOL IfsProvider
00152 );
00153
00154 int
00155 InstallIfsLspProtocolChains(
00156 WINSOCK_CATALOG eCatalog,
00157 GUID *Guid,
00158 __in_z WCHAR *lpszLspName,
00159 __in_z WCHAR *lpszLspFullPathAndFile,
00160 DWORD *pdwCatalogIdArray,
00161 DWORD dwCatalogIdArrayCount
00162 );
00163
00164 int
00165 InstallNonIfsLspProtocolChains(
00166 WINSOCK_CATALOG eCatalog,
00167 GUID *Guid,
00168 __in_z WCHAR *lpszLspName,
00169 __in_z WCHAR *lpszLspFullPathAndFile,
00170 DWORD *pdwCatalogIdArray,
00171 DWORD dwCatalogIdArrayCount
00172 );
00173
00174 int
00175 InsertIfsLspIntoAllChains(
00176 WSAPROTOCOL_INFOW *OriginalEntry,
00177 WSAPROTOCOL_INFOW *Catalog,
00178 int CatalogCount,
00179 int IfsEntryIdx,
00180 int ChainIdx
00181 );
00182
00183
00184
00185 int
00186 ReorderCatalog(
00187 WINSOCK_CATALOG Catalog,
00188 DWORD dwLayeredId
00189 );
00190
00191
00192 DWORD *
00193 ReorderACatalog(
00194 WINSOCK_CATALOG Catalog,
00195 DWORD dwLayerId,
00196 INT *dwEntryCount
00197 );
00198
00199
00200 int
00201 WriteProviderOrder(
00202 WINSOCK_CATALOG Catalog,
00203 DWORD *pdwCatalogOrder,
00204 DWORD dwNumberOfEntries,
00205 INT *lpErrno
00206 );
00207
00208
00209
00210
00211
00212
00213
00214
00215 int
00216 RemoveAllLayeredEntries(
00217 WINSOCK_CATALOG Catalog
00218 );
00219
00220
00221 int
00222 DeinstallProvider(
00223 WINSOCK_CATALOG Catalog,
00224 GUID *Guid
00225 );
00226
00227
00228
00229 int
00230 UpdateProvider(
00231 WINSOCK_CATALOG Catalog,
00232 LPGUID ProviderId,
00233 WCHAR *DllPath,
00234 WSAPROTOCOL_INFOW *ProtocolInfoList,
00235 DWORD NumberOfEntries,
00236 LPINT lpErrno
00237 );
00238
00239
00240 int
00241 RemoveProvider(
00242 WINSOCK_CATALOG Catalog,
00243 DWORD dwProviderId
00244 );
00245
00246
00247
00248
00249
00250
00251
00252
00253 void
00254 PrintProviders(
00255 WINSOCK_CATALOG Catalog,
00256 BOOL bLayeredOnly,
00257 BOOL bVerbose
00258 );
00259
00260
00261 LSP_ENTRY *
00262 BuildLspMap(
00263 WSAPROTOCOL_INFOW *pProviders,
00264 int iProviderCount,
00265 int *pLspCount
00266 );
00267
00268
00269 void
00270 PrintLspMap(
00271 LSP_ENTRY *pLspMap,
00272 int iLspCount
00273 );
00274
00275
00276 void
00277 FreeLspMap(
00278 LSP_ENTRY *pLspMap,
00279 int iLspCount
00280 );
00281
00282
00283 int
00284 LspDependencyCheck(
00285 LSP_ENTRY *pLspMap,
00286 int iLspCount
00287 );
00288
00289
00290 void
00291 UpdateLspMap(
00292 LSP_ENTRY *pLspMap,
00293 DWORD dwOldValue,
00294 DWORD dwNewValue
00295 );
00296
00297
00298 void
00299 MapNewEntriesToOld(
00300 LSP_ENTRY *pEntry,
00301 WSAPROTOCOL_INFOW *pProvider,
00302 int iProviderCount
00303 );
00304
00305
00306 int
00307 AddGuidToLspEntry(
00308 LSP_ENTRY *entry,
00309 GUID *guid,
00310 int *lpErrno
00311 );
00312
00313
00314 void
00315 UpdateProviderOrder(
00316 LSP_ENTRY *UpdatedEntry,
00317 DWORD *OrderArray,
00318 int ArrayCount
00319 );
00320
00321
00322 int
00323 MaxLayeredChainCount(
00324 LSP_ENTRY *pLspMap,
00325 int LspCount
00326 );
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 BOOL
00337 RemoveIdFromChain(
00338 WSAPROTOCOL_INFOW *pInfo,
00339 DWORD dwCatalogId
00340 );
00341
00342
00343 BOOL
00344 IsIdInChain(
00345 WSAPROTOCOL_INFOW *pInfo,
00346 DWORD dwId
00347 );
00348
00349
00350 int
00351 GetProviderCount(
00352 WSAPROTOCOL_INFOW *pProviders,
00353 int iProviderCount,
00354 int iProviderType
00355 );
00356
00357
00358 int
00359 GetLayeredEntriesByGuid(
00360 WSAPROTOCOL_INFOW *pMatchLayers,
00361 int *iLayeredCount,
00362 WSAPROTOCOL_INFOW *pEntries,
00363 int iEntryCount,
00364 GUID *MatchGuid
00365 );
00366
00367
00368 BOOL
00369 IsEqualProtocolEntries(
00370 WSAPROTOCOL_INFOW *pInfo1,
00371 WSAPROTOCOL_INFOW *pInfo2
00372 );
00373
00374
00375 int
00376 RetrieveLspGuid(
00377 __in_z char *LspPath,
00378 GUID *Guid
00379 );
00380
00381
00382 BOOL
00383 IsNonIfsProvider(
00384 WSAPROTOCOL_INFOW *pProvider,
00385 int iProviderCount,
00386 DWORD dwProviderId
00387 );
00388
00389
00390 HMODULE
00391 LoadUpdateProviderFunction(
00392 );
00393
00394
00395 int
00396 CountOrphanedChainEntries(
00397 WSAPROTOCOL_INFOW *pCatalog,
00398 int iCatalogCount
00399 );
00400
00401 WSAPROTOCOL_INFOW *
00402 FindProviderById(
00403 DWORD CatalogId,
00404 WSAPROTOCOL_INFOW *Catalog,
00405 int CatalogCount
00406 );
00407
00408 WSAPROTOCOL_INFOW *
00409 FindProviderByGuid(
00410 GUID *Guid,
00411 WSAPROTOCOL_INFOW *Catalog,
00412 int CatalogCount
00413 );
00414
00415 DWORD
00416 GetCatalogIdForProviderGuid(
00417 GUID *Guid,
00418 WSAPROTOCOL_INFOW *Catalog,
00419 int CatalogCount
00420 );
00421
00422 DWORD
00423 FindDummyIdFromProtocolChainId(
00424 DWORD CatalogId,
00425 WSAPROTOCOL_INFOW *Catalog,
00426 int CatalogCount
00427 );
00428
00429 void
00430 InsertIdIntoProtocolChain(
00431 WSAPROTOCOL_INFOW *Entry,
00432 int Index,
00433 DWORD InsertId
00434 );
00435
00436 void
00437 BuildSubsetLspChain(
00438 WSAPROTOCOL_INFOW *Entry,
00439 int Index,
00440 DWORD DummyId
00441 );
00442 #endif