首页
社区
课程
招聘
SPI截获封包的问题(C++)
发表于: 2005-11-15 17:29 8841

SPI截获封包的问题(C++)

2005-11-15 17:29
8841
代码如下:
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutineCpy;
LPWSABUF        lpBuf;
LPDWORD                lpRecvLen;
............................
void CALLBACK MyCompletionRoutine(
  IN DWORD dwError,
  IN DWORD cbTransferred,
  IN LPWSAOVERLAPPED lpOverlapped,
  IN DWORD dwFlags                               
)
{
        WaitForSingleObject(hMutex02,INFINITE);
        RtlZeroMemory(lpRMemory,4096);
        CopyMemory(lpRMemory,lpBuf->buf,lpBuf->len);
        *(DWORD*)((BYTE*)lpRMemory+4090) = *lpRecvLen;
        MessageBox(NULL,"What the Hell!!!!!!",NULL,MB_OK);//句2
        ReleaseMutex(hMutex02);
        hWnd = FindWindow(NULL,"GetBuffer");
        PostMessage(hWnd,(WM_USER+101),0,0);
        lpCompletionRoutineCpy( dwError,cbTransferred,lpOverlapped,dwFlags );
}

int WSAAPI WSPRecv(
                        SOCKET                        s,
                        LPWSABUF                lpBuffers,
                        DWORD                        dwBufferCount,
                        LPDWORD                        lpNumberOfBytesRecvd,
                        LPDWORD                        lpFlags,
                        LPWSAOVERLAPPED        lpOverlapped,
                        LPWSAOVERLAPPED_COMPLETION_ROUTINE        lpCompletionRoutine,
                        LPWSATHREADID        lpThreadId,
                        LPINT                        lpErrno
                        )
{
        if (MB_Flag)
        {
                if (lpCompletionRoutine&&lpOverlapped)
                {
                        MessageBox(NULL,"What the Fuck!",NULL,MB_OK);//句1
                        lpBuf = lpBuffers;
                        lpRecvLen = lpNumberOfBytesRecvd;
                        lpCompletionRoutineCpy = lpCompletionRoutine;
                        lpCompletionRoutine = MyCompletionRoutine;
                }
        }
        return NextProcTable.lpWSPRecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,lpFlags,
                                                                                lpOverlapped,lpCompletionRoutine,lpThreadId,lpErrno);
}

句1执行了,这说明是重叠操作,我把原来的CompletionRoutine保存在全局变量lpCompletionRoutineCpy中,用MyCompletionRoutine替代原来的CompletionRoutine,可MyCompletionRoutine根本就没被调用,因为句2的MessageBox没有出现
这是为什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 8128
活跃值: (1980)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
2
因为他可能是用注册事件搞的,那个回调函数根本没有使用
大多数编程都会使用注册事件, 而不是用回调函数
2005-11-15 22:41
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢
我没研究过事件,
但你的解释好象不合逻辑,既然不用,为什么不给这参数设置为NULL,呃,也许是迷惑我,我怎么觉得我的代码有问题
好吧 我研究研究事件先
2005-11-15 23:35
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我把代码改了下,去掉了MyCompletionRoutine:
int WSAAPI WSPRecv(
                        SOCKET                        s,
                        LPWSABUF                lpBuffers,
                        DWORD                        dwBufferCount,
                        LPDWORD                        lpNumberOfBytesRecvd,
                        LPDWORD                        lpFlags,
                        LPWSAOVERLAPPED        lpOverlapped,
                        LPWSAOVERLAPPED_COMPLETION_ROUTINE        lpCompletionRoutine,
                        LPWSATHREADID        lpThreadId,
                        LPINT                        lpErrno
                        )
{
        char Buf[10] = {0};
        int iRet = NextProcTable.lpWSPRecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,lpFlags,
                                                                                lpOverlapped,lpCompletionRoutine,lpThreadId,lpErrno);
        wsprintf(Buf,"%08X",(*lpNumberOfBytesRecvd));
        MessageBox(NULL,Buf,NULL,MB_OK);
        return iRet;
}
结果MessageBox显示为0,也就是*lpNumberOfBytesRecvd为0,这是为什么?这个参数不是指向实际接收到的字节数吗?应该不是0才对啊
2005-11-17 00:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
加快学习哈,这个在研究中
2005-11-17 07:24
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谁能给个WSPRecv的例子?直接看例子可能明白的快些
2005-11-17 21:07
0
游客
登录 | 注册 方可回帖
返回
//