📄 tcpipdog.cpp
字号:
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;
}
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]);
}
void XfShutdown(SOCKET s)
{
int iError;
if(NextProcTable.lpWSPShutdown(s, SD_BOTH, &iError) != 0)
WSASetLastError(iError);
}
//=============================================================================================
//Winsock 2 service provider hook functions
SOCKET WSPAPI WSPSocket(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFOW lpProtocolInfo,
GROUP g,
DWORD dwFlags,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPSocket ..."));
SOCKET s = NextProcTable.lpWSPSocket(af, type, protocol, lpProtocolInfo, g, dwFlags, lpErrno);
if(s == INVALID_SOCKET)
return s;
if (af == FROM_PROTOCOL_INFO)
af = lpProtocolInfo->iAddressFamily;
if (type == FROM_PROTOCOL_INFO)
type = lpProtocolInfo->iSocketType;
if (protocol == FROM_PROTOCOL_INFO)
protocol = lpProtocolInfo->iProtocol;
m_CheckAcl.CheckSocket(s, af, type, protocol);
return s;
}
int WSPAPI WSPCloseSocket(
SOCKET s,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPCloseSocket ..."));
m_CheckAcl.CheckCloseSocket(s);
return NextProcTable.lpWSPCloseSocket(s, lpErrno);
}
int WSPAPI WSPConnect(
SOCKET s,
const struct sockaddr FAR * name,
int namelen,
LPWSABUF lpCallerData,
LPWSABUF lpCalleeData,
LPQOS lpSQOS,
LPQOS lpGQOS,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPConnect ..."));
if(m_CheckAcl.CheckConnect(s, name, namelen) != XF_PASS)
{
ODS2(_T("Deny the application "), m_sProcessName);
*lpErrno = WSAECONNREFUSED;
return SOCKET_ERROR;
}
return NextProcTable.lpWSPConnect(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, lpErrno);
}
SOCKET WSPAPI WSPAccept(
SOCKET s,
struct sockaddr FAR *addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondition,
DWORD dwCallbackData,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPAccept ..."));
SOCKET news = NextProcTable.lpWSPAccept(s, addr, addrlen, lpfnCondition, dwCallbackData, lpErrno);
if (news != INVALID_SOCKET && m_CheckAcl.CheckAccept(s, news) != XF_PASS)
{
int iError;
if(NextProcTable.lpWSPCloseSocket(news, &iError) != 0)
WSASetLastError(iError);
// v1.0.2 add 2001-12-22
*lpErrno = 0;
}
return news;
}
int WSPAPI WSPSend(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPSend ..."));
if (m_CheckAcl.CheckSend(s, lpBuffers[0].buf, lpBuffers[0].len, lpNumberOfBytesSent) != XF_PASS)
{
XfShutdown(s);
*lpErrno = WSAECONNABORTED;
return SOCKET_ERROR;
}
return NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped
, lpCompletionRoutine, lpThreadId, lpErrno);
}
int WSPAPI WSPSendTo(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
const struct sockaddr FAR * lpTo,
int iTolen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPSendTo ..."));
if (m_CheckAcl.CheckSendTo(s, lpTo, lpBuffers[0].buf, lpBuffers[0].len, lpNumberOfBytesSent) != XF_PASS)
{
XfShutdown(s);
*lpErrno = WSAECONNABORTED;
return SOCKET_ERROR;
}
return NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpTo
, iTolen, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
}
int WSPAPI WSPRecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPRecv ..."));
//
// 2001-12-24 add, 如果是重叠操作且设置了回调函数,则首先用自定义函数
// AddOverlapped保存原来的参数信息,然后用自己的回调函数接管原来的回
// 调函数,并设置标志为IsSetCompletionRoutine
//
BOOL IsSetCompletionRoutine = FALSE;
if(lpOverlapped && lpCompletionRoutine && m_Overlapped.AddOverlapped(s
, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags
, lpOverlapped, lpCompletionRoutine, NULL, NULL, 0/*WSPRecv*/)
)
{
lpCompletionRoutine = CompletionRoutine;
IsSetCompletionRoutine = TRUE;
}
//
// 2001-12-22 修改,这里有一个BUG,原来参数dwBufferCount为 1
// 现在重新更改为dwBufferCount
//
int iRet = NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped
, lpCompletionRoutine, lpThreadId, lpErrno);
//
// 返回SOCKET_ERROR有两种情况:
// 1. 有错误发生
// 2. 没有立即返回:没有立即返回可能是由于重叠操作造成,如果lpErrno为
// WSA_IO_PENDING 则表示重叠操作成功,稍后操作才能完成。
// 如果返回SOCKET_ERROR或者设置了自己的回调函数,直接返回由回调函数
// 处理操作完成后的工作。
//
if(iRet == SOCKET_ERROR || IsSetCompletionRoutine == TRUE)
{
return iRet;
}
if (m_CheckAcl.CheckRecv(s, lpBuffers[0].buf, lpBuffers[0].len, lpNumberOfBytesRecvd) != XF_PASS)
{
XfShutdown(s);
*lpErrno = WSAECONNABORTED;
return SOCKET_ERROR;
}
return iRet;
}
int WSPAPI WSPRecvFrom (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
struct sockaddr FAR * lpFrom,
LPINT lpFromlen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno
)
{
ODS(_T("XFILTER.DLL: WSPRecvFrom ..."));
//
// 2001-12-24 add, 如果时重叠操作且设置了回调函数,则首先用自定义函数
// AddOverlapped保存原来的参数信息,然后用自己的回调函数接管原来的回
// 调函数,并设置标志为IsSetCompletionRoutine
//
BOOL IsSetCompletionRoutine = FALSE;
if(lpOverlapped && lpCompletionRoutine && m_Overlapped.AddOverlapped(s
, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags
, lpOverlapped, lpCompletionRoutine, lpFrom, lpFromlen, 1/*WSPRecvFrom*/)
)
{
lpCompletionRoutine = CompletionRoutine;
IsSetCompletionRoutine = TRUE;
}
//
// 2001-12-22 修改,这里有一个BUG,原来参数dwBufferCount为 1
// 现在重新更改为dwBufferCount
//
int iRet= NextProcTable.lpWSPRecvFrom(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpFrom
, lpFromlen, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
//
// 返回SOCKET_ERROR有两种情况:
// 1. 有错误发生
// 2. 没有立即返回:没有立即返回可能是由于重叠操作造成,如果lpErrno为
// WSA_IO_PENDING 则表示重叠操作成功,稍后操作才能完成。
// 如果返回SOCKET_ERROR或者设置了自己的回调函数,直接返回由回调函数
// 处理操作完成后的工作。
//
if(iRet == SOCKET_ERROR || IsSetCompletionRoutine == TRUE)
{
return iRet;
}
if (m_CheckAcl.CheckRecvFrom(s, lpFrom, lpBuffers[0].buf, lpBuffers[0].len, lpNumberOfBytesRecvd) != XF_PASS)
{
XfShutdown(s);
*lpErrno = WSAECONNABORTED;
return SOCKET_ERROR;
}
return iRet;
}
// v1.0.2 2001-12-24 add for overlapped io
void CALLBACK CompletionRoutine (
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
)
{
ODS(_T("XFILTER.DLL: CompletionRoutine ..."));
int iIndex = m_Overlapped.FindOverlapped(lpOverlapped);
if(iIndex < 0)
return;
if(m_Overlapped.m_OverlappedRecorder[iIndex].FunctionType == 1)//WSPRecvFrom
{
if( m_CheckAcl.CheckRecvFrom(
m_Overlapped.m_OverlappedRecorder[iIndex].s
, m_Overlapped.m_OverlappedRecorder[iIndex].lpFrom
, m_Overlapped.m_OverlappedRecorder[iIndex].lpBuffers[0].buf
, m_Overlapped.m_OverlappedRecorder[iIndex].lpBuffers[0].len
, &cbTransferred
) != XF_PASS
)
{
XfShutdown(m_Overlapped.m_OverlappedRecorder[iIndex].s);
dwError = WSAECONNABORTED;
}
}
else if(m_Overlapped.m_OverlappedRecorder[iIndex].FunctionType == 0) //WSPRecv
{
if( m_CheckAcl.CheckRecv(
m_Overlapped.m_OverlappedRecorder[iIndex].s
, m_Overlapped.m_OverlappedRecorder[iIndex].lpBuffers[0].buf
, m_Overlapped.m_OverlappedRecorder[iIndex].lpBuffers[0].len
, &cbTransferred
) != XF_PASS
)
{
XfShutdown(m_Overlapped.m_OverlappedRecorder[iIndex].s);
dwError = WSAECONNABORTED;
}
}
if(m_Overlapped.m_OverlappedRecorder[iIndex].lpCompletionRoutine != NULL)
{
m_Overlapped.m_OverlappedRecorder[iIndex].lpCompletionRoutine(dwError
, cbTransferred, lpOverlapped, dwFlags);
}
m_Overlapped.DeleteOverlapped(iIndex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -