Странное поведение при вызове 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 ().
Если быть более точным — 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;
}
ну и тд там по коду.
Таким образом в любом случае нужно делать кеширование в драйвере фс для отображения исполняемых образов.