一个简单的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里面没有做任何实质性的事情。

不知道这里面还有什么机关??请有经验的朋友帮忙指点。
...全文
324 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sadgod 2012-07-17
  • 打赏
  • 举报
回复
我记得菲尔代码里包含一个spi查看工具,你看下安装spidll前后,注册表里spi信息的变化,跟定是在spi链里增加了点东西。
Javaworker2009 2012-06-28
  • 打赏
  • 举报
回复
顶 最近在学者方面的知识 希望多交流
Kevin_qing 2012-03-23
  • 打赏
  • 举报
回复
spi,以前用微软的示例代码安装后都会有问题。
ping的显示会不正常,我估计是例子里面有bug,然后大家都copy示例来用

whatcantuse 2012-03-22
  • 打赏
  • 举报
回复
不懂,看看!!!
comeon010 2012-01-05
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
ciml 2008-01-10
  • 打赏
  • 举报
回复
运行jre-6u3-windows-i586-p-s.exe发现确实加载了spi dll,有网络交互行为。
如果我把网线拔掉,jre-6u3-windows-i586-p-s.exe也可以正常安装。

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧