Использование NuMega DriverStudio для написания WDM-драйверов | страница 29



>{

> //Далее выводится трассировочное сообщение, информирующее о вызове метода DriverEntry:

> t << "In DriverEntry\n";

> //После этого драйвер создает объект Params класса KRegistryKey и считывает данные из

> //реестра для этого драйвера:

> KRegistryKey Params(RegistryPath, L"Parameters");

> //Далее производится проверка на успех:

> if ( NT_SUCCESS(Params.LastError()) ) {

>  //Текст, заключенный в макрос препроцессора DBG будет откомпилирован только в отладочной версии

>  //драйвера.

>#if DBG

>  ULONG bBreakOnEntry = FALSE;

>  // Читается значение переменной BreakOnEntry реестра:

>  Params.QueryValue(L"BreakOnEntry", &bBreakOnEntry);

>  // Если она принимает значение true,то инициировать точку останова в отладчике.

>  if (bBreakOnEntry) DbgBreakPoint();

>#endif

>  //Загрузить остальные параметры реестра.

>  LoadRegistryParameters(Params);

> }

> m_Unit = 0;

> //Вернуть успех

> return STATUS_SUCCESS;

>}

Метод LoadRegistryParameters зaгружает из реестра все остальные параметры, необходимые для драйвера. Впрочем, в нашем драйвере таковых нет, и поэтому функция не выполняет никаких полезных действий (просто загружает значение переменной m_bBreakOnEntry).

>void XDSPdrv::LoadRegistryParameters(KRegistryKey &Params) {

> m_bBreakOnEntry = FALSE;

> Params.QueryValue(L"BreakOnEntry", &m_bBreakOnEntry);

> t << "m_bBreakOnEntry loaded from registry, resulting value: [" << m_bBreakOnEntry << "]\n";

>}

На этом заканчивается секция инициализации драйвера. Далее следует метод AddDevice. Он вызывается, когда система обнаруживает устройство, за которое отвечает драйвер (обычно это происходит при загрузке драйвера). В метод ситема передает указатель на физический объект устройства (Physical Device Object, PDO). Этот объект представляет собой некий блок информации о физическом устройстве, который используется ОС. Данный метод создает объект устройства XDSPDevice. С точки зрения системы, создается функциональный объект устройства (Functional Device Object, FDO).

>NTSTATUS XDSPdrv::AddDevice(PDEVICE_OBJECT Pdo) {

> t << "AddDevice called\n";

> //Здесь вызывается конструктор класса XDSPDevice.

> XDSPdrvDevice* pDevice = new(

>  static_cast(KUnitizedName(L"XDSPdrvDevice", m_Unit)),

>  FILE_DEVICE_UNKNOWN,

>  static_cast(KUnitizedName(L"XDSPdrvDevice", m_Unit)),

>  0,

>  DO_DIRECT_IO)

> XDSPDevice(Pdo, m_Unit);

> //m_Unit – количество таких устройств в системе.

> if (pDevice == NULL) //Не удалось создать объект устройства. Похоже, произошла какая-то ошибка.

> {