Решил написать простейший виртуальный диск. То есть не хотел заморачиваться в использовании спин-блокировок и подобного. Хотел все возложить на ZwWriteFile. Написал вот такую функцию-обработчик: Код (Text): NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION io_stack; PSECUREDISK_EXTENSION sDevice_extension = (MY_DISK_EXTENSION) DeviceObject -> DeviceExtension; io_stack = IoGetCurrentIrpStackLocation(Irp); if (io_stack->Parameters.Write.Length == 0) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } if ((io_stack->Parameters.Write.ByteOffset.QuadPart + io_stack->Parameters.Write.Length) > sDevice_extension->file_size.QuadPart) { DbgPrint("My SUPER-Driver: Error in Write_IRPhandler equal\n"); Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; Irp->IoStatus.Information = 0; } ZwWriteFile( sDevice_extension->file_handle, NULL, NULL, NULL, &Irp->IoStatus, (PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); DbgPrint("Write_IRPhandler: len = %d, bo = %d, st = %d\n", io_stack->Parameters.Write.Length, io_stack->Parameters.Write.ByteOffset.QuadPart, Irp->IoStatus.Status); IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) ); return STATUS_SUCCESS; } Дебагер честно выводит: Write_IRPhandler: len = 0, bo = Различные_корректные_значения, st = 0 Немного меняю код: Код (Text): NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION io_stack; ULONG Length; LARGE_INTEGER ByteOffset; PSECUREDISK_EXTENSION sDevice_extension = (MY_DISK_EXTENSION) DeviceObject -> DeviceExtension; io_stack = IoGetCurrentIrpStackLocation(Irp); Length = io_stack->Parameters.Write.Length; ByteOffset.QuadPart = io_stack->Parameters.Write.ByteOffset.QuadPart; if (Length == 0) { Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } if ((ByteOffset.QuadPart + Length) > sDevice_extension->file_size.QuadPart) { DbgPrint("My SUPER-Driver: Error in Write_IRPhandler equal\n"); Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; Irp->IoStatus.Information = 0; } ZwWriteFile( sDevice_extension->file_handle, NULL, NULL, NULL, &Irp->IoStatus, (PUCHAR) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority), Length, &ByteOffset, NULL ); DbgPrint("!!!!!!!!!!-------->>Write_IRPhandler: len = %d, bo = %d, st = %d\n", Length, ByteOffset.QuadPart, Irp->IoStatus.Status); IoCompleteRequest( Irp, (CCHAR) (NT_SUCCESS(Irp->IoStatus.Status) ? IO_DISK_INCREMENT : IO_NO_INCREMENT) ); return STATUS_SUCCESS; } И теперь дебагер более точен: Write_IRPhandler: len = 512, bo = Различные_корректные_значения, st = 0 Однако запись не происходит. Логически предполагаю, что дело в передаваемом буфере. Но почему? И как так получается, что изменяется значение длины (думаю измениться могло что угодно, просто в моем случае это длина)?