Конференция "WinAPI" » Можно ли узнать имя родительского процесса в 64 разрядной винде? [D7, WinXP]
 
  • KilkennyCat © (17.06.10 17:15) [20]
    еще дополнение - ниже указанные функции не повлияли на вышеуказанный результат

    procedure EnableAllPrivileges;
    var c1, c2 : dword;
       ptp : PTokenPrivileges;
       i1 : integer;
    begin
     if OpenProcessToken(windows.GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, c1) then
       try
         c2 := 0;
         GetTokenInformation(c1, TokenPrivileges, nil, 0, c2);
         if c2 <> 0 then begin
           ptp := AllocMem(c2);
           if GetTokenInformation(c1, TokenPrivileges, ptp, c2, c2) then begin
             for i1 := 0 to integer(ptp^.PrivilegeCount) - 1 do
               ptp^.Privileges[i1].Attributes := ptp^.Privileges[i1].Attributes or SE_PRIVILEGE_ENABLED;
             AdjustTokenPrivileges(c1, false, ptp^, c2, PTokenPrivileges(nil)^, cardinal(pointer(nil)^));
           end;
           FreeMem(ptp);
         end;
       finally CloseHandle(c1) end;
    end;

    function ChangeFSRedirection(bDisable: Boolean): Boolean;
    type
        TWow64DisableWow64FsRedirection = Function(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
        TWow64EnableWow64FsRedirection = Function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
    var
       hHandle: THandle;
       Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
       Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
       Wow64FsEnableRedirection: LongBool;
    begin
     Result := false;

    // if not IsWindows64 then
      //  Exit;

     try
       hHandle := GetModuleHandle('kernel32.dll');
       @Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection');
       @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');

       if bDisable then
       begin
        if (hHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil) then
        begin
          Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
          Result := True;
        end;
       end else
       begin
        if (hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) then
        begin
          Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
          Result := True;
        end;
       end;
     Except
     end;
    end;

  • KilkennyCat © (17.06.10 17:19) [21]
    ну и последнее забыл - результаты идентичны для пользователей с правами: администратора; домашних пользователей; пользователя.
  • KilkennyCat © (17.06.10 17:22) [22]

    > из проводника win7x64 - C:\Windows\ediskVolume1\Windows\explorer.
    > exe
    >
    > родитель ie64 - C:\Program Files\InterneProgram Files\Internet
    > Explorer\iexplore.exe
    >
    > ie32 - C:\Program Files (x86)\Integram Files (x86)\Internet
    > Explorer\iexplore.exe

    забавные пути...
  • sniknik © (17.06.10 17:31) [23]
    KilkennyCat ©   (17.06.10 17:10) [18]
    Ну, вот это и требовалось.

    Хотя тут вроде неправильно...
    > из проводника win7x64 - C:\Windows\ediskVolume1\Windows\explorer.exe
    Похоже DevicePathToWin32Path криво отработал (опять юникод?). Какой у тебя тут исходный путь? От GetProcessImageFileName.

    > еще дополнение - ниже указанные функции не повлияли на вышеуказанный результат
    Судя по всему единственное проблемное это 64 vs нормального в 32.
  • sniknik © (17.06.10 17:33) [24]
    > забавные пути...
    У тебя с юникодом нужно размер char на 2 умножать... ну и все сдвинулось из-за этого.
  • KilkennyCat © (17.06.10 17:33) [25]
    исходный путь D:\
    тупо сделал так: Move(sRes[1], lpFilename[0], result + 1000);
    получилось -
    C:\Windows\explorer.exe

  • KilkennyCat © (17.06.10 17:34) [26]
    да, юникод постоянно преподносит сюрпрайзы... хорошо еще, что тут очевидно.
  • sniknik © (18.06.10 00:22) [27]
    Еще один, наверное окончательный вариант... ;) обработка одного из проверенных здесь  (отличие от того - дает полный путь, что и требуется в одном из случаев).
     uses ... TlHelp32;
     function GetModuleFileName(pID: DWORD): string;
     var
       hSnapshot: THandle;
       mEntr: tagMODULEENTRY32;
     begin
       result:= 'noname';
       hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID);
       if hSnapshot <> INVALID_HANDLE_VALUE then
       try
         mEntr.dwSize:= SizeOf(mEntr);
         if Module32First(hSnapshot, mEntr) then
           result:= mEntr.szExePath;
       finally
         CloseHandle(hSnapshot)
       end;
     end;

     function ParentProcName: string;
     var
       pID: DWORD;
       hSnapshot: THandle;
       ProcessEntry: TProcessEntry32;
     begin
       result:= 'noname';
       hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       if hSnapshot <> INVALID_HANDLE_VALUE then
       try
         ProcessEntry.dwSize:= SizeOf(ProcessEntry);
         if Process32First(hSnapshot, ProcessEntry) then begin
           pID:= GetCurrentProcessID;
           repeat
             if ProcessEntry.th32ProcessID = pID then begin
               result:= GetModuleFileName(ProcessEntry.th32ParentProcessID);
               Break;
             end;
           until not Process32Next(hSnapshot, ProcessEntry);
         end;
       finally
         CloseHandle(hSnapshot)
       end;
     end;


    На нем и остановлюсь.
  • KilkennyCat © (18.06.10 07:06) [28]
    Ага, я пробовал через снапшот, но где-то ошибался, у меня не заработало...
    Появится еще время - оформлю все это в какой-нить PsApi2
  • sniknik © (18.06.10 07:38) [29]
    > у меня не заработало...
    Блин, проверил, у меня тоже ;(. Можно посмотреть ошибку от Module32First (валится тут похоже на ней), "завернуть" ее в Win32Check, но это после, на работу пора. ;)
 
Конференция "WinAPI" » Можно ли узнать имя родительского процесса в 64 разрядной винде? [D7, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.002]