Извините за похожие посты, но сам разобраться не смог. Прокопался весь вечер - не могу найти причину проблемы: На коде Код (Text): RtlZeroMemory(&attLocked,sizeof(attLocked)); RtlZeroMemory(&iobLocked,sizeof(iobLocked)); const wchar_t fname[] = L"\\??\\C:\\1.txt"; InitializeObjectAttributes(&attLocked,(PUNICODE_STRING)fname/*inBuffer/*name*/,OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,NULL,NULL); __asm int 3; /* breakpoint */ if(currentIrql==PASSIVE_LEVEL) status = ZwCreateFile(&hLocked,GENERIC_READ,&attLocked,&iobLocked,NULL/*allocation size*/,FILE_ATTRIBUTE_NORMAL,0/*share*/,FILE_OPEN/*no create*/,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0); Внутри ZwCreateFile возникает БСОД. IRQL_NOT_LESS_OR_EQUAL. Слов (литературных) более нет. Какой на [CONSORED] нот лесс, если у меня стоит проверка на PASSIVE_LEVEL. На всякий случай, весь код в секции "PAGE". Проверил - нашел на сайте туториал по программированию в режиме ядра. Процел насчет ядра системы, памяти, работы с файлами. Внимательно просмотрел пример открытия файла. Все понятно вроде. Запуск - снова синий экран. Скажите пожалуйста, в чем я не прав.
Приведенный код исполняется в NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp ) в коде обработки IRQ на PASSIVE_LEVEL. На всякий случай, код завернут в спин-блокировку (перед разбором номера IRQ)
Можно, потому, что ни при использовании системного буфера, при передаче IRQ от клиента драйверу, ни при (PUNICODE_STRING)L"\\??\\C:\\1.txt" все равно получаю синий экран. Примечательно, что при передаче в качестве имени файла строки "кукареку" бсода нет... P.S. Ситуация с IoCreateFile -- аналогичная... Ничего не пойму.
SpiritFire Не могу понять, зачем так извращаться с именем файла? У меня все без проблем работает , где file - UNICODE_STRING. Но если это так уж и принципиально, попробуй подключить WorkItem.
UNICODE_STRING - не то же самое, что wchar_t, это структура, которая хранит размеры буфера со строкой и указатель wchar_t* на строку. вобщем steelfactor напесал как инициализировать данную структуру имея юнекод строку
Ответ неправильный. UNICODE_SRING - структура. Ты передаешь строку. Он считает ее за структуру. Внутри себя он повышает иркл для своих внутренних блокировок. А адрес неправильный. Отсюда IRQL_NOT_LESS_OR_EQUAL. Когда народ научится читать мсдн?
Сори, я сонный был, дурака свалял - у меня этот весь код был завернут в спин-блокировку. Которая сама по себе повышала IRQ. Буду читать про UNICODE_STRING.