Можно ли (и как) создать файл в памяти, так чтоб "скармливать" его FILE_OBJECT функциям IoPageRead, FsRtlGetFileSize и т.п. как будто это реальный файл.
Я тоже думал о MMF, но вот не знаю, как потом обращаться с ним, как с файловым объектом. Т.е. передавать его туда, где требуется FILE_OBJECT. Спасибо за помощь, попробую ObReferenceObjectByHandle. Как понял надо передать IoFileObjectType, чтоб получить FILE_OBJECT ? Вот только боюсь, что потом ещё надо будет колдовать над самой структурой, чтоб например задать тип носителя и т.п. Я правильно думаю?
IoFileObjectType как я понимаю для access check нужен, так что если FILE_OBJECT будет только из ядра использоваться, то можно и 0 передать. А вот по поводу типа носителя - это что? Файл в памяти всё равно будет иметь файл на диске - pagefile.sys
Я собираюсь делать это на прикладном уровне, а не в ядре. И не получилось заюзать ObReferenceObjectByHandle. Подключил wdm.lib, заинклудил ntddk.h, а ругается линкер, типа не нашел __imp__ObReferenceObjectByHandle. Про тип носителя, это просто я глянул содержимое IoPageRead. Там берется поле из FILE_OBJECT и проверяется на тип носителя (флопик, жесткий диск и т.п.).
SystemError > То есть из прикладного? Я так понимаю, будет драйвер, которому из юзерлэнда отправят IOCTL, он откроет хендл и по нему получит FILE_OBJECT. > В wdm.lib есть только ObReferenceObject (точнее ObfReferenceObject), нужно подключить ntoskrnl.lib. > IMHO ObReferenceObjectByHandle в FILE_OBJECT всё что нужно запишет, что это винт и файл подкачки.
Я имею в виду, что ObReferenceObjectByHandle буду вызывать не из драйвера, а из приложения. Т.е. все, что я пытаюсь сделать, делается в обычном виндовом приложении, а не в ядре. Честно говоря не нашел противопоказаний использования ObReferenceObjectByHandle в приложении. Подключил и ntoskrnl.lib, картина такая же, не линкер находит __imp__ObReferenceObjectByHandle. Вот предложили ещё попробовать использовать IoCreateStreamFileObject.
А каким образом ObReferenceObjectByHandle будет вызываться не из драйвера, а из приложения? > Чем/что/как компилируешь? У меня нормально собирается msvc 7.1 и intel 8.1 с файлами из XPDDK
Не знаю. Зашел в тупик. Задача в общем выглядит так: Открыть файл, т.е. в 3-м кольце получить его HANDLE, который связан, точнее представляет собой буффер в памяти, а не файл на диске? Ну то есть операция обратная CreateFileForMapping (ZwCreateSection), т.е. не представить файл в виде области памяти, а представить область памяти в виде файла, чтоб передавать в функции, которые запрашивают хендл файла.
Функции CreateFileForMapping нет в Win32 API. Есть CreateFileMapping. IMHO для поставленной задачи она и нужна, в качестве хендла файла передавать INVALID_HANDLE_VALUE. А лезть в ядро смысл какой? ObReferenceObjectByHandle из юзерленда вызвать нельзя, для этих целей нужен драйвер. Подробнее про них см. статьи от Four-F на сайте.
Про ObReferenceObjectByHandle уже понял, спасибо. Но задача остается... В общем задача сводится к следующему: HANDLE hFile = CreateFile(....); HANDLE hMemory = CreateFileMapping(hFile, ...); assert(hMemory != 0); Только hFile - не файл на диске. Пробовал использовать pipe и mailslot, не получилось.
Посмотри описание CreateFileMapping: То есть, всё что нужно - вызвать эту ф-цию, передавая ей не хендл файла, а INVALID_HANDLE_VALUE.
Упс, только щас вроде понял задачу > IMHO это почти невозможно. Для симуляции файлов предназначены пайпы, но они как бы не имеют памяти. Лучше распиши задачу подробнее, почему не устраивает временный файл и какими ф-циями будет использоваться хэндл такого "файла".