получить процесс mdoules c # с kernel.dll - PullRequest
0 голосов
/ 31 декабря 2018

У меня возникают некоторые проблемы при выполнении этого:

    public MODULEENTRY32 getModule(String ModuleName)
    {
        MODULEENTRY32 module32;
        module32.dwSize = (uint) Marshal.SizeOf(typeof(MODULEENTRY32));
        IntPtr hSnap = CreateToolhelp32Snapshot(SnapshotFlags.TH32CS_SNAPMODULE | SnapshotFlags.TH32CS_SNAPMODULE32, (uint) process.Id);
        Module32First(hSnap, out module32);
        if (hSnap == IntPtr.Zero)
        {
            return new MODULEENTRY32();
        }
        do
        {
            if (module32.szModule.Equals(ModuleName))
            {
                CloseHandle(hSnap);
                return module32;
            }
        } while (Module32Next(hSnap, out module32));
        return new MODULEENTRY32();
    }

Я пытался получить модули из процесса, но он всегда возвращает 0, я уверен, что имя модуля является corrent, а процесстоже идентификатор

1 Ответ

0 голосов
/ 02 января 2019

Я не думаю, что вы предоставили достаточно информации, чтобы определить, в чем проблема.

Если вы прочитали документацию CreateToolHelp32Snapshot , вам следует проверить, является ли возвращенный hSnap INVALID_HANDLE_VALUE (-1),Если это так, вам нужно вызвать GetLastError, чтобы определить причину сбоя.

Возможные причины сбоев задокументированы:

Если указанный процесс является процессом Idle или одним изВ процессах CSRSS эта функция завершается сбоем, а последний код ошибки - ERROR_ACCESS_DENIED, поскольку их ограничения доступа не позволяют открывать их на уровне пользователя.

Если указанный процесс является 64-разрядным процессом, а вызывающий - 32-В битовом процессе эта функция завершается ошибкой, и последний код ошибки - ERROR_PARTIAL_COPY (299).

и:

При создании снимков, которые содержат кучи и модули для процесса, отличного отВ текущем процессе функция CreateToolhelp32Snapshot может завершиться ошибкой или вернуть неверную информацию по разным причинам.Например, если таблица данных загрузчика в целевом процессе повреждена или не инициализирована, или если список модулей изменяется во время вызова функции в результате загрузки или выгрузки библиотек DLL, функция может завершиться ошибкой с ERROR_BAD_LENGTH или другим кодом ошибки.Убедитесь, что целевой процесс не был запущен в приостановленном состоянии, и попробуйте вызвать функцию еще раз.Если функция завершается с ошибкой с ERROR_BAD_LENGTH при вызове с TH32CS_SNAPMODULE или TH32CS_SNAPMODULE32, вызывайте функцию снова, пока она не завершится успешно.

...