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

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

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

« : 19-10-2008 17:29 » 

По мере времени попробую сюда скидывать ответы на простые вопросы по драйверам WDM и DDK. FAQ/ЧаВо)
все простые вопросы  скидывайте сюда, буду отвечать по возможности... ну и модерировать.

посему, пожалуйста, постарайтесь задавать вопросы коротко, но ясно Внимание! Говорит и показывает...

Вопрос: что такое структура DEVICE_EXTENSION и почему указатель на нее содержится в структуре DEVICE_OBJECT.

Ответ:
  Данная структура предназначена для хранения любых ваших переменных, которые необходимы вам  для работы. Использовать глобальные переменные для тех же целей не всегда возможно, так как один и тот же код драйвера может обслуживать несколько одинаковых физических устройств(объектов). Это означает, что одна и та же функция в драйвере может обрабатывать запросы для нескольких однотипных устройств (например. две одинаковые звуковые PCI карточки). Для различения этих устройств в процедуре AddDevice создается два объекта-устройства, описываемые двумя структурами DEVICE_OBJECT.
  
  Одним из полей структуры DEVICE_OBJECT является  указатель на вашу пользовательскую структуру (ее и называют структурой DEVICE_EXTENSION).
Размер этой структуры вы определяете сами (сколько вам надо в разумных пределах) при создании нового объекта-устройства  в функции AddDevice, вызывая функцию IoCreateDevice() .
В дальнейшей работе указатель на ваши данные (структура DEVICE_EXTENSION) вы можете всегда получить, имея указатель на DEVICE_OBJECT (объект устройства).
  
  Определить поля и размер этой структуры - ваша задача. Ядро ничего не знает о том, что вы будете там хранить. Тип поля DevObj->DeviceObjectExtension определен как PDEVOBJ_EXTENSION. Поэтому при использовании этого поля вы должны использовать явное преобразование типа PDEVOBJ_EXTENSION к типу(структуре), объявленному вами.
Имя вашей структуры вы можете задавать любое доступное, однако для удобочитаемости кода рекомендуется добавлять в ее название  DEVICE_EXTENSION  или DEV_EXT.
  PS в WDF инфраструктуре она может иметь названия WDFCONTEXT или DEVICE_CONTEXT и т.д.. см второй параметр WdfDeviceCreate() и макросы WDF_DECLARE_CONTEXT_TYPE()/WDF_DECLARE_CONTEXT_TYPE_WITH_NAME() и т.д.

  для аналогии приведу пример из Win API: смысловым подобием DEVICE_EXTENSION является результат функции SetWindowLong()/GetWindowLong(...) в функциях обработчиках сообщений граф-интерфеса. Тут для оконной функции можно привязать некоторую пользовательскую структуру к заданному окну. Окна разные, пользовательская структура разная, а функция обработки остается одна и та же.
« Последнее редактирование: 22-06-2009 07:31 от Ochkarik » Записан

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

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

« Ответ #1 : 16-12-2008 18:32 » 

Вопрос: я скомпилировал драйвер, как мне его запустить?

Ответ:
в случае драйвера, который НЕ является драйвером-устройством аппаратной железки:
  1. написать приложение, которое его загрузит: см статью Грома на этом сайте. пишется такое приложение буквально в десять строчек.
  2. воспользоваться универсальным загрузчиком (напрмиер DriverLoader от OSR, либо утилитой из комплекта DriverStudio) - это те же 10 строчек фактически.
  3. прописать его в реестре как сервис. (это то, что делают те десять строчек, только вручную)
рекомендуется первый способ, так как в дальнейшем вам скорее всего все равно потребуется что-нибудь еще)

в случае, если драйвер является PNP драйвером, обслуживающим некую плату:
   такой драйвер запускает менеджер PnP при обнаружении соответствующего устройства.
   для его запуска вам потребуется создать Inf файл описания, соответствующий данному устройству.
   для создания этого файла можно воспользоваться утилитой из набора DDK tools - infedit (кажется, так - на работе посмотрю) либо написать его самому, воспользовавшись справкой DDK, по аналогии с примером для похожего оборудования.
« Последнее редактирование: 22-06-2009 07:32 от Ochkarik » Записан

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

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

« Ответ #2 : 04-06-2009 11:44 » 

Вопрос: DRIVER_OBJECT, указатель на объект драйвера, - первый аргумент функции DriverEntry(DRIVER_OBJECT DriverObject,...) - когда создается эта структура?

Ответ:

Объект драйвера - это совокупность структуры DRIVER_OBJECT и функций самого драйвера (со стандартным интерфейсом), адреса которых сам драйвер прописал в структуру DRIVER_OBJECT. То есть, при загрузке драйвера менеджер делает примерно следующее:
   1. загружает драйвер в память,
   2. размещает память структуры DRIVER_OBJECT,
   3. если драйвер загружается под конкретное железо(то есть, инициатор загрузки - менеджер PnP),
      тогда менеджер PnP еще инициализирует путь к ветке реестра соответствующего PnP устройства (поле DriverObject->HardwareDatabase).
Фактически - все. И конечно, менеджер вызывает функцию DriverEntry() загруженного драйвера.
А все остальное - почти все поля этой структуры DRIVER_OBJECT - заполняются самим драйвером в DriverEntry.

Например,
ваш драйвер должен обрабатывать запросы менеджера PnP? Вы должны написать функцию (например, ObrabotkaPnp(...) )обработки этих запросов и заполнить DriverObject->MajorFunction[IRP_MJ_PNP] = ObrabotkaPnp.
Драйвер пишется под железку? - напишите функцию XxxAddDevice() и заполните поле DriverObject->DriverExtension->AddDevice = XxxAddDevice.
и т.д. (это просто пример!)

Описание функции DriverEntry() http://msdn.microsoft.com/en-us/library/ms795702.aspx
Описание полей   DRIVER_OBJECT http://msdn.microsoft.com/en-us/library/dd852039.aspx
Что надо сделать при написании DriverEntry() http://msdn.microsoft.com/en-us/library/ms794742.aspx
« Последнее редактирование: 22-06-2009 07:33 от Ochkarik » Записан

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

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

« Ответ #3 : 01-09-2009 15:10 » 

Вопрос: при попытке запуска драйвера Device Manager выдает ошибку?
(Разъяснение кодов ошибок, о которых сообщает диспетчер устройств в Windows )
Ответ:

источник http://support.microsoft.com/kb/310123
дополнительно(устаревшие значения? Win95/98): http://www.usbman.com/Guides/Error%20Codes%20Explained.htm
http://www.helpwithwindows.com/windows98/troub-46.html
пока выдрал только описания(а то сам постоянно забываю). Большая часть из них, к сожалению, ничего не объясняет, но хоть так.
(потом форматну)

Устройство настроено неправильно. (Код 1)
Драйвер для этого устройства поврежден, или системе недостаточно оперативной памяти или других ресурсов. (Код 3)[/b]

Запуск этого устройства невозможен. (Код 10)
Если в сопоставленном устройству разделе реестра имеется параметр FailReasonString, его значение отображается в сообщении об ошибке. Драйвер или перечислитель размещает здесь строковое значение реестра. При отсутствии параметра FailReasonString появляется приведенное ниже сообщение об ошибке.
 
Не найдены свободные ресурсы, нужные для этого устройства. Если вы хотите использовать данное устройство, вам придется отключить одно из других устройств системы. (Код 12)
Для правильной работы этого устройства необходимо перезагрузить компьютер. (Код 14)
Не удается выявить все ресурсы, используемые устройством. (Код 16)
Переустановите драйверы для данного устройства. (Код 18)

Windows не может запустить данное устройство, поскольку сведения о его настройках (в реестре) неполны или повреждены. Для устранения этой проблемы сначала попробуйте запустить Мастер устранения неполадок. Если это не помогает, следует удалить, а затем переустановить устройство. (Код 19) [/b]
Была обнаружена проблема с реестром.
Это может произойти, когда для устройства определена более чем одна служба, произошла ошибка при открытии раздела реестра службы или не удается получить имя драйвера из раздела реестра службы.


Устройство удаляется из системы. (Код 21)
Эта ошибка означает, что Windows выполняет процесс удаления устройства. Однако устройство еще не полностью удалено.

Это устройство отключено. (Код 22)

Устройство отсутствует, работает неправильно или для него установлены не все драйверы. (Код 24)

Драйверы для этого устройства не установлены. (Код 28)

Это устройство отключено, поскольку программа, встроенная в устройство, не сообщила о необходимых ресурсах. (Код 29)

Это устройство работает неправильно, поскольку не удалось загрузить для него драйверы. (Код 31)

Драйвер (служба) для данного устройства был отключен. Альтернативный драйвер может обеспечить выполнение этой функции. (Код 32)
Запуск данного драйвера был отключен в реестре.
Windows не может определить, какие ресурсы необходимы для данного устройства. (Код 33)
Произошла ошибка в трансляторе, определяющем тип ресурсов, необходимых для данного устройства.

Windows не может определить настройки для данного устройства. Обратитесь к документации, поставляемой вместе с устройством, и используйте вкладку «Ресурсы» для настройки конфигурации. (Код 34)
Микропрограмма вашего компьютера содержит недостаточно сведений для правильной конфигурации и использования данного устройства. Для использования данного устройства обратитесь к поставщику компьютера за обновленной версией микропрограммы или BIOS. (Код 35)
Устройству требуется прерывание PCI, а оно настроено на прерывание ISA (или наоборот). Воспользуйтесь программой системной настройки компьютера для перенастройки прерываний для данного устройства. (Код 36)
Windows не может инициализировать драйвер устройства для данного оборудования. (Код 37)
Драйвер возвратил ошибку в процессе выполнения DriverEntry. Переустановить драйверы для данного устройства.

Windows не может загрузить драйвер устройства для данного оборудования, поскольку предыдущая версия драйвера устройства все еще находится в памяти. (Код 38)
Драйвер не может быть загружен, потому что загружена предыдущая версия. Перезагрузите компьютер.

Windows не может загрузить драйвер устройства для данного оборудования. Документ может быть поврежден или отсутствует. (Код 39)

Не удается получить доступ к оборудованию, поскольку сведения о его службе в реестре отсутствуют или записаны неправильно. (Код 40)
Сведения в разделе реестра службы для данного драйвера неверны. Переустановить драйверы для данного устройства.

Драйвер для этого устройства успешно загружен, но само устройство не обнаружено. (Код 41)
Эта проблема появляется в том случае, если устанавливается драйвер для устройства, которое не является устройством Plug and Play, но Windows не удается найти это устройство.

Windows не может загрузить драйвер устройства для данного оборудования, поскольку дубликат устройства уже установлен в системе. (Код 42)
Был обнаружен дубликат устройства. Эта ошибка происходит, когда драйвер шины некорректно создает два подпроцесса с одинаковыми названиями (ошибка драйвера шины) или когда устройство с серийным номером обнаружено в новом месте, прежде чем оно было удалено со старого места. Эту проблему можно решить, перезагрузив компьютер.


Работа устройства была остановлена, поскольку оно сообщило о проблемах. (Код 43)
Один из драйверов, контролирующих устройство, уведомил операционную систему, что в устройстве произошла ошибка.

Приложение или служба завершили работу данного устройства. (Код 44)

В настоящий момент данное устройство не подключено к компьютеру. (Код 45)
Эта ошибка возникает в том случае, если устройство, которое ранее было подключено к компьютеру, теперь не подключено. Для устранения этой неполадки подключите устройство к компьютеру. Данная ситуация не требует вмешательства. Данный код ошибки используется только для указания отключенного состояния устройства и не требует никаких действий по устранению ошибки. Проблема решается автоматически при подключении соответствующего устройства к компьютеру.

Если диспетчер устройств запускается с переменной окружения DEVMGR_SHOW_NONPRESENT_DEVICES, для которой задано значение 1 (что обозначает, показывать эти устройства), то все ранее присоединенные устройства (NONPRESENT) показываются в списке устройств, и им присваивается этот код ошибки.


Не удается получить доступ к данному устройству, поскольку операционная система находится в процессе завершения работы. (Код 46)
Устройство отсутствует, поскольку система завершает работу.
Данная ситуация не требует вмешательства. Устройство должно работать правильно после следующего включения компьютера.
Данный код ошибки появляется только тогда, когда включена Проверка драйверов, и все приложения уже завершили работу.


Windows не может использовать данное устройство, поскольку оно было подготовлено для безопасного удаления, но не было удалено с компьютера. (Код 47)

Программное обеспечение для данного устройства заблокировано, поскольку известно, что существуют проблемы при его работе в ОС Windows. Обратитесь к поставщику за новым драйвером. (Код 48)

Windows не может запустить устройства, поскольку системный куст слишком велик (превышает предельное значение размера реестра). (Код 49)
« Последнее редактирование: 01-09-2009 15:14 от Ochkarik » Записан

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

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

« Ответ #4 : 12-10-2009 19:04 » 

Портирование драйвера WDM на WDF (KMDF)
(это конечно не простой вопрос, но вот она ссылка))
http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/PortingToWdf.doc
и
http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Porting-WDM-Drvs-to-KMDF.ppt
« Последнее редактирование: 12-10-2009 19:14 от Ochkarik » Записан

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

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

« Ответ #5 : 23-05-2010 19:46 » 

с этим вопросом я пытался разобраться пытаясь написать корректный inf-файл, для того чтобы доступ к драйверу через IOCTL мог происходить от любого пользователя под Vista/Win7 (иначе требуются права админа)
долго искал, что же такое "HKR,,Security,,”D:P(A;;GA;;;SY)”" в секции [MyDevice.Security]. тогда так и не получилось разобраться а тут случайно на верную ссылку набрел:
http://www.microsoft.com/whdc/driver/security/drvsecure.mspx
Записан

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

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

« Ответ #6 : 24-05-2010 20:55 » 

http://blogs.technet.com/b/mark_russinovich/
Записан

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

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

« Ответ #7 : 26-08-2010 20:45 » 

все знают что означает volatile? Ага
http://alenacpp.blogspot.com/2006/04/volatile.html
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #8 : 27-08-2010 14:21 » new

все знают что означает volatile? Ага
http://alenacpp.blogspot.com/2006/04/volatile.html
Вообще-то в первом примере ошибка. Там нужен и volatile, что бы компилятор не выкинул проверку переменной в цикле, и атомарноя операция (в общем случае. хотя для примера - проверка на ноль/неноль атомарная не обязательно).
Записан
Ochkarik
Модератор

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

« Ответ #9 : 27-08-2010 15:27 » 

согласен)
Записан

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

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

« Ответ #10 : 17-05-2017 11:07 » 

отладка ядра через USB 3.0 с удаленной машины
(а так же по сети, через USB 2.0 и прочее там же)


Setting Up Kernel-Mode Debugging over a USB 3.0 Cable Manually
Setting Up Kernel-Mode Debugging over a USB 3.0 Cable in Visual Studio
ВАЖНО: нужен кабель А-А перекрестный и без питания VBus.
кабель типа А-А я видел (и даже имею) но не факт что он кросс и точно с питанием- на нем красная этикетка:
"не втыкать между двумя ПК!!!"
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines