Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2008, 17:03   #1
student_63
Пользователь
 
Аватар для student_63
 
Регистрация: 07.11.2007
Сообщений: 92
Сообщение Функция NtQuerySystemInformation

Здравствуйте, нашел в поиске по форуму как получить список процессов используя NtQuerySystemInformation
Код:
type
 
  TfrmProcess = class(TForm)
    tvProcess: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    procedure AddProcess(const ID, ParentID: DWORD;
      const Description: String);
    procedure GetProcTree;
  end;
 
  PSYSTEM_THREADS = ^SYSTEM_THREADS;
  SYSTEM_THREADS  = packed record
    KernelTime: LARGE_INTEGER;
    UserTime: LARGE_INTEGER;
    CreateTime: LARGE_INTEGER;
    WaitTime: ULONG;
    StartAddress: Pointer;
    UniqueProcess: DWORD;
    UniqueThread: DWORD;
    Priority: Integer;
    BasePriority: Integer;
    ContextSwitchCount: ULONG;
    State: Longint;
    WaitReason: Longint;
  end;
 
  PSYSTEM_PROCESS_INFORMATION = ^SYSTEM_PROCESS_INFORMATION;
  SYSTEM_PROCESS_INFORMATION = packed record
    NextOffset: ULONG;
    ThreadCount: ULONG;
    Reserved1: array [0..5] of ULONG; // Что такое, пока не понятно...
    CreateTime: FILETIME;
    UserTime: FILETIME;
    KernelTime: FILETIME;
    ModuleNameLength: WORD;
    ModuleNameMaxLength: WORD;
    ModuleName: PWideChar;
    BasePriority: ULONG;
    ProcessID: ULONG;
    InheritedFromUniqueProcessID: ULONG;
    HandleCount: ULONG;
    Reserved2 : array[0..1] of ULONG; // Что такое, пока не понятно...
    PeakVirtualSize : ULONG;
    VirtualSize : ULONG;
    PageFaultCount : ULONG;
    PeakWorkingSetSize : ULONG;
    WorkingSetSize : ULONG;
    QuotaPeakPagedPoolUsage : ULONG;
    QuotaPagedPoolUsage : ULONG;
    QuotaPeakNonPagedPoolUsage : ULONG;
    QuotaNonPagedPoolUsage : ULONG;
    PageFileUsage : ULONG;
    PeakPageFileUsage : ULONG;
    PrivatePageCount : ULONG;
    ReadOperationCount : LARGE_INTEGER;
    WriteOperationCount : LARGE_INTEGER;
    OtherOperationCount : LARGE_INTEGER;
    ReadTransferCount : LARGE_INTEGER;
    WriteTransferCount : LARGE_INTEGER;
    OtherTransferCount : LARGE_INTEGER;
    ThreadInfo: array [0..0] of SYSTEM_THREADS;
  end;
 
  function NtQuerySystemInformation(
    SystemInformationClass: DWORD;   // тип требуемой информации
    SystemInformation : Pointer;     // указатель на буфер, в который вернется информация
    SystemInformationLength : DWORD; // размер буфера в байтах
    var ReturnLength: DWORD          // сколько байт было возвращено или требуется
    ): DWORD; stdcall; external 'ntdll.dll';
 
const
  SystemProcessesAndThreadsInformation = 5;
  STATUS_INFO_LENGTH_MISMATCH = $C0000004;
 
var
  frmProcess: TfrmProcess;
 
implementation
 
{$R *.dfm}
 
{ TForm2 }
 
procedure TfrmProcess.AddProcess(const ID, ParentID: DWORD;
  const Description: String);
var
  I: Integer;
  Node: TTreeNode;
begin
  Node := nil;
  for I := 0 to tvProcess.Items.Count - 1 do
    if DWORD(tvProcess.Items.Item[i].Data) = ParentID then
    begin
      Node := tvProcess.Items.Item[i];
      Break;
    end;
  Node := tvProcess.Items.AddChildFirst(Node, Description);
  Node.Data := Pointer(ID);
end;
 
procedure TfrmProcess.FormCreate(Sender: TObject);
begin
  GetProcTree;
end;
procedure TfrmProcess.GetProcTree;
var
  SystemInformation, SystemInformationIterator: PSYSTEM_PROCESS_INFORMATION;
  ReturnLength: DWORD;
  ModuleName: String;
begin
  ReturnLength := 0;
  if NtQuerySystemInformation(
    SystemProcessesAndThreadsInformation,
    nil, 0, ReturnLength) <> STATUS_INFO_LENGTH_MISMATCH then Exit;
  if ReturnLength > 0 then
  begin
    GetMem(SystemInformation, ReturnLength);
    try
      if NtQuerySystemInformation(SystemProcessesAndThreadsInformation,
        SystemInformation, ReturnLength, ReturnLength) = 0 then
      begin
        SystemInformationIterator := SystemInformation;
        repeat
          if SystemInformationIterator^.ModuleName = nil then
            ModuleName := 'System Idle Process'
          else
            ModuleName := SystemInformationIterator^.ModuleName;
          AddProcess(SystemInformationIterator^.ProcessID,
            SystemInformationIterator^.InheritedFromUniqueProcessID,
            ModuleName);
          SystemInformationIterator :=
            Pointer(DWORD(SystemInformationIterator) +
            SystemInformationIterator^.NextOffset);
        until SystemInformationIterator^.NextOffset = 0;
      end;
    finally
      FreeMem(SystemInformation);
    end;
  end;
end;
end.
Вот только я не пойму, как мне в виде TreeView на моей форме вывести этот список и чтобы он обновлялся автоматически. И еще может кто знает как это все работает, пожалуйста напишите или киньте ссылки. Заранее благодарен
Я уверен, вы согласитесь со мной... что если
со страницей 534 мы встречаемся во второй главе, то первая глава должна быть невыносимо длинной.
- ШЕРЛОК ХОЛМС
student_63 вне форума Ответить с цитированием
Старый 27.03.2008, 17:30   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
как мне в виде TreeView на моей форме вывести этот список
А вот это что:
tvProcess: TTreeView;
Третья строка в коде...
Цитата:
и чтобы он обновлялся автоматически
Поставьте таймер и будет вам вечное автоматическое обновление.
mihali4 вне форума Ответить с цитированием
Старый 27.03.2008, 18:46   #3
student_63
Пользователь
 
Аватар для student_63
 
Регистрация: 07.11.2007
Сообщений: 92
По умолчанию

Что то не могу я присвоить своему дереву дерево другого класса, напишите, плизз как
Я уверен, вы согласитесь со мной... что если
со страницей 534 мы встречаемся во второй главе, то первая глава должна быть невыносимо длинной.
- ШЕРЛОК ХОЛМС
student_63 вне форума Ответить с цитированием
Старый 27.03.2008, 20:06   #4
student_63
Пользователь
 
Аватар для student_63
 
Регистрация: 07.11.2007
Сообщений: 92
По умолчанию

посмотрите, пожалуйста, что я сделал не так, завтра хоть чтото по курсачу показывать надо, а тут жесть такая
Вложения
Тип файла: rar Kurs_.rar (14.4 Кб, 87 просмотров)
Я уверен, вы согласитесь со мной... что если
со страницей 534 мы встречаемся во второй главе, то первая глава должна быть невыносимо длинной.
- ШЕРЛОК ХОЛМС
student_63 вне форума Ответить с цитированием
Старый 27.03.2008, 20:33   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Загляните в инспектор объектов и попробуйте найти обработчик события OnCreate для формы.
Нету? Вот и я не нашел...
А в тексте модуля обработчик для него прописан...
mihali4 вне форума Ответить с цитированием
Старый 27.03.2008, 20:37   #6
student_63
Пользователь
 
Аватар для student_63
 
Регистрация: 07.11.2007
Сообщений: 92
По умолчанию

Спасибо большое. У меня всегда из-за какой-нить глупости тупики получаются. Все заработало!!!

А как здесь еще автоматическое обновление сделать, чтото не догоню никак?
Я уверен, вы согласитесь со мной... что если
со страницей 534 мы встречаемся во второй главе, то первая глава должна быть невыносимо длинной.
- ШЕРЛОК ХОЛМС

Последний раз редактировалось rpy3uH; 19.08.2008 в 09:11.
student_63 вне форума Ответить с цитированием
Старый 07.09.2016, 10:40   #7
SerZ06
Новичок
Джуниор
 
Регистрация: 06.09.2016
Сообщений: 2
По умолчанию

Все привет.
Подниму тему.
с процессами все понятно. делаю службу в которой монятся процессы. в частности (firefox.exe/iexplorer.exe/...)то-есть процессы браузеров.
теперь вопрос - как по ID процесса получить заголовки окон открытых в сессии пользователя???
SerZ06 вне форума Ответить с цитированием
Старый 07.09.2016, 12:51   #8
SerZ06
Новичок
Джуниор
 
Регистрация: 06.09.2016
Сообщений: 2
По умолчанию

Всем спасибо - разобрался, точнее - запустил из сервиса приложение в сессии пользователя и получил то что нужно )
SerZ06 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция ZiLi Microsoft Office Excel 1 05.09.2008 18:37
API-функция NeiL Win Api 2 02.05.2008 22:08
функция Janette Помощь студентам 1 29.04.2008 20:10
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50