2015-06-02 2 views
0

Я пытаюсь подобрать модули процесса, в соответствии с msdn невозможно обработать модули TH32CS_SNAPMODULE в 32-битных приложениях, используя функцию EnumProcessModules. Я не могу перечислить модули определенного процесса и переходят в бесконечный цикл.Ошибка при попытке EnumProcessModules в Windows 8 64bit

Я просто успел скомпилировать приложение для Windows 64bit.

вот моя ошибка кода!

procedure getmodule(ProcessID: Cardinal); 
var 
    Modules: array of HMODULE; 
    cbNeeded, i: Cardinal; 
    ModuleInfo: TModuleInfo; 
    ModuleName: array[0..MAX_PATH] of Char; 
    PHandle: THandle; 
    ITEM: TListItem; 
begin 
    SetLength(Modules, 1024); 
    PHandle := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessID); 
    if (PHandle <> 0) then 
    begin 
    EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded); //Getting the enumeration of modules 
    SetLength(Modules, cbNeeded div SizeOf(HMODULE)); //Setting the number of modules 
    for i := 0 to Length(Modules) - 1 do //Start the loop 
    begin 
     item := Form1.listView2.Items.Add; 
     ITEM.Caption := IntToStr(i); // Testing 
    end; 
    CloseHandle(PHandle); 
    end; 
end; 
+0

Документация 'CreateToolhelp32Snapshot' объясняет, как получить и 32- и 64-битных модулей в снимок с вашего 64-разрядного процесса. Включите в свой вызов как «TH32CS_SNAPMODULE», так и «TH32CS_SNAPMODULE32». –

+0

пример, я пытаюсь получить список модулей whit function CreateToolhelp32Snapshot, но у меня есть какой-то процесс, который не работает, например, explorer, я не знаю почему, но если я скомпилирую свое приложение 64bits, это сработает. Да, мой вызов имеет TH32CS_SNAPMODULE32 и TH32CS_SNAPMODULE, но дескриптор модулей - 0. – MrHelp

+0

см. ContinueLoop: = Module32First (ModuleSnap, ModuleEntry); while Integer (ContinueLoop) <> 0 do begin – MrHelp

ответ

3

Вы не вводите бесконечный цикл; вы вводите очень длинный цикл. Когда EnumProcessModules не работает, он, очевидно, устанавливает cbNeeded := 0. Это также задает длину вашего массива равным нулю. Затем вы вводите цикл, начинающийся с 0 и заканчивающийся на -1. Интерпретируется как Cardinal, значение -1 - 4294967295. Для подсчета этого значения требуется большое (но не бесконечное) время, особенно когда вы добавляете элементы в список. Вы, наверное, устали ждать своей программы и убили ее, пока она не закончила цикл.

Есть по крайней мере два изменения, которые необходимо сделать для того, чтобы продолжить работу по программе:

  1. Объявляет i как Integer так, что вычисления Length(Modules) - 1 не Underflow.

  2. Обратите внимание на возвращаемые значения всех ваших вызовов API. Никогда не игнорируйте возвращаемое значение API. MSDN говорит, что EnumProcessModules возвращает ноль, когда он терпит неудачу. Проверьте это. Если он возвращает ноль, то звоните GetLastError, чтобы узнать причину.

    Кроме того, не допускайте, чтобы 1024 был достаточно большим для вашего массива; возможно, что cbNeeded будет установлено на большее число. Когда это произойдет, вы будете перебирать больше элементов массива, чем вы получили. (Дополнительные значения будут нулевые ручки.)