Программирование драйверов Windows


Использование диагностических callback-функций


Диагностические обратные вызовы являются процедурами драйвера, который тот предлагает для вызова в моменты начала фатальных сбоев системы. Эти процедуры предлагают удобный способ захвата отладочной информации во время сбоя. Кроме того, они могут быть использованы для того, чтобы перевести аппаратуру в определенное состояние перед тем, как система окончательно "рухнет". Для использования диагностических обратных вызовов нужно выполнить следующее.

  1. В процедуре DriverEntry необходимо выполнить вызов функции KeInitializeCallbackRecord

    для выполнения настройки структуры KBUGCHECK_CALLBACK_RECORD. Место для хранения этой закрытой структуры должно быть выделено в нестраничном пуле (причем должно содержаться в не прикосновенности до момента ее де-регистрации, выполняемой при помощи функции KeDeregisterBugCheckCallback в процедуре Unload данного драйвера).

  2. В DriverEntry необходимо выполнить вызов KeRegisterBugCheckCallback

    для подключения драйвера к механизму уведомления об ошибочных ситуациях. Аргументами этого вызова будет указатель на структуру типа KBUGCHECK_CALLBACK_RECORD, адрес предоставляемой драйвером callback-функции, адрес и размер предоставляемого драйвером буфера и строка, которая будет использована для идентификации буфера. Место для буфера должно быть выделено в нестраничном пуле (причем также должно содержаться в неприкосновенности до момента вызова функции KeDeregisterBugCheckCallback).

  3. В том случае, если была обнаружена ошибка, система выполняет вызов зарегистрированной в п. 2 callback-функции, которой будет передан адрес буфера и его размер. Работа вызванной функции состоит в том, что она должна заполнить предоставленный буфер информацией, которую сочтет необходимой, и которая не смогла бы иным образом найти свое отражение в crash dump файле, например, внутреннее содержимое регистров обслуживаемого устройства.
  4. При анализе crash dump файла при помощи WinDbg эту информацию можно вывести на экран, если воспользоваться командой !bugdump.

Существуют некоторые ограничения на действия, разрешенные регистрируемой callback-функции. Во время работы она не может получать какие-либо системные ресурсы (например, память). Она также не должна использовать объекты синхронизации. Однако разрешено делать вызовы процедур ядра, которые не нарушают указанных ограничений, и вызовы процедур HAL уровня, например, для того, чтобы получить доступ к регистрам устройства.




Начало  Назад  Вперед