Разъясните плиз про эту структуру кто знает.
Вот так она выглядит в
Windows 2000:
typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryOffset;
ULONG ThreadCount;
ULONG Reserved1 [6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG Reserved2;
VM_COUNTERS VmCounters;
ULONG PrivatePageCount;
IO_COUNTERS IoCounters; // Windows >= 2000 only
SYSTEM_THREADS Threads;
}
SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
А вот так — в
Windows XP+:
typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryOffset;
ULONG ThreadCount;
ULONG Reserved1 [6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG Reserved2;
VM_COUNTERS VmCounters;
ULONG PrivatePageCount;
SYSTEM_THREADS Threads;
}
SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
Я прав?
Если да, то как же получить смещение поля
.Threads на любой
Windows начиная с
2000? Можно конечно объявить две структуры и приводить буфер к ним в зависимости от версии, но есть ли способ проще?
Всё, только что сам нашёл, извините за беспокойство =)
Я неверно сформулировал вопрос. Там различие
2000 и
NT4, которое для меня роли не играет.
Вот как надо:
Структура SYSTEM_PROCESSES имеет переменный размер, поле .NextEntryDelta указывает смещение к следующей струтктуре в массиве. Наличие этого поля позволяет нам игнорировать различия в размере фиксированной части структуры между Windows NT 4.0 и Windows 2000, где в состав структуры было добавлено поле IoCounters.
Взял
здесьАвтор(ы): Александр Федотов
Дата: 23.10.2001
В статье рассматривается несколько способов перечисления процессов
в Windows различных версий, включая методы, пригодные для перечисления
процессов на другом компьютере.
.
И извиняюсь, там последнее поле не
typedef struct ...
{
SYSTEM_THREADS Threads;
}
...;
а
typedef struct ...
{
SYSTEM_THREADS Threads [1];
}
...;
Кстати, структура на самом деле называется
SYSTEM_PROCESS_INFORMATION, и Александр Федотов уже исправил в
статье на своём сайте. (а информаионный класс 5 — SystemProcessInformation)
Вот наиболее полное и правильное (ИМХО) определение структуры:
struct SYSTEM_PROCESS_INFORMATION
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
BYTE _unknown1[24];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
KPRIORITY BasePriority;
ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
LONG HandleCount;
ULONG SessionId;
ULONG _unknown2;
// VM counters
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
#if _WIN32_WINNT >= 0x500
// IO counters
ULONGLONG ReadOperationCount;
ULONGLONG WriteOperationCount;
ULONGLONG OtherOperationCount;
ULONGLONG ReadTransferCount;
ULONGLONG WriteTransferCount;
ULONGLONG OtherTransferCount;
#endif
};
SYSTEM_THREAD_INFORMATION не входит в эту структуру, её адрес можно вычислить, зная NextEntryOffset и NumberOfThreads.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth