>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);
> //Возвращаем количество прочитанных слов