m_hFile := CreateFile(@Disk[ 1 ], GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
if m_hFile = INVALID_HANDLE_VALUE then
Exit;
m_fileMapping := CreateFileMapping(m_hFile, 0, PAGE_READONLY, 0, MAX_FMAPPING_SIZE_VALUE, @MappingName[ 1 ]);
Не получается промапить диск (
читается фиксированый буфер, из него парсится мфт-запись, оффсет увеличивается на размер записи и снова читается буфер огромного размера.
Хочу оптимизировать сие безобразие - промапив в память кусок диска, дабы избежать многократного перечитывания содержимого диска.
Пишу что-то вроди (прожект на дельфи):
Код:
CreateFileMapping постоянно возвращает 0. GetLastError возвращает 5. Запускаю на висте, UAC отключен. Кто может подсказать, что изменить, чтоб мапило содержимое диска нормально, если это вообще в принципе возможно?
Ведь если в CreateFile передавать не строку типа "\\.\c:", а путь к файлу, все прекрасно работает.
З.Ы. Или может есть способ читать еще быстрее?
Насчет оптимальности чтения, в голову приходит только чтение буфером фиксированного размера 64Kb ( или 1Mb для Vista).
Да, но промапить файл с FILE_SHARE_READ Or FILE_SHARE_WRITE получается ведь, и проекция, насколько я понимаю меняется при каждом внешнем изменении файла.
Лично я сильно подозреваю, что эта функция не предназначена, чтобы мапить диски.
Цитата: Dart Bobr
Да, но промапить файл с FILE_SHARE_READ Or FILE_SHARE_WRITE получается ведь, и проекция, насколько я понимаю меняется при каждом внешнем изменении файла.
наоборот, при каждом изменении памяти содержимое файла тоже меняется (конечно не сразу).
Цитата: wanja
Лично я сильно подозреваю, что эта функция не предназначена, чтобы мапить диски.
как раз наверно так и есть.
Ладно буду пробовать сделать то же, что и CreateFileMapping, только ручками..