Flenger
Гость
|
|
« : 07-12-2008 14:22 » |
|
у меня возник вопрос: второй параметр функцыи 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
|
|
« Ответ #2 : 07-12-2008 20:40 » |
|
VxD? может быть все таки WDM?)))) VxD драйвера ТОЛЬКО до Win98 использовались. и уж тем более на них не было никакого KMDF . KMDF - обертка WDM. достать в WDM - никак. это в код драйвера прошито на уровне кода switch(IOCTL) {case 1,,, case 2... и т.д.} думаю в KMDF так же.. короче вы должны ЗНАТЬ особенности интерфейса драйвера который собираетесь вызывать. примерчик... статья Грома на сайте) читайте)
|
|
|
Записан
|
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
|
|
« Ответ #4 : 08-12-2008 13:25 » |
|
по поводу Dbgview - поищите в форуме, в висте какой то ключ реестра надо было изменить. навскидку не помню какой. здесь я уже кому то подсказывал.
KmdManager - никогда не пользовался. но аналогов полно. что значит неработает валидно? там код примитивный. можете сами написать - см статью Грома.
про С# и IOCTL - тоже по форуму поищите. был такой вопрос)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #5 : 11-12-2008 07:18 » |
|
Столкнулся с такой проблемой..... компилю пример с WDK\src\kmdf\toaster\func\simple в XP SP2. раньше он у меня запускался через KmdManager а сейчас регестрируется, но нестартует, пишет "неудаётся найти указаный файл"...... что это может быть ?? и почему когда я хоткл скомпилить пример с папки на Рабочем столе писало ошибки, что то типа немогло подключить каких то там хидеров WDF..... скопировал исходники на диск с:\ (там у меня и WDK находится) - всё скомпилилось валидно..... пожалуйста подскажите как называется аналог проги типа KmdManager..... желательно что б под Вистой тоже работала.....
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 11-12-2008 15:04 » |
|
|
|
« Последнее редактирование: 11-12-2008 15:12 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #7 : 11-12-2008 15:51 » |
|
а чем вам родной не угодил? - сори а как он называется
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #8 : 12-12-2008 08:33 » |
|
KmdManager) - как кокретно он не работает под вистой? а насчет аналогов я может погорячился.. пока не нашел)
|
|
« Последнее редактирование: 12-12-2008 08:35 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #9 : 12-12-2008 22:21 » |
|
в конце концов... вот она лень матушка... сами его перепишите) в чем вопрос - это же пример с открытыми исходными кодами? да кстати.... мельком его глянул. никакой же разницы! там стандартные OpenService/StartService. это СТАНДАРТНАЯ заргузка драйвера! таких загрузчиков миллионы. и пишутсья они на Си в три строчки!
а теперь почему драйвер может не запускаться... попробуйте запустить программу которая к нему обращается принудительно от имени администратора. эту фичу вроде бы исправили в SP1 для висты. хотя не уверен что это ваш случай...
|
|
|
Записан
|
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
|
|
« Ответ #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=184059PPS посмотрите здесь 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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #12 : 13-12-2008 12:20 » |
|
Ochkarik Мега СПАСИБО за изложенную инфу..... о бметодах передачи я знаю.... книгу которую вы посоветовали, купил, недели 3 назад... но там примеров именно как обрабатывается IOCTL нету..... там глава 8 вроде бы должна описывать что и как... там есть "Извлечение буферов в KMDF"..... а скажите зачем область контекста объекта устройства..... ?? там написано что её драйверы юзают для хранения инфы имеющеё отношение к объекту устройства...... просто я по примерах WDK часто вижу что её юзают в IOCTL запросах..... device = WdfIoQueueGetDevice(Queue); pDevContext = GetDeviceContext(device); switch(IoControlCode) {
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 13-12-2008 17:53 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #14 : 14-12-2008 17:01 » |
|
Ochkarik Огромное СПАСИБО!!!! у меня нереальная трабла... я пытаюсь связатся с драйвером через IOCTL запрос.... юзая .NET (С#) за рыбу брал kmdf\Toaster\Simple я там добавил ссылку WdfDeviceCreateSymbolicLink на Device.... CreateFile создаю вроде валидно а вот DeviceIoControl, нивкакую...... блин что делать....... может мне сорцы выложить ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #15 : 14-12-2008 17:19 » |
|
Flenger, выкладывай, что спрашиваешь то ) проблемную функцию запости
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #16 : 15-12-2008 07:13 » |
|
DeviceIoControl какую ошибку возвращает? ее расшифровка? я ж не экстрасенс)
|
|
« Последнее редактирование: 15-12-2008 07:17 от Ochkarik »
|
Записан
|
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
|
|
« Ответ #18 : 15-12-2008 15:17 » |
|
а что гласит описание по поводу "error U1087"? .inx - что за зверь? я честно говоря под KMDF пока и не думал переходить...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #20 : 15-12-2008 15:32 » |
|
Что это может быть Error U1087 ? INX предоставляет собой архитектурно - независимый INF - файл..... Утилита Build, которой задаются соответствующие инструкцыи, использует данные в файле INX для создания соответсвующего INF файла для проекта... Можно пример только на KMDF с EVENT, что б можно было от драйвера запрос кинуть моей проге....
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #21 : 15-12-2008 16:36 » |
|
inf можно ручками переписать. там всего то три строчки по аналогии дописать. хоть "ddk\src\general\portio\genport.inf" посмотрите... там для 64 бит есть разделы...
а ошибка - либо переменные окружения не проставили либо в файле sources. видимо...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #22 : 15-12-2008 16:40 » |
|
PS и зачем у вас имя дериктории с пробелами используется?!
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #23 : 16-12-2008 07:18 » |
|
Вот собственно сам проект.......
Может так будет легче
|
|
|
Записан
|
|
|
|
Flenger
Гость
|
|
« Ответ #24 : 16-12-2008 15:02 » |
|
Ochkarik я с траблом роздуплился...... там оказывается просто файла dirs нехватало..... и в sources поправил
INCLUDES = $(INCLUDES);..\inc;..\shared
пожалуйста розкажите про то как драйвер будет слать запрос приложению........(я про это буду искать в книге, но всё же лучше будет ваш ответ)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #25 : 16-12-2008 15:04 » |
|
Flenger, еще раз и по русски) драйвер - приложению? может наоборот?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Flenger
Гость
|
|
« Ответ #26 : 16-12-2008 15:38 » |
|
ну типа приложение драйверу засылает запрос(это я впринцепе реализовал, можешь маленький пример: приложение отсылает текс с нескольких слов драйверу(пусть даже на WDM мне главное сам DeviceIoControl))...... драйвер его обрабатывает, а потом посылает приложению...... как это реализовать.......
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #27 : 16-12-2008 18:03 » |
|
функция DeviceIoControl может не только передавать драйверу информацию от приложения но и забирать ее) напрямую вызов драйвером кода приложения - только через APC, но до этого вам еще много изучить надо)
так что тот же DeviceIoControl вам в руки)
|
|
|
Записан
|
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
Специалист
Offline
|
|
« Ответ #29 : 17-12-2008 08:48 » |
|
Ochkarik, можно подробнее про APC. Хотя бы имя функции от которой смотреть.
|
|
|
Записан
|
while (8==8)
|
|
|
Ochkarik
|
|
« Ответ #30 : 17-12-2008 11:33 » |
|
вобще не очень темой владею... так как ни разу не вставало такой задачи. но суть все равно та же, спящая нитка которую будит драйвер. видел реализацию на примере CPNMouse. по поиску.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|