www.pudn.com > xiflter_2.0.rar > TcpIpdog.cpp
/*============================================================================ 文件: TcpIpDog.cpp 说明: --------------------------------------------------- 最小化的 Winsock 2 SPI 传输服务提供者 --------------------------------------------------- 工程: MinLSP 作者: 朱雁辉,朱雁冰 创建日期: 2001/08/21 网址: http://www.xfilt.com 电子邮件: xstudio@xfilt.com 版权所有 (c) 2001-2002 X 工作室 警告: --------------------------------------------------- 本电脑程序受著作权法的保护。未经授权,不能使用 和修改本软件全部或部分源代码。凡擅自复制、盗用或散 布此程序或部分程序或者有其它任何越权行为,将遭到民 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。 凡通过合法途径购买本软件源代码的用户被默认授权 可以在自己的程序中使用本软件的部分代码,但作者不对 代码产生的任何后果负责。 使用了本软件代码的程序只能以可执行文件形式发布, 未经特别许可,不能将含有本软件源代码的源程序以任何 形式发布。 --------------------------------------------------- */ //—————————————————————————————————————— // 使用Unicode编码 // #define UNICODE #define _UNICODE #include#include #include #include #include // // 全局变量,用来保存系统服务提供者30个服务函数指针 // WSPPROC_TABLE NextProcTable ; // // 全局变量,用来临时保存全部服务提供者的信息 // LPWSAPROTOCOL_INFOW ProtocolInfo = NULL; DWORD ProtocolInfoSize = 0; INT TotalProtocols = 0; BOOL GetProviders() { INT ErrorCode; ProtocolInfo = NULL; ProtocolInfoSize = 0; TotalProtocols = 0; if (WSCEnumProtocols(NULL, ProtocolInfo, &ProtocolInfoSize , &ErrorCode) == SOCKET_ERROR && ErrorCode != WSAENOBUFS) { printf("First WSCEnumProtocols failed %d\n", ErrorCode); return(FALSE); } if ((ProtocolInfo = (LPWSAPROTOCOL_INFOW) GlobalAlloc(GPTR, ProtocolInfoSize)) == NULL) { printf("Cannot enumerate Protocols %d\n", GetLastError()); return(FALSE); } if ((TotalProtocols = WSCEnumProtocols(NULL , ProtocolInfo, &ProtocolInfoSize, &ErrorCode)) == SOCKET_ERROR) { printf("Second WSCEnumProtocols failed %d\n", ErrorCode); return(FALSE); } printf("Found %d protocols\n",TotalProtocols); return(TRUE); } void FreeProviders(void) { GlobalFree(ProtocolInfo); } BOOL GetHookProvider( IN WSAPROTOCOL_INFOW *pProtocolInfo, OUT TCHAR *sPathName, OUT WSAPROTOCOL_INFOW *pNextProtocolInfo ) { if(pProtocolInfo->ProtocolChain.ChainLen <= 1) return FALSE; GetProviders(); __try { for(int i = pProtocolInfo->ProtocolChain.ChainLen - 1; i > 0; i--) { for(int j = 0; j < TotalProtocols; j++) { if(pProtocolInfo->ProtocolChain.ChainEntries[i] == ProtocolInfo[j].dwCatalogEntryId) { INT iErrno, iProviderPathLen = MAX_PATH; if(WSCGetProviderPath(&ProtocolInfo[j].ProviderId , sPathName, &iProviderPathLen, &iErrno) == SOCKET_ERROR) return FALSE; if (!ExpandEnvironmentStrings(sPathName, sPathName, MAX_PATH)) return FALSE; memcpy(pNextProtocolInfo , pProtocolInfo, sizeof(WSAPROTOCOL_INFOW)); return TRUE; } } } } __finally { FreeProviders(); } return FALSE; } SOCKET WSPAPI WSPSocket( int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno ) { OutputDebugString(_T("MinLSP.DLL: WSPSocket ...\n")); return NextProcTable.lpWSPSocket( af, type, protocol, lpProtocolInfo, g, dwFlags, lpErrno); } BOOL WINAPI DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } int WSPAPI WSPStartup( WORD wVersionRequested, LPWSPDATA lpWSPData, LPWSAPROTOCOL_INFOW lpProtocolInfo, WSPUPCALLTABLE upcallTable, LPWSPPROC_TABLE lpProcTable ) { OutputDebugString(_T("MinLSP.DLL: WSPStartup...\n")); TCHAR sLibraryPath[MAX_PATH]; LPWSPSTARTUP WSPStartupFunc = NULL; HMODULE hLibraryHandle = NULL; INT ErrorCode = 0; WSAPROTOCOL_INFOW NextProtocolInfo; if (!GetHookProvider(lpProtocolInfo, sLibraryPath, &NextProtocolInfo) || (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL || (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress( hLibraryHandle, "WSPStartup")) == NULL ) return WSAEPROVIDERFAILEDINIT; if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData , &NextProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS) return ErrorCode; NextProcTable = *lpProcTable; lpProcTable->lpWSPSocket = WSPSocket; return 0; }