Код драйвера может вызываться в контексте различных процессов и довольно-таки часто. Поэтому не хочется каждый раз открывать его на запись, записывать данные, затем закрывать. Тем более что всё это придётся засовывать в спин-блоки, чтобы не нарушить последовательность данных. Хотелось-бы один раз открыть и работать только с объектом файла, но тогда в контекстах других процессов хендл будет недействителен и вызов ZwWriteFile завершится неудачей. Что здесь можно сделать?
Я открывал реестр и работал с ним из ядра при открытии использовал в AccessMask OBJ_KERNEL_HANDLE - в DDK так и написано: If the caller is not running in a system thread context, it must set the OBJ_KERNEL_HANDLE attribute when it calls InitializeObjectAttributes. Проблем небыло.
Спасибо. Почти работает, несчитая бсодов. Вобщем глупость какая-то получается. открываю файл в DispatchControl обработчике примерно так: Код (Text): InitializeObjectAttributes( &object_attributes, &ustr_filename, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, 0, 0 ); ntstatus = ZwCreateFile( &h_file, FILE_APPEND_DATA | SYNCHRONIZE, &object_attributes, &io_status_block, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_MAXIMUM_DISPOSITION, FILE_SYNCHRONOUS_IO_NONALERT, 0, 0 ); затем в другом месте записываю данные в этот файл: Код (Text): PACKET_INFO packet_info; ZwWriteFile(h_file, 0, 0, 0, &io_status_block, &packet_info, sizeof(packet_info), 0, 0); ZwWriteFile(h_file, 0, 0, 0, &io_status_block, p_buffer, ul_buffer_len, 0, 0); Бсод вылетает когда этот код вызывается во-второй раз (в третий раз вызывается ZwWriteFile). смотрел в отладчике - где-то в недрах ядра вылазит левый указатель: cmp [edi + 4], 0 ; edi = 0