>{
> //Далее выводится трассировочное сообщение, информирующее о вызове метода 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) //Не удалось создать объект устройства. Похоже, произошла какая-то ошибка.
> {