Доброго всем времени!
DriverWorks.
Подскажите, где ошибка:
использую метод DO_DIRECT_IO
...
READ_WRITE_MEMORY_ARGS* pArgs = (READ_WRITE_MEMORY_ARGS*)I.IoctlBuffer();
t << "pArgs->ByteOffset = " << pArgs->ByteOffset;
t << "pArgs->DwordCount = " << pArgs->DwordCount;
KMemory Mem(I.Mdl());
PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace(); // - вот тут система и падает
m_MemoryRange0.inb(pArgs->ByteOffset, pBuffer, pArgs->DwordCount);
// если использовать проверку - падения системы нет, но и чтения тоже.
/* if (Mem.IsValid()) {
PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace();
m_MemoryRange0.inb(pArgs->ByteOffset, pBuffer, pArgs->DwordCount);
}*/
I.Information() = pArgs->DwordCount;
...
насколько я понимаю, при DO_DIRECT_IO входной буфер в IoctlBuffer
а выходной пользовательский буфер получают именно из MDL.
Спасибо.
Здравствуйте, Hsl, Вы писали:
Hsl>Доброго всем времени!
Hsl>DriverWorks.
Hsl>Подскажите, где ошибка:
Hsl>использую метод DO_DIRECT_IO
Hsl>Hsl>...
Hsl> READ_WRITE_MEMORY_ARGS* pArgs = (READ_WRITE_MEMORY_ARGS*)I.IoctlBuffer();
Hsl>t << "pArgs->ByteOffset = " << pArgs->ByteOffset;
Hsl>t << "pArgs->DwordCount = " << pArgs->DwordCount;
Hsl> KMemory Mem(I.Mdl());
Hsl> PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace(); // - вот тут система и падает
Hsl> m_MemoryRange0.inb(pArgs->ByteOffset, pBuffer, pArgs->DwordCount);
Hsl> // если использовать проверку - падения системы нет, но и чтения тоже.
Hsl>/* if (Mem.IsValid()) {
Hsl> PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace();
Hsl> m_MemoryRange0.inb(pArgs->ByteOffset, pBuffer, pArgs->DwordCount);
Hsl> }*/
Hsl> I.Information() = pArgs->DwordCount;
Hsl>...
Hsl>
Hsl>насколько я понимаю, при DO_DIRECT_IO входной буфер в IoctlBuffer
Hsl>а выходной пользовательский буфер получают именно из MDL.
Hsl>Спасибо.
1. The caller must be running at IRQL <= DISPATCH_LEVEL
2. Что возвращает I.Mdl() ?
3. Помоему mdl создается для METHOD_OUT_DIRECT и METHOD_IN_DIRECT — могу ошибатся!