
- •«Тверской государственный технический университет»
- •Задание
- •Описание
- •Процессы и модули
- •Получение списка идентификаторов процессов
- •Получение имен процессов
- •Получение списка модулей для заданного процесса
- •Параметры
- •Возвращаемые значения
- •Примечания
- •Параметры
- •Возвращаемые значения
- •Параметры
- •Возвращаемые значения
- •Примечания
- •Исходный текст программы:
- •Результаты работы программы:
Получение списка модулей для заданного процесса
Список хендлов модулей для заданного процесса можно получить, используя функцию EnumProcessModules. Поскольку данная функция требует одним из параметров хендл процесса, необходимо этот хендл открыть функцией OpenProcess. При этом флаги доступа должны включать (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ) для возможности получения необходимой информации о процессе. Полученный хендл процесса передается в EnumProcessModules и функция заполняет указанный массив хендлами модулей процесса. Далее нужно получить имя каждого модуля функцией GetModuleBaseName.
Описания функций и структур
EnumProcesses
Функция EnumProcesses получает идентификаторы всех процессов в системе.
BOOL EnumProcesses(
DWORD *lpidProcess, // массив для получения идентификаторов процессов
DWORD cb, // размер массива
DWORD *cbNeeded // количество записанных байт
);
Параметры
lpidProcess
[out] Указатель на массив, в который помещаются идентификаторы процессов.
cb
[in] Задает размер в байтах массива lpidProcess.
cbNeeded
[out] Получает количество байт, записанных в массив lpidProcess.
Возвращаемые значения
Если функция выполнилась успешно, то возвращается ненулевое значение.
Если функция выполнилась неуспешно, то возвращается 0. Для получения более подробной информации об ошибке используйте GetLastError.
Примечания
Имеет смысл передавать в EnumProcesses большой массив DWORD, поскольку трудно предугадать, сколько будет процессов во время вызова EnumProcesses. Чтобы определить, сколько процессов было перечислено при вызове EnumProcesses, разделите полученное в cbNeeded значение на sizeof(DWORD). Не существует указания, что буфер слишком маленький, чтобы вместить все идентификаторы процессов. Косвенным признаком подобной ситуации может быть равенство значения в cbNeeded размеру массива.
Для получения описателей (хендлов) процессов по их идентификаторам используйте функцию OpenProcess.
EnumProcessModules
Функция EnumProcessModules получает хендлы всех модулей заданного процесса.
BOOL EnumProcessModules(
HANDLE hProcess, // хендл процесса
HMODULE *lphModule, // массив для получения хендлов модулей
DWORD cb, // размер массива
LPDWORD lpcbNeeded // требуемое количество байт
);
Параметры
hProcess
[in] Хендл процесса.
lphModule
[out] Указатель на массив, в который помещаются хендлы модулей.
cb
[in] Задает размер в байтах массива lphModule.
lpcbNeeded
[out] Получает количество байт, необходимых для сохранения всех хендлов модулей в массиве lphModule.
Возвращаемые значения
Если функция выполнилась успешно, то возвращается ненулевое значение.
Если функция выполнилась неуспешно, то возвращается 0. Для получения более подробной информации об ошибке используйте GetLastError.
Примечания
Имеет смысл передавать в EnumProcessModules большой массив HMODULE, поскольку трудно предугадать, сколько модулей будет у процесса во время вызова EnumProcessModules. Чтобы определить, что массив lphModule слишком мал для хранения всех хендлов модулей процесса, сравните значение, записанное в lpcbNeeded, со значением, заданным в cb. Если lpcbNeeded больше cb, нужно увеличить размер массива и вызвать EnumProcessModules еще раз.
Чтобы определить, сколько модулей было перечислено при вызове EnumProcessModules, разделите полученное в lpcbNeeded значение на sizeof(HMODULE).
GetModuleBaseName
Функция GetModuleBaseName получает базовое имя заданного модуля.
DWORD GetModuleBaseName(
HANDLE hProcess, // хендл процесса
HMODULE hModule, // хендл модуля
LPTSTR lpBaseName, // буфер для имени
DWORD nSize // размер буфера
);