DeviceControl / KMemoryRange / inb (outb)
От: Hsl  
Дата: 29.05.06 05:46
Оценка:
Доброго всем времени!
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.
Спасибо.
Re: DeviceControl / KMemoryRange / inb (outb)
От: Аноним  
Дата: 29.05.06 14:06
Оценка:
Здравствуйте, 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 — могу ошибатся!
Re[2]: DeviceControl / KMemoryRange / inb (outb)
От: Hsl  
Дата: 30.05.06 04:50
Оценка:
А>1. The caller must be running at IRQL <= DISPATCH_LEVEL
А>2. Что возвращает I.Mdl() ?
А>3. Помоему mdl создается для METHOD_OUT_DIRECT и METHOD_IN_DIRECT — могу ошибатся!

1. код выполняется на PASSIVE_LEVEL
2. проверка Mem.IsNull() возвращает true
3. именно так. метод доступа к буферам установлен DO_DIRECT_IO, а значит я должен использовать mdl

... мда... а вот код управления в/в IOCTL был сформирован как:
#define GET_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
исправлено на
#define GET_IOCTL_800 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
все, естественно, заработало...
прошу прощения за невнимательность.
спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.