ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 03.01.18 19:47
Оценка:
как сделать, чтобы выполнение не продолжалось, пока он реально не создаст файл?
LARGE_INTEGER       AllocationSize;
UNICODE_STRING      LogFileName;
IO_STATUS_BLOCK     IoStatusBlock;
OBJECT_ATTRIBUTES   ObjectAttributes;

HANDLE              LogFileHandle;
NTSTATUS Status;

//
// Open the Log File for writing.
//
RtlInitUnicodeString(L"\\??\\C:\\FP_1.log", fullPath);
InitializeObjectAttributes(
    &ObjectAttributes,
    &LogFileName,
    OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    NULL,
    NULL
);
Status = ZwCreateFile(
    &LogFileHandle,
    GENERIC_WRITE,
    &ObjectAttributes,
    &IoStatusBlock,
    NULL,
    FILE_ATTRIBUTE_NORMAL,
    0,
    FILE_OVERWRITE_IF,
    FILE_SYNCHRONOUS_IO_NONALERT,
    NULL,
    0
);

ZwClose(LogFileHandle);


Если запустить как обычно, то файл создается.

Но если ПОСЛЕ этих строк будет нечто, провоцирующее BSOD — то потом обнаруживается, что файла нет.

Получается, сперва код продолжает выполнение, а затем файл создается фактически.

Как исправить?
Re: ZwCreateFile - как успеть при BSOD?
От: Слава  
Дата: 03.01.18 20:09
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Получается, сперва код продолжает выполнение, а затем файл создается фактически.


Я не вижу здесь аналогов createfile file_flag_no_buffering file_flag_write_through
Хотя может для Zw эти опции зовутся иначе.

PS: программа, переживающая BSOD, называется гипервизор.
Re: ZwCreateFile - как успеть при BSOD?
От: Alexander G Украина  
Дата: 03.01.18 20:11
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Как исправить?


Кэширование. Можно флашить ZwFlushBuffersFile.
Можно открыть без буферизации (и писать тогда кусками по размеру сектора).

Если .log — журнал транзакций, то просто флашить недостаточно, чтобы гарантировать консистентность при BSOD. Для таких случаев CLFS сделали.
Русский военный корабль идёт ко дну!
Re[2]: ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 03.01.18 20:20
Оценка:
Здравствуйте, Слава, Вы писали:

FILE_NO_INTERMEDIATE_BUFFERING пробовал (а также GENERIC_WRITE заменял на что-то не GENERIC, но с SYNCHRONIZE), никак.
Re[2]: ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 03.01.18 20:22
Оценка:
Здравствуйте, Alexander G, Вы писали:

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


S>>Как исправить?


AG>Кэширование. Можно флашить ZwFlushBuffersFile.

AG>Можно открыть без буферизации (и писать тогда кусками по размеру сектора).

AG>Если .log — журнал транзакций, то просто флашить недостаточно, чтобы гарантировать консистентность при BSOD. Для таких случаев CLFS сделали.


Что значит транзакции?
Просто лог как лог
У CLFS сложноватое API... Осваивать его... А у меня уже есть функции-утилы для создания и записи строк в файл...
Re[3]: ZwCreateFile - как успеть при BSOD?
От: Alexander G Украина  
Дата: 03.01.18 20:29
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Что значит транзакции?

S>Просто лог как лог
S>У CLFS сложноватое API... Осваивать его... А у меня уже есть функции-утилы для создания и записи строк в файл...

Проехали. CLFS не для записи строк в файл

ZwFlushBuffersFile. Ну или FltFlushBuffers если из фильтра.
Русский военный корабль идёт ко дну!
Re[4]: ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 03.01.18 20:53
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Ну или Flt

Как это достало
Одна и та же функция же — какой префикс хочу, такой и использую! И желательно именно Zw или Nt, он везде оптимально смотрится.
Отредактировано 03.01.2018 20:54 sergey77666 . Предыдущая версия .
Re[3]: ZwCreateFile - как успеть при BSOD?
От: ononim  
Дата: 04.01.18 04:20
Оценка:
S>FILE_NO_INTERMEDIATE_BUFFERING пробовал (а также GENERIC_WRITE заменял на что-то не GENERIC, но с SYNCHRONIZE), никак.
SYNCHRONIZE нужен. Просто нужен, без оглядки на сохранение при BSOD-е. Это если вы собираетесь использовать хэндл для синхронных операций. Иначе может случится песец.
Как много веселых ребят, и все делают велосипед...
Отредактировано 04.01.2018 4:24 ononim . Предыдущая версия .
Re: ZwCreateFile - как успеть при BSOD?
От: ononim  
Дата: 04.01.18 04:23
Оценка:
Думаю самым правильным решением будет заранее сделать файл с зарезервированным размером и просто писать в него с FILE_WRITE_THROUGH. FILE_NO_INTERMEDIATE_BUFFERING даже лучше, но у него есть свои ограничения, до которых, вы скорее всего, не дочитали.
Как много веселых ребят, и все делают велосипед...
Re[4]: ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 04.01.18 08:49
Оценка:
Здравствуйте, ononim, Вы писали:

S>>FILE_NO_INTERMEDIATE_BUFFERING пробовал (а также GENERIC_WRITE заменял на что-то не GENERIC, но с SYNCHRONIZE), никак.

O>SYNCHRONIZE нужен. Просто нужен, без оглядки на сохранение при BSOD-е. Это если вы собираетесь использовать хэндл для синхронных операций. Иначе может случится песец.

А никто его и не убирает, внимательнее будьте.
Re[5]: ZwCreateFile - как успеть при BSOD?
От: Alexander G Украина  
Дата: 04.01.18 11:07
Оценка:
Здравствуйте, sergey77666, Вы писали:

AG>>Ну или Flt

S>Как это достало
S>Одна и та же функция же — какой префикс хочу, такой и использую! И желательно именно Zw или Nt, он везде оптимально смотрится.

Ну как, Zw функции пойдут с самого верха, через все фильтры — этот и другие. Можно получить дедлоки/рекурсию/бесконечный цикл.

Другие фильтры ожидаются, например, от anti-malware, сортов которого как собак нерезаных. Отлаживай потом BSOD у заказчика по дампу.

Лучше сразу играть по правилам.
Русский военный корабль идёт ко дну!
Re[6]: ZwCreateFile - как успеть при BSOD?
От: sergey77666 Марс  
Дата: 04.01.18 11:12
Оценка:
Здравствуйте, Alexander G, Вы писали:

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


AG>>>Ну или Flt

S>>Как это достало
S>>Одна и та же функция же — какой префикс хочу, такой и использую! И желательно именно Zw или Nt, он везде оптимально смотрится.

AG>Ну как, Zw функции пойдут с самого верха, через все фильтры — этот и другие. Можно получить дедлоки/рекурсию/бесконечный цикл.


AG>Другие фильтры ожидаются, например, от anti-malware, сортов которого как собак нерезаных. Отлаживай потом BSOD у заказчика по дампу.


AG>Лучше сразу играть по правилам.


Хочется библиотеки писать. Которые можно и в минифильтре, и в обычном драйвере юзать, и даже в приложении юзермода (если это зачем-то нужно). А тут конкретное усложнение выходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.