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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

NTSTATUS MyPrettyDevice::OnStartDevice(KIrp I) {

NTSTATUS status = STATUS_SUCCESS;

I.Information() = 0;

. . . //Какая-то инициализация – может, PCI,

//может – какое-то другое оборудование…

//Устройство только что заработало – конечно, оно свободно…

m_AlreadyUsed = false;

return status;

}

NTSTATUS MyPrettyDevice::Create(KIrp I) {

NTSTATUS status;

if (m_AlreadyUsed)

//Это устройство уже используется кем-то. Нельзя допустить его использование

//несколькими приложениями одновременно.

//Возвращаем ошибку.

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

else {

//Это устройство свободно. Устанавливаем флаг и возвращаем успех.

m_AlreadyUsed = false;

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

}

return status;

}

NTSTATUS MyPrettyDevice::Close(KIrp I) {

NTSTATUS status;

//Пользователь закончил работу с устройством, теперь оно свободно.

//Сбрасываем флаг.

m_AlreadyUsed = false;

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

return status;

}

Функция SerialRead вызывается, когда драйвер получает запрос на чтение. Это важная функция. Т.к. мы хотим, чтобы приложение пользователя могло читать и писать в память микросхемы, то именно сюда необходимо добавлять наш код. Все фрагменты кода, добавленные программистом, будут выделены жирным шрифтом:

//This code was added by the programmer

Фактически в данном методе мы должны прочитать содержимое памяти и передать его приложению пользователя. Но тут самое время вспомнить, что плата обменивается с памятью 4– байтными словами. Поэтому для операций с памятью следует применять метод ind/outd.

void XDSPdrvDevice::SerialRead(KIrp I) {

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

NTSTATUS status = STATUS_SUCCESS;

//Здесь мы получаем буфер пользователя. Он передается через Irp.

KMemory Mem(I.Mdl());

PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace();

//Теперь pBuffer – указатель на буфер пользователя.

//Здесь мы получаем число 4-байтных слов, которое должно быть прочитано. Оно также

//передается через Irp, как запрашиваемое количество байт для чтения.

ULONG dwTotalSize = I.ReadSize(CURRENT);

ULONG dwBytesRead = dwTotalSize;

//Здесь мы читаем заданное число байт из памяти устройства. Плата XDSP680 обменивается

//с памятью 4-байтными словами.Начальный адрес – 0, dwTotalSize 4-байтных слов будут

//прочитаны в буфер pBuffer.

m_MainMem.ind(0,(ULONG*)pBuffer,dwTotalSize);

//Возвращаем количество прочитанных слов

I.Information() = dwBytesRead;

I.Status() = status;

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

PnpNextIrp(I);

}

Метод SerialWrite работает практически так же, только он записывает данные в память устройства, а не считывает их.

void XDSPdrvDevice::SerialWrite(KIrp I) {

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

NTSTATUS status = STATUS_SUCCESS;

KMemory Mem(I.Mdl());

PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace();

ULONG dwTotalSize = I.WriteSize(CURRENT);

ULONG dwBytesSent = dwTotalSize;

m_MainMem.outd(0,(ULONG*)pBuffer,dwTotalSize);

I.Information() = dwBytesSent;

I.Status() = status;

PnpNextIrp(I);

}

Как мы упоминали ранее, для большинства драйверов устройств недостаточно функций чтения и записи. Мало-мальски сложное устройство требует еще и множества других операций: получить состояние, получить информацию об устройстве, как-то отконфигурировать его. Для выполнения этих задач служат функции управления вводом-выводом, IO Control; сокращенно — IOCTL. IOCTL предоставляет программисту возможность разработать практически неограниченное количество различных функций управления устройством.

И драйвер, и приложение пользователя различают, какую функцию управления устройством вызвать, при помощи IOCTL-кодов. Такой код представляет собой обыкновенное 32-разрядное число. Для удобства ему директивой #define задают какое-то понятное имя. Например, в нашем случае зададим IOCTL-код, при получении которого драйвер будет возвращать количество памяти "на борту" PCI-устройства.

#define XDSPDRV_IOCTL_GETMEMSIZE 0x800

Если при чтении драйверу посылается IRP-пакет со старшим кодом функции IRP_MJ_READ, при записи — IRP_MJ_WRITE, то при вызове функции DeviceIOControl для нашего устройства драйвер получает пакет со старшим кодом IRP_MJ_IOCONTROL и младшим — код самой IOCTL-функции. Метод DeviceControl вызывается при получении драйвером IRP со старшим кодом IRP_MJ_DEVICE_CONTROL. Она действует подобно методу StartIo. В зависимости от кода IOCTL производится вызов соответствующей функции.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x