一个简单的winsock spi dll安装后的奇怪现象,请高人分析。
ciml 2008-01-09 05:49:30 费尔防火墙的例子,稍微修改了一下,导出WSPStartup
整个dll就这个函数,这里面简单的将下层的分配表返回给调用者,也就是说根本没有做任何数据包的干预。
int
WSPAPI
WSPStartup(
IN WORD wVersionRequested,
OUT LPWSPDATA lpWSPData,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
IN WSPUPCALLTABLE upcallTable,
OUT LPWSPPROC_TABLE lpProcTable
)
{
EnterCriticalSection(&gCriticalSection);
__try
{
ODS(_T("WSPStartup..."));
if(!m_IsFirstStarup)
{
upcallTable = m_UpCallTable;
memcpy(lpProcTable, &NextProcTable, sizeof(WSPPROC_TABLE));
return 0;
}
TCHAR sLibraryPath[512];
LPWSPSTARTUP WSPStartupFunc = NULL;
HMODULE hLibraryHandle = NULL;
INT ErrorCode = 0;
_tcscpy(sLibraryPath,_T("C:\\WINDOWS\\system32\\mswsock.dll"));
if (/*!GetHookProvider(lpProtocolInfo, sLibraryPath)
||*/ (hLibraryHandle = LoadLibrary(sLibraryPath)) == NULL
|| (WSPStartupFunc = (LPWSPSTARTUP)GetProcAddress(hLibraryHandle, "WSPStartup")) == NULL
)
{
ODS(_T("LoadLibrary mswsock.dll failed!"));
return WSAEPROVIDERFAILEDINIT;
}
if ((ErrorCode = WSPStartupFunc(wVersionRequested, lpWSPData, lpProtocolInfo, upcallTable, lpProcTable)) != ERROR_SUCCESS)
{
ODS(_T("call WSPStartupFunc retcode=%d"),ErrorCode);
return ErrorCode;
}
FreeLibrary(hLibraryHandle); //add by neil
if( !lpProcTable->lpWSPAccept ||
!lpProcTable->lpWSPAddressToString ||
!lpProcTable->lpWSPAsyncSelect ||
!lpProcTable->lpWSPBind ||
!lpProcTable->lpWSPCancelBlockingCall ||
!lpProcTable->lpWSPCleanup ||
!lpProcTable->lpWSPCloseSocket ||
!lpProcTable->lpWSPConnect ||
!lpProcTable->lpWSPDuplicateSocket ||
!lpProcTable->lpWSPEnumNetworkEvents ||
!lpProcTable->lpWSPEventSelect ||
!lpProcTable->lpWSPGetOverlappedResult ||
!lpProcTable->lpWSPGetPeerName ||
!lpProcTable->lpWSPGetSockName ||
!lpProcTable->lpWSPGetSockOpt ||
!lpProcTable->lpWSPGetQOSByName ||
!lpProcTable->lpWSPIoctl ||
!lpProcTable->lpWSPJoinLeaf ||
!lpProcTable->lpWSPListen ||
!lpProcTable->lpWSPRecv ||
!lpProcTable->lpWSPRecvDisconnect ||
!lpProcTable->lpWSPRecvFrom ||
!lpProcTable->lpWSPSelect ||
!lpProcTable->lpWSPSend ||
!lpProcTable->lpWSPSendDisconnect ||
!lpProcTable->lpWSPSendTo ||
!lpProcTable->lpWSPSetSockOpt ||
!lpProcTable->lpWSPShutdown ||
!lpProcTable->lpWSPSocket ||
!lpProcTable->lpWSPStringToAddress )
{
ODS(_T("wsp function is null!"));
return WSAEINVALIDPROCTABLE;
}
m_UpCallTable = upcallTable;
NextProcTable = *lpProcTable;
/*
lpProcTable->lpWSPSocket = WSPSocket;
lpProcTable->lpWSPCloseSocket = WSPCloseSocket;
lpProcTable->lpWSPConnect = WSPConnect;
lpProcTable->lpWSPAccept = WSPAccept;
lpProcTable->lpWSPSend = WSPSend;
lpProcTable->lpWSPSendTo = WSPSendTo;
lpProcTable->lpWSPRecv = WSPRecv;
lpProcTable->lpWSPRecvFrom = WSPRecvFrom;
*/
//v1.0.2 add 2001-12-22
m_IsFirstStarup = FALSE;
}
__finally
{
LeaveCriticalSection(&gCriticalSection);
}
return 0;
}
现在的问题很奇怪,这个dll安装后,确实起作用了,浏览器上网没有问题
但到目前为止已经发现下面两个奇怪现象:
1.安装该dll后,msn登录成功后,大概等5秒后自动断开,后续一直无法登录,卸载dll后msn登录成功,正常使用。
2.运行jre-6u3-windows-i586-p-s.exe安装程序(java jre),提示“无法应用转换程序。请确认是否指定了有效的转换程
序路径”,卸载dll后可以正常安装。
非常让人纳闷,非常奇怪,因为该 dll里面没有做任何实质性的事情。
不知道这里面还有什么机关??请有经验的朋友帮忙指点。