· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› FlushFileBuffers

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Май 12, 2004 00:56:03

Вот собственно и вопрос: а аналог в ядре Где??? Цель – записал в файл, закрыл. Готово. Хоть перезагрузись, инфа в файле. Когда такие требования к реестру, то просто – ZwFlushKey.
В MSDN сказано использовать флаг FILE_NO_INTERMEDIATE_BUFFERING, да вот фига. Всё равно не пишет (сразу. Если поерзать по диску, инфа flush-ится)
Точнее: использую флаги: (FILE_SYNCHRONOUS_IO_NONALERT OR FILE_NON_DIRECTORY_FILE OR FILE_NO_INTERMEDIATE_BUFFERING OR FILE_WRITE_THROUGH)
З.Ы. Пытался проследить за FlushFileBuffers – попал черти-знает куда. Надеюсь на Вашу помощь.

Заранее благодарен. --==ППС==--


Дата: Май 12, 2004 05:07:27

Посмотри KeFlushIoBuffers, FlushAdapterBuffers.


Дата: Май 12, 2004 07:58:24

Вот те и нет в МСДН :) Спасибо. Попробую!


Дата: Май 12, 2004 15:18:00 · Поправил: PavPS

Рано обрадовался. Понял из DDK, что мне подходит KeFlushIoBuffers, но ни как не врублюсь, откуда взять MDL-Memory descriptor. Надо еще и Memory manager-а юзать?? Как ваще ф-ю эту юзать???
Еще нашел FlushWriteBuffers - вот думаю ваще то, что надо. А она пустая. Там один Ret :(
И еще попутно вопрос: А можно ли с этой целью послать IRP_MJ_FLUSH_BUFFERS. И если можно, то на кого слать CallDriver?
И всё же, возвращаясь к флагам при IoCreateFile@?? почему не действуют. Может конфликт какой, может кто игнорируется, как при флагах FILE_NO_INTERMEDIATE_BUFFERING и APPEND_DATA?
P.S. посмотрел в какие дебри ведет FlushIoBuffers. Там есть записи в порты. Может ч/з них как-то можно.
З.З.Ы. Sory за множество "а может...". Ну темно по этой теме. Может в лит-ру какую тыкните. Или сходники какие :)) ??
Заранее благодарен за любые ответы, мнения и т.д.


Дата: Май 12, 2004 16:36:18 · Поправил: PavPS

И еще 1 вопросик, чтобы не создавать новой темы.
Может плохо читал или смотрел, но сам не знаю, и решил спросить:
Как узнать, по какому адресу спроецированы ntoskrnl.exe & hal.exe (програмно) . Или они всегда проецируются по одним и тем же адресам???


Дата: Май 13, 2004 03:04:32

По поводу ядра это тебе к Four-F надо обращаться.


Дата: Май 13, 2004 07:49:16

Да знаю. Вот сидим и ждем уважаемого гуру...


Дата: Май 13, 2004 14:07:24

[ PavPS: Вот сидим и ждем уважаемого гуру... ]

Да ладно там...

Тебе нужна NtFlushBuffersFile. На KeFlushIoBuffers, FlushAdapterBuffers и т.п. забей - это совсем не то.

NTSTATUS
NtFlushBuffersFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock
);

Либо используй FILE_FLAG_WRITE_THROUGH без FILE_FLAG_NO_BUFFERING. Тогда все операции с файлом пройдут через кэш, но данные будут сброшены на диск до возвращения функции. Если же добавить ещё и FILE_FLAG_NO_BUFFERING, тогда все операции будут выполняться прямо с файлом. Но FILE_FLAG_NO_BUFFERING накладывает довольно жесткие ограничения на выравнивание буферов и на размер данных (посмотри внимательно его описание в MSDN).



[ PavPS: А можно ли с этой целью послать IRP_MJ_FLUSH_BUFFERS. И если можно, то на кого слать CallDriver? ]

Можно. NtFlushBuffersFile именно это и делает. Если руками, то через ObReferenceObjectByHandle надо получить указатель на FILE_OBJECT. Затем получить указатель на девайс, который рулит эти файлом через IoGetRelatedDeviceObject. Затем сформировать IRP через IoBuildSynchronousFsdRequest и слать его драйверу через IoCallDriver. Но я бы с этим не связывался ;)



[ PavPS: Как узнать, по какому адресу спроецированы ntoskrnl.exe & hal.exe (програмно) . Или они всегда проецируются по одним и тем же адресам??? ]

ZwQuerySystemInformation(SystemModuleInformation,...). см "Часть 6 : Базовая техника: Работа с памятью. Использование системных куч". Там именно это и делается.

У меня на одной (но только на одной) машине при каждой переустановке системы базовый адрес ntoskrnl менялся. При перезагрузках вроде постоянен. К hal я не присматривался. В любом случае, хардкодить базу системных модулей не стоит.


Дата: Май 13, 2004 14:17:10

Базу ntoskrnl можно ещё получить старым дореволюционным способом. См. KmdKit\examples\simple\GetKernelBase


Дата: Май 13, 2004 14:55:24

Ого! Спасобочки. Гора(ы) с плеч.

NtFlushBuffersFile - конечно, проше. её и буду юзать.
Hal.exe править несобираюсь, а вот ntoskrnl - это дело другое. Вот блин, грузитца по разным адресам после переустановок. А я то думаю, чё у меня то всё пашет а у других ReBoot.

Еще раз спасибо!


Дата: Май 13, 2004 21:27:43

To Four-F

Полоса невезенья какая-то. Так ведь NtFlushBuffersFile для тех у кого NtDll.dll есть в адресном пр-ве. Она не проецируется в System. Что скажите???
Поиграюсь шаз с флагами и кнопкой reset. Посмотрим, как они себя ведут. От кого есть польза. А так, похоже за IRP_MJ_??? браться. Так не хотелось... :(((

ЗюЫю После опытов с Flush??? и кнопкой Reset у меня скоро весь фат упадет. Но добью...


Дата: Май 14, 2004 11:09:01

Она есть и в ntoskrnl, но не экспортируется :( Так чем плох FILE_FLAG_WRITE_THROUGH? Должно работать.


Дата: Май 14, 2004 15:10:12

База ntoskrnl.exe , вообще то это константы. Жёстко зашитые. Если верить Свену Шрайберу (а у меня нет оснований ему не верить), ядро использует под себя четырёхметровые станицы памяти. оно лежит, начиная с адреса $80000000.На самом деле система отображает туда первые 4метра физической памяти и тд(но смотри, этот первый кусок не будет цельным , он дырявый), соответственно ntoskrnl будет лежать на пятом метре физической памяти, и сам знаешь где в виртухальной. А вообще, если я не ошибаюсь, всё это можна вытащить из структуры SharedUserData, которая также имеет строго определённое место положение в памяти... Можна конечно проще,zwQuerySystemInformation


Дата: Май 14, 2004 15:14:11

"У меня на одной (но только на одной) машине при каждой переустановке системы базовый адрес ntoskrnl менялся. При перезагрузках вроде постоянен. К hal я не присматривался. В любом случае, хардкодить базу системных модулей не стоит."
Знаете сэр, я такое тоже заметил как то ранее однажды... как не парадоксально, у меня оказался битый контроллер памяти... до сих пор нихрена не могу сопоставить ....


Дата: Май 14, 2004 18:22:50

Всем спасибо!

2 Four-F

Знаю, что глупо говорить: вот флаги не действуют... Хотя ведь на то они и флаги, чтобы чем-то управлять. Но до сих пор безрезультатно. На данный момент всё перепроверяю.

2 CARDINAL

Свена я тоже уважаю. Читал. Читаю. Ничего плохого сказать не хотел, но факты налицо. Грузится по разным адресам.

З.Ы. Счаз только время нашел - буду все проверять. Результаты выложу.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.051