Структура SYSTEM_PROCESSES
От: Аноним  
Дата: 26.03.07 06:45
Оценка:
Разъясните плиз про эту структуру кто знает.
Вот так она выглядит в 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? Можно конечно объявить две структуры и приводить буфер к ним в зависимости от версии, но есть ли способ проще?
Re: Структура SYSTEM_PROCESSES
От: Аноним  
Дата: 26.03.07 06:54
Оценка:
Всё, только что сам нашёл, извините за беспокойство =)
Я неверно сформулировал вопрос. Там различие 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];
}
...;
Re[2]: Структура SYSTEM_PROCESS_INFORMATION
От: gear nuke  
Дата: 26.03.07 09:51
Оценка:
Кстати, структура на самом деле называется 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.