KMDF and Simple Application

Тема в разделе "WASM.NT.KERNEL", создана пользователем Flenger, 5 дек 2008.

  1. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Доброе время суток!!!!

    Вопрос:

    У меня есть Виртуальный диск... возможно ли как то отображать в нём дерево фолдеров которое находится на сервере... допустим я через какую то там прогу узнаю что сейчас находится в даной деректории.... как можно отобразить это в Виртуальном диске... тоесть что б при просмотре свойств файла отображался ихний реальный розмер как на сервере ?????

    и вобще как можно осуществить общение драйвера KMDF с Application ????

    Общение будет осуществлятся через службу ???? или как... если можно кинте ссылочку где об этом возможно почитать....
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    прога загоняет данные в драйвер через DeviceIOControl, ReadFile, WriteFile. В kernel mode это всё превращается в IRP. В DDK море примеров.
     
  3. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    s0larian сенкс!!! а с KMDF обращение к драйверу так же рпоисходит ???
     
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    KMDF это просто библиотека для kernel mode. В user mode у тебя всё равно CreateFile().
     
  5. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    s0larian я знаю что KMDF это просто framework для kernel mode.

    Смотри, а что б связыватся с драйвером ненадо там создавать какую либо службу....

    Если можешь вкратце набросать как происходит обращение к драйверу(вернее описание CreateFile(), что допустим делает DeviceIOControl)

    Зарание благодарен!!!
     
  6. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Flenger, в user mode вызываешь CreateFile(твоё_имя):

    http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

    а потом DeviceIoControl(handle):

    http://msdn.microsoft.com/en-us/library/aa363216.aspx

    В ядре, можешь напрямую прописать обработчики:
    Код (Text):
    1.     DispatchTable[IRP_MJ_CREATE] = MyDispatch;
    2.     DispatchTable[IRP_MJ_CLEANUP] = MyDispatch;
    3.     DispatchTable[IRP_MJ_CLOSE] = MyDispatch;
    4.     DispatchTable[IRP_MJ_DEVICE_CONTROL] = MyDeviceIoControl;
    и потом вызвать IoCreateDevice() и IoCreateSymbolicLink():

    http://msdn.microsoft.com/en-us/library/aa490468.aspx
    http://msdn.microsoft.com/en-us/library/aa490622.aspx

    Примеров, как я уже упоминал, полно в DDK. Ты что, разбираться ленишься?
     
  7. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    s0larian сенкс.

    Всё то что ты написал я тоже уже знаю...... потому как розбиратся я неленюсь....
    кста, IoCreateSymbolicLink() какраз необизателен...... просто так типа удобнее....
     
  8. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    s0larian у меня возник вопрос: второй параметр функцыи DeviceIoControl (dwIocontrolCode - это значение, котоpое указывает опеpацию, котоpую должен выполнить VxD. Вы должны каким-то обpазом достать список допустимых значений dwIoControlCode для данного VxD, пpежде, чем вы узнаете, какую опеpацию вам нужно совеpшить)

    каким образом мне достать этот список операцый ????
     
  9. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Я так понял второй параметр это грубо говоря имя моей функцыи.... потом при обработке IOCTL запроса в драйвере я смогу отфильтровать по имени мою функцыю и принять какие либо действия......

    Я правильно понял или нет ????
     
  10. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Flenger, DeviceIOControl() это, грубо говоря, call gate. То есть програмеру все запросы надо прогнать через него. Поэтому OS тебе даёт первый уровень абстракции - "функция". User mode посылает, например, IOCTL_ENABLE, IOCTL_DISABLE, IOCTL_SET_SOMETHING, IOCTL_GET_SOMETHING. А драйвер их обслуживает. То есть, это спецификация интерфейса.
     
  11. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    s0larian сенкс!!!

    Подскажите если знаете как мне на С# реализовать свой(типа как в примерах DeviceIoControl(hDevice, IOCTL_TEST_SMTH, - тоесть надо реализовать свой IOCTL_TEST_SMTH) ControleCode.

    я думаю мне надо походу что то типа
    #define IOCTL_TEST_SMTH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 300, METHOD_NEITHER, FILE_ANY_ACCESS) // READ_USN_JOURNAL_DATA, USN

    если нет то поправте.....

    + неподскажете почему в Висте неработает Dbgview(у меня последняя версия, мой драйвер выдаёт макрос KdPrint но ничего невидно....)
    я МСДН читал что он(KdPrint) типа в Висте как то нетак работает или вобще ничего невыдаёт уже непомню, или выдаёт но при определённых настройках.... подскажите плизз, а то в ХР всё работает....

    + ах да ещё есть ли аналог KmdManager.exe а то он на Висте походу неработает валидно
     
  12. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Как на C# не знаю. Точно работает вот что - пишешь на C/C++, линкуешь в DLL и вызываешь из C#.

    В Vista вызывай DbgPrintEx() и будет видно.
     
  13. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Столкнулся с такой проблемой..... компилю пример с WDK\src\kmdf\toaster\func\simple в XP SP2. раньше он у меня запускался через KmdManager а сейчас регестрируется, но нестартует, пишет "неудаётся найти указаный файл"...... что это может быть ?????

    и почему когда я хоткл скомпилить пример с папки на Рабочем столе писало ошибки, что то типа немогло подключить каких то там хидеров WDF..... скопировал исходники на диск с:\ (там у меня и WDK находится) - всё скомпилилось валидно.....

    Плиз подскажите как называется аналог проги типа KmdManager..... желательно что б под Вистой тоже работала.....
     
  14. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    up!!!! ну что никто с моими проблемами несталкивался....
    я аналог KmdManager уже нашёл - OSR Load Driver
     
  15. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Flenger
    Код (Text):
    1. [DllImport("kernel32.dll")]
    2. public static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, out IntPtr lpOutBuffer, uint nOutBufferSize, out IntPtr lpBytesReturned, IntPtr lpOverlapped);
     
  16. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Вопрос как мне организовать в драйвере приём IOCTL запроса ???

    тоесть у мя есть
    Код (Text):
    1. WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchSequential);
    2.  
    3. queueConfig.EvtIoDeviceControl = DriverEvtIoDeviceControl;
    потом в функцыи DriverEvtIoDeviceControl я switch буду обрабатывать запрос....
    Код (Text):
    1. switch(IoControlCode)
    2.     {
    3.         case IOCTL_MY_TESTH:
    мне непонятно как именно обрабатывать сам запрос... допустим мне нужно с User Mode передать строчку..... что должно быть в обработчике IOCTL_MY_TESTH.

    мне нужно как то извлечь(буфер ввода.вывода).... они походу извлекаются методами семейства Wdf RequestRetrieve ????

    Если можна киньте плиз примерчик.......
     
  17. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Кароче траблу я решил........... запрос посылается нормально, даже фильтруется на выборке
    Код (Text):
    1.  
    2. switch (IoControlCode) {
    3.                
    4.         case IOCTL_WDFDIO_OUTPUT:
    5.             KdPrint(("1111111ToasterEvtIoDeviceControl called\n"));
    6.             break;
    7.  
    8.     default:
    9.         KdPrint(("ToasterEvtIoDeviceControl called\n"));
    10.         status = STATUS_INVALID_DEVICE_REQUEST;
    11. }
    вопрос такой: немогу скомпилить по Vista_x64 and Windows Server 2008.....

    вот что вываливает в логе
    Код (Text):
    1. errors in directory c:\develope\test - copy\func\simple
    2. c:\winddk\6001.18001\bin\makefile.new(7040) : error U1087: cannot have : and :: dependents for same target
    3. errors in directory c:\develope\test - copy\func\simple
    4. nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS1 NOLINK=1 MAKEDIR_RELATIVE_TO_BASEDIR= failed - rc = 2
    5.  
    6. c:\winddk\6001.18001\bin\makefile.new(7040) : error U1087: cannot have : and :: dependents for same target
    7. errors in directory c:\develope\test - copy\func\simple
    8. nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS2 LINKONLY=1 NOPASS0=1 MAKEDIR_RELATIVE_TO_BASEDIR= failed - rc = 2
    в чём может быть проблема

    и ещё киньте мне плиз пример .inx файла для x_64 (лучше если это Vista_x64 and Windows Server 2008)....

    зарание благодарен!!
     
  18. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    а что это за makefile.new? Тебе надо иметь файл sources и потом запустить build из под Vista/64 environment.
     
  19. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    Вот собственно сам проект.......

    Может так будет легче
     
  20. Flenger

    Flenger New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    14
    я с траблом роздуплился...... там оказывается просто файла dirs нехватало..... и в sources поправил

    INCLUDES = $(INCLUDES);..\inc;..\shared

    плиз розкажите про то как драйвер будет слать запрос приложению........(я про это буду искать в книге, но всё же лучше будет ваш ответ)