【发布时间】:2015-12-20 01:01:16
【问题描述】:
我正在尝试使用 VirtualQueryEx 使用 Visual Studio 2012 读取 32 位进程的一些内存页面。
但是,当我运行程序时,我得到 VirtualQueryEx 错误 6:无效句柄。但是,句柄本身 [hProcess] 没有错误,我正在传递适当的参数。可能是什么?
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdio.h>
// Forward declarations:
BOOL GetProcessList( );
BOOL ListProcessModules( DWORD dwPID );
BOOL ListProcessThreads( DWORD dwOwnerPID );
void printError( TCHAR* msg );
int main( void )
{
GetProcessList( );
system("pause");
return 0;
}
BOOL GetProcessList( )
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
return( FALSE );
}
// Set the size of the structure before using it.
pe32.dwSize = sizeof( PROCESSENTRY32 );
// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First( hProcessSnap, &pe32 ) )
{
printError( TEXT("Process32First") ); // show cause of failure
CloseHandle( hProcessSnap ); // clean the snapshot object
return( FALSE );
}
// Now walk the snapshot of processes, and
// display information about each process in turn
do
{
//If the process name equals foo_process.exe
if (!_tcscmp(pe32.szExeFile, _T("foo_process.exe")))
{
hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID );
if( hProcess == NULL )
printError( TEXT("OpenProcess") );
unsigned char *addr = NULL;
MEMORY_BASIC_INFORMATION meminfo;
if (VirtualQueryEx(hProcess, addr, &meminfo, sizeof(meminfo)) == 0){
printError( TEXT("VirtualQueryEx") );
//return FALSE;
}
}
} while( Process32Next( hProcessSnap, &pe32 ) );
CloseHandle( hProcessSnap );
return( TRUE );
}
void printError( TCHAR* msg )
{
...
}
编辑 2:更多信息:
Windows 7 64 位平台。
Visual Studio 2012(32 位调试器)运行 作为管理员
- 进程为 *32(32 位)
【问题讨论】:
-
抱歉,无法复制。我对您的代码进行了快速测试,但没有找到有效的
hProcess导致ERROR_INVALID_HANDLE的情况。如果尝试查看notepad.exe(当然是在它运行时),您是否会遇到同样的错误,或者"foo_process.exe"有什么特别之处。 -
我的水晶球说进程还没有初始化。很可能通过将 CREATE_SUSPENDED 传递给 CreateProcess() 调用。
-
在this Q+A 和this blog post 中得到了很好的覆盖。
-
Win7 Sp1 x64,VS 2012 Up4,程序编译为 32b 非 Unicode 控制台应用程序,并在调试器或在 cmd 提示符下独立运行(添加了一些 printf)正常运行(未提升) .
-
P.S.在这一点上,我建议您在某处 (Stack Overflow Etiquette for Sharing Files and Resources) 上传一个最小的、完整的、可编译的项目,这样其他人就不必填写空白或猜测项目设置。举个例子,如果真正的
printError函数有缓冲区溢出的错误,那么到目前为止发布的所有 cmets 都可能没有实际意义。
标签: c++ winapi visual-studio-2012