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; 
}