Конференция "WinAPI" » OpenProcess и 64bit applications... [D7]
 
  • istok20 © (28.11.09 00:15) [0]
    OpenProcess в 64битной ОС срабатывает только для 32битных приложений (getlasterror говорит "отказано в доступе")

    каким-то образом можно заставить его работать с 64битными процессами? какие есть варианты кроме freepascal и ожидания следующей версии delphi?

    код:


    procedure TForm1.Button1Click(Sender: TObject);
    var
     pe: TProcessEntry32;
     ph, snap:THandle;//дескрипторы процесса и снимка
     mh: hmodule;//дескриптор модуля
     procs: array[0..$fff] of DWORD;//массив для хранения дескрипторов процессов
     count, cm: Cardinal;//количество процессов
     i: Integer;
     ModName: array[0..max_path] of char;//имя модуля
     LastIndex: Integer; // индекс последнего добавленного Proc
    begin
     ListView1.Clear;

     if not EnumProcesses(@procs, sizeof(procs), count) then
     begin
       exit;
     end;
     for i := 0 to count div 4 - 1 do
     begin
     //  Application.ProcessMessages;
       ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
         false, procs[i]);
       if ph > 0 then
       begin
         EnumProcessModules(ph, @mh, 4, cm);
         GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));

         with ListView1.Items.Add do
         begin
           Caption := (string(ModName));
           SubItems.Add(IntToStr(procs[i]));
         end;
         CloseHandle(ph);
       end
       else
         with ListView1.Items.Add do
         begin
           Caption := 'failed: ' + (string(ModName));
           SubItems.Add(IntToStr(procs[i]));
           SubItems.Add(IntToStr(GetLastError) + ':' + GetSystemErrorMessage(GetLastError));
         end;
     end;
    end;



    спасибо
  • Игорь Шевченко © (28.11.09 00:18) [1]
    debug-привилегию включить ?
  • istok20 © (28.11.09 01:02) [2]

    > Игорь Шевченко ©   (28.11.09 00:18) [1]
    > debug-привилегию включить ?


    о, помогло, спасибо)

    теперь борюсь с получением имени файла процесса, попробовал GetModuleFileNameExW вместо GetModuleFileNameEx - все равно не помогло - для многих x64 процессов не возвращает путь к файлу, сама ф-ция возвращает 0, вот что говорит расшифровка getlasterror: "запрос readprocessmemory или writeprocessmemory был выполнен только частично"
  • Rouse_ © (28.11.09 01:12) [3]
    А что пишешь?
  • istok20 © (28.11.09 01:16) [4]
    учёт использования программ, для которого нужно получать полный путь к файлам запущенных процессов...
  • istok20 © (28.11.09 01:52) [5]
    кажется отрыл точно такую же проблему на немецком форуме, надеюсь, это закроет тему...   http://www.delphipraxis.net/post976584.html
  • istok20 © (28.11.09 02:13) [6]
    да, сработало, вопрос закрыт:)
  • Игорь Шевченко © (29.11.09 01:14) [7]

    > учёт использования программ, для которого нужно получать
    > полный путь к файлам запущенных процессов...


    Стандартный аудит не ?
 
Конференция "WinAPI" » OpenProcess и 64bit applications... [D7]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]