我用OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcID)获取外部进程的handle的时候,会失败,用GetLastError发现是“拒绝访问”不知为何。我改如何获取外部进程的handle呐?

解决方案 »

  1.   

    不要用PROCESS_ALL_ACCESS,换成 PROCESS_VM_WRITE+PROCESS_VM_OPERATION 试试!
      

  2.   

    hProcess=::OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_WRITE|PROCESS_VM_OPERATION|
    //获取所有的权限
    PROCESS_VM_READ,TRUE,dwProcessId);
      

  3.   

    你开始应该得到了进程ID吧,就是dwProcessId.
      

  4.   

    1.我已经获得了正确的进程ID。
    2.访问权限的定义:
      #define PROCESS_TERMINATE         (0x0001)  
      #define PROCESS_CREATE_THREAD     (0x0002)  
      #define PROCESS_SET_SESSIONID     (0x0004)  
      #define PROCESS_VM_OPERATION      (0x0008)  
      #define PROCESS_VM_READ           (0x0010)  
      #define PROCESS_VM_WRITE          (0x0020)  
      #define PROCESS_DUP_HANDLE        (0x0040)  
      #define PROCESS_CREATE_PROCESS    (0x0080)  
      #define PROCESS_SET_QUOTA         (0x0100)  
      #define PROCESS_SET_INFORMATION   (0x0200)  
      #define PROCESS_QUERY_INFORMATION (0x0400)  
      #define PROCESS_ALL_ACCESS        (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
    这表示 PROCESS_ALL_ACCESS 已经获得了所有的权限,还有什么办法获得更多的权限吗?
      

  5.   

    在nt系统如果要打开系统进程要先加载调试权限:AddPrivilege(SE_DEBUG_NAME);/*---------------------------------------------------------------------
    //AddPrivilege.c
    //Coder: sjdf
    //E-mail: [email protected]
    //Create date: 2003.10.6
    //Last modify date: 2003.10.8
    //Compiler: LCC 3.8
    //Test platform: Win2000 Adv Server + sp4
    ---------------------------------------------------------------------*/
    #ifdef _DEBUG
    #include <stdio.h>
    #endif#include <windows.h>
    //---------------------------------------------------------------------
    //为当前进程增加指定的特权,Name为特权名,成功返回0,失败返回1
    int AddPrivilege(const char *Name);
    //---------------------------------------------------------------------
    //为当前进程增加指定的特权
    int AddPrivilege(const char *Name)
    {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    LUID Luid; if (!OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
    &hToken))
    {
    #ifdef _DEBUG
    printf("OpenProcessToken error.\n");
    #endif
    return 1;
    } if (!LookupPrivilegeValue(NULL,Name,&Luid))
    {
    #ifdef _DEBUG
    printf("LookupPrivilegeValue error.\n");
    #endif
    return 1;
    } tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    tp.Privileges[0].Luid = Luid; if (!AdjustTokenPrivileges(hToken,
    0,
    &tp,
    sizeof(TOKEN_PRIVILEGES),
    NULL,
    NULL))
    {
    #ifdef _DEBUG
    printf("AdjustTokenPrivileges error.\n");
    #endif
    return 1;
    } return 0;
    }
    //---------------------------------------------------------------------