> 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.
> if ( ! NT_SUCCESS(m_ConstructorStatus) ) {
> //Ошибка в создании объекта устройства
> return;
> }
> //Запомнить номер драйвера
> m_Unit = Unit;
> //Инициализация устройства нижнего уровня. В роли устройства нижнего уровня в нашем
> //драйвере выступает PDO. Но в случае стека драйверов в качестве устройства нижнего
> //уровня может выступать объект устройства другого драйвера.
> m_Lower.Initialize(this, Pdo);
> // Установить объект нижнего уровня для нашего драйвера.
> SetLowerDevice(&m_Lower);
> // Установить стандартную политику PnP для данного устройства.
> SetPnpPolicy();
>}
Порядок вызова методов m_Lower.Initialize(this, Pdo), SetLowerDevice(&m_Lower) и SetPnpPolicy() является жизненно важным. Его нарушение может вызвать серьезные сбои в работе драйвера. Не стоит редактировать текст конструктора, сгенерированный DriverWizard.
Деструктор объекта устройства не выполняет никаких действий. Но для сложных драйверов, когда создаются системные потоки, разнообразные объекты синхронизации и выделяется память, то все созданные объекты должны быть уничтожены в деструкторе. В нашем простейшем случае не стоит вносить изменения в текст деструктора.