itakethisname
Интересующийся
Offline
|
|
« : 08-02-2010 17:30 » |
|
Привет. Драйвер пишу с использованием WDF, необходимо внутри драйвера хранить определенный стэк данных. Как лучше реализовать, предполагаю выделить порядка 20 килобайт данных. И вытаскивать эти данные в аппликацию. Как лучше это сделать?
|
|
« Последнее редактирование: 09-02-2010 20:22 от Ochkarik »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 08-02-2010 18:48 » |
|
смотря что за данные... смотря "кто" и "как" будет иметь к ним доступ. рекомендаций на все случаи жизни не бывает)
|
|
« Последнее редактирование: 08-02-2010 18:50 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #2 : 08-02-2010 20:29 » |
|
предполагается записывать все пакеты проходящие через драйвер, и считывать их из юзермода программкой. не понимаю как выделить память, malloc работает?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 08-02-2010 20:52 » |
|
1. все равно мало инфы. сколько пакетов, какой общий поток, размер(20кб - одного пакета?). поток только в одну сторону? или обратно тоже? что вообще за драйвер? 2. шутите) какой еще malloc???)))) ExAllocatePool! или как он там на KMDF-е...WdfMemoryCreate что ли...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #4 : 08-02-2010 21:52 » |
|
Размер каждого пакета в районе 20байт, соответственно, данные идут сверху и снизу, хранятся в этоЙ области памяти.
Короче, брать данные из фильтра драйвера и слать наверх.
|
|
« Последнее редактирование: 09-02-2010 08:47 от Sel »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 09-02-2010 08:03 » |
|
хм, ну и в чем проблема? если поток только от драйвера в приложение - простейшее FIFO, плюс ReadFile на его вычитку. синхронизировать операции чтения/записи в такое FIFO только придется, но тут тоже полно вариантов)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #6 : 09-02-2010 17:28 » |
|
ещё вопрос: вот текст функции, которая обрабатывает вызов DeviceIoControl(хэндл на девайс....) VOID BtmhsfIoDevCtrl(IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t OutputBufferLength, IN size_t InputBufferLength, IN ULONG IoControlCode) { // PFILTER_EXTENSION filterExt; NTSTATUS status = STATUS_SUCCESS; // WDFDEVICE device;
UNREFERENCED_PARAMETER(OutputBufferLength); UNREFERENCED_PARAMETER(InputBufferLength); UNREFERENCED_PARAMETER(Queue); UNREFERENCED_PARAMETER(IoControlCode); KdPrint(("\nEntered MyDeviceIoDevCtrlED\n"));
//switch (IoControlCode) // if (!NT_SUCCESS(status)) WdfRequestComplete(Request, status);
return; }
Как передать данные наверх?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 09-02-2010 19:58 » |
|
http://msdn.microsoft.com/en-us/library/aa491610.aspxhttp://msdn.microsoft.com/en-us/library/aa490083.aspxTo retrieve a handle to a framework memory object that represents the buffer, the driver calls WdfRequestRetrieveInputMemory or WdfRequestRetrieveOutputMemory. To retrieve the virtual address and length of the buffer, the driver can call WdfRequestRetrieveInputBuffer or WdfRequestRetrieveOutputBuffer. To allocate and build a memory descriptor list (MDL) for the buffer, the driver calls WdfRequestRetrieveInputWdmMdl or WdfRequestRetrieveOutputWdmMdl.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #8 : 11-02-2010 16:52 » |
|
привет в продолжении этой темы, подскажите пожалуйста что я делаю не так. ниже код драйвера и аппликации.(WDF + C#) проблема в том что не происходит выполнение WdfMemoryCopyFromBuffer... подскажите пожалуйста в чем косяк. Driver VOID IoDevCtrl(IN WDFQUEUE Queue, IN WDFREQUEST Request, IN size_t OutputBufferLength, IN size_t InputBufferLength, IN ULONG IoControlCode) { NTSTATUS status = STATUS_SUCCESS;
WDF_OBJECT_ATTRIBUTES attributes; WDF_OBJECT_ATTRIBUTES attrib; WDFMEMORY inputBuf; WDFMEMORY outputBuf;
WDFSTRING handleStr = NULL; WDFSTRING hString = NULL;
PVOID pOutputBuffer = NULL; PUCHAR printPTR = NULL;
UNREFERENCED_PARAMETER(Queue); UNREFERENCED_PARAMETER(IoControlCode);
WDF_OBJECT_ATTRIBUTES_INIT(&attributes); WDF_OBJECT_ATTRIBUTES_INIT(&attrib);
pOutputBuffer = ExAllocatePoolWithTag( NonPagedPool, OutputBufferLength, 't' ); status = WdfStringCreate( NULL, &attributes, &hString ); status = WdfStringCreate( NULL, &attrib, &handleStr ); KdPrint(("\nEntered MyDeviceIoDevCtrlED\n")); KdPrint(("\n the>> OutputBufferLength is >> %d \n", OutputBufferLength)); KdPrint(("\n the>> InputBufferLength is >> %d \n", InputBufferLength)); status = WdfRequestRetrieveOutputMemory( Request, &outputBuf ); if (NT_SUCCESS(status)) { KdPrint(("\nGOOD : WdfRequestRetrieveOutputMemory\n")); }
status = WdfRequestRetrieveInputMemory( Request, &inputBuf ); if (NT_SUCCESS(status)) { KdPrint(("\nGOOD : WdfRequestRetrieveInputMemory\n")); }
status = WdfMemoryCopyToBuffer( inputBuf, 0, pOutputBuffer, OutputBufferLength ); if (NT_SUCCESS(status)) { KdPrint(("\nGOOD : WdfMemoryCopyToBuffer\n")); }
KdPrint(("\nGOOD : WdfMemoryCopyToBuffer\n"));
status = WdfMemoryCopyFromBuffer( outputBuf, 0, pOutputBuffer, OutputBufferLength ); if (NT_SUCCESS(status)) { KdPrint(("\nGOOD : WdfMemoryCopyFromBuffer\n")); }
ExFreePool(pOutputBuffer);
WdfRequestComplete(Request, status);
return; }
Аппликация:
IntPtr hFile; //Application.Run(new Form1()); ulong bytes;
uint iArraySize = 3;
bool result; hFile = CreateFile( "\\\\.\\myDevice", FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); int bytesReturned = 0; uint sessionId = 0; uint size = 0; uint q = 10; uint p = 10;
IntPtr pDest = IntPtr.Zero; IntPtr pSource = IntPtr.Zero; string StrDest = "abc"; OutputForm.AddtxtMethod(" Input >> " + StrDest); string StrSource = "123" ; OutputForm.AddtxtMethod(" Source >> " + StrSource); pDest = Marshal.AllocHGlobal((int)q); pSource = Marshal.AllocHGlobal((int)p);
pDest = Marshal.StringToHGlobalAnsi(StrDest); pSource = Marshal.StringToHGlobalAnsi(StrSource); OutputForm.AddtxtMethod(" DEST >> " + Marshal.PtrToStringAnsi(pDest).ToString()); OutputForm.AddtxtMethod(" SOURCE >> " + Marshal.PtrToStringAnsi(pSource).ToString()); if ((int)hFile == -1) { OutputForm.AddtxtMethod("Driver: IS NOT OPENED"); } else { OutputForm.AddtxtMethod("Driver: IS OPENED"); }
result = DeviceIoControl( hFile, //handle to device 0x0001, //control code pSource, iArraySize, // >> input pDest, iArraySize, // >> output ref size, //returned bytes IntPtr.Zero); if (result) { OutputForm.AddtxtMethod(("IOCTL Sent!" + size).ToString()); } StrDest = Marshal.PtrToStringAnsi(pDest); StrSource = Marshal.PtrToStringAnsi(pSource); OutputForm.AddtxtMethod(" DEST >> " + StrDest.ToString()); OutputForm.AddtxtMethod(" SOURCE >> " + StrSource.ToString());
|
|
« Последнее редактирование: 11-02-2010 16:55 от itakethisname »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 11-02-2010 18:17 » |
|
1. "0x0001, //control code" - неверно задан. IOCTL надо задавать специальным образом. в зависимости от типа - различная обработка.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #10 : 11-02-2010 18:40 » |
|
т.е. только лишь из-за того что на вход DeviceIoControl идёт IOCTL 0x0001 то DeviceIoControl будет работать в урезанном режиме? я так понимаю, что IOCTL код обрабатывается исключительно в теле DeviceIoControl, если заблуждаюсь поправьте. никаких switch'ей у меня нет...
но ведь у меня даже UNREFERENCED_PARAMETER(IoControlCode); и IoControlCode никак не обрабатывается..
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 11-02-2010 19:43 » |
|
само значение IoControlCode - определяет тип передачи параметров: http://msdn.microsoft.com/en-us/library/ms795857.aspx там внутри зашито поле? по которому передача параметров происходил либо буферизированно, либо через MDL либо через "никакой" метод: http://msdn.microsoft.com/en-us/library/ms795909.aspxпример формирования кода IOCTL_TEST_1, при помощи макроса CTL_CODE(): DeviceIoControl(hDevice, IOCTL_TEST_1, &inBuff, lenInputBuff, &outBuff, lenOutBuff, &ReturetLength, NULL); #define IOCTL_TEST_1 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) далее вы во-первых должны ОБЯЗАТЕЛЬНО проверять значение IoControlCode == IOCTL_TEST_1 в процедуре IoDevCtrl(). и поступать сообразно методу как вы его определили: METHOD_BUFFERED - одна обработка. METHOD_IN_DIRECT or METHOD_OUT_DIRECT -другая и т.д.
|
|
« Последнее редактирование: 17-02-2010 06:49 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
itakethisname
Интересующийся
Offline
|
|
« Ответ #12 : 16-02-2010 23:09 » |
|
Большое спасибо Ваш совет помог, спасибо.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #13 : 17-02-2010 04:19 » |
|
#define IOCTL_TEST_1 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x703, METHOD_BUFFERED, FILE_ANY_ACCESS) Вообще, хотя сплош и рядом можно увидеть любое значение FunctionCode (0x703 в данном случае), но в DDK написано, что значения меньше 0x800 зарезервированы майкрософт. Работать конечно всё будет, но как-то нехорошо получается. ИМХО грамотнее наверное соблюдать такое несложное предписание
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 17-02-2010 06:48 » |
|
правильно) не рекомендуют... я просто скопипастил из соседней темы кусочек сообщения
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|