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) //Не удалось создать объект устройства. Похоже, произошла какая-то ошибка.
{
t << "Error creating device XDSPdrvDevice" << (ULONG) m_Unit << EOL;
return STATUS_INSUFFICIENT_RESOURCES;
}
//Получить статус создания устройства.
NTSTATUS status = pDevice->ConstructorStatus();
if ( !NT_SUCCESS(status) ) //Похоже, устройство создано, но неудачно; произошла ошибка.
{
t << "Error constructing device XDSPdrvDevice" << (ULONG) m_Unit << " status " << (ULONG) status << EOL;
delete pDevice;
} else {
m_Unit++; //Устройство создано удачно
}
//Вернуть статус устройства.
return status;
}
Все. Работа объекта драйвера на этом окончена. Как мы можем видеть, объект драйвера практически не выполняет каких-либо функций управления аппаратурой, но он жизненно необходим для правильной инициализации драйвера. В нашем случае НЕ ТРЕБУЕТСЯ вносить какие-либо изменения в текст, сформированный DriverWizard.
Основным классом драйвера является класс устройства. Класс устройства XDSPdrvDevice является подклассом класса KpnpDevice. Конструктор получает два параметра: указатель на PDO и номер драйвера в системе.
XDSPdrvDevice::XDSPdrvDevice(PDEVICE_OBJECT Pdo, ULONG Unit) : KPnpDevice(Pdo, NULL) {
t << "Entering XDSPdrvDevice::XDSPdrvDevice (constructor)\n";
//Здесь проверяется код ошибки, которую вернул конструктор суперкласса. В случае
//успешного создания объекта базового класса значение переменной m_ConstructorStatus
//будет NT_SUCCESS.