进程的SE_DEBUG_NAME权限 也已经加了

解决方案 »

  1.   

    void CTestDlg::OnButton1() 
    {
    DWORD bytes;
        BYTE tmpValue;
    m_hProcess=OpenProcess(3748);//3748是进程ID,下面那个地址是绝对可以读的。只是突然不能读了。用其它软件可以读出内容。其内存地址是有分配物理内存的提交
    if (ReadProcessMemory(m_hProcess,(void *)0x000E3FFB,(void *)&tmpValue,1,&bytes)==0)
    {
    int h=GetLastError();
    AfxMessageBox("进程不能读"); }
            else
    {
    AfxMessageBox("进程可以读");
            
    }
    }
    HANDLE CTestDlg::OpenProcess(DWORD pid)
    {
    HANDLE hToken;
       if (OpenProcessToken(GetCurrentProcess(), 
                            TOKEN_ADJUST_PRIVILEGES, &hToken))
       {
          if (EnablePrivilege(hToken, SE_DEBUG_NAME, TRUE)) 
      {
    HANDLE hANDLE;
    if(hANDLE=::OpenProcess(PROCESS_ALL_ACCESS,false, pid))
    {
    AfxMessageBox("进程可以打开");
    return hANDLE;
    }
    AfxMessageBox("进程不能打开");
          }
       }
      return NULL;
    }
    BOOL CTestDlg::EnablePrivilege(HANDLE hToken, LPCTSTR szPrivName,BOOL fEnable)
    {
       TOKEN_PRIVILEGES tp;
       tp.PrivilegeCount = 1;
       LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid);
       tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
       AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
       return((GetLastError() == ERROR_SUCCESS));
    }