SleepEx(100,true)出现0x00000000 处未处理的异常: 0xC0000005: Access violation问题

虎了吧唧的银 2012-07-07 06:25:02
代码如下:
#include "Stdafx.h"
#include "IcmpNormalScan.h"
#include "DataAndConst.h"
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);

struct ApcParament
{
CHAR Buffer[512];
DWORD dwDestIP;
};


void ApcFunc(void *p)
{
if(bStop==false)
{
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))
{
pMainWindow->PostMessage(WM_HOST_SCAN_INFO,1,pApcParament->dwDestIP);
}
}
}

DWORD WINAPI IcmpNormalScan(LPVOID pThreapParam)
{
ThreadSyn cSynEntry;
ThreadParament *pThreadParament=(ThreadParament *)pThreapParam;
ApcParament *ReplyBuffer=NULL;
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 = "DF is the best!";
int NumberOfIP=pThreadParament->dwLastIP-pThreadParament->dwOriginalIP+1;
ReplyBuffer=new ApcParament[NumberOfIP];
int i=0;
for(DWORD dwIP=pThreadParament->dwOriginalIP;dwIP<=pThreadParament->dwLastIP&&!bStop;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,
pThreadParament->dwTimeOut*1000);
char strLog[256];
in_addr tmp;
tmp.S_un.S_addr=htonl(dwIP);
sprintf(strLog,"Scaning Host %s.",inet_ntoa(tmp));
pMainWindow->SendMessage(WM_UPDATA_LOG,(WPARAM)strLog);

SleepEx(1,true);
while(bPause)
{
Sleep(100);
}
}//end of while
}
int i=0;
while(bStop==false )
{
if(SleepEx(100,true)==WAIT_IO_COMPLETION)
{
}
else
{
i++;
}
if( pThreadParament->dwTimeOut*10==i)
{
break;
}
if(i%10==0)
{
char strLog[256];
sprintf(strLog,"Waiting for timeout,Last %u Seconds.\n",((pThreadParament->dwTimeOut)-(i/10)));
pMainWindow->SendMessage(WM_UPDATA_LOG,(WPARAM)strLog);

}
}
IcmpCloseHandle(IcmpHandle);
pMainWindow->PostMessage(WM_FINISH_SCAN);
delete []ReplyBuffer;
return 0;
}
创建这个线程时,到SleepEx()那个函数就会出现上述问题,跪求怎么办
...全文
1409 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
david_ming 2013-02-27
  • 打赏
  • 举报
回复
注意你的 WriteFileEx 或 ReadFileEx 的最后一个参数,不能为 NULL
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
每次执行完一次回调函数之后就到SleepEx(1,true)这里提示说 0x00000000 处未处理的异常: 0xC0000005: Access violation
虎了吧唧的银 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不用跪了,原因不在SleepEx()上,这种情况多半是线程同步做的不好,造成内存堆破坏。
[/Quote]
能否针对这个程序再说详细点,还是不太懂啊
Eleven 2012-07-07
  • 打赏
  • 举报
回复
0x00000000 处未处理的异常: 0xC0000005: Access violation
-------------------
应该是空指针异常了,看看哪个指针为NULL
zhouzhipen 2012-07-07
  • 打赏
  • 举报
回复
不用跪了,原因不在SleepEx()上,这种情况多半是线程同步做的不好,造成内存堆破坏。
重叠IO模型之OverLapped完成例程模型WSACompletionRoutineServer VS2010 基础入门 客户端与服务器端 客户端向服务器端发送数据 可接收多个客户端 #include #include #pragma comment (lib, "ws2_32.lib") #define PORT 8088 #define MSG_SIZE 1024 SOCKET g_sConnect; bool g_bConnect = false; typedef struct { WSAOVERLAPPED overLap; WSABUF wsaBuf; char chMsg[MSG_SIZE]; DWORD nRecvNum; DWORD nFlags; SOCKET sClient; }PRE_IO_OPERATION_DATA, *LP_PER_IO_OPERATION_DATA; void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags); DWORD WINAPI workThread(LPVOID lp) { LP_PER_IO_OPERATION_DATA lpData; while(TRUE) { if (g_bConnect) // 有新的连接 { // 为lpData分配空间并初始化 lpData = (LP_PER_IO_OPERATION_DATA)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRE_IO_OPERATION_DATA)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; lpData->sClient = g_sConnect; WSARecv(lpData->sClient, &lpData->wsaBuf, 1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); g_bConnect = false; // 理完毕 } SleepEx(1000, TRUE); } return 0; } // 系统在WSARecv收到信息后,自动调用此函数,并传入参数--回调函数 void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags) { LP_PER_IO_OPERATION_DATA lpData = (LP_PER_IO_OPERATION_DATA)lpOverlap; if (0 != dwError) // 接收失败 { printf("Socket %d Close!\n", lpData->sClient); closesocket(lpData->sClient); HeapFree(GetProcessHeap(), 0, lpData); } else // 接收成功 { lpData->chMsg[dwTrans] = '\0'; send(lpData->sClient, lpData->chMsg, dwTrans, 0); printf("Socket:%d MSG: %s \n", lpData->sClient, lpData->chMsg); memset(&lpData->overLap, 0, sizeof(WSAOVERLAPPED)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; // 继续接收来自客户端的数据 实现 WSARecv与CompletionRoutine循环 WSARecv(lpData->sClient, &lpData->wsaBuf,1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); } } int main() { WSADATA wsaData; WSAStartup(0x0202, &wsaData); SOCKET sListen; sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in addrListen; addrListen.sin_family = AF_INET; addrListen.sin_port = htons(PORT); addrListen.sin_addr.S_un.S_addr = htonl(ADDR_ANY); int nErrorCode = 0; nErrorCode = bind(sListen, (sockaddr*)&addrListen, sizeof(sockaddr)); nErrorCode = listen(sListen, 5); DWORD nThreadID; CreateThread(NULL, 0, workThread, NULL, 0, &nThreadID); sockaddr_in addrConnect; int nAddrLen = sizeof(sockaddr_in); printf("Server Started!\n"); while(TRUE) { g_sConnect= accept(sListen, (sockaddr*)&addrConnect, &nAddrLen); if (INVALID_SOCKET == g_sConnect) { return -1; } g_bConnect = true; // 连接成功 printf("Accept Client :%s -- PORT:%d\n", inet_ntoa(addrConnect.sin_addr), htons(addrConnect.sin_port)); } return 0; }
## Features ### Anti-debugging attacks - IsDebuggerPresent - CheckRemoteDebuggerPresent - Process Environement Block (BeingDebugged) - Process Environement Block (NtGlobalFlag) - ProcessHeap (Flags) - ProcessHeap (ForceFlags) - NtQueryInformationProcess (ProcessDebugPort) - NtQueryInformationProcess (ProcessDebugFlags) - NtQueryInformationProcess (ProcessDebugObject) - NtSetInformationThread (HideThreadFromDebugger) - NtQueryObject (ObjectTypeInformation) - NtQueryObject (ObjectAllTypesInformation) - CloseHanlde (NtClose) Invalide Handle - SetHandleInformation (Protected Handle) - UnhandledExceptionFilter - OutputDebugString (GetLastError()) - Hardware Breakpoints (SEH / GetThreadContext) - Software Breakpoints (INT3 / 0xCC) - Memory Breakpoints (PAGE_GUARD) - Interrupt 0x2d - Interrupt 1 - Parent Process (Explorer.exe) - SeDebugPrivilege (Csrss.exe) - NtYieldExecution / SwitchToThread - TLS callbacks ### Anti-Dumping - Erase PE header from memory - SizeOfImage ### Timing Attacks [Anti-Sandbox] - RDTSC (with CPUID to force a VM Exit) - RDTSC (Locky version with GetProcessHeap & CloseHandle) - Sleep -> SleepEx -> NtDelayExecution - Sleep (in a loop a small delay) - Sleep and check if time was accelerated (GetTickCount) - SetTimer (Standard Windows Timers) - timeSetEvent (Multimedia Timers) - WaitForSingleObject -> WaitForSingleObjectEx -> NtWaitForSingleObject - WaitForMultipleObjects -> WaitForMultipleObjectsEx -> NtWaitForMultipleObjects (todo) - IcmpSendEcho (CCleaner Malware) - CreateWaitableTimer (todo) - CreateTimerQueueTimer (todo) - Big crypto loops (todo) ### Human Interaction / Generic [Anti-Sandbox] - Mouse movement - Total Physical memory (GlobalMemoryStatusEx) - Disk size using DeviceIoControl (IOCTL_DISK_GET_LENGTH_INFO) - Disk size using GetDiskFreeSpaceEx (TotalNumberOfBytes) - Mouse (Single click / Double click) (todo) - DialogBox (todo) - Scrolling (todo) - Execution after reboot (todo) - Count of processors (Win32/Tinba - Win32/Dyre) - Sandbox k

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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