Организация ввода-вывода. Часть 2. Драйверы для WINDOWS NT. Рощин А.В. - 108 стр.

UptoLike

Составители: 

108
Получить указатель на данные пользователя в системном контексте
CurrentAddress = MmGetSystemAddressForMdl( Irp->MdlAddress
);
Irp->IoStatus.Information = irpSp->Parameters.Read.Length;
switch (irpSp->MajorFunction)
{
case IRP_MJ_READ:
Чтение
RtlMoveMemory(
CurrentAddress,
diskExtension->DiskImage + irpSp-
>Parameters.Read.ByteOffset.LowPart,
irpSp->Parameters.Read.Length);
break;
case IRP_MJ_DEVICE_CONTROL:
Проверка. Всегда все в порядке
break;
case IRP_MJ_WRITE:
Запись
RtlMoveMemory(
diskExtension->DiskImage + irpSp-
>Parameters.Read.ByteOffset.LowPart,
CurrentAddress, irpSp->Parameters.Read.Length);
break;
default:
Что-то не поддерживаемое
Irp->IoStatus.Information = 0;
break;
}
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
VOID
RamDiskUnloadDriver(
IN PDRIVER_OBJECT DriverObject
)
Эта процедура вызывается системой для выгрузки драйвера.
Требуется освободить все занятые ресурсы
Аргументы:
     … Получить указатель на данные пользователя в системном контексте

      CurrentAddress = MmGetSystemAddressForMdl( Irp->MdlAddress
);

      Irp->IoStatus.Information = irpSp->Parameters.Read.Length;

    switch (irpSp->MajorFunction)
    {
    case IRP_MJ_READ:
   … Чтение
         RtlMoveMemory(
             CurrentAddress,
             diskExtension->DiskImage + irpSp-
>Parameters.Read.ByteOffset.LowPart,
             irpSp->Parameters.Read.Length);
         break;

      case IRP_MJ_DEVICE_CONTROL:
        … Проверка. Всегда все в порядке
          break;

    case IRP_MJ_WRITE:
   … Запись
         RtlMoveMemory(
             diskExtension->DiskImage + irpSp-
>Parameters.Read.ByteOffset.LowPart,
             CurrentAddress, irpSp->Parameters.Read.Length);
         break;

      default:
     … Что-то не поддерживаемое
           Irp->IoStatus.Information = 0;
           break;
      }

      Irp->IoStatus.Status = STATUS_SUCCESS;
      IoCompleteRequest( Irp, IO_NO_INCREMENT );

      return STATUS_SUCCESS;
}

VOID
RamDiskUnloadDriver(
     IN PDRIVER_OBJECT DriverObject
     )

        Эта процедура вызывается системой для выгрузки драйвера.
Требуется освободить все занятые ресурсы
        Аргументы:


                                        108