Что-то я совсем отупел... Задача следующая, пользовательское приложение функцией _lread скармливает драйверу буфер. Драйвер должен эти данные расшифровать и положить в тот же буфер и пользовательское приложение получит расшифрованные данные. Чего только не делал, но данные получаемые IRP_MJ_READ какие-то левые. Пробовал читать и писать и SystemBuffer и UserBuffer.
Судя по Пробовал читать и писать и SystemBuffer и UserBuffer Вы работаете с моделью буферезированного ввода. Попробуйте установить флаг DO_DIRECT_IO. А буфер искать в MdlAddress. И вообще, передавать буфер драйверу через IRP_MJ_READ - это както криво. Есть же IRP_MJ_DEVICE_CONTROL.
Спасибо большое! Разобрался! Ошибка была в коде (ошибся с типом!) - просто недоглядел! А вобще крив не я, а Novex! Именно через IRP_MJ_READ они драйверу ключа данные передают! Думаю тему можно закрыть.
TarasCo Во-первых - по IRP_MJ_READ данные передаются не драйверу, а из драйвера. Во-вторых - почему криво? Может просто неудобно в программировании. Зато производительность этого метода на больших обьемах данных гораздо лучше, чем IRP_MJ_DEVICE_CONTROL
Во-вторых - почему криво? Может просто неудобно в программировании. Зато производительность этого метода на больших обьемах данных гораздо лучше, чем IRP_MJ_DEVICE_CONTROL Не согласен Производительность будет определяться способом передачи DO_DIRECT_IO (прямой) или DO_BUFFERED_IO (буфферизированный). При буферизированном вводе - как минимум, лишнее копирование.
infern0 Интересно это как? Может не IRP_MJ_READ а IRP_MJ_WRITE? TarasCo А кто тебе запрещает использовать DO_DIRECT_IO вместе с IRP_MJ_READ?
очень просто. Используется метод с передачей пользовательского адреса через mdl. Далее перед вызовом ты заполняешь буфер некоей инфой и делаешь readfile с этим буфером. Драйвер получает адрес, читает оттуда данные, заполняет назад ответом и возвращает управление. А что тебя смутило ?
В ядре, IMHO, разницы практически никакой, при условии, что входного буфера у DeviceIoControl нет, а прочие условия равны. <font size=1> Код (Text): [b]NtReadFile[/b]( . . . ) { ObReferenceObjectByHandle( hFile, . . . ); pDeviceObject = IoGetRelatedDeviceObject( pFileObject ); if ( KeGetPreviousMode() != KernelMode) { try { ProbeForWriteIoStatusEx( IoStatusBlock, . . . ); ProbeForWrite( Buffer, . . . ); if ( ByteOffset ) { ProbeForRead( ByteOffset, . . . ); } if ( Key ) { ProbeAndReadUlong( Key ); } } } if ( hEvent ) { ObReferenceObjectByHandle( hEvent, . . . ); KeClearEvent( pEventObject ); } if ( pFileObject->Flags & FO_SYNCHRONOUS_IO ) { if ( !IopAcquireFastLock( pFileObject ) ) { IopAcquireFileObjectLock( pFileObject, . . . ); } } KeClearEvent( &pFileObject->Event ); IopAllocateIrp( pDeviceObject->StackSize, TRUE ); // Fill IRP if ( pDeviceObject->Flags & DO_DIRECT_IO ) { pMdl = IoAllocateMdl( Buffer, Length, . . . ); MmProbeAndLockPages( pMdl, . . . ); } return IopSynchronousServiceTail( . . . ); } </font><!--size--> <font size=1> Код (Text): [b]IopXxxControlFile[/b]( . . . ) { if ( KeGetPreviousMode() != KernelMode) { try { ProbeForWriteIoStatusEx( IoStatusBlock, . . . ); } } ObReferenceObjectByHandle( hFile . . . ); if ( hEvent ) { ObReferenceObjectByHandle( hEvent, . . . ) KeClearEvent( pEventObject ); } if ( pFileObject->Flags & FO_SYNCHRONOUS_IO ) { if ( !IopAcquireFastLock( pFileObject ) ) { IopAcquireFileObjectLock( pFileObject, . . . ); } } if ( !( pFileObject->Flags & FO_DIRECT_DEVICE_OPEN ) ) { pDeviceObject = IoGetRelatedDeviceObject( pFileObject ); } else { pDeviceObject = IoGetAttachedDevice( pFileObject->DeviceObject ); } KeClearEvent( &pFileObject->Event ); IopAllocateIrp( pDeviceObject->StackSize, TRUE ); // Fill IRP switch ( IoControlCode & 3 ) { case 1: case 2: try { if ( OutputBufferLength != 0 ) { pIrp->MdlAddress = IoAllocateMdl( OutputBuffer, OutputBufferLength, . . . ); MmProbeAndLockPages( pIrp->MdlAddress, . . . ); } } } return IopSynchronousServiceTail( . . . ); } </font><!--size-->