WINAPI VirtualQueryEx - 无效句柄
Posted
技术标签:
【中文标题】WINAPI VirtualQueryEx - 无效句柄【英文标题】:WINAPI VirtualQueryEx - invalid handle 【发布时间】: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 都可能没有实际意义。
【参考方案1】:
无符号字符 *addr = NULL;
您要求 VirtualQueryEx 查询无效的地址 0,导致失败。
【讨论】:
无效地址在最坏的情况下会导致 ERROR_INVALID_PARAMETER,而不是 OP 的 ERROR_INVALID_HANDLE。查看 5 年前的 cmets 和/或亲自尝试。以上是关于WINAPI VirtualQueryEx - 无效句柄的主要内容,如果未能解决你的问题,请参考以下文章
[原]Universal Windows问题:winapifamily问题:WINAPI_PARTITION_DESKTOP问题:WINAPI_PARTITION_APP问题:WINAPI_FAMIL