Монитор процессов

Автор JleruOHeP, 28 октября 2007, 23:59:11

0 Пользователей и 1 гость просматривают эту тему.

JleruOHeP

Помогите плз!
Нужен монитор процессов, выполненный в виде дерева. На C#.
Нашел вариант с System.Diagnostics.Process.GetProcesses(), но вот как потом из полученных процессов выделять родителей и детей - не нашел...
Еще вариант есть с функцией NtSystemQuerryInformation, лписанной в ntdll.dll - но ее что то не получается экспортировать нормально. У нее в качестве параметров указатель на структуру передается - но компилятор ругается на его размер (структура сложная...). Как можно в C# объявить просто тип "указатель" (а-ля pointer в Delphi)?

Для справки, или мб кому то просто пригодиццо:

type
  USHORT = Word;
  LONG = LongInt;
  PLARGE_INTEGER = ^LARGE_INTEGER;
  PPWideChar = ^PWideChar;
  PLONG = ^LongInt;
  ULONGLONG = Int64;
  PTOKEN_PRIVILEGES = PTokenPrivileges;
  TIMER_TYPE = Integer;
  PUSHORT = ^USHORT;
  NTSTATUS = Integer;
  PVOID = Pointer;
  CLIENT_ID = packed record
    UniqueProcess: THandle;
    UniqueThread: THandle;
  end;
  PCLIENT_ID = ^CLIENT_ID;
{ Структура UNICODE_STRING - Передача строковых параметров для Native API и   хранение строк во внутренних структурах Windows }
  TUnicodeString = packed record
    Length: WORD;
    MaximumLength: WORD;
    Buffer: PWideChar;
  end;
 UNICODE_STRING = TUnicodeString;

{Базовая информация о системе - класс запрашиваемой информации 0}
  SYSTEM_BASIC_INFORMATION = packed record
    AlwaysZero: ULONG;
    MaximumIncrement: ULONG;
    PhysicalPageSize: ULONG;
    NumberOfPhysicalPages: ULONG;
    LowestPhysicalPage: ULONG;
    HighestPhysicalPage: ULONG;
    AllocationGranularity: ULONG;
    LowestUserAddress: ULONG;
    HighestUserAddress: ULONG;
    ActiveProcessors: ULONG;
    NumberProcessors: UCHAR;
    Filler: array[0..2] of char;
  end;

type
{ Формат времени (структура аналогична SYSTEMTIME в Win32 API }
  TIME_FIELDS = packed record
    Year: WORD;
    Month: WORD;
    Day: WORD;
    Hour: WORD;
    Minute: WORD;
    Second: WORD;
    Milliseconds: WORD;
    Weekday: WORD;
  end;
  PTIME_FIELDS = ^TIME_FIELDS;

{ Информация о производительности системы - класс информации равен 2}
  SYSTEM_PERFORMANCE_INFORMATION = packed record
    IdleTime: LARGE_INTEGER;
    ReadTransferCount: LARGE_INTEGER;
    WriteTransferCount: LARGE_INTEGER;
    OtherTransferCount: LARGE_INTEGER;
    ReadOperationCount: ULONG;
    WriteOperationCount: ULONG;
    OtherOperationCount: ULONG;
    AvailablePages: ULONG;
    TotalCommittedPages: ULONG;
    TotalCommitLimit: ULONG;
    PeakCommitment: ULONG;
    PageFaults: ULONG;
    WriteCopyFaults: ULONG;
    TransitionFaults: ULONG;
    Reserved1: ULONG;
    DemandZeroFaults: ULONG;
    PagesRead: ULONG;
    PageReadIos: ULONG;
    Reserved2: array[0..1] of ULONG;
    PageFilePagesWritten: ULONG;
    PageFilePageWriteIos: ULONG;
    MappedFilePagesWritten: ULONG;
    MappedFilePageWriteIos: ULONG;
    PagedPoolUsage: ULONG;
    NonPagedPoolUsage: ULONG;
    PagedPoolAllocs: ULONG;
    PagedPoolFrees: ULONG;
    NonPagedPoolAllocs: ULONG;
    NonPagedPoolFrees: ULONG;
    TotalFreeSystemPtes: ULONG;
    SystemCodePage: ULONG;
    TotalSystemDriverPages: ULONG;
    TotalSystemCodePages: ULONG;
    SmallNonPagedLookasideListAllocateHits: ULONG;
    SmallPagedLookasideListAllocateHits: ULONG;
    Reserved3: ULONG;
    MMSystemCachePage: ULONG;
    PagedPoolPage: ULONG;
    SystemDriverPage: ULONG;
    FastReadNoWait: ULONG;
    FastReadWait: ULONG;
    FastReadResourceMiss: ULONG;
    FastReadNonPossible: ULONG;
    FastMdlReadNoWait: ULONG;
    FastMdlReadWait: ULONG;
    FastMdlReadResourceMiss: ULONG;
    FastMdlReadNonPossible: ULONG;
    MapDataNoWait: ULONG;
    MapDataWait: ULONG;
    MapDataNoWaitMiss: ULONG;
    MapDataWaitMiss: ULONG;
    PinMappedDataCount: ULONG;
    PinReadNoWait: ULONG;
    PinReadWait: ULONG;
    PinReadNoWaitMiss: ULONG;
    PinReadWaitMiss: ULONG;
    CopyReadNoWait: ULONG;
    CopyReadWait: ULONG;
    CopyReadNoWaitMiss: ULONG;
    CopyReadWaitMiss: ULONG;
    MdlReadNoWait: ULONG;
    MdlReadWait: ULONG;
    MdlReadNoWaitMiss: ULONG;
    MdlReadWaitMiss: ULONG;
    ReadAheadIos: ULONG;
    LazyWriteIos: ULONG;
    LazyWritePages: ULONG;
    DataFlushes: ULONG;
    DataPages: ULONG;
    ContextSwitches: ULONG;
    FirstLevelTbFills: ULONG;
    SecondlevelTbFills: ULONG;
    SystemCalls: ULONG;
  end;
  PSYSTEM_PERFORMANCE_INFORMATION = ^SYSTEM_PERFORMANCE_INFORMATION;

{ Информация о текущем времени и часовом поясе класс информации 3 }
  SYSTEM_TIME_OF_DAY_INFORMATION = packed record
    BootTime: LARGE_INTEGER;
    CurrentTime: LARGE_INTEGER;
    TimeZoneBias: LARGE_INTEGER;
    CurrentTimeZoneId: ULONG;
    Reserved: ULONG;
  end;
  PSYSTEM_TIME_OF_DAY_INFORMATION = ^SYSTEM_TIME_OF_DAY_INFORMATION;

  { Информация о процессах и потоках }
  THREAD_STATE = Integer;
  KWAIT_REASON = Integer;
  KPRIORITY = Integer;
  POOL_TYPE = Integer;

  { Описание потока }
  SYSTEM_THREADS = packed record
    KernelTime: LARGE_INTEGER;
    UserTime: LARGE_INTEGER;
    CreateTime: LARGE_INTEGER;
    WaitTime: ULONG;
    StartAddress: PVOID;
    ClientId: CLIENT_ID;
    Priority: KPRIORITY;
    BasePriority: KPRIORITY;
    ContextSwitchCount: ULONG;
    State: THREAD_STATE;
    WaitReason: KWAIT_REASON;
    Reserved: ULONG;
  end;

  SYSTEM_THREADS_ARRAY = array[0..1024] of SYSTEM_THREADS;
  PSYSTEM_THREADS_ARRAY = ^SYSTEM_THREADS_ARRAY;

  { Счетчики виртуальной памяти }
  VM_COUNTERS = packed record
    PeakVirtualSize: ULONG;
    VirtualSize: ULONG;
    PageFaultCount: ULONG;
    PeakWorkingSetSize: ULONG;
    WorkingSetSize: ULONG;
    QuotaPeakPagedPoolUsage: ULONG;
    QuotaPagedPoolUsage: ULONG;
    QuotaPeakNonPagedPoolUsage: ULONG;
    QuotaNonPagedPoolUsage: ULONG;
    PageFileUsage: ULONG;
    PeakPageFileUsage: ULONG;
  end;

  {Счетчики ввода-вывода. Эта структура существует только в Windows 2000 и выше}
  IO_COUNTERS = packed record
    ReadOperationCount: LARGE_INTEGER;
    WriteOperationCount: LARGE_INTEGER;
    OtherOperationCount: LARGE_INTEGER;
    ReadTransferCount: LARGE_INTEGER;
    WriteTransferCount: LARGE_INTEGER;
    OtherTransferCount: LARGE_INTEGER;
  end;

  { Информация о процессе для Windows 2000 и выше }
  SYSTEM_PROCESSES_NT2000 = packed record
      // величина смещения для перехода к следующему элементу списка
    NextEntryDelta: ULONG;
    ThreadCount: ULONG;
    Reserved1: array[0..5] of ULONG;
    CreateTime: LARGE_INTEGER;
    UserTime: LARGE_INTEGER;
    KernelTime: LARGE_INTEGER;
    ProcessName: UNICODE_STRING;
    BasePriority: KPRIORITY;
    ProcessId: ULONG;
    InheritedFromProcessId: ULONG;
    HandleCount: ULONG;
    Reserved2: array[0..1] of ULONG;
    VmCounters: VM_COUNTERS;
    PrivatePageCount: ULONG;
    IoCounters: IO_COUNTERS;
  //  Threads : array[0..0] of SYSTEM_THREADS;
  end;

  PSYSTEM_PROCESSES_NT2000 = ^SYSTEM_PROCESSES_NT2000;

  { Информация об аппаратной конфигурации системы - класс информации 7}

  SYSTEM_CONFIGURATION_INFORMATION = packed record
    DiskCount: ULONG;
    FloppyCount: ULONG;
    CdRomCount: ULONG;
    TapeCount: ULONG;
    SerialCount: ULONG;
    ParallelCount: ULONG;
  end;

  PSYSTEM_CONFIGURATION_INFORMATION = ^SYSTEM_CONFIGURATION_INFORMATION;
  { Информация о времени работы процессора в различных режимах. Для каждого процессора в системе возвращается по структуре }
  SYSTEM_PROCESSOR_TIMES = packed record
    IdleTime: LARGE_INTEGER;
    KernelTime: LARGE_INTEGER;
    UserTime: LARGE_INTEGER;
    DpcTime: LARGE_INTEGER;
    InterruptTime: LARGE_INTEGER;
    InterruptCount: ULONG;
  end;

  PSYSTEM_PROCESSOR_TIMES = ^SYSTEM_PROCESSOR_TIMES;
  { Информация о глобальных настройках системы }
  SYSTEM_GLOBAL_FLAG = packed record
    GlobalFlag: ULONG;
  end;
  PSYSTEM_GLOBAL_FLAG = ^SYSTEM_GLOBAL_FLAG;
  { Информация о загруженных модулях режима ядра }
  SYSTEM_MODULE_INFORMATION = packed record
    Reserved: array [0..1] of ULONG;
    Base: PVOID;
    Size: ULONG;
    Flags: ULONG;
    Index: USHORT;
    Unknown: USHORT;
    LoadCount: USHORT;
    ModuleNameOffset: USHORT;
    ImageName: array[0..255] of char; { ANSI }
  end;

  PSYSTEM_MODULE_INFORMATION = ^SYSTEM_MODULE_INFORMATION;
  SYSTEM_MODULE_INFORMATION_ARRAY = array[0..16384] of
    SYSTEM_MODULE_INFORMATION;
  { Массив информации для класса SystemModuleInformation }
  SYSTEM_MODULES_INFORMATION = packed record
    Count: ULONG;
    Data: SYSTEM_MODULE_INFORMATION_ARRAY;
  end;
  PSYSTEM_MODULES_INFORMATION = ^SYSTEM_MODULES_INFORMATION;


{ Информация о дескрипторе }
  SYSTEM_HANDLE_INFORMATION = packed record
    PID: ULONG;        { Идентификатор процесса, владеющего данным дескриптором }
    ObjectType: UCHAR; { Тип объекта, идентифицируемого данным дескриптором }
    Flags: UCHAR;      { Флаги дескриптора }
    Handle: USHORT;    { Значение дескриптора }
    FObject: PVOID;    { Адрес объекта, идентифицируемого данным дескриптором }
    GrantedAccess: ACCESS_MASK; { Степень доступа к объекту, предоставленная
                                   в момент создания данного дескриптора }
  end;
  PSYSTEM_HANDLE_INFORMATION = ^SYSTEM_HANDLE_INFORMATION;
  SYSTEM_HANDLE_INFORMATION_ARRAY = array[0..16384] of SYSTEM_HANDLE_INFORMATION;
  { Массив информации для класса SystemHandleInformation }
  SYSTEM_HANDLES_INFORMATION = packed record
    Count: ULONG;
    Data: SYSTEM_HANDLE_INFORMATION_ARRAY;
  end;
  PSYSTEM_HANDLES_INFORMATION = ^SYSTEM_HANDLES_INFORMATION;
  { Информация об объектах выдается только в том случае, если в системе
    установлен глобальный флаг FLG_MAINTAIN_OBJECT_TYPELIST }
  { Информация об объектах }
  SYSTEM_OBJECT_INFORMATION = packed record
    NextEntryOffset: ULONG;
    ObjectAddress: PVOID;
    CreatorProcessId: ULONG;
    Unknown: USHORT;
    Flags: USHORT;
    PointerCount: ULONG;
    HandleCount: ULONG;
    PagedPoolUsage: ULONG;
    NonPagedPoolUsage: ULONG;
    ExclusiveProcessId: ULONG;
    SecurityDescriptor: PSECURITY_DESCRIPTOR;
    Name: UNICODE_STRING;
  end;

function NtQuerySystemInformation (
            SystemInformationClass: LongInt; // класс запрашиваемой системной
                                                                    //  информации
            SystemInformation: Pointer;        // указатель на результирующий буфер
            SystemInformationLength: ULONG;     //  размер  этого буфера
            ReturnLength: PDWORD          // количество записанных байт
                                                        ) : NTSTATUS; stdcall;
   external 'ntdll.dll';    // имя библиотеки DLL, содержащей функцию
Тот кто познал любовь являеться низшим существом и должен страдать

GTG

[move]*<#>=========(000*000)
/-----------------()()()\
\/"""""""""""""""""""""\/
_\_________________/

weend

18 ноября 2007, 14:46:26 #2 Последнее редактирование: 19 ноября 2007, 07:07:43 от weend
2JleruOHeP:
Как, кстати, продвигается?

JleruOHeP

Сделано.
Оказалось все довольно просто - но найти как это просто было самым сложным)
Если надо - могу выложить решение в скором времени!
Тот кто познал любовь являеться низшим существом и должен страдать

weend

Выложи, ес не трудно. Интересно посмотреть.