>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";