Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NtQuerySystemInformation [D7]


Страницы:   1 2

Игорь ©   (2008-10-13 13:49:00) 

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

Спасибо


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

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


Rouse_   (2008-10-15 09:38:00) [2]


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

200Мб в архиве


Riply   (2008-10-15 06:23:00) [3]

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


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

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


Rouse_   (2008-10-14 15:47:00) [5]


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

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


Riply   (2008-10-14 15:14:00) [6]

>  [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 14:41:00) [7]


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

Да


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

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

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

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

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


Riply   (2008-10-14 14:27:00) [8]

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

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


Rouse_   (2008-10-14 14:15:00) [9]


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

W2K sources ;)


Rouse_   (2008-10-14 14:15:00) [10]


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

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


Riply   (2008-10-14 14:14:00) [11]

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

А это откуда ?


Riply   (2008-10-14 14:10:00) [12]

> [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 :)


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

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

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.


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


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

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


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

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

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


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


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


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

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


Riply   (2008-10-14 11:49:00) [16]

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

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


Riply   (2008-10-14 11:44:00) [17]

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

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

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

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


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


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

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

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

???


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

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


Riply   (2008-10-14 11:14:00) [20]

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

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо