代码如下:
HANDLE hProc = OpenProcess(PROCESS_VM_READ,FALSE,dwPID);
if(hProc)

  DWORD dwRet = -1;
DWORD dwAddr = *(DWORD*)((DWORD)GetCommandLine + 1);
TCHAR tcBuf[buffLen];
DWORD dwRead = 0;  ReadProcessMemory(hProc,(LPVOID)dwAddr,&dwAddr,4,&dwRead);
}在xp、server2003上都没问题。
 

解决方案 »

  1.   

    win7的UAC权限问题,提Debug权限应该都有了吧?
    把UAC禁用再试试这段代码
      

  2.   


    UAC禁用过了不行。GetLastError()返回错误码0x000003e6,没有访问权限。
    怎样才能提Debug权限?
      

  3.   

    procedure SetPrivilege;
    var
    OldTokenPrivileges, TokenPrivileges: TTokenPrivileges;
    ReturnLength: dword;
    hToken: THandle;
    Luid: int64;
    begin
    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
    LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);
    TokenPrivileges.Privileges[0].luid := Luid;
    TokenPrivileges.PrivilegeCount := 1;
    TokenPrivileges.Privileges[0].Attributes := 0;
    AdjustTokenPrivileges(hToken, False, TokenPrivileges, SizeOf(TTokenPrivileges), OldTokenPrivileges, ReturnLength);
    OldTokenPrivileges.Privileges[0].luid := Luid;
    OldTokenPrivileges.PrivilegeCount := 1;
    OldTokenPrivileges.Privileges[0].Attributes := TokenPrivileges.Privileges[0].Attributes or SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
    end;本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flashrhx2007/archive/2008/11/18/3326416.aspx
      

  4.   

    可能我没说明白,调用OpenProcess()返回成功,只是调用ReadProcessMemory()时失败,GetLastError()返回错误码0x000003e6,没有访问权限。
      

  5.   

    dwPID是哪个进程的,如果是audiodg.exe再怎么提都不行,只能用驱动程序
      

  6.   

    HANDLE hProc = OpenProcess(PROCESS_VM_READ|PROCESS_VM_OPERATION,FALSE,dwPID);
      

  7.   


    置上PROCESS_ALL_ACCESS也不行。难道就无解了吗?
      

  8.   

    其他进程行不行,是不是地址有问题,用VirtualQueryEx查看内存状态
      

  9.   

    一般应用程序有些也属于高权限程序,如果有system以上的权限,直接读似乎是不行的
      

  10.   


    DWORD dwAddr = *(DWORD*)((DWORD)GetCommandLine + 1);
    返回的内存地址超出被查进程的内存地址了。本文的初衷是获取其它进程的命令行地址,看来使用这种方式在win7下不可行。在网上搜到另一种替代方式:http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-processes/。
      

  11.   

    获得其他进程的命令行应该从进程环境块找,而不是用当前进程的GetCommandLine