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 - 无效句柄的主要内容,如果未能解决你的问题,请参考以下文章

如何在无模式对话框中使用 Enter 键?

[原]Universal Windows问题:winapifamily问题:WINAPI_PARTITION_DESKTOP问题:WINAPI_PARTITION_APP问题:WINAPI_FAMIL

C#。 WinApi。在窗口上绘制

自定义控件,winapi

如何更改静态文本控件(winapi)的字体?

winApi 32 图标定义