奇怪的问题 枚举 windows进程的问题
下面是我写的枚举进程的代码 直接运行的时候可以正常工作枚举进程 但是OD加载进去后 Process32Next这个函数返回值是0 运行不成功
加入GetLastError() 返回的错误代码也是0
拷贝了MSDN 上的代码 也是同样的问题 直接运行可以 但是 OD加载了运行就不行 各位帮看下 是不是我机器的问题
用汇编重写了下 汇编里 直接运行也是Process32Next错误 返回的错误代码是参数不合法
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include <tlhelp32.h>
void main(void)
{
PROCESSENTRY32 Process;
HANDLE hSap;
int bret;
hSap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSap == INVALID_HANDLE_VALUE)
{
printf("create snap error\n");
return;
}
RtlZeroMemory(&Process, sizeof (PROCESSENTRY32));
Process.dwSize = sizeof (PROCESSENTRY32);
bret = Process32First(hSap, &Process);
if(!bret)
{
printf("first error\n");
return;
}
do
{
printf("%s\n",Process.szExeFile);
if(0 == lstrcmp(Process.szExeFile, "taskmgr.exe"))
break;
}while(Process32Next(hSap,&Process));
}
汇编:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
.data
szTask db "taskmgr.exe",0
ProcessIds dd 1024 dup(0)
szText db "success",0
.data?
hProcess dd ?
stProcess PROCESSENTRY32 <?>
hSnap dd ?
.code
start:
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
.if eax == INVALID_HANDLE_VALUE
ret
.endif
mov hSnap,eax
invoke RtlZeroMemory,addr stProcess,sizeof PROCESSENTRY32
mov stProcess.dwSize,sizeof PROCESSENTRY32
invoke Process32First,hSnap,addr stProcess
.if eax == FALSE
ret
.endif
invoke lstrcmp,addr szTask,addr stProcess.szExeFile
.if eax != 0
@mm:
invoke Process32Next,hSnap, offset stProcess
.if eax == FALSE
invoke MessageBox,NULL,NULL,NULL,MB_OK
ret
.endif
invoke lstrcmp,addr szTask, addr stProcess.szExeFile
or eax,eax
jnz @mm
.endif
invoke MessageBox,NULL,szText,NULL,MB_OK
ret
end start