Я конечно в Дельфях не силён, но вот что-то смущает меня передача IoStatus: pointer в функцию.
Ведь по этому указателю будет тебе возвращена инфа:
Pointer to a variable that receives the final completion status and information about the requested operation
А указатель у тебя никуда не указывает. (Нужен укзатель на IO_STATUS_BLOCK) И в это никуда пытаются писать видимо...
проблема с NTCreateFile Из нулевого кольца
От:
Аноним
Дата:
02.01.07 14:18
Оценка:
Пишу драйвер в Delphi и возникла проблема с NtCreateFile.
Итак, есть код, который работает в нулевом кольце (kernel mode),и который должен создать текстовый файл. Вызываю фунукцию NtCreateFile (см. ниже), но она выдает ошибку STATUS_ACCESS_VIOLATION. Не могу понять, что я делаю не так. Подскажите пожалуйста.
Здравствуйте, Вумудщзук, Вы писали:
>>Пишу драйвер в Delphi и возникла проблема с NtCreateFile. В> В>чё, неужели в delphi уже можно драйвера писать??
Да, и даже получается.
Даже статья на этом сайте есть про драйверы в Delphi.
Конечно заморочки существуют. вот например с этим NtCreateFile... третий день бьюсь, не могу понять
в чем дело и куда копать. разного рода изменения приводят даже не к BSOD,а к банальному перезапуску.
Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы
выдает ошибку.
А из какого IRQL надо запускать NtCreateFile? Может в этом дело?
Здравствуйте, _Dimak_, Вы писали: _D_>Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы _D_>выдает ошибку.
Лучше всегда использовать ZwCreateFile, NtCreateFile можно использовать только из контекста системного потока, иначе можно получить ACCESS_DENY. Вызов ZwCreateFile из драйвера гарантирует, что не будет проверок безопасности и соответствующего кода ошибки ( ACCESS_DENY ).
_D_>А из какого IRQL надо запускать NtCreateFile? Может в этом дело?
Только PASSIVE_LEVEL.
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, _Dimak_, Вы писали: _D_>>Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы _D_>>выдает ошибку.
TC>Лучше всегда использовать ZwCreateFile, NtCreateFile можно использовать только из контекста системного потока, иначе можно получить ACCESS_DENY. Вызов ZwCreateFile из драйвера гарантирует, что не будет проверок безопасности и соответствующего кода ошибки ( ACCESS_DENY ).
Попробовал ZwCreateFile. Перезапускается, будь он неладен. Хоть ьы BSOD рисовал. Ума не приложу, что делать.
Как правило, синий экран сам по себе несет мало полезной информации. Гораздо полезнее дампы памяти, которые записываются в файлы по указанным в том же разделе реестра адресам. Расшифровать дамп можно с помощью свободно распространяемого отладчика windbg ( можно скачать с сайта MS ). Если бы Вы перестали упрямиться и стали писать на С, то можно было бы увидеть прямо в исходном коде место ошибки со значением переменных и.т.д. Ну Вам будет посложнее, хотя полезную информацию все равно можно подчерпнуть .
Да пребудет с тобою сила
Re[2]: проблема с NTCreateFile Из нулевого кольца
От:
Аноним
Дата:
06.01.07 00:50
Оценка:
Здравствуйте, __INFINITE, Вы писали:
__I>Я конечно в Дельфях не силён, но вот что-то смущает меня передача IoStatus: pointer в функцию. __I>Ведь по этому указателю будет тебе возвращена инфа: __I>
__I>Pointer to a variable that receives the final completion status and information about the requested operation
__I>
__I>А указатель у тебя никуда не указывает. (Нужен укзатель на IO_STATUS_BLOCK) И в это никуда пытаются писать видимо...
Это раз. Далее аффтару. Ты, уважаемый голубчик, инициализировал область памяти для хранения хендла? Куда NtCreateFile() тебе запишет новый хендл? Блок статуса (IO_STATUS_BLOCK) тоже куда по-твоему система писать будет?
Правильнее будет так:
var
iosb : IO_STATUS_BLOCK;
hfile : HANDLE; // насколько я знаю, в делфях есть такой тип данных или определи его сам как равный DWORD'у
status : NTSTATUS;
...
begin
...
status = NtCreateFile (
@hfile, // указатель на хендл
GENERIC_WRITE,
@object_attributes, // указатель на структуру, содержащую имя и атрибуты объекта ядра
@iosb, // указатель на блок статуса
0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ or FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE,
nil,
0);
...
убедительная просьба следить за объемом цитирования — модератор
Самое интересное, что я начинал программировать именно на паскале и писал на нем года три, а теперь я вообще не фига не помню, смотрю, как на незнакомый язык
Да пребудет с тобою сила
Re[4]: проблема с NTCreateFile Из нулевого кольца
От:
Аноним
Дата:
06.01.07 20:31
Оценка:
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, Аноним, Вы писали:
TC>Самое интересное, что я начинал программировать именно на паскале и писал на нем года три, а теперь я вообще не фига не помню, смотрю, как на незнакомый язык '
IMHO, из объявления надо убрать все var'ы, раз уж там написан уже указательный тип. А вообще, насколько я помню, var — означает передачу по ссылке, а не по указателю, это вроде как в C++ ссылки (&). И знак @ всё же надо, т.к. он означает передачу по адресу, т.е. то что и надо.