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



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

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