Драйвер падает на вызове NtOpenprocess
От: Аноним  
Дата: 08.09.07 10:46
Оценка:
Использую ddk 2000, ОС — XP SP2.
При вызове драйвер происходит перезагрузка, в журнаое пишется — System Error, код 102, категория 1003, описание "Код ошибки 000000c4, параметр1 00000060, параметр2 00000000, параметр3 00024000, параметр4 00000004".
Как мне диагностировать ошибку? Отладчиком не пробовал, кажется это слишком жирно, один вызов отлаживать.


DWORD *buff;
DWORD dwProcessId, dwThreadId, address;
HANDLE ProcessHandle;
NTSTATUS status = STATUS_SUCCESS;
CLIENT_ID ClientId;
OBJECT_ATTRIBUTES oa;

buff = (DWORD *)Irp->AssociatedIrp.SystemBuffer;
dwProcessId = buff[0];
dwThreadId = 0;
ClientId.UniqueThread = (HANDLE)dwThreadId;
ClientId.UniqueProcess = (HANDLE)dwProcessId;
InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
status = NtOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &oa, &ClientId);
Re: Драйвер падает на вызове NtOpenprocess
От: Unmanaged Россия ICQ 476611995
Дата: 08.09.07 11:16
Оценка:
А>Как мне диагностировать ошибку?

Используй WinDbg + Virtual PC. Отладчик покажет в чём ошибка, и даже покажет ошибочную строку.

А>Отладчиком не пробовал, кажется это слишком жирно, один вызов отлаживать.


Уж извини, за тебя это делать никто не будет. А телепаты давно забили на RSDN.
STATUS_INVALID_DEVICE_REQUEST
Re[2]: Драйвер падает на вызове NtOpenprocess
От: mexmat  
Дата: 08.09.07 12:52
Оценка:
Здравствуйте, Unmanaged, Вы писали:

А>>Как мне диагностировать ошибку?


U>Используй WinDbg + Virtual PC. Отладчик покажет в чём ошибка, и даже покажет ошибочную строку.


А>>Отладчиком не пробовал, кажется это слишком жирно, один вызов отлаживать.


U>Уж извини, за тебя это делать никто не будет. А телепаты давно забили на RSDN.



Мне не лень, я просто не уверен в целесообразности отладки, пока не уверен, что правильно инициализировал параметры.
Чтобы убедиться и спрашиваю
Re: Драйвер падает на вызове NtOpenprocess
От: TarasCo  
Дата: 08.09.07 13:00
Оценка:
А>
А>buff = (DWORD *)Irp->AssociatedIrp.SystemBuffer;
А>dwProcessId = buff[0];
А>

Меня в это место смущает. Если Вы находитесь в обработчике Irp, то это скорее всего пользовательский поток и из него нельзя вызывать Nt функции. Хотя это и не должно приводить к системной ошибке, должен быть access denied.
Да пребудет с тобою сила
Re[2]: Драйвер падает на вызове NtOpenprocess
От: mexmat  
Дата: 08.09.07 13:17
Оценка:
Здравствуйте, TarasCo, Вы писали:

А>>
А>>buff = (DWORD *)Irp->AssociatedIrp.SystemBuffer;
А>>dwProcessId = buff[0];
А>>

TC>Меня в это место смущает. Если Вы находитесь в обработчике Irp, то это скорее всего пользовательский поток и из него нельзя вызывать Nt функции. Хотя это и не должно приводить к системной ошибке, должен быть access denied.

Нет, это обработчик IOCTL-запроса. Если можно, объясните подробно, как влияет контекст на вызов Ntxxx.
Как можно перейти к нужному контексту? Был бы очень рад какой-нибудь ссылке на тему
Re[3]: Драйвер падает на вызове NtOpenprocess
От: TarasCo  
Дата: 09.09.07 07:53
Оценка:
M>Нет, это обработчик IOCTL-запроса. Если можно, объясните подробно, как влияет контекст на вызов Ntxxx.
M>Как можно перейти к нужному контексту? Был бы очень рад какой-нибудь ссылке на тему

Функции семейства Nt проверяют права доступа. Несмотря на то, что вызов осуществляется из режима ядра, он все равно проходит в контексте какого-то потока, у которого есть токен. Поэтому вызов Nt функции в обработчике IOCTL практически тождественен такому же вызову в UM. Если у Вас нет прав на открытие процесса — Вам не дадут это сделать. Драйвера обычно используют ф. семейства Zw. Они как правило переадресуются соответствующим Nt функциям, но при этом выставляется переменная PreviousMode = KernelMode и проверки безопасности не производяться.
Да пребудет с тобою сила
Re[3]: Драйвер падает на вызове NtOpenprocess
От: Unmanaged Россия ICQ 476611995
Дата: 09.09.07 11:04
Оценка:
M>Мне не лень, я просто не уверен в целесообразности отладки...

Подключение отладчика к виртуальной машине занимает 5 минут.
Сейчас ты просто отнимаешь время у других участников форума.
STATUS_INVALID_DEVICE_REQUEST
Re[4]: Драйвер падает на вызове NtOpenprocess
От: Злость Россия  
Дата: 10.09.07 08:05
Оценка: 1 (1)
Здравствуйте, TarasCo, Вы писали:

[skip]

TC>Функции семейства Nt проверяют права доступа. Несмотря на то, что вызов осуществляется из режима ядра, он все равно проходит в контексте какого-то потока, у которого есть токен. Поэтому вызов Nt функции в обработчике IOCTL практически тождественен такому же вызову в UM. Если у Вас нет прав на открытие процесса — Вам не дадут это сделать. Драйвера обычно используют ф. семейства Zw. Они как правило переадресуются соответствующим Nt функциям, но при этом выставляется переменная PreviousMode = KernelMode и проверки безопасности не производяться.


А зачем мы тут код анализируем, код ошибки то верифайер выдал, что драйвер выгружается и забыл освободить распределение из nonpool.
... << RSDN@Home 1.2.0 alpha rev. 685>>
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re: Драйвер падает на вызове NtOpenprocess
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 10.09.07 09:07
Оценка:
А>Использую ddk 2000, ОС — XP SP2.
А>При вызове драйвер происходит перезагрузка, в журнаое пишется — System Error, код 102, категория 1003, описание "Код ошибки 000000c4, параметр1 00000060, параметр2 00000000, параметр3 00024000, параметр4 00000004".
А>Как мне диагностировать ошибку? Отладчиком не пробовал, кажется это слишком жирно, один вызов отлаживать.
check DDK. Latest is available online, see Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION
... << RSDN@Home 1.2.0 alpha rev. 685>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[5]: Драйвер падает на вызове NtOpenprocess
От: TarasCo  
Дата: 10.09.07 09:16
Оценка:
З>А зачем мы тут код анализируем, код ошибки то верифайер выдал, что драйвер выгружается и забыл освободить распределение из nonpool.

IMHO, данный код не должен был привести к выгрузке драйвера. Поскольку код ошибки извлекли не из под отладчика и не из минидампа, он может не имеет отношения к рассматриваемому случаю? Хотя, если приведенный код был в DriverEntry, то многое объясняется. NtOpenProcess обламывается по известным причинам, DriverEntry возвращает код, отличный от STATUS_SUCCESS, драйвер выгружают и получают означенную ошибку.
Да пребудет с тобою сила
Re[6]: Драйвер падает на вызове NtOpenprocess
От: Аноним  
Дата: 12.10.07 00:35
Оценка:
Здравствуйте, TarasCo, Вы писали:

З>>А зачем мы тут код анализируем, код ошибки то верифайер выдал, что драйвер выгружается и забыл освободить распределение из nonpool.


TC>IMHO, данный код не должен был привести к выгрузке драйвера. Поскольку код ошибки извлекли не из под отладчика и не из минидампа, он может не имеет отношения к рассматриваемому случаю? Хотя, если приведенный код был в DriverEntry, то многое объясняется. NtOpenProcess обламывается по известным причинам, DriverEntry возвращает код, отличный от STATUS_SUCCESS, драйвер выгружают и получают означенную ошибку.



Пишу, надеюсь это будет полезным.
Решил отлаживаться, вызываю драйвер на виртуалке — всё ок. С железом наверное что-то
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.