-
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 = 67108864MAX_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, почему так происходит?