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

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

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

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

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

« Ответ #31 : 12-12-2011 12:51 » 

Выкладываю код и соответствующий ему лог ошибок, после выполнения всех написанных Вами, Ochkarik действий.

* UseDriver.rar (311 Кб - загружено 865 раз.)
Записан

Ищущий да обрящет
Dimka
Деятель
Команда клуба

ru
Offline 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. Полученный список в студию (можно скриншотом, если там нет прокрутки).

По-умолчанию это выглядит так:

* vcppdir.png (20.45 Кб - загружено 2701 раз.)
« Последнее редактирование: 12-12-2011 14:01 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Fredwriter
Постоялец

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

« Ответ #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
при таких настройках:

* Настройки.bmp (707.15 Кб - загружено 2954 раз.)
Записан

Ищущий да обрящет
Dimka
Деятель
Команда клуба

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

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

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

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

« Ответ #36 : 12-12-2011 16:56 » 

Переустановил SDK, и всё заработало, спасибо огромное за помощь, теперь можно продолжить.
Записан

Ищущий да обрящет
Dimka
Деятель
Команда клуба

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

« Ответ #37 : 12-12-2011 17:24 » 

Цитата: Ochkarik
PPS Dimka, у меня SDK кажись не стоит. но все компилится тоже.
SDK в той или иной форме всегда присутствует, иначе просто невозможно собрать приложение для Windows. В нём все заголовочные файлы Windows и lib-библиотеки для взаимодействия приложения с системными dll.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Ochkarik
Модератор

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

« Ответ #38 : 12-12-2011 20:01 » 

Dimka, ну это само собой... я имел в виду, что отдельно не ставил. не знал что можно добиться такого эффекта.
а ссылка на папки SDK после удаления последней где могут остаться?
в настройках путей студии, и в переменных окружения?
я думал, что уж они то за собой чистят... по крайней мере те, что написанные майкрософтом...
« Последнее редактирование: 12-12-2011 20:15 от Ochkarik » Записан

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

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

« Ответ #39 : 13-12-2011 06:32 » 

Цитата
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая:
А что не так с DriverUnload? Чего там не хватает?
Записан

Ищущий да обрящет
Ochkarik
Модератор

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

« Ответ #40 : 13-12-2011 08:03 » 

Цитата
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая:
А что не так с DriverUnload? Чего там не хватает?
Цитата
там объект устройства и ссылка не убивается
Записан

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

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

« Ответ #41 : 13-12-2011 08:54 » 

Цитата: Ochkarik
а ссылка на папки SDK после удаления последней где могут остаться?
Да где угодно. Не одна ж VS на него может ссылаться. И другие компиляторы, и среды разработки. И отдельно устанавливаемые библиотеки для разработчиков.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Fredwriter
Постоялец

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

« Ответ #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
Модератор

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

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

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

« Ответ #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
Модератор

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

« Ответ #45 : 13-12-2011 11:36 » 

вот это "sizeof(65533)" - что это, и зачем?
да, эта строка создает объект и возвращает указатель на созданный объект в deviceObject.
и...?
Записан

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

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

« Ответ #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
Модератор

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

« Ответ #47 : 13-12-2011 13:03 » 

это я вашего вопроса не понял) в чем вопрос то был?
Записан

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

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

« Ответ #48 : 13-12-2011 13:08 » 

Вы, спросили:
Цитата
только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет?
Я выложил часть кода, где создаётся объект устройства, и спросил то или не то?
Записан

Ищущий да обрящет
Ochkarik
Модератор

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

« Ответ #49 : 13-12-2011 13:22 » 

все. но более полный ответ был бы
DRIVER_OBJECT
Цитата
PDEVICE_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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

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

« Ответ #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
Модератор

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

« Ответ #51 : 13-12-2011 13:40 » 

можно)
Записан

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

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

« Ответ #52 : 14-12-2011 08:02 » 

Подскажите пожалуйста, как правильнее написать программку, которая будет использовать устройство, что там должно быть и как грамотнее это расположить.
Понятно, что там должны быть такие Api, как CreateFile ReadFile, WriteFile, DeviceIoControl
Я здесь нашел их описания и примеры использования:
http://vsokovikov.narod.ru/New_MSDN_API/Device_io/calling_deviceiocontrol.htm
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm
http://vsokovikov.narod.ru/New_MSDN_API/device_io.htm

Записан

Ищущий да обрящет
Ochkarik
Модератор

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

« Ответ #53 : 14-12-2011 08:07 » 

ссылки - все не то.
определитесь сначала, что вы хотите получить. в зависимости от этого и пишутся все программы)
Записан

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

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

« Ответ #54 : 14-12-2011 10:00 » 

Я хочу, одну, как кажется простую вещь, нужно, что-бы при использовании какой-нибудь MajorFunction, имеющейся в драйвере, выводилось на экран сообщение. То есть при какой-то операции ввода вывода -  как-бы демонстрация возможной функциональности драйвера. Драйвер который объясняет как он ведет себя при определенном I/O запросе. Там только 4 MajorFunction, и еще есть функция GetMessage. Вот она и отвечает за вывод сообщений при каком-нибудь I/O запросе. Вот собственно что мне нужно. GetMessage кажется немного переделать нужно, и написать программку, которая будет дергать драйвер.
Цитата
Определитесь сначала, что вы хотите получить. В зависимости от этого и пишутся все программы)

Я знаю в зависимости от чего пишутся программы, просто я думал, что не только я знаю, что я хочу получить.
« Последнее редактирование: 14-12-2011 10:40 от Fredwriter » Записан

Ищущий да обрящет
Ochkarik
Модератор

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

« Ответ #55 : 14-12-2011 10:58 » 

по сути - да, все верно. так и надо сделать!
Записан

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

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

« Ответ #56 : 14-12-2011 12:10 » 

Я вот и прошу совета, как лучше это сделать? Что и как написать? Можете меня проинструктировать?
Записан

Ищущий да обрящет
Fredwriter
Постоялец

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

« Ответ #57 : 14-12-2011 14:39 » 

что я вкладываю в слово "проинструктировать": с программистской точки зрения как-нибудь мне объяснить, что-бы я таки написал данную прогу и защитил 20-го числа курсовой.
Записан

Ищущий да обрящет
Ochkarik
Модератор

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

« Ответ #58 : 14-12-2011 14:58 » 

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

далее, для начала вам надо заполнить в драйвере свои обработчики MJ_CREATE/MJ_CLOSE которые отвечают за обработку вызовов CreateFIle/CloseHandle из приложения,
и например MJ_READ/MJ_WRITE которые отвечают за вызов ReadFile/WriteFile из приложения.
далее вставить в них, то что вам надо. пусть это будет тот же мессадж. или отладочное сообщение.
далее из написанного приложения - открыть драйвер по символической ссылке и чего нибудь в него записать и закрыть, отслеживая дейсвия по мессаджам в журнале(или отладочным сообщениям в DbgView)

как-то так)
Записан

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

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

« Ответ #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 » Записан

Ищущий да обрящет
Страниц: 1 [2] 3 4  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines