![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
NtQuerySystemInformation [D7]
Игорь © (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