Ochkarik
|
|
« Ответ #30 : 12-12-2011 10:36 » |
|
уберите строчку #include "windef.h" и измените путь к файлу на L"\\\\.\\MyDriver" или какое там имя было...
PS так наверное правильней будет hDrv = CreateFile ( L"\\\\.\\MyDriver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
|
|
« Последнее редактирование: 12-12-2011 15:51 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #31 : 12-12-2011 12:51 » |
|
Выкладываю код и соответствующий ему лог ошибок, после выполнения всех написанных Вами, Ochkarik действий.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #32 : 12-12-2011 13:50 » |
|
1>------ Rebuild All started: Project: UseDriver, Configuration: Debug Win32 ------ 1>Deleting intermediate and output files for project 'UseDriver', configuration 'Debug|Win32' 1>Compiling... 1>stdafx.cpp 1>Compiling... 1>UseDriver.cpp 1>c:\users\user\documents\visual studio 2005\projects\usedriver\usedriver\usedriver.cpp(11) : error C2065: 'GENRIC_READ' : undeclared identifier 1>c:\users\user.\documents\visual studio 2005\projects\usedriver\usedriver\usedriver.cpp(12) : error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Обращаю внимание, что здесь я делал Rebuild, а не Build - PCB-файл моя версия Visual Studio признала повреждённым и несоответствующим. Любопытно также, что в проекте зачем-то Unicode включен. Тогда надо L"\\\\.\\MyDriver" или что там у вас. Ну и конечно опечатка в GENERIC_READ. Если это поправить, то вуаля. 1>------ Build started: Project: UseDriver, Configuration: Debug Win32 ------ 1>Compiling... 1>UseDriver.cpp 1>Compiling manifest to resources... 1>Linking... 1>Embedding manifest... 1>Build log was saved at "file://c:\Users\user\Documents\Visual Studio 2005\Projects\UseDriver\UseDriver\Debug\BuildLog.htm" 1>UseDriver - 0 error(s), 0 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Из чего можно заключить, что либо кто-то особо умелый сносил и устанавливал Windows SDK при живой Visual Studio, либо чьи-то золотые руки мастерски ковырялись в настройках самой Visual Studio, либо происходило что-нибудь в этом духе. В меню Tools/Options... В диалоге в дереве Projects and Solutions/VC++ Directories. Затем справа сверху Show directories for поставить в значение Include Files. Полученный список в студию (можно скриншотом, если там нет прокрутки). По-умолчанию это выглядит так:
|
|
« Последнее редактирование: 12-12-2011 14:01 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Fredwriter
|
|
« Ответ #33 : 12-12-2011 14:50 » |
|
Переустановил Visual C++, поменял 2005 на 2008, теперь у меня такой лог: Compiling... cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release stdafx.cpp Compiling... cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release UseDriver.cpp c:\program files\microsoft sdks\windows\v6.0a\include\windows.h(21) : fatal error C1083: Cannot open include file: 'sdkddkver.h': No such file or directory
при таких настройках:
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #34 : 12-12-2011 15:25 » |
|
Fredwriter, посмотри в папке c:\program files\microsoft sdks\windows\v6.0a\include\ есть ли там файл sdkddkver.h.
У меня есть, и сборка проходит нормально с учётом конвертирования под VS 2008 и исправления мною вышеописанных ошибок.
Пути такие же. А вот в PlatformSDK, включённый в состав Visual C++, такого файла нет.
|
|
« Последнее редактирование: 12-12-2011 15:28 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Ochkarik
|
|
« Ответ #35 : 12-12-2011 16:06 » |
|
PS да... после того как вы скомпилите приложение перед его запуском, драйвер еще установить надо будет... при помощи SC-менеджера. а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая: там объект устройства и ссылка не убивается. то есть в том состоянии как он выложен ранее - он не выгрузится и второй раз не загрузится. и кстати флаги deviceObject->Flags лучше ставить после инициализации DriverObject->MajorFunction[] и остального, хотя это не повлияет в вашем случае. еще рекомендую, поставить какую нибудь программу вывода отладочных сообщений ядра например DebugMon от SysInternals. и натыкать сообщений DbgPrint() чтобы смотреть, что у вас происходит.
PPS Dimka, у меня SDK кажись не стоит. но все компилится тоже.
|
|
« Последнее редактирование: 12-12-2011 16:08 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #36 : 12-12-2011 16:56 » |
|
Переустановил SDK, и всё заработало, спасибо огромное за помощь, теперь можно продолжить.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #37 : 12-12-2011 17:24 » |
|
PPS Dimka, у меня SDK кажись не стоит. но все компилится тоже. SDK в той или иной форме всегда присутствует, иначе просто невозможно собрать приложение для Windows. В нём все заголовочные файлы Windows и lib-библиотеки для взаимодействия приложения с системными dll.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Ochkarik
|
|
« Ответ #38 : 12-12-2011 20:01 » |
|
Dimka, ну это само собой... я имел в виду, что отдельно не ставил. не знал что можно добиться такого эффекта. а ссылка на папки SDK после удаления последней где могут остаться? в настройках путей студии, и в переменных окружения? я думал, что уж они то за собой чистят... по крайней мере те, что написанные майкрософтом...
|
|
« Последнее редактирование: 12-12-2011 20:15 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #39 : 13-12-2011 06:32 » |
|
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая: А что не так с DriverUnload? Чего там не хватает?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #40 : 13-12-2011 08:03 » |
|
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая: А что не так с DriverUnload? Чего там не хватает? там объект устройства и ссылка не убивается
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #41 : 13-12-2011 08:54 » |
|
а ссылка на папки SDK после удаления последней где могут остаться? Да где угодно. Не одна ж VS на него может ссылаться. И другие компиляторы, и среды разработки. И отдельно устанавливаемые библиотеки для разработчиков.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Fredwriter
|
|
« Ответ #42 : 13-12-2011 09:56 » |
|
там объект устройства и ссылка не убивается А как её убить заразу? Вот код моей функции DriverUnload: VOID MyDriverUnload (IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING linkString; GetMessage(MSG_DRIVERUNLOAD, DriverObject, NULL); RtlInitUnicodeString(&linkString, L"\\DosDDevices\\MyDriver"); IoDeleteSymbolicLink(&linkString); IoDeleteDevice(DriverObject->DeviceObject); } Вот код функции DriverUnload, которую использует Уолтер Они в Своей книге Использование WDM: VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { // DriverUnload PAGED_CODE(); KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject)); RtlFreeUnicodeString(&servkey); } // DriverUnload
Может не в функции DriverUnload нужно заниматься этим мокрым делом?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #43 : 13-12-2011 10:13 » |
|
ааа... если так, то уже нормально. только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет? PS у Они такой код, потому что там небось драйвер PnP. в них - устройство рождается в AddDevice() по обнаружению экземпляра оборудования, а удаляется в IRP_MJ_PNP.... у вас legacy-драйвер, устройство вы рождаете в DriverEntry. удалить должны сами... когда нибудь, когда сочтете нужным) ЗЗЫ только не DosDDevices PPPS и статусы... статусы все всех функций проверяем! сколько говорить то уже можно!
|
|
« Последнее редактирование: 13-12-2011 10:16 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #44 : 13-12-2011 10:31 » |
|
только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет? Вот, значит, часть кода, где создаётся объект устройства, это то, что нужно? RtlInitUnicodeString(&nameString, L"\\Device\\MyDriver"); status = IoCreateDevice(DriverObject, sizeof(65533), &nameString, 0, 0, FALSE, &deviceObject); if (!NT_SUCCESS(status)) return status;
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #45 : 13-12-2011 11:36 » |
|
вот это "sizeof(65533)" - что это, и зачем? да, эта строка создает объект и возвращает указатель на созданный объект в deviceObject. и...?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #46 : 13-12-2011 12:33 » |
|
вот это "sizeof(65533)" - что это, и зачем? Это так в книге было, по которой я этот драйвер писал. Почитал Уолтера Они, он указывает в этом параметре размер структуры DEVICE_EXTENSION. DEVICE_EXTENSION - это структура, указатель на которую хранится в поле DeviceExtention структуры DEVICE_OBJECT. Эта структура (DEVICE_EXTENSION) определяется автором драйвера и хранит информацию о конкретном экземпляре устройства. То есть, это структура расширения устройства. По всей видимости из-за того, что DeviceExtension не определено, в книге и не указывают её размер. Sizeof ведь возвращает размер занимаемый (в байтах) переменной или типа, ну, по всей видимости и константы тоже. и...? А вот это я не понял вопроса.
|
|
« Последнее редактирование: 13-12-2011 12:36 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #47 : 13-12-2011 13:03 » |
|
это я вашего вопроса не понял) в чем вопрос то был?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #48 : 13-12-2011 13:08 » |
|
Вы, спросили: только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет? Я выложил часть кода, где создаётся объект устройства, и спросил то или не то?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #49 : 13-12-2011 13:22 » |
|
все. но более полный ответ был бы DRIVER_OBJECTPDEVICE_OBJECT DeviceObject Pointer to the device objects created by the driver. This member is automatically updated when the driver calls IoCreateDevice successfully. A driver can use this member and the NextDevice member of DEVICE_OBJECT to step through a list of all the device objects that the driver created. ...
могли бы и сами проверить.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #50 : 13-12-2011 13:38 » |
|
после того как вы скомпилите приложение перед его запуском, драйвер еще установить надо будет... при помощи SC-менеджера. Я уже установил его, но не при помощи SC-менеджера, а при помощи Reg-файла вот таким путём: REGEDIT4 [HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MyDriver] "ErrorControl"=dword:00000001 "Type"=dword:00000001 "Start"=dword:00000002 "ImagePath"="\\SystemRoot\\System32\\Drivers\MyDriver.sys Тоже из той книги. Теперь уж можно писать программку, которая будет открывать драйвер и делать с ним всякие вещи?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #51 : 13-12-2011 13:40 » |
|
можно)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|
Ochkarik
|
|
« Ответ #53 : 14-12-2011 08:07 » |
|
ссылки - все не то. определитесь сначала, что вы хотите получить. в зависимости от этого и пишутся все программы)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #54 : 14-12-2011 10:00 » |
|
Я хочу, одну, как кажется простую вещь, нужно, что-бы при использовании какой-нибудь MajorFunction, имеющейся в драйвере, выводилось на экран сообщение. То есть при какой-то операции ввода вывода - как-бы демонстрация возможной функциональности драйвера. Драйвер который объясняет как он ведет себя при определенном I/O запросе. Там только 4 MajorFunction, и еще есть функция GetMessage. Вот она и отвечает за вывод сообщений при каком-нибудь I/O запросе. Вот собственно что мне нужно. GetMessage кажется немного переделать нужно, и написать программку, которая будет дергать драйвер. Определитесь сначала, что вы хотите получить. В зависимости от этого и пишутся все программы) Я знаю в зависимости от чего пишутся программы, просто я думал, что не только я знаю, что я хочу получить.
|
|
« Последнее редактирование: 14-12-2011 10:40 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #55 : 14-12-2011 10:58 » |
|
по сути - да, все верно. так и надо сделать!
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #56 : 14-12-2011 12:10 » |
|
Я вот и прошу совета, как лучше это сделать? Что и как написать? Можете меня проинструктировать?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Fredwriter
|
|
« Ответ #57 : 14-12-2011 14:39 » |
|
что я вкладываю в слово "проинструктировать": с программистской точки зрения как-нибудь мне объяснить, что-бы я таки написал данную прогу и защитил 20-го числа курсовой.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #58 : 14-12-2011 14:58 » |
|
для начала вам надо убедится что драйвер загружается и корректно выполняет то что он уже должен выполнять. если вы понимаете что вы уже написали - у вас это получится.
далее, для начала вам надо заполнить в драйвере свои обработчики MJ_CREATE/MJ_CLOSE которые отвечают за обработку вызовов CreateFIle/CloseHandle из приложения, и например MJ_READ/MJ_WRITE которые отвечают за вызов ReadFile/WriteFile из приложения. далее вставить в них, то что вам надо. пусть это будет тот же мессадж. или отладочное сообщение. далее из написанного приложения - открыть драйвер по символической ссылке и чего нибудь в него записать и закрыть, отслеживая дейсвия по мессаджам в журнале(или отладочным сообщениям в DbgView)
как-то так)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #59 : 14-12-2011 17:51 » |
|
для начала вам надо убедится что драйвер загружается и корректно выполняет то что он уже должен выполнять. Если вы понимаете что вы уже написали - у вас это получится. Дело в том, что я писал этот драйвер по одной книге, а объяснение всего, что там написано читал в другой. Я прекрасно понимаю, что там написано, но кроме того, что там написано я больше ничего никогда не писал на Си. Поэтому я не могу понять как убедиться в том, что он корректно загружается - я этого никогда не делал. В функции DriverEntry моего драйвера имеется то, что должно быть в стандартной подобной функции: создание объекта устройства, создание символической ссылки, и заполнение массива MajorFuntion[]. А сами MajorFunction[], почти все ничего и не выполняют, кроме вызова функции GetMessage, которая заполняет структуру IO_ERROR_LOG_PACKET и выводит её в системный лог. Как проверить корректно он работает или нет я не знаю а что он написано понимаю, такое тоже бывает). Только вот что я понять не могу, там написано: if (Irp != NULL) { IrpStackLocation = IoGetCurrentIrpStackLocation(Irp); Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction; Log_Packet->FinalStatus = Irp->IoStatus.Status; } else { Log_Packet->MajorFunctionCode = 0; Log_Packet->FinalStatus = 0; } А в функциях драйвера везде NULL подаётся, то есть никаких Irp в IO_ERROR_LOG_PACKET никогда не будет?
|
|
« Последнее редактирование: 14-12-2011 18:03 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
|