Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.06;
Скачать: CL | DM;

Вниз

NtQuerySystemInformation   Найти похожие ветки 

 
Игорь ©   (2008-10-13 13:49) [0]

Привет, дайте примерчик попроще для получения списка процессов в Windows 2000 с помощью NtQuerySystemInformation, нашел пример Игоря Шевченко но для меня сложноват, мне нужен только список процессов с ID

Спасибо


 
Сергей М. ©   (2008-10-13 13:54) [1]

А чем функциональность PSAPI не устроила ?
Тот же результат достижим , и ощутимо проще ..


 
Vlad Oshin ©   (2008-10-13 14:26) [2]

или еще так

uses tlhelp32;

procedure TForm2.Button2Click(Sender: TObject);
var
 hSnapshoot: THandle;
 pe32: TProcessEntry32;
begin
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot <> -1) then begin
   pe32.dwSize := SizeOf(TProcessEntry32);
   if (Process32First(hSnapshoot, pe32)) then
      repeat
        memo1.Lines.Add(format(" %10d, %5d: %s", [pe32.th32ProcessID, pe32.cntThreads, pe32.szExeFile]));
      until not Process32Next(hSnapshoot, pe32);
   CloseHandle (hSnapshoot);
end;
end;


 
Игорь ©   (2008-10-13 14:42) [3]

Блин ну причем здесь CreateToolhelp32Snapshot то, мне нужна NtQuerySystemInformation


 
Сергей М. ©   (2008-10-13 14:52) [4]


> Игорь ©   (13.10.08 14:42) [3]


Вот тут страдалец типа тебя

http://programmersforum.ru/showthread.php?p=85515

тоже нашел код)


 
Игорь ©   (2008-10-13 16:00) [5]


> Сергей М. ©   (13.10.08 14:52) [4]


С чего ты взял что я страдалец?

Это код не работает в Windows 2000


 
Сергей М. ©   (2008-10-13 16:07) [6]


> Игорь ©   (13.10.08 16:00) [5]


> С чего ты взял что я


Ну не я же)
Код-то тебе не понятен)


> Это код не работает в Windows 2000
>


Что, вот прямо так и говорит "не работаю в Windows 2000" ?


 
Rouse_ ©   (2008-10-13 16:19) [7]


> Это код не работает в Windows 2000

Обоснуй...


 
Игорь ©   (2008-10-14 11:01) [8]


> Rouse_ ©   (13.10.08 16:19) [7]


Ну вот применительно к этому коду http://programmersforum.ru/showthread.php?p=85515 получаеться вот что

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;
         Form1.ListBox1.Items.Add(ModuleName);
         SystemInformationIterator :=
           Pointer(DWORD(SystemInformationIterator) +
           SystemInformationIterator^.NextOffset);
       until SystemInformationIterator^.NextOffset = 0;
     end;
   finally
     FreeMem(SystemInformation);
   end;
 end else
   ShowMessage("NO");


 
Riply ©   (2008-10-14 11:14) [9]

> [8] Игорь ©   (14.10.08 11:01)

> получаеться вот что

Не увидела обоснования, о котором тебя спрашивали.
Не понятно, что за код ты приводишь и зачем. Он работающий или нет ?

В любом случае по нему (коду), навскидку, есть пара замечаний:
1. между двумя вызовами NtQuerySystemInformation многое может измениться.
  результатом может оказаться то, что памяти не хватит.
2. при удачном вызове NtQuerySystemInformation не обязана возвращать 0


 
Rouse_ ©   (2008-10-14 11:22) [10]

Приведенный тобой код, это куций обрезок моего примера, расположенного по ссылке: http://rouse.drkb.ru/winapi.php#taskmon
Сам пример я проверял и на 2000 и на ХР и на 2003-ем, все нормально работало... Единственное НО!!! Я не проверял работу данного кода под ограниченной учетной записью... Под обычной админской записью все работает как и должно...


 
Rouse_ ©   (2008-10-14 11:27) [11]


> между двумя вызовами NtQuerySystemInformation многое может
> измениться.
>   результатом может оказаться то, что памяти не хватит.

Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.

> при удачном вызове NtQuerySystemInformation не обязана возвращать 0

???


 
Riply ©   (2008-10-14 11:44) [12]

> [11] Rouse_ ©   (14.10.08 11:27)
> Ничего страшного, функция заполнит буффер только той информацией, окторая в него влезет.

Ну и мы получим не все процессы, которые есть. Троян, как раз и спячется :)

> при удачном вызове NtQuerySystemInformation не обязана возвращать 0
> ???

Ну ведь у нее результат NTSTATUS - знаковый.
Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,
если при этом возвращается дополнительная информация.


 
Riply ©   (2008-10-14 11:49) [13]

> [12] Riply ©   (14.10.08 11:44)
> Он может быть больше нуля (STATUS_SEVERITY_INFORMATIONAL) в случае успеха,

Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL, а возврат
"ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.


 
Сергей М. ©   (2008-10-14 12:30) [14]


> Игорь ©   (14.10.08 11:01) [8]


Так не бывает - запросил 0, получил тоже 0, да еще и с отлупом "несоответствие длины инф-ции" ..

Что-то здесь нечисто ..


 
Rouse_ ©   (2008-10-14 13:50) [15]


> Ну и мы получим не все процессы, которые есть. Троян, как
> раз и спячется :)

Троян и так спрячется, ну например изъяв себя из списка правкой NextOffset :)


> Имеется ввиду не возврат значения STATUS_SEVERITY_INFORMATIONAL,
>  а возврат
> "ошибки", у которой severity code равен STATUS_SEVERITY_INFORMATIONAL.

MSDN четко кажет по этому поводу:
Returns an NTSTATUS success or error code.

А success равен нулю, все остальное от лукавого :)


 
Rouse_ ©   (2008-10-14 13:56) [16]

Кстати, вообще перечень кодов возврата данной функции таков:

Return Value:

   Returns one of the following status codes:

       STATUS_SUCCESS - normal, successful completion.

       STATUS_INVALID_INFO_CLASS - The SystemInformationClass parameter
           did not specify a valid value.

       STATUS_INFO_LENGTH_MISMATCH - The value of the SystemInformationLength
           parameter did not match the length required for the information
           class requested by the SystemInformationClass parameter.

       STATUS_ACCESS_VIOLATION - Either the SystemInformation buffer pointer
           or the ReturnLength pointer value specified an invalid address.

       STATUS_WORKING_SET_QUOTA - The process does not have sufficient
           working set to lock the specified output structure in memory.

       STATUS_INSUFFICIENT_RESOURCES - Insufficient system resources exist
           for this request to complete.


 
Riply ©   (2008-10-14 14:10) [17]

> [15] Rouse_ ©   (14.10.08 13:50)

> А success равен нулю, все остальное от лукавого :)

Неа. success - это не STATUS_SUCCESS, а NTSTATUS success, т.е. больше или равно нулю.

Вот перевод С-ишного дефайна:
function NT_SUCCESS(const Status: NTSTATUS): Boolean;
begin
Result := Status >= 0;
end;

Разумеется, это мое IMHO, но оно подтверждается, исходниками (заслуживающими доверия (например, линуксоиды)),
просмотренными Вашей покорной слугой.
Очень в редких случаях Status проверяется на строгое равенство STATUS_SUCCESS
(обычно, когда надо вручную установить Win32LastError), во всех остальных идет проверка NT_SUCCESS.
+ к этому, не забываем о STATUS_PENDING :)


 
Riply ©   (2008-10-14 14:14) [18]

> [16] Rouse_ ©   (14.10.08 13:56)
> Кстати, вообще перечень кодов возврата данной функции таков:

А это откуда ?


 
Rouse_ ©   (2008-10-14 14:15) [19]


> + к этому, не забываем о STATUS_PENDING :)

Эммнь... список всех возможных кодов возврата данной функции я тебе привел :)


 
Rouse_ ©   (2008-10-14 14:15) [20]


> А это откуда ?

W2K sources ;)


 
Riply ©   (2008-10-14 14:27) [21]

> [20] Rouse_ ©   (14.10.08 14:15)
> W2K sources ;)

Это уже серьезней :) У меня их, к сожалению, нет.
Там так и говорится, что это все возможные коды,
или что это возможные коды ?
Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?


 
Rouse_ ©   (2008-10-14 14:41) [22]


> Там так и говорится, что это все возможные коды

Да


> Или ты просто посмотрел реализацию самой NtQuerySystemInformation ?

Да, только там на SystemPathInformation, SystemCallTimeInformation возвращает еще STATUS_NOT_IMPLEMENTED

на SystemSessionProcessInformation может вернуть STATUS_DATATYPE_MISALIGNMENT

на SystemCrashDumpInformation может вернуть STATUS_ACCESS_DENIED

Но эти флаги не документированы, так что...


 
Riply ©   (2008-10-14 15:14) [23]

>  [22] Rouse_ ©   (14.10.08 14:41)

Я тоже чуть поискала. Пока результаты такие:
ReactOS-овцы при некоторых INFO классах проверяют на строгое равенство (видела два примера),
в остальных случаях на NT_SUCCESS. В том числе и для нашего Инфо-класса:
nErrCode = NtQuerySystemInformation
 (
  SystemProcessesAndThreadsInformation,
  pInfoBuffer,
  nSize,
  NULL
 );

 /* double the buffer size */
 nSize += nSize;
}
/* repeat until the buffer is big enough */
while(nErrCode == STATUS_INFO_LENGTH_MISMATCH);

/* failure */
if(!NT_SUCCESS(nErrCode))
{
 DPRINT(FAILED_WITH_STATUS, "NtQuerySystemInformation", nErrCode);
 return nErrCode;  
}


Я понимаю, что в при сравнении с W2K sources, они проигрывают, но это повод задуматься,
т.к. у них все же пример использования.
Я еще покапаюсь. Может получится найти подтверждение или опровержение.


 
Rouse_ ©   (2008-10-14 15:47) [24]


> но это повод задуматься,

Эмм... понимаешь, я как-бы не говорю что жесткая проверка с нулем есть правильно, макрос NT_SUCCESS стандарт де-факто, но в данном случае он просто избыточен и поэтому проверка на 0 вполне оправдывает себя :)


 
Игорь Шевченко ©   (2008-10-15 00:42) [25]

Эта...народ, вы учтите, что с момента непатченного W2k чьи обрезанные исходники гуляют по белу свету, прошло довольно много времени и в NtQuery/SetSystemInformation добавлено много новых информационных кодов (ну и статусов вероятно тоже)


 
Riply ©   (2008-10-15 06:23) [26]

Offtop
А эти W2k - они большие по объему ?
Offtop


 
Rouse_ ©   (2008-10-15 09:38) [27]


> А эти W2k - они большие по объему ?

200Мб в архиве


 
slow!alfamoon!com   (2008-10-16 12:46) [28]

wrk есть, как я уже говорил - это сурсы ядра 2k3sp1



Страницы: 1 вся ветка

Текущий архив: 2009.12.06;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.012 c
2-1255954503
Ivan8511
2009-10-19 16:15
2009.12.06
Разница между ADOTable и ADOQuery


2-1255860293
A.L.E.X.A.N.D.E.R.
2009-10-18 14:04
2009.12.06
Реализация float8/16/24


3-1230718073
Медвежонок Пятачок
2008-12-31 13:07
2009.12.06
рекурсия, CTE и сортировка как в оракле


15-1255183831
Kerk
2009-10-10 18:10
2009.12.06
Реквием по мечте


2-1256050979
CodeRz
2009-10-20 19:02
2009.12.06
Найти число длиной N