Конференция "WinAPI" » Передача данных из драйвера
 
  • p © (04.03.14 12:56) [0]
    Пытаюсь написать mini filter драйвер, взял пример из DDK - scanner, юзер программу пишу в Delphi XE3

    Передаю данные из драйвера в программу с помощью FltSendMessage, все работает отлично, получаю данные, отправляю ответ

    //Delphi
    type
     PFILTER_MESSAGE_INFO = ^TFILTER_MESSAGE_INFO;

     TFILTER_MESSAGE_INFO = record
       FileName: array [0 .. MAX_PATH - 1] of WCHAR;
       FileNameLength: ULONG;
       ProcessId: THandle;
       Buffer: array [0 .. 65536 - 1] of PUCHAR;
       WriteLength: ULONG;
       WriteOffset: LARGE_INTEGER;
     end;

    //Драйвер
    #define MAX_PATH 260
    #define MAX_BUFFER_SIZE   65536

    typedef struct _FILTER_MESSAGE_INFO
    {
       WCHAR          FileName[MAX_PATH];
    ULONG          FileNameLength;
    HANDLE         ProcessId;
    PUCHAR         Buffer[MAX_BUFFER_SIZE];
    ULONG          WriteLength;
       LARGE_INTEGER  WriteOffset;  

    }
    FILTER_MESSAGE_INFO, *PFILTER_MESSAGE_INFO;

    PFILTER_MESSAGE_INFO Notification = NULL;

    Notification = ExAllocatePoolWithTag( NonPagedPool,  sizeof( FILTER_MESSAGE_INFO ),  'nacS' );

    //Заполняю Notification
    Notification->ProcessId = (HANDLE)PsGetProcessId(IoThreadToProcess( Data->Thread ));
    и т.д. и т.п.
    ...
    //Отсылаю
    Status = FltSendMessage( ScannerData.Filter,
             &ScannerData.ClientPort,
             Notification,
             sizeof(FILTER_MESSAGE_INFO) ,
             Reply,
             &ReplyLength,
             NULL );



    Но если размер передаваемых данных больше, то в программу уже приходит бред

    typedef struct _FILTER_MESSAGE_INFO
    {
       WCHAR          FileName[MAX_PATH];
    ULONG          FileNameLength;
    HANDLE         ProcessId;

    HANDLE         ThreadId;
    ULONG          Status;

    PUCHAR         Buffer[MAX_BUFFER_SIZE];
    ULONG          WriteLength;
       LARGE_INTEGER  WriteOffset;  

    }
    FILTER_MESSAGE_INFO, *PFILTER_MESSAGE_INFO;



    Собственно вопрос как передавать/передать из драйвера большие обьемы данных
  • Rouse_ © (04.03.14 15:51) [1]
    Разбиваешь на блоки и передаешь.
  • p © (04.03.14 16:36) [2]

    > Rouse_ ©   (04.03.14 15:51) [1]


    Нужно за один раз, драйвер ждет ответа, и второй раз не пройдет

    the minifilter driver is put into a wait state indefinitely и ждет ответа
  • p © (04.03.14 16:42) [3]
    Пока придумал запихать все ULONG'и и HANDL'ы в WCHAR UserData[1024]; а в юзере распарсить

    Работает, но хочется сделать по нормальному
  • Rouse_ © (04.03.14 21:07) [4]

    > p ©   (04.03.14 16:36) [2]
    > Нужно за один раз, драйвер ждет ответа, и второй раз не
    > пройдет

    А в чем проблема, не понимаю?
    Драйвер передает блок, ты считал. Если считал не все - говори что нужно еще столько по такому-то оффсету. Хотя обычно делается все строго наоборот. Дровина заявляет что есть данные на 3 мега - давай читай и оффсет скажи откуда хочешь.
  • han_malign (06.03.14 10:52) [5]
    а те кому надо все и сразу - передают заголовок/указатель на  секциюmapped file(например DemoForge Mirage драйвер) и определяют примитив синхронизации буфера...
  • p © (11.03.14 14:13) [6]
    Все вкурил как это делать


    typedef struct _FILTER_MESSAGE_INFO
    {
    WCHAR      FileName[1024];
    ULONG      FileNameLength;
    ULONG      DataLength;
    UCHAR      DataBuffer[];

    }
    FILTER_MESSAGE_INFO, *PFILTER_MESSAGE_INFO;

    ULONG DataLength;
    PFILTER_MESSAGE_INFO Notification = NULL;

    DataLength = FIELD_OFFSET(FILTER_MESSAGE_INFO, DataBuffer[Data->Iopb->Parameters.Write.Length]);  
      Notification = ExAllocatePoolWithTag( NonPagedPool, DataLength, 'tag0' );



    А в юзере один раз выделяешь MAX_DATA_SIZE = 67108864

    MAX_DATA_SIZE - ((65535 - sizeof(MDL)) / sizeof(ULONG_PTR)) * PAGE_SIZE

    x86 (32-bit) 4096 4 bytes ((65535 - 28) / 4) * 4096 = 67076096 bytes (63.97 MB)

    IA64 8096 8 bytes ((65535 - 48) / 8) * 8192 = 67051520 bytes (63.95 MB)

    X64 4096 8 bytes ((65535 - 48) / 8) * 4096 = 33525760 bytes (32MB)

  • p © (26.04.14 10:51) [7]

    > Пытаюсь написать mini filter драйвер, взял пример из DDK
    > - scanner, юзер программу пишу в Delphi XE3


    Написал mini filter драйвер, просматриваю приходящие сообщения из драйвера и заметил что довольно часто процесс ntoskrnl.exe закрывает файл вместо процесса открывшего его

    Ну то есть например SearchProtocolHost.exe открыл файл, сделал с ним что то - IRP_MJ_CREATE->IRP_MJ_QUERY_INFORMATION->IRP_MJ_CLEANUP http://imglink.ru/pictures/26-04-14/d919425151c89dfd14d295dfb8c7db94.jpg

    а IRP_MJ_CLOSE http://imglink.ru/pictures/26-04-14/92aded0bf1877ace8e0106d70bcdcddc.jpg вызывает уже ntoskrnl.exe, почему так происходит?
 
Конференция "WinAPI" » Передача данных из драйвера
Есть новые Нет новых   [118668   +50][b:0][p:0.002]