Минимальный функционал IrpHandler для файловых операций
От: Iskarov.And  
Дата: 11.07.12 13:14
Оценка:
Странное поведение при вызове LoadLibrary ("\\.\MyDevice\Library.dll") со своего устройства. MyDevice создан NonPnP драйвером, IoCreateDevice () и IoCreateSymbolicLink (). Все irp запросы направляются к IrpHandler, написаны IRP_MJ_CREATE, IRP_MJ_CLEANUP, IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_QUERY_INFORMATION (FileStandardInformation и FileBasicInformation).

При вызове LoadLibrary () приходят IRP_MJ_CREATE -> IRP_MJ_QUERY_INFORMATION (FileBasicInformation) -> IRP_MJ_CLEANUP -> IRP_MJ_CLOSE и так несколько раз подряд, после чего выводит MessageBox с текстом что подгружаемый файл не является валидным win32 приложением.
Заполняю pIrp->AssociatedIrp->SystemBuffer структурой FILE_BASIC_INFORMATION (вроде ничего критичного там нету, просто время и атрибут файла), pIrp->IoStatus.Information = sizeof (FILE_BASIC_INFORMATION), pRip->IoStatus = STATUS_SUCCESS, и завершаю процессинг Irp.

Не могу понять из каких соображений она говорит что файл не валидный. Никаких других Irp запросов не приходит.

Также интересно что на IRP_MJ_QUERY_INFORMATION с FileBasicInformation pIrp->UserBuffer = 0, хотя на запросе FileStandardInformation он ссылается на память. Насколько я понимаю она туда как раз должны перекидывать инфу с SystemBuffer.

CreateFile ("\\.\MyDevice\Library.dll"), GetFileSize () и ReadFile () работают вполне нормально.

Буду признателен за объяснение что я не так делаю и что нужно заимплементить для корректной работы LoadLibrary ().
Re: Минимальный функционал IrpHandler для файловых операций
От: izl3sa Россия  
Дата: 11.07.12 13:22
Оценка:
IA>Буду признателен за объяснение что я не так делаю и что нужно заимплементить для корректной работы LoadLibrary ().
Для корректной работы с исполняемыми образами нужно заимплементить поддержку кэша, без этого не будет работать mm io и как следствие загрузчик.
Re[2]: Минимальный функционал IrpHandler для файловых операций
От: izl3sa Россия  
Дата: 11.07.12 14:00
Оценка: 3 (1)
Если быть более точным — cache manager работает через memory mapped files и для того, чтобы это работало для надо выделить память под управляющие структуры и инициализировать их. В частности это FILE_OBJECT.SectionObjectPointer. Конечно это структура ассоциирована с FCB (file control block — те непосредственно с файлом). Соответственно инициализация всех управляющих структур осуществляется в CcInitializeCacheMap, которую надо вызвать один раз для FCB. Соответсвенно DataSectionPointer это на самом деле управляющая структура CONTROL_AREA, которая используется для управления секцией. Если посмотреть код MmCreateSection, то можно обратить внимание, что если указатель SectionObjectPointer не будет инициализирован то mm io не будет работать.


            if (File->SectionObjectPointer == NULL) {
                ObDereferenceObject (File);
                return STATUS_INVALID_FILE_FOR_SECTION;
            }


ну и тд там по коду.
Таким образом в любом случае нужно делать кеширование в драйвере фс для отображения исполняемых образов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.