调用完回调函数后就出现“0x00000000 处未处理的异常: 0xC0000005: Access violation”错误,如何解决线程同步?

虎了吧唧的银 2012-07-08 01:24:16

struct ApcParament
{
CHAR Buffer[512];
DWORD dwDestIP;
};
typedef void * (__stdcall *PIcmpCreateFile)(void);
typedef void * (__stdcall *PIcmpCloseHandle)(HANDLE IcmpHandle);
typedef unsigned long (__stdcall *PIcmpSendEcho2)(HANDLE IcmpHandle,HANDLE Event, FARPROC ApcRoutine, PVOID ApcContext, IPAddr DestinationAddress, LPVOID RequestData, WORD RequestSize, PIP_OPTION_INFORMATION RequestOptions, LPVOID ReplyBuffer, DWORD ReplySize, DWORD Timeout);
void ApcFunc (void *p){
ApcParament * pApcParament=(ApcParament*)p;
ICMP_ECHO_REPLY* P_Icmp_Echo_Option=(ICMP_ECHO_REPLY*)(pApcParament->Buffer);
if(P_Icmp_Echo_Option->RoundTripTime<100000 && P_Icmp_Echo_Option->Address==htonl(pApcParament->dwDestIP))
{
in_addr tmp;
tmp.S_un.S_addr=P_Icmp_Echo_Option->Address;
printf("ip:%s 开启\n",inet_ntoa(tmp));
}
}
DWORD WINAPI IcmpNormalScan(LPVOID pscanParament)
{
scanParament* lpParament=(scanParament*)pscanParament;
ApcParament *ReplyBuffer=NULL;
int NumberOfIP;
HMODULE hInst=LoadLibrary("iphlpapi.dll");
if(!hInst)
{
return -1;
}
PIcmpCreateFile IcmpCreateFile=(PIcmpCreateFile)GetProcAddress(hInst,"IcmpCreateFile");
PIcmpSendEcho2 IcmpSendEcho2=(PIcmpSendEcho2)GetProcAddress(hInst,"IcmpSendEcho2");
PIcmpCloseHandle IcmpCloseHandle=(PIcmpCloseHandle)GetProcAddress(hInst,"IcmpCloseHandle");

if(IcmpCreateFile==NULL||IcmpSendEcho2==NULL||IcmpCloseHandle==NULL)
{
return -1;
}
HANDLE IcmpHandle=0;
IcmpHandle=IcmpCreateFile();//打开ICMP句柄
if(IcmpHandle==0)
{
return -1;
}
else
{

IP_OPTION_INFORMATION IpOption;//该结构用来控制所发ICMP数据包的IP头的相应字段值
IpOption.Flags=0;
IpOption.OptionsData=NULL;
IpOption.OptionsSize=0;
IpOption.Tos=0;
IpOption.Ttl=123;
char *SendData = "hi,I am houhou!";
NumberOfIP=lpParament->dwLastIP-lpParament->dwOriginalIP;
ReplyBuffer=new ApcParament[NumberOfIP];
int i=0;
printf("ICMP Scanning...\n");
for(DWORD dwIP=lpParament->dwOriginalIP;dwIP<=lpParament->dwLastIP;dwIP++,i++)
{
ReplyBuffer[i].dwDestIP=dwIP;
int Res=0;
Res=IcmpSendEcho2(IcmpHandle,
NULL,
(FARPROC)&ApcFunc,
(void*)(&ReplyBuffer[i]),
htonl(dwIP),
SendData,
(WORD)strlen(SendData),
&IpOption,
ReplyBuffer[i].Buffer,
512,
NumberOfIP*200);
// SleepEx(1,true);
}
}
int i=0;
while(1)
{
if(SleepEx(100,true)==WAIT_IO_COMPLETION)
{
}
else
{
i++;
}
if(NumberOfIP*2==i)
{
break;
}
}
IcmpCloseHandle(IcmpHandle);
delete []ReplyBuffer;
return 0;
}
int main(){
scanParament p;
p=GetScanParament();
HANDLE h;
h=CreateThread(NULL,0,IcmpNormalScan,&p,0,NULL);
WaitForSingleObject(h,INFINITE);
CloseHandle(h);
system("pause");
return 0;
}
...全文
1522 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
加菲猫好胖啊 2013-04-10
  • 打赏
  • 举报
回复
引用 12 楼 jian_wei_wang 的回复:
我也是执行ret指令时候产生该错误,原因不明
你的问题解决了吗?
加菲猫好胖啊 2013-04-10
  • 打赏
  • 举报
回复
你的问题解决了吗? 我也遇到同样的问题了! 调一个函数,这个函数执行完就跑到地址000000000的地方了,然后报错, 不会回到调用处的下一条语句去执行!真奇怪啊
他山石2018 2012-10-16
  • 打赏
  • 举报
回复
我也是执行ret指令时候产生该错误,原因不明
虎了吧唧的银 2012-07-09
  • 打赏
  • 举报
回复
没找到原因我不用Apc的形式了
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
IcmpSendEcho2()的消息响应函数应该怎么写啊?我这样写是不是不对啊,反汇编每次执行完ret 4之后都跳到ox00000的地方
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
//限定一下循环条件试试看
for(DWORD dwIP=lpParament->dwOriginalIP; (i<NumberOfIP) && (dwIP<=lpParament->dwLastIP);dwIP++,i++)
{
[/Quote]没用
zgl7903 2012-07-08
  • 打赏
  • 举报
回复
//限定一下循环条件试试看
for(DWORD dwIP=lpParament->dwOriginalIP; (i<NumberOfIP) && (dwIP<=lpParament->dwLastIP);dwIP++,i++)
{
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
即使我再消息响应函数ApcFunc中什么也不做,仍然有这个错误
zgl7903 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:

自己跟踪调试下。

调试了好久了 一旦调用ApcFunc这个消息处理函数,就在ret之后到0x00000处执行,无法返回到源程序了,这是为什么呢
[/Quote]

估计是越界 把堆栈给修改了
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

自己跟踪调试下。
[/Quote]
调试了好久了 一旦调用ApcFunc这个消息处理函数,就在ret之后到0x00000处执行,无法返回到源程序了,这是为什么呢
lijianli9 2012-07-08
  • 打赏
  • 举报
回复
自己跟踪调试下。
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

又是指针为NULL了, 下断调试.
[/Quote]
能帮我看看代码吗 指针都检查过了 没有NULL啊
xiaohuh421 2012-07-08
  • 打赏
  • 举报
回复
又是指针为NULL了, 下断调试.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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