Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Область памяти в WDF драйвере  (Прочитано 15263 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
itakethisname
Интересующийся

eu
Offline Offline

« : 08-02-2010 17:30 » 

Привет. Драйвер пишу с использованием WDF, необходимо внутри драйвера хранить определенный стэк данных.
Как лучше реализовать, предполагаю выделить порядка 20 килобайт данных. И вытаскивать эти данные в аппликацию.
Как лучше это сделать?
« Последнее редактирование: 09-02-2010 20:22 от Ochkarik » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 08-02-2010 18:48 » 

смотря что за данные... смотря "кто" и "как"  будет иметь к ним доступ.
рекомендаций на все случаи жизни не бывает)
« Последнее редактирование: 08-02-2010 18:50 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline Offline

« Ответ #2 : 08-02-2010 20:29 » 

предполагается записывать все пакеты проходящие через драйвер, и считывать их из юзермода программкой.
не понимаю как выделить память, malloc работает? Улыбаюсь
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-02-2010 20:52 » 

1. все равно мало инфы. сколько пакетов, какой общий поток, размер(20кб - одного пакета?). поток только в одну сторону? или обратно тоже? что вообще за драйвер?
2. шутите) какой еще malloc???)))) ExAllocatePool! или как он там на KMDF-е...WdfMemoryCreate что ли...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline Offline

« Ответ #4 : 08-02-2010 21:52 » 

Размер каждого пакета в районе 20байт, соответственно, данные идут сверху и снизу, хранятся в этоЙ области памяти.

Короче, брать данные из фильтра драйвера и слать наверх.
« Последнее редактирование: 09-02-2010 08:47 от Sel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 09-02-2010 08:03 » 

хм, ну и в чем проблема?
если поток только от драйвера в приложение - простейшее FIFO, плюс ReadFile на его вычитку.
синхронизировать операции чтения/записи в такое FIFO только придется, но тут тоже полно вариантов)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 09-02-2010 19:58 » 

http://msdn.microsoft.com/en-us/library/aa491610.aspx
http://msdn.microsoft.com/en-us/library/aa490083.aspx
Цитата
To 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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 11-02-2010 18:17 » 

1. "0x0001,                  //control code" - неверно задан. IOCTL надо задавать специальным образом. в зависимости от типа - различная обработка.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline Offline

« Ответ #10 : 11-02-2010 18:40 » 

т.е. только лишь из-за того что на вход DeviceIoControl идёт IOCTL 0x0001 то DeviceIoControl будет работать в урезанном режиме?
я так понимаю, что IOCTL код обрабатывается исключительно в теле DeviceIoControl, если заблуждаюсь поправьте.
никаких switch'ей у меня нет...

но ведь у меня даже UNREFERENCED_PARAMETER(IoControlCode); и IoControlCode никак не обрабатывается..
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
itakethisname
Интересующийся

eu
Offline Offline

« Ответ #12 : 16-02-2010 23:09 » 

Большое спасибо Улыбаюсь Ваш совет помог, спасибо.
Записан
resource
Молодой специалист

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 17-02-2010 06:48 » new

правильно) не рекомендуют... Краснею
я просто скопипастил из соседней темы кусочек сообщения Скромно так...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines