Видимо в продолжение спин-блокировок...

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 4 мар 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Решил написать простейший виртуальный диск. То есть не хотел заморачиваться в использовании спин-блокировок и подобного. Хотел все возложить на ZwWriteFile. Написал вот такую функцию-обработчик:
    Код (Text):
    1. NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    2. {
    3.     PIO_STACK_LOCATION      io_stack;
    4.     PSECUREDISK_EXTENSION           sDevice_extension = (MY_DISK_EXTENSION) DeviceObject -> DeviceExtension;
    5.     io_stack = IoGetCurrentIrpStackLocation(Irp);
    6.  
    7.     if (io_stack->Parameters.Write.Length == 0)
    8.     {
    9.         Irp->IoStatus.Status = STATUS_SUCCESS;
    10.         Irp->IoStatus.Information = 0;
    11.         IoCompleteRequest(Irp, IO_NO_INCREMENT);
    12.         return STATUS_SUCCESS;
    13.     }
    14.  
    15.     if ((io_stack->Parameters.Write.ByteOffset.QuadPart + io_stack->Parameters.Write.Length) > sDevice_extension->file_size.QuadPart)
    16.     {
    17.         DbgPrint("My SUPER-Driver: Error in Write_IRPhandler equal\n");
    18.         Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    19.         Irp->IoStatus.Information = 0;
    20.     }
    21.  
    22.     ZwWriteFile( sDevice_extension->file_handle, NULL, NULL, NULL, &Irp->IoStatus,
    23.         (PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL );
    24.     DbgPrint("Write_IRPhandler:  len = %d, bo = %d, st = %d\n", io_stack->Parameters.Write.Length, io_stack->Parameters.Write.ByteOffset.QuadPart, Irp->IoStatus.Status);
    25.  
    26.     IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) );
    27.     return STATUS_SUCCESS;
    28. }
    Дебагер честно выводит:
    Write_IRPhandler: len = 0, bo = Различные_корректные_значения, st = 0
    Немного меняю код:
    Код (Text):
    1. NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    2. {
    3.     PIO_STACK_LOCATION      io_stack;
    4.     ULONG                   Length;
    5.     LARGE_INTEGER           ByteOffset;
    6.     PSECUREDISK_EXTENSION   sDevice_extension = (MY_DISK_EXTENSION) DeviceObject -> DeviceExtension;
    7.     io_stack = IoGetCurrentIrpStackLocation(Irp);
    8.     Length = io_stack->Parameters.Write.Length;
    9.     ByteOffset.QuadPart = io_stack->Parameters.Write.ByteOffset.QuadPart;
    10.  
    11.     if (Length == 0)
    12.     {
    13.         Irp->IoStatus.Status = STATUS_SUCCESS;
    14.         Irp->IoStatus.Information = 0;
    15.         IoCompleteRequest(Irp, IO_NO_INCREMENT);
    16.         return STATUS_SUCCESS;
    17.     }
    18.  
    19.     if ((ByteOffset.QuadPart + Length) > sDevice_extension->file_size.QuadPart)
    20.     {
    21.         DbgPrint("My SUPER-Driver: Error in Write_IRPhandler equal\n");
    22.         Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    23.         Irp->IoStatus.Information = 0;
    24.     }
    25.  
    26.     ZwWriteFile( sDevice_extension->file_handle, NULL, NULL, NULL, &Irp->IoStatus,
    27.         (PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority), Length, &ByteOffset, NULL );
    28.     DbgPrint("!!!!!!!!!!-------->>Write_IRPhandler:  len = %d, bo = %d, st = %d\n", Length, ByteOffset.QuadPart, Irp->IoStatus.Status);
    29.     IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) );
    30.     return STATUS_SUCCESS;
    31. }
    И теперь дебагер более точен:
    Write_IRPhandler: len = 512, bo = Различные_корректные_значения, st = 0

    Однако запись не происходит. Логически предполагаю, что дело в передаваемом буфере. Но почему? И как так получается, что изменяется значение длины (думаю измениться могло что угодно, просто в моем случае это длина)?
     
  2. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Прошу прощения за столь глупый вопрос - сам разобрался. Надо внимательнее читать теорию..