20.
Средства получения информации о
процессах и потоках в ОС MS Windows.
Error 404:
answer not found J
Задача получения списка выполняющихся
в системе процессов является одной из основных при выполнении мониторинга ресурсов,
как отдельного ПК, так и ЛВС в целом, поэтому для ее решения разработано
значительное количество утилит, имеется встроенное системное средство –
диспетчер задач.
Все перечисленные программные
средства используют как функции Win32 API (Application Program Interface – прикладной программный интерфейс), так и
функции еще одного базового интерфейса, называемого Native API (естественный API). Внешняя часть Native API пользовательского режима
содержится в модуле ntdll.dll, «настоящий» интерфейс реализован в ntoskernel.exe – ядре операционной системы NT (NT operation system kernel). Функции Win32 API,
как правило, обращаются к функциям Native API, отбрасывая часть
полученной от них информации. Поэтому использование функций Native API позволяет получить, вообще говоря, более эффективное ПО.
К функциям Win32 API для получения информации о выполняющихся в
системе процессах относятся функции CreateToolHelp32Snapshot(), Process32First(),
Process32Next(), Thread32First (), Thread32Next(),
Module32First(), Module32Next(), Heap32ListFirst(), Heap32ListNext() и некоторые другие. Самая известная из функций
Native API для доступа к содержимому многих важных внутренних структур операционной
системы, таких как списки процессов, потоков, дескрипторов, драйверов и т. п. –
функция NtQuerySystemInformation ().
1.1.1 Использование
функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
Первый этап получения информации о выполняющихся в системе
процессах - получение снимка (snapshot)
системы, который содержит информацию о состоянии системы в момент выполнения
снимка.
Снимок создается
с помощью функции CreateToolHelp32Snapshot (dwFlags,
th32ProcessID), первый
аргумент определяет, какая информация будет записана в снимок - возможные
значения dwFlags приведены в таблице.
Флаг - dwFlags |
Описание |
TH32CS_SnapHEAPLIST |
В снимок включается список куч, принадлежащих
указанному процессу |
TH32CS_SnapPROCESS |
В снимок включается список процессов,
присутствующих в системе |
TH32CS_SnapTHREAD |
В снимок включается список потоков |
TH32CS_SnapMODULE |
В снимок включается список модулей,
принадлежащих указанному процессу |
TH32CS_SnapALL |
В снимок включается список куч, процессов,
потоков и модулей |
Второй аргумент определяет процесс,
информация о котором необходима (если требуется список куч и модулей). В
остальных случаях он игнорируется.
Второй этап - извлечение из снимка списка процессов. Для
выполнения этой операции служат функции:
Process32First
( hSnapshot, LPProcessEntry32)
Process32Next
( hSnapshot, LPProcessEntry32).
Первый аргумент - хэндл
созданного снимка (возвращает функция CreateToolHelp32Snapshot).
Второй аргумент- структура,
содержащая 10 полей:
1. Первое поле этой структуры - dwSize
- должно перед вызовом функции содержать размер структуры в байтах - sizeof (ProcessEntry32).
2. Второе поле - cntUsage
- содержит число ссылок на процесс, то есть число потоков, которые в настоящий
момент используют какие-либо данные процесса.
3. Третье поле - th32ProcessID - является
идентификатором процесса.
4. Шестое поле - cntThreads
- определяет число потоков, принадлежащих процессу.
5. Седьмое поле - th32ParentProcessID - является
идентификатором родительского по отношению к текущему процесса.
6. Поле pcPriClassBase cодержит базовый приоритет процесса.
7. Поле szExeFile cодержит имя файла,
создавшего процесс.
Для того, чтобы получить информацию о
первом процессе в снимке, необходимо вызвать функцию Process32First. В случае
успешного завершения функция возвращает TRUE. Для того, чтобы просмотреть все
оставшиеся процессы, нужно вызывать функцию Process32Next до тех пор, пока она
не возвратит FALSE.
В список используемых модулей - uses - необходимо добавить модуль TlHelp32