Александр Тарво - Использование NuMega DriverStudio для написания WDM-драйверов

Здесь есть возможность читать онлайн «Александр Тарво - Использование NuMega DriverStudio для написания WDM-драйверов» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программы, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Использование NuMega DriverStudio для написания WDM-драйверов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Использование NuMega DriverStudio для написания WDM-драйверов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Использование NuMega DriverStudio для написания WDM-драйверов — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Использование NuMega DriverStudio для написания WDM-драйверов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

В классе KPnPDevice механизм отмены запроса реализован при помощи метода CancelQueuedIrp.

VOID XDSPdrvDevice::CancelQueuedIrp(KIrp I) {

//Получаем очередь IRP-пакетов этого устройства.

KDeviceQueue dq(DeviceQueue());

//Проверить, является ли IRP, который должен быть отменен, тем пакетом, который должен

//быть обработан.

if ( (PIRP)I == CurrentIrp() ) {

//Уничтожить пакет.

CurrentIrp() = NULL;

//При вызове метода CancelQueuedIrp устанавливается глобальная системная

//защелка (SpinLock). Теперь следует ее сбросить.

CancelSpinLock::Release(I.CancelIrql());

t << "IRP canceled " << I << EOL;

I.Information() = 0;

I.Status() = STATUS_CANCELLED;

//Обработать следующий пакет.

PnpNextIrp(I);

}

//Удалить из очереди пакет. Если это удалось, то функция вернет true.

else if (dq.RemoveSpecificEntry(I)) {

// Это удалось. Теперь сбрасываем защелку.

CancelSpinLock::Release(I.CancelIrql());

t << "IRP canceled " << I << EOL;

I.Information() = 0;

I.PnpComplete(this, STATUS_CANCELLED);

} else {

//Неудача. Сбрасываем защелку.

CancelSpinLock::Release(I.CancelIrql());

}

}

Меотод StartIo является виртуальной функцией. Она вызывается системой, когда драйвер готов обрабатывать следующий запрос в очереди. Это чрезвычайно важная функция: она является диспетчером всех запросов на ввод-вывод, поступаемых к нашему драйверу. В функции вызываются обработчики запросов на чтение, запись а также обработчики вызовов IOCTL. К счастью, умный DriverWizard генерирует скелет функции автоматически и вносить изменения в нее в нашем простом случае не требуется. В принципе, в эту функцию можно ввести какие-то дополнительные проверки IRP-пакетов.

VOID XDSPdrvDevice::StartIo(KIrp I) {

t << "Entering StartIo, " << I << EOL;

// Здесь надо проверить, отменен этот запрос или нет. Это производится при помощи вызова

//метода TestAndSetCancelRoutine. Также этот метод устанавливает новую функцию отмены

//пакетов, если это необходимо. Адрес новой функции передается вторым параметром. Если

//он равен NULL,то вызывается старая функция. Если пакет должен быть отменен, функция

//вернет FALSE.

if (!I.TestAndSetCancelRoutine(LinkTo(CancelQueuedIrp), NULL, CurrentIrp())) {

//Пакет отменен.

return;

}

// Начать обработку запроса.

// Выбрать необходимую функцию

switch (I.MajorFunction()) {

case IRP_MJ_READ:

//Чтение

SerialRead(I);

break;

case IRP_MJ_WRITE:

//Запись

SerialWrite(I);

break;

case IRP_MJ_DEVICE_CONTROL:

//IOCTL

switch (I.IoctlCode()) {

default:

//Мы обрабатываем пакет, который не должен быть обработан.

//Поэтому просто выходим.

ASSERT(FALSE);

break;

}

break;

default:

// Драйвер занес в очередь какой-то непонятный пакет,

//он не должен быть обработан.

ASSERT(FALSE);

PnpNextIrp(I);

break;

}

}

Метод Create вызывается, когда пользовательское приложение пытается установить связь с драйвером при помощи вызова API CreateFile(). Обычно этот запрос обрабатывается в нашем объекте устройства и нет смысла пересылать запрос устройству нижнего уровня.

NTSTATUS XDSPdrvDevice::Create(KIrp I) {

NTSTATUS status;

t << "Entering XDSPdrvDevice::Create, " << I << EOL;

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

//приложением связи с устройством.

status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

t << "XDSPdrvDevice::Create Status " << (ULONG)status << EOL;

return status;

}

Аналогично метод Close вызывается при разрыве связи приложения с драйвером.

NTSTATUS XDSPdrvDevice::Close(KIrp I) {

NTSTATUS status;

t << "Entering XDSPdrvDevice::Close, " << I << EOL;

//Здесь можно вставить код пользователя, который должен быть вызван при разрыве

//приложением связи с устройством.

status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

t << "XDSPdrvDevice::Close Status " << (ULONG)status << EOL;

return status;

}

В этих методах можно ввести проверки каких-либо условий. Отвлечемся на секунду от нашей PCI-карточки и обратим внимание на другой хороший пример — тот же программатор микроконтроллеров. Предположим, пользователь подключил программатор к компьютеру и начинает записывать в память микроконтроллера разработанную им программу. В принципе, ничто не помешает ему открыть еще одну копию программы и писать в ту же микросхему что-то совсем другое. В результате, в эту несчастную микросхему запишется невообразимая каша. Для того, чтобы избежать такой ситуации, в объекте драйвера надо установить флаг, который будет показывать, свободно ли это устройство, или оно уже кем-то используется. Это может выглядеть так:

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Использование NuMega DriverStudio для написания WDM-драйверов»

Представляем Вашему вниманию похожие книги на «Использование NuMega DriverStudio для написания WDM-драйверов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Использование NuMega DriverStudio для написания WDM-драйверов»

Обсуждение, отзывы о книге «Использование NuMega DriverStudio для написания WDM-драйверов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x