Поделиться через


функция обратного вызова DRIVER_REINITIALIZE (ntddk.h)

Подпрограмма повторной инициализации продолжает инициализацию драйвера и устройства после возврата процедуры DriverEntry драйвера.

Синтаксис

DRIVER_REINITIALIZE DriverReinitialize;

void DriverReinitialize(
  [in]           _DRIVER_OBJECT *DriverObject,
  [in, optional] PVOID Context,
  [in]           ULONG Count
)
{...}

Параметры

[in] DriverObject

Указатель на структуру DRIVER_OBJECT , предоставленный вызывающим. Это объект драйвера драйвера.

[in, optional] Context

Предоставленный вызывающим объектом указатель на контекстные сведения, указанные в предыдущем вызове IoRegisterDriverReinitialization или IoRegisterBootDriverReinitialization.

[in] Count

Указанное вызывающим объектом значение, представляющее количество вызовов подпрограммы повторной инициализации , включая текущий вызов.

Возвращаемое значение

None

Remarks

Чтобы поставить в очередь подпрограмму повторной инициализации для выполнения, подпрограмма DriverEntry драйвера должна вызвать ioRegisterDriverReinitialization или IoRegisterBootDriverReinitialization. Подпрограмма повторной инициализации также может вызывать саму функцию IoRegisterDriverReinitialization , что приводит к повторной постановке подпрограммы в очередь. Такая повторная постановка в очередь может выполняться несколько раз, а параметр count подпрограммы указывает количество вызовов. Первый вызов IoRegisterDriverReinitialization должен быть выполнен из DriverEntry, а DriverEntry должен возвращать STATUS_SUCCESS.

Дополнительные сведения о реализации подпрограммы повторной инициализации см. в статье Создание подпрограммы повторной инициализации.

Примеры

Чтобы определить подпрограмму повторного инициализации обратного вызова, необходимо сначала предоставить объявление функции, определяющее тип определяемой процедуры обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализу кода для драйверов, средству проверки статических драйверов (SDV) и другим средствам проверки находить ошибки, и это требование для написания драйверов для операционной системы Windows.

Например, чтобы определить подпрограмму повторной инициализации обратного вызова с именем MyReinitialize, используйте тип DRIVER_REINITIALIZE, как показано в следующем примере кода:

DRIVER_REINITIALIZE MyReinitialize;

Затем реализуйте процедуру обратного вызова следующим образом:

_Use_decl_annotations_
VOID
  MyReinitialize(
    struct _DRIVER_OBJECT  *DriverObject,
    PVOID  Context,
    ULONG  Count
    )
  {
      // Function body
  }

Тип функции DRIVER_REINITIALIZE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, не забудьте добавить заметку _Use_decl_annotations_ в определение функции. Заметка _Use_decl_annotations_ гарантирует, что будут использоваться заметки, применяемые к типу функции DRIVER_REINITIALIZE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в статье Объявление функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_см. в статье Поведение функции с заметками.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть ntddk.h (включая Ntddk.h, Ntifs.h)
IRQL Вызывается на PASSIVE_LEVEL.