Re: проблема с NTCreateFile Из нулевого кольца
От: __INFINITE Россия  
Дата: 05.01.07 22:19
Оценка: +1
Здравствуйте, Аноним, Вы писали:
А>var
А> IoStatus: pointer;
А> objectAttributes: TOBJECTATTRIBUTES;
А> status: NTSTATUS;
А> FileHandle: PDWORD;
А> fileName: UNICODE_STRING;
А> s:string;
А> s1:Ansi_String;

А>s:='\DosDevices\C:\My.txt'+chr(0);

А> RtlInitAnsiString(s1,@s[1]);
А> RtlAnsiStringToUnicodeString(FileName,s1, true);
А> InitializeObjectAttributes (@objectAttributes,
А> @fileName,
А> OBJ_KERNEL_HANDLE or OBJ_INHERIT,
А> 0,
А> nil );

А> status := NtCreateFile( FileHandle,

А> GENERIC_WRITE,
А> @objectAttributes,
А> IoStatus,
А> 0,
А> FILE_ATTRIBUTE_NORMAL,
А> FILE_SHARE_READ or FILE_SHARE_WRITE,
А> FILE_OPEN_IF,
А> FILE_NON_DIRECTORY_FILE,
А> nil,
А> 0);

Я конечно в Дельфях не силён, но вот что-то смущает меня передача 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. Не могу понять, что я делаю не так. Подскажите пожалуйста.

Прототип функции описал так:
CONST
NTOSKrnl = 'ntoskrnl.exe';
GENERIC_WRITE = $40000000;
FILE_ATTRIBUTE_NORMAL =$80;
FILE_SHARE_READ = $1;
FILE_SHARE_WRITE = $2;
FILE_OPEN_IF = $3;
FILE_NON_DIRECTORY_FILE = $40;

OBJ_KERNEL_HANDLE = $200;
OBJ_INHERIT = $2;

Function NtCreateFile(var FileHandle:PDWORD;
DesiredAccess:dword;
ObjectAttributes:POBJECTATTRIBUTES;
var IoStatusBlock:PIO_STATUS_BLOCK;
AllocationSize:dword;
FileAttributes,
ShareAccess,
CreateDisposition,
CreateOptions:dword;
EaBuffer:pointer;
EaLength:dword):NTStatus;
stdcall;external NTOSKrnl name '_NtCreateFile@44';





Вот код вызываемой функции, в которой проблема:


var
IoStatus: pointer;
objectAttributes: TOBJECTATTRIBUTES;
status: NTSTATUS;
FileHandle: PDWORD;
fileName: UNICODE_STRING;
s:string;
s1:Ansi_String;



s:='\DosDevices\C:\My.txt'+chr(0);
RtlInitAnsiString(s1,@s[1]);
RtlAnsiStringToUnicodeString(FileName,s1, true);
InitializeObjectAttributes (@objectAttributes,
@fileName,
OBJ_KERNEL_HANDLE or OBJ_INHERIT,
0,
nil );

status := NtCreateFile( FileHandle,
GENERIC_WRITE,
@objectAttributes,
IoStatus,
0,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ or FILE_SHARE_WRITE,
FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE,
nil,
0);
Re: проблема с NTCreateFile Из нулевого кольца
От: Вумудщзук Беларусь  
Дата: 02.01.07 16:32
Оценка:
>Пишу драйвер в Delphi и возникла проблема с NtCreateFile.

чё, неужели в delphi уже можно драйвера писать??
Homo sum et nihil humani a me alienum puto...
Re[2]: проблема с NTCreateFile Из нулевого кольца
От: wellwell Австралия https://www.softperfect.com
Дата: 02.01.07 17:44
Оценка:
" Вумудщзук " <43994@users.rsdn.ru> wrote in message news:2287651@news.rsdn.ru...
> чё, неужели в delphi уже можно драйвера писать??

Только не уже, а пока еще
http://www.codenet.ru/progr/delphi/stat/vxd.php
где-то валялась подобная статься для *.sys драйвера...
Posted via RSDN NNTP Server 2.0
Re[2]: проблема с NTCreateFile Из нулевого кольца
От: _Dimak_  
Дата: 03.01.07 10:49
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>Пишу драйвер в Delphi и возникла проблема с NtCreateFile.

В>
В>чё, неужели в delphi уже можно драйвера писать??

Да, и даже получается.
Даже статья на этом сайте есть про драйверы в Delphi.

Конечно заморочки существуют. вот например с этим NtCreateFile... третий день бьюсь, не могу понять
в чем дело и куда копать. разного рода изменения приводят даже не к BSOD,а к банальному перезапуску.
Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы
выдает ошибку.
А из какого IRQL надо запускать NtCreateFile? Может в этом дело?
Re[3]: проблема с NTCreateFile Из нулевого кольца
От: TarasCo  
Дата: 03.01.07 11:49
Оценка:
Здравствуйте, _Dimak_, Вы писали:
_D_>Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы
_D_>выдает ошибку.

Лучше всегда использовать ZwCreateFile, NtCreateFile можно использовать только из контекста системного потока, иначе можно получить ACCESS_DENY. Вызов ZwCreateFile из драйвера гарантирует, что не будет проверок безопасности и соответствующего кода ошибки ( ACCESS_DENY ).

_D_>А из какого IRQL надо запускать NtCreateFile? Может в этом дело?

Только PASSIVE_LEVEL.
Да пребудет с тобою сила
Re[4]: проблема с NTCreateFile Из нулевого кольца
От: _Dimak_  
Дата: 03.01.07 12:53
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, _Dimak_, Вы писали:

_D_>>Еще интересный факт, при попытке использовать ZwCreateFile, система перезапускалась, а с NtCreateFile хотя бы
_D_>>выдает ошибку.

TC>Лучше всегда использовать ZwCreateFile, NtCreateFile можно использовать только из контекста системного потока, иначе можно получить ACCESS_DENY. Вызов ZwCreateFile из драйвера гарантирует, что не будет проверок безопасности и соответствующего кода ошибки ( ACCESS_DENY ).


Попробовал ZwCreateFile. Перезапускается, будь он неладен. Хоть ьы BSOD рисовал. Ума не приложу, что делать.
Re[5]: проблема с NTCreateFile Из нулевого кольца
От: TarasCo  
Дата: 03.01.07 16:56
Оценка:
Здравствуйте, _Dimak_, Вы писали:

_D_>Попробовал ZwCreateFile. Перезапускается, будь он неладен. Хоть ьы BSOD рисовал. Ума не приложу, что делать.


Ну, с этим можно поладить .

Находим в реестре ветвь:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl

и снимаем галку AutoReboot — после этого, по идее, Вы будете иметь наслаждение созерцать синий экран. То же самое можно сделать и без редактора реестра — http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/27670.mspx?mfr=true

Как правило, синий экран сам по себе несет мало полезной информации. Гораздо полезнее дампы памяти, которые записываются в файлы по указанным в том же разделе реестра адресам. Расшифровать дамп можно с помощью свободно распространяемого отладчика 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[3]: проблема с NTCreateFile Из нулевого кольца
От: TarasCo  
Дата: 06.01.07 13:31
Оценка:
убедительная просьба следить за объемом цитирования — модератор

Самое интересное, что я начинал программировать именно на паскале и писал на нем года три, а теперь я вообще не фига не помню, смотрю, как на незнакомый язык
Да пребудет с тобою сила
Re[4]: проблема с NTCreateFile Из нулевого кольца
От: Аноним  
Дата: 06.01.07 20:31
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, Аноним, Вы писали:


TC>Самое интересное, что я начинал программировать именно на паскале и писал на нем года три, а теперь я вообще не фига не помню, смотрю, как на незнакомый язык '


IMHO, из объявления надо убрать все var'ы, раз уж там написан уже указательный тип. А вообще, насколько я помню, var — означает передачу по ссылке, а не по указателю, это вроде как в C++ ссылки (&). И знак @ всё же надо, т.к. он означает передачу по адресу, т.е. то что и надо.
Re[3]: проблема с NTCreateFile Из нулевого кольца
От: _Dimak_  
Дата: 09.01.07 11:57
Оценка:
Здравствуйте, Аноним, Вы писали:

убедительная просьба следить за объемом цитирования — модератор

Не получилось ((

Пробовал даже так, все равно ACCESS_VIOLATION и BSOD :

убедительная просьба испольщовать таги для подсветки кода: в Вагем случае это таг pascal — модератор

var
    IoStatus: IO_STATUS_BLOCK;
    objectAttributes: TOBJECTATTRIBUTES;
    FileHandle: DWORD;

    PIoStatus: PIO_STATUS_BLOCK;
    PIobjectAttributes: POBJECTATTRIBUTES;
    PFileHandle: PDWORD;
    status: NTSTATUS;
    fileName: UNICODE_STRING;

begin
    PIobjectAttributes:=ExAllocatePool(NonPagedPool,SizeOf(objectattributes));

    PIoStatus:=ExAllocatePool(NonPagedPool,SizeOf(IoStatus));

    PFileHandle:=ExAllocatePool(NonPagedPool,SizeOf(FileHandle));

   
    RtlZeroMemory(Piobjectattributes,SizeOf(objectattributes));
    RtlZeroMemory(PIOStatus,SizeOf(IoStatus));
    RtlZeroMemory(PFileHandle,SizeOf(FileHandle));
   
    
    InitializeObjectAttributes (PiobjectAttributes,
                                @fileName,
                                OBJ_CASE_INSENSITIVE or OBJ_KERNEL_HANDLE,
                                0,
                                nil );


    status := ZwCreateFile(PFileHandle,
                           GENERIC_WRITE,
                           PiobjectAttributes,
                           PIoStatus,
                           Ptime,
                           FILE_ATTRIBUTE_NORMAL,
                           0,
                           FILE_OPEN_IF,
                           FILE_NON_DIRECTORY_FILE,
                           0,
                           0);

end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.