IRP_MJ_READ и буфер.

Тема в разделе "WASM.WIN32", создана пользователем ViRUS, 13 авг 2005.

  1. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    Что-то я совсем отупел...

    Задача следующая, пользовательское приложение функцией _lread скармливает драйверу буфер. Драйвер должен эти данные расшифровать и положить в тот же буфер и пользовательское приложение получит расшифрованные данные.

    Чего только не делал, но данные получаемые IRP_MJ_READ какие-то левые. Пробовал читать и писать и SystemBuffer и UserBuffer.
     
  2. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Судя по

    Пробовал читать и писать и SystemBuffer и UserBuffer

    Вы работаете с моделью буферезированного ввода.



    Попробуйте установить флаг DO_DIRECT_IO. А буфер искать в MdlAddress.



    И вообще, передавать буфер драйверу через IRP_MJ_READ - это както криво. Есть же IRP_MJ_DEVICE_CONTROL.
     
  3. ViRUS

    ViRUS New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    10
    Адрес:
    Russia
    Спасибо большое! Разобрался! Ошибка была в коде (ошибся с типом!) - просто недоглядел! А вобще крив не я, а Novex! Именно через IRP_MJ_READ они драйверу ключа данные передают!

    Думаю тему можно закрыть.
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    TarasCo





    Во-первых - по IRP_MJ_READ данные передаются не драйверу, а из драйвера.

    Во-вторых - почему криво? Может просто неудобно в программировании. Зато производительность этого метода на больших обьемах данных гораздо лучше, чем IRP_MJ_DEVICE_CONTROL
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    в случае новекса и туда и обратно - он прав.
     
  6. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Во-вторых - почему криво? Может просто неудобно в программировании. Зато производительность этого метода на больших обьемах данных гораздо лучше, чем IRP_MJ_DEVICE_CONTROL





    Не согласен :)

    Производительность будет определяться способом передачи DO_DIRECT_IO (прямой) или DO_BUFFERED_IO (буфферизированный). При буферизированном вводе - как минимум, лишнее копирование.
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    infern0



    Интересно это как? Может не IRP_MJ_READ а IRP_MJ_WRITE?



    TarasCo





    А кто тебе запрещает использовать DO_DIRECT_IO вместе с IRP_MJ_READ?
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    очень просто. Используется метод с передачей пользовательского адреса через mdl. Далее перед вызовом ты заполняешь буфер некоей инфой и делаешь readfile с этим буфером. Драйвер получает адрес, читает оттуда данные, заполняет назад ответом и возвращает управление. А что тебя смутило ?
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В ядре, IMHO, разницы практически никакой, при условии, что входного буфера у DeviceIoControl нет, а прочие условия равны.



    <font size=1>
    Код (Text):
    1.  
    2. [b]NtReadFile[/b]( . . . )
    3. {
    4.  
    5.     ObReferenceObjectByHandle( hFile, . . . );
    6.  
    7.     pDeviceObject = IoGetRelatedDeviceObject( pFileObject );
    8.  
    9.     if ( KeGetPreviousMode() != KernelMode) {
    10.  
    11.          try {
    12.  
    13.             ProbeForWriteIoStatusEx( IoStatusBlock, . . . );
    14.  
    15.             ProbeForWrite( Buffer, . . . );
    16.  
    17.             if ( ByteOffset ) {
    18.  
    19.                 ProbeForRead( ByteOffset, . . . );
    20.             }
    21.  
    22.             if ( Key ) {
    23.  
    24.                 ProbeAndReadUlong( Key );
    25.             }
    26.         }
    27.     }
    28.  
    29.     if ( hEvent ) {
    30.  
    31.         ObReferenceObjectByHandle( hEvent, . . . );
    32.         KeClearEvent( pEventObject );
    33.     }
    34.  
    35.     if ( pFileObject->Flags & FO_SYNCHRONOUS_IO ) {
    36.  
    37.         if ( !IopAcquireFastLock( pFileObject ) ) {
    38.  
    39.             IopAcquireFileObjectLock( pFileObject, . . . );
    40.         }
    41.     }
    42.  
    43.     KeClearEvent( &pFileObject->Event );
    44.  
    45.     IopAllocateIrp( pDeviceObject->StackSize, TRUE );
    46.  
    47.     //  Fill IRP
    48.  
    49.     if ( pDeviceObject->Flags & DO_DIRECT_IO ) {
    50.  
    51.         pMdl = IoAllocateMdl( Buffer, Length, . . . );
    52.         MmProbeAndLockPages( pMdl, . . . );
    53.     }
    54.  
    55.     return IopSynchronousServiceTail( . . . );
    56. }
    </font><!--size-->





    <font size=1>
    Код (Text):
    1.  
    2. [b]IopXxxControlFile[/b]( . . . )
    3. {
    4.  
    5.     if ( KeGetPreviousMode() != KernelMode) {
    6.  
    7.         try {
    8.  
    9.             ProbeForWriteIoStatusEx( IoStatusBlock, . . . );
    10.         }
    11.     }
    12.  
    13.     ObReferenceObjectByHandle( hFile . . . );
    14.  
    15.     if ( hEvent ) {
    16.  
    17.         ObReferenceObjectByHandle( hEvent, . . . )
    18.         KeClearEvent( pEventObject );
    19.     }
    20.  
    21.     if ( pFileObject->Flags & FO_SYNCHRONOUS_IO ) {
    22.  
    23.         if ( !IopAcquireFastLock( pFileObject ) ) {
    24.  
    25.             IopAcquireFileObjectLock( pFileObject, . . . );
    26.         }
    27.     }
    28.  
    29.     if ( !( pFileObject->Flags & FO_DIRECT_DEVICE_OPEN ) ) {
    30.  
    31.         pDeviceObject = IoGetRelatedDeviceObject( pFileObject );
    32.  
    33.     } else {
    34.  
    35.         pDeviceObject = IoGetAttachedDevice( pFileObject->DeviceObject );
    36.     }
    37.  
    38.     KeClearEvent( &pFileObject->Event );
    39.  
    40.     IopAllocateIrp( pDeviceObject->StackSize, TRUE );
    41.  
    42.     //  Fill IRP
    43.  
    44.     switch ( IoControlCode & 3 ) {
    45.  
    46.     case 1:
    47.     case 2:
    48.  
    49.         try {
    50.  
    51.             if ( OutputBufferLength != 0 ) {
    52.  
    53.                 pIrp->MdlAddress = IoAllocateMdl( OutputBuffer, OutputBufferLength, . . . );
    54.    
    55.                 MmProbeAndLockPages( pIrp->MdlAddress, . . . );
    56.             }
    57.         }
    58.     }
    59.  
    60.     return IopSynchronousServiceTail( . . . );
    61. }
    </font><!--size-->