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



>VOID XDSPdrvDevice::Invalidate() {

> //Вызвать метод Invalidate для диапазона адресов памяти.

> m_MainMem.Invalidate();

>}

Далее следует виртуальная функция OnStartDevice. Она вызывается при приходе IRP– пакета со старшим кодом IRP_MJ_PNP и кодом подфункции IRP_MN_START_DEVICE. Обычно это происходит при старте драйвера после выполнения всех необходимых проверок и инициализаций. В этой функции драйвер инициализирует физическое устройство и приводит его в рабочее состояние. Также здесь драйвер получает список ресурсов, которые имеются в устройстве. На основе этого списка ресурсов выполняется их инициалиция. Хотя мы не вносим изменений в данную функцию, но нельзя не отметить ее огромную важность. Именно в данной функции выполняется инициализация устройства и получение списка его ресурсов. По другому мы их получить никак не можем, т.к. имеем дело с PnP устройством, для которого система распределяет ресурсы самостоятельно.

>NTSTATUS XDSPdrvDevice::OnStartDevice(KIrp I) {

> t << "Entering XDSPdrvDevice::OnStartDevice\n";

> NTSTATUS status = STATUS_SUCCESS; I.Information() = 0;

> //Здесь драйвер получает список ресурсов устройства

> PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources();

> PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources();

> // Наше устройство является PCI – карточкой и в своем конфигурационном поле содержит

> //базовые адреса диапазонов памяти и портов ввода-вывода. Получаем эти данные

> KPciConfiguration PciConfig(m_Lower.TopOfStack());

> // Инициализируем каждый диапазон отображения адресов. Теперь, после инициализации,

> //базовый адрес отображенного диапазона в виртуальном адресном пространстве

> //процессора может быть получен при помощи вызова метода Base(). Физический адрес на

> //шине адреса ЦП – при помощи CpuPhysicalAddress().

> status = m_MainMem.Initialize(pResListTranslated, pResListRaw, PciConfig.BaseAddressIndexToOrdinal(0));

> if (!NT_SUCCESS(status)) {

>  //Неудача при инициализации области памяти

>  Invalidate();

>  return status;

> }

> //Сюда можно добавить код, выполняющий необходимую инициализацию, специфичную для

> //этого устройства

> return status;

>}

Виртуальная функция OnStopDevice вызывается при остановке устройства. В этом случае система посылает драйверу IRP с старшим кодом IRP_MJ_PNP и кодом подфункции IRP_MN_STOP_DEVICE. Драйвер должен осободить все используемые ресурсы.

>NTSTATUS XDSPdrvDevice::OnStopDevice(KIrp I) {

> NTSTATUS status = STATUS_SUCCESS;

> t << "Entering XDSPdrvDevice::OnStopDevice\n";