?? tcpipdog.cpp
字號:
/*============================================================================
文件: TcpIpDog.cpp
說明:
---------------------------------------------------
最小化的 Winsock 2 SPI 服務提供者
---------------------------------------------------
工程: MinWinsockSpi
作者: 朱雁輝,朱雁冰
創建日期: 2001/08/21
網址: http://www.xfilt.com
電子郵件: xstudio@xfilt.com
版權所有 (c) 2001-2002 X 工作室
警告:
---------------------------------------------------
本電腦程序受著作權法的保護。未經授權,不能使用
和修改本軟件全部或部分源代碼。凡擅自復制、盜用或散
布此程序或部分程序或者有其它任何越權行為,將遭到民
事賠償及刑事的處罰,并將依法以最高刑罰進行追訴。
凡通過合法途徑購買本軟件源代碼的用戶被默認授權
可以在自己的程序中使用本軟件的部分代碼,但作者不對
代碼產生的任何后果負責。
使用了本軟件代碼的程序只能以可執行文件形式發布,
未經特別許可,不能將含有本軟件源代碼的源程序以任何
形式發布。
---------------------------------------------------
*/
//——————————————————————————————————————
//
#include <afxwin.h>
#include <ws2spi.h>
#include <io.h>
//
// 用來保存系統服務提供者路徑信息的自定義注冊表鍵值
//
#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;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -