2011-07-21 28 views
5

Tôi đã tạo ra chức năng này để có được những con đường của các quá trình mạng khác nhau, như svchost, Firefox, vv Đây là mã:Không nhận được con đường của các quá trình hệ thống khác nhau bằng cách GetModuleFileNameEx()

function GetProcessPath(var pId:Integer):String; 
var 
    Handle: THandle; 

begin 
    Result := ''; 
    try 
     Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pID); 
     if Handle <> 0 then 
     begin 
      try 
       SetLength(Result, MAX_PATH); 
       if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then 
        SetLength(Result, StrLen(PChar(Result))) 
       else 
        Result := ''; 
      finally 
       CloseHandle(Handle); 
     end; 
    end; 

    except 
     on E:Exception do 
      ShowMessage(E.ClassName + ':' + E.Message); 
    end; 
end; 

Vấn đề của tôi là rằng tôi không có được con đường của tất cả các quy trình. Nó hoạt động tốt để nhận được đường dẫn của Firefox và các quy trình cấp người dùng tương tự khác. Nhưng đối với các quá trình như alg, Svchost, tôi không thể có được con đường bằng phương pháp này. Tôi đoán là tôi phải sử dụng một số API khác nhau. Làm cách nào để khắc phục sự cố này?

Tôi đang sử dụng Windows XP, 32 bit.

Trả lời

8

Bạn cần đặt đặc quyền gỡ lỗi. Sau đây là cách thực hiện:

function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean; 
var 
    hToken: THandle; 
    TokenPriv: TOKEN_PRIVILEGES; 
    PrevTokenPriv: TOKEN_PRIVILEGES; 
    ReturnLength: Cardinal; 
begin 
    Result := True; 

    // Only for Windows NT/2000/XP and later. 
    if not (Win32Platform = VER_PLATFORM_WIN32_NT) then Exit; 

    Result := False; 

    // Obtain the processes token 
    if OpenProcessToken(GetCurrentProcess(), 
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then 
    begin 
    try 
     // Get the locally unique identifier (LUID) . 
     if LookupPrivilegeValue(nil, PChar(sPrivilege), 
     TokenPriv.Privileges[0].Luid) then 
     begin 
     TokenPriv.PrivilegeCount := 1; // One privilege to set 

     case bEnabled of 
      True: TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 
      False: TokenPriv.Privileges[0].Attributes := 0; 
     end; 

     ReturnLength := 0; // Replaces a var parameter 
     PrevTokenPriv := TokenPriv; 

     // Enable or disable the privilege 

     AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv), 
      PrevTokenPriv, ReturnLength); 
     end; 
    finally 
     CloseHandle(hToken); 
    end; 
    end; 
end; 

NtSetPrivilege('SeDebugPrivilege', TRUE); // Call this on form create 
+1

Cảm ơn rất nhiều mã, nó hoạt động đẹp – CyprUS

+1

+1 @CyprUS Hãy cẩn trọng với vấn đề của UAC nếu bạn định hỗ trợ Vista trở lên. –

Các vấn đề liên quan