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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Kmdf and Simple Application  (Прочитано 31077 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Flenger
Гость
« : 07-12-2008 14:22 » new

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

каким образом мне достать этот список операцый Не понял?


Смотрите робота происходит так: приложение посылает текстовое сообщение драйверу (с указанием имени файла которго я выбрал) потом драйвер отсылает это сообщение назад приложению.....

Как осуществить это...... допустим я использую каркас драйвера с WDK (kmdf\toaster\func\simple)... я так понял что это делается через CreateFile - получаю дескриптор и передаю его DeviceIoControl.....

если можно киньте какоё нить примерчик пресылки простой фразы драйверу.....
Записан
Flenger
Гость
« Ответ #1 : 07-12-2008 20:05 » 

Я так понял второй параметр это грубо говоря имя моей функцыи....  потом при обработке IOCTL запроса в драйвере я смогу отфильтровать по имени мою функцыю и принять какие либо действия......

Я правильно понял или нет Не понял?
Записан
Ochkarik
Модератор

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

« Ответ #2 : 07-12-2008 20:40 » 

VxD?Не понял может быть все таки WDM?))))
VxD драйвера ТОЛЬКО до Win98 использовались. и уж тем более на них не было никакого KMDF . KMDF - обертка WDM.
достать в WDM - никак. это в код драйвера прошито на уровне кода switch(IOCTL) {case 1,,, case 2... и т.д.}
думаю в KMDF так же.. короче вы должны ЗНАТЬ особенности интерфейса  драйвера который собираетесь вызывать.
примерчик... статья Грома на сайте) читайте)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #3 : 07-12-2008 21:53 » 

Ochkarik я это знаю(VxD драйвера ТОЛЬКО до Win98).....

эту фраза вырезаная с статьи на Four - F......

Подскажите если знаете как мне на С# реализовать свой(типа как в примерах 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  а то он на Висте походу неработает валидно
Записан
Ochkarik
Модератор

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

« Ответ #4 : 08-12-2008 13:25 » 

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

KmdManager - никогда не пользовался. но аналогов полно. что значит неработает валидно? там код примитивный. можете сами написать - см статью Грома.

про С# и IOCTL - тоже по форуму поищите. был такой вопрос)

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #5 : 11-12-2008 07:18 » 

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

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

пожалуйста подскажите как называется аналог проги типа KmdManager..... желательно что б под Вистой тоже работала.....
Записан
Ochkarik
Модератор

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

« Ответ #6 : 11-12-2008 15:04 » 

http://www.google.ru/search?sourceid=navclient&hl=ru&ie=UTF-8&rls=GGLG,GGLG:2005-41,GGLG:ru&q=driver+loader
третья ссылка на OSR
PS пардон, это на WDM...
PS а чем вам родной не угодил?
« Последнее редактирование: 11-12-2008 15:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #7 : 11-12-2008 15:51 » 

а чем вам родной не угодил? - сори а как он называется Не понял
Записан
Ochkarik
Модератор

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

« Ответ #8 : 12-12-2008 08:33 » 

KmdManager) - как кокретно он не работает под вистой?
а насчет аналогов я может погорячился.. пока не нашел)
« Последнее редактирование: 12-12-2008 08:35 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #9 : 12-12-2008 22:21 » 

в конце концов... вот она лень матушка... сами его перепишите) в чем вопрос - это же пример с открытыми исходными кодами?
да кстати.... мельком его глянул. никакой же разницы! там стандартные OpenService/StartService.
это СТАНДАРТНАЯ заргузка драйвера! таких загрузчиков миллионы. и пишутсья они на Си в три строчки!

а теперь почему драйвер может не запускаться... попробуйте запустить программу которая к нему обращается принудительно от имени администратора.
эту фичу вроде бы исправили в SP1 для висты. хотя не уверен что это ваш случай...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #10 : 13-12-2008 08:28 » 

Вопрос как мне организовать в драйвере приём IOCTL запроса Не понял

тоесть у мя есть
Код:
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchSequential);

queueConfig.EvtIoDeviceControl = DriverEvtIoDeviceControl;

потом в функцыи DriverEvtIoDeviceControl я switch буду обрабатывать запрос....
Код:
switch(IoControlCode)
{
case IOCTL_MY_TESTH:
мне непонятно как именно обрабатывать сам запрос... допустим мне нужно с User Mode передать строчку..... что должно быть в обработчике IOCTL_MY_TESTH.

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

Если можна киньте пожалуйста примерчик.......
Записан
Ochkarik
Модератор

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

« Ответ #11 : 13-12-2008 11:27 » 

для KMDF не подскажу, но поскольку они базируются на WDM...
общая идея для WDM драйверов такая:
существуют три вида передачи данных.
1. через промежуточный буфер организуемый ОС. в этом случае буфер один его размер - равен MAX размеру входного/выходного буфера.
     при входе туда копируется исходная информация, перед выходом из драйвера вы комируете туда выходную.
     при входе вам отдается входной размер, перед выходом вы обязаны установить объем который скопировали туда на отдачу.
2. через MDL - тут в двух словах не расскажешь, надо читать глазами. на русском - есть, так что повторяться не буду.
3. напрямую через указатель ring-3. тоже читать глазами. много нюансов.

для начала подойдет первый - как самый простой он называется METHOD_BUFFERED или как-то так...
определить вы должны его тоже правильно
#define IOCTL_TEST_SMTH   CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 300,  METHOD_NEITHER, FILE_ANY_ACCESS) // READ_USN_JOURNAL_DATA, USN
METHOD_NEITHER - это третий метод.

далее вы должны извлечь адрес входного буфера (лежит в irp), ОБЯЗАТЕЛЬНО проверить его длинну. и работать.
в случаях (2-3) предстоят промежуточные действия - в примерах все должно быть.
не забывать что в случае буферизации - буфер общий, поэтому писать в него ТОЛЬКО после того как все прочитали и обработали.
перед выходом записать выходные данные и установить в поле статуса выходную длинну.
после этого завершить обработку IRP. и выставить статус  обработки.
как-то так)
PS приобретите книгу по KMFD Пенни Орвик. она во-первых качественно переведена на русский, а во вторых очень подробная. даже слишком)
на ваше счастье нужный отрывок выложили http://www.bhv.ru/books/get_pdf_data.php?id=184059

PPS посмотрите здесь http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Porting-WDM-Drvs-to-KMDF.ppt#330,52,Read/Write/IOCTL Callbacks
и следующие страницы там очень наглядно и структурно. и как раз по KMDF. в общем ответ на ваш вопрос)
« Последнее редактирование: 13-12-2008 11:58 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #12 : 13-12-2008 12:20 » 

Ochkarik Мега СПАСИБО за изложенную инфу..... о бметодах передачи я знаю.... книгу которую вы посоветовали, купил, недели 3 назад... но там примеров именно как обрабатывается IOCTL нету..... там глава 8 вроде бы должна описывать что и как... там есть "Извлечение буферов в KMDF".....

а скажите зачем область контекста объекта устройства..... Не понял?? там написано что её драйверы юзают для хранения инфы имеющеё отношение к объекту устройства...... просто я по примерах WDK часто вижу что её юзают в IOCTL запросах.....

device = WdfIoQueueGetDevice(Queue);
    pDevContext = GetDeviceContext(device);

    switch(IoControlCode) {
Записан
Ochkarik
Модератор

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

« Ответ #13 : 13-12-2008 17:53 » 

https://forum.shelek.ru/index.php/topic,16479.0.html
 это то же самое что DEVICE_EXTENSION для WDM
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #14 : 14-12-2008 17:01 » 

Ochkarik Огромное СПАСИБО!!!!

у меня нереальная трабла... я пытаюсь связатся с драйвером через IOCTL запрос.... юзая .NET (С#)

за рыбу брал kmdf\Toaster\Simple

я там добавил ссылку WdfDeviceCreateSymbolicLink на Device....

CreateFile создаю вроде валидно а вот DeviceIoControl, нивкакую......

блин что делать.......

может мне сорцы выложить Не понял?

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 14-12-2008 17:19 » 

Flenger, выкладывай, что спрашиваешь то )  проблемную функцию запости
Записан

Ochkarik
Модератор

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

« Ответ #16 : 15-12-2008 07:13 » 

DeviceIoControl какую ошибку возвращает? ее расшифровка?
я ж не экстрасенс)
« Последнее редактирование: 15-12-2008 07:17 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #17 : 15-12-2008 14:01 » 

Кароче траблу я решил...........  запрос посылается нормально, даже фильтруется на выборке
Код:
 
switch (IoControlCode) {

case IOCTL_WDFDIO_OUTPUT:
KdPrint(("1111111ToasterEvtIoDeviceControl called\n"));
break;

    default:
KdPrint(("ToasterEvtIoDeviceControl called\n"));
        status = STATUS_INVALID_DEVICE_REQUEST;
}

вопрос такой: немогу скомпилить по Vista_x64 and Windows Server 2008.....

вот что вываливает в логе
Код:
errors in directory c:\develope\test - copy\func\simple
c:\winddk\6001.18001\bin\makefile.new(7040) : error U1087: cannot have : and :: dependents for same target
errors in directory c:\develope\test - copy\func\simple
nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS1 NOLINK=1 MAKEDIR_RELATIVE_TO_BASEDIR= failed - rc = 2

c:\winddk\6001.18001\bin\makefile.new(7040) : error U1087: cannot have : and :: dependents for same target
errors in directory c:\develope\test - copy\func\simple
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)....

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

Записан
Ochkarik
Модератор

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

« Ответ #18 : 15-12-2008 15:17 » 

а что гласит описание по поводу "error U1087"?
.inx - что за зверь? я честно говоря под KMDF пока и не думал переходить...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #19 : 15-12-2008 15:19 » 

Код:
Visual C++ Concepts: Building a C/C++ Program   
NMAKE Fatal Error U1087

cannot have : and :: dependents for same target

A target cannot be specified in both a single-colon (:) and a double-colon (::) dependency.
To specify a target in multiple description blocks, use :: in each dependency line.
« Последнее редактирование: 15-12-2008 15:21 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #20 : 15-12-2008 15:32 » 

Что это может быть Error U1087 Не понял?

INX предоставляет собой архитектурно - независимый INF - файл..... Утилита Build, которой задаются соответствующие инструкцыи, использует данные в файле INX для создания соответсвующего INF файла для проекта...

Можно пример только на KMDF с EVENT, что б можно было от драйвера запрос кинуть моей проге....
Записан
Ochkarik
Модератор

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

« Ответ #21 : 15-12-2008 16:36 » 

inf можно ручками переписать. там всего то три строчки по аналогии дописать.
хоть "ddk\src\general\portio\genport.inf"  посмотрите... там для 64 бит есть разделы...

а ошибка - либо переменные окружения не проставили либо в файле sources.
видимо...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #22 : 15-12-2008 16:40 » 

PS и зачем у вас имя дериктории с пробелами используется?!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #23 : 16-12-2008 07:18 » 

Вот собственно сам проект.......

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

* func.zip (8.98 Кб - загружено 847 раз.)
Записан
Flenger
Гость
« Ответ #24 : 16-12-2008 15:02 » 

Ochkarik я с траблом роздуплился...... там оказывается просто файла dirs нехватало..... и в sources поправил

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

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

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

« Ответ #25 : 16-12-2008 15:04 » 

Flenger, еще раз и по русски) драйвер - приложению? может наоборот?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #26 : 16-12-2008 15:38 » 

ну типа приложение драйверу засылает запрос(это я впринцепе реализовал, можешь маленький пример: приложение отсылает текс с нескольких слов драйверу(пусть даже на WDM мне главное сам DeviceIoControl))...... драйвер его обрабатывает, а потом посылает приложению...... как это реализовать.......
Записан
Ochkarik
Модератор

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

« Ответ #27 : 16-12-2008 18:03 » 

функция DeviceIoControl может не только передавать драйверу информацию от приложения но и забирать ее)
напрямую вызов драйвером кода приложения - только через APC, но до этого вам еще много изучить надо)

так что тот  же DeviceIoControl вам в руки)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Flenger
Гость
« Ответ #28 : 17-12-2008 05:47 » 

Ochkarik можешь объяснить зачем нужен CreateEvent..... как происходит реагирование проги на событие от драйвера..... она ж должна как-то ждать ответа от драйвера.....

Почему примеры из WDK(KMDF) компилируются, а вот драйвера незагружаются(некоторые(Toaster) устанавливаются но незагружаются)....... Error Code 39 или ещё что то в этом роде....... Это всё происходит под Windows Server 2008? аналогично думаю будет и под Vista_x64.....
« Последнее редактирование: 17-12-2008 05:48 от Flenger » Записан
sss
Специалист

ru
Offline Offline

« Ответ #29 : 17-12-2008 08:48 » 

Ochkarik, можно подробнее про APC. Хотя бы имя функции от которой смотреть.
Записан

while (8==8)
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines