www.pudn.com > xiflter_2.0.rar > TcpIpdog.cpp
/*============================================================================ 文件: TcpIpDog.cpp 说明: --------------------------------------------------- 最小化的 Winsock 2 SPI 服务提供者 --------------------------------------------------- 工程: MinWinsockSpi 作者: 朱雁辉,朱雁冰 创建日期: 2001/08/21 网址: http://www.xfilt.com 电子邮件: xstudio@xfilt.com 版权所有 (c) 2001-2002 X 工作室 警告: --------------------------------------------------- 本电脑程序受著作权法的保护。未经授权,不能使用 和修改本软件全部或部分源代码。凡擅自复制、盗用或散 布此程序或部分程序或者有其它任何越权行为,将遭到民 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。 凡通过合法途径购买本软件源代码的用户被默认授权 可以在自己的程序中使用本软件的部分代码,但作者不对 代码产生的任何后果负责。 使用了本软件代码的程序只能以可执行文件形式发布, 未经特别许可,不能将含有本软件源代码的源程序以任何 形式发布。 --------------------------------------------------- */ //—————————————————————————————————————— // #include#include #include // // 用来保存系统服务提供者路径信息的自定义注册表键值 // #define REG_INSTALL_KEY \ _T("SYSTEM\\CurrentControlSet\\Services\\WinSock2\\Xstudio_Min_Winsock_Spi") // // 全局变量,用来保存系统服务提供者30个服务函数指针 // WSPPROC_TABLE NextProcTable ; void GetRightEntryIdItem( IN WSAPROTOCOL_INFOW *pProtocolInfo, OUT TCHAR *sItem ) { if(pProtocolInfo->ProtocolChain.ChainLen <= 1) { _stprintf(sItem, _T("%u"), pProtocolInfo->dwCatalogEntryId); } else { _stprintf(sItem, _T("%u"), pProtocolInfo->ProtocolChain .ChainEntries[pProtocolInfo->ProtocolChain.ChainLen - 1]); } } BOOL GetHookProvider( IN WSAPROTOCOL_INFOW *pProtocolInfo, OUT TCHAR *sPathName ) { TCHAR sItem[21]; GetRightEntryIdItem(pProtocolInfo, sItem); HKEY hSubkey; DWORD ulDateLenth = MAX_PATH; TCHAR sTemp[MAX_PATH]; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE , REG_INSTALL_KEY, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS) return FALSE; if (RegQueryValueEx(hSubkey, sItem, 0, NULL, (BYTE*)sTemp, &ulDateLenth) || ExpandEnvironmentStrings(sTemp, sPathName, ulDateLenth) == 0) return FALSE; if(sPathName[0] == '\0' && sTemp[0] != '\0') _tcscpy(sPathName, sTemp); RegCloseKey(hSubkey); return TRUE; } SOCKET WSPAPI WSPSocket( int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g, DWORD dwFlags, LPINT lpErrno ) { OutputDebugString(_T("MinWinsockSpi.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("MinWinsockSpi.dll: WSPStartup...\n")); TCHAR sLibraryPath[512]; LPWSPSTARTUP WSPStartupFunc = NULL; HMODULE hLibraryHandle = NULL; INT ErrorCode = 0; if (!GetHookProvider(lpProtocolInfo, sLibraryPath) || (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL || (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress( hLibraryHandle, "WSPStartup")) == NULL ) return WSAEPROVIDERFAILEDINIT; if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData , lpProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS) return ErrorCode; NextProcTable = *lpProcTable; lpProcTable->lpWSPSocket = WSPSocket; return 0; }