Шифрую данные на вирт. диске. DriverObject->MajorFunction[IRP_MJ_READ] = RamDskReadWrite; DriverObject->MajorFunction[IRP_MJ_WRITE] = RamDskReadWrite; При IRP_MJ_WRITE все нормально- захожу в обработчик и шифрую.А вот IRP_MJ_READ - не вызывается при работе с данными на диске. Данные считываются(файлы с диска читаются), но в эту функцию я не попадаю, следовательно не могу дешифровать. Где косяк или я не там шифрую? NTSTATUS RamDskReadWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION irpStack; NTSTATUS status; ULONG information = 0; PUCHAR currentAddress; PDEVICE_EXTENSION devExt = DeviceObject->DeviceExtension; DBGPRINT( DBG_COMP_READ, DBG_LEVEL_VERBOSE, ("ReadWrite - IN \n" ) ); if ( devExt->DevState != WORKING ) { DBGPRINT( DBG_COMP_READ, DBG_LEVEL_WARN, ("Device not ready\n" ) ); status = STATUS_INVALID_DEVICE_STATE; COMPLETE_REQUEST( Irp, status, information ); } status = IoAcquireRemoveLock(&devExt->RemoveLock, Irp); if (!NT_SUCCESS(status)) { DBGPRINT( DBG_COMP_PNP, DBG_LEVEL_ERROR, ("Acquire RemoveLock failed\n" ) ); COMPLETE_REQUEST( Irp, status, 0 ); return status; } irpStack = IoGetCurrentIrpStackLocation(Irp); // Проверка базвого смещения и также, что длина блока делится на размер сектора нацело if (RtlLargeIntegerGreaterThan( RtlLargeIntegerAdd( irpStack->Parameters.Read.ByteOffset, RtlConvertUlongToLargeInteger(irpStack->Parameters.Read.Length)), RtlConvertUlongToLargeInteger(devExt->DiskRegInfo.DiskSize)) || (irpStack->Parameters.Read.Length & (devExt->DiskGeometry.BytesPerSector - 1))) { DBGPRINT( DBG_COMP_READ, DBG_LEVEL_ERROR, ( "Error invalid parameter\n" "ByteOffset: %x\n" "Length: %d\n" "Operation: %x\n", irpStack->Parameters.Read.ByteOffset, irpStack->Parameters.Read.Length, irpStack->MajorFunction )); status = STATUS_INVALID_PARAMETER; COMPLETE_REQUEST( Irp, status, information ); IoReleaseRemoveLock(&devExt->RemoveLock, Irp); return status; } // Получим указатель на отображаемый буфер пользователя ASSERT ( Irp->MdlAddress != NULL ); currentAddress = MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority ); // Проверим удалаось ли сделать меппинг if ( currentAddress == NULL ) { status = STATUS_INSUFFICIENT_RESOURCES; COMPLETE_REQUEST( Irp, status, information ); IoReleaseRemoveLock(&devExt->RemoveLock, Irp); DBGPRINT( DBG_COMP_READ, DBG_LEVEL_ERROR, ("Unable to get the system-space virtual address\n" ) ); return status; } DBGPRINT( DBG_COMP_READ, DBG_LEVEL_VERBOSE, ( "Irp of Request: %x\n" "Vmem Address of Transfer: %x - %x\n" "Length of Transfer: %d\n" "Operation: %x\n" "Starting ByteOffset: %x\n", Irp, currentAddress, ((PUCHAR)currentAddress) + irpStack->Parameters.Read.Length, irpStack->Parameters.Read.Length, irpStack->MajorFunction, irpStack->Parameters.Read.ByteOffset.LowPart )); information = irpStack->Parameters.Read.Length; switch (irpStack->MajorFunction) { case IRP_MJ_READ: // дешифрование // сюда вообще не попадаю RtlMoveMemory( currentAddress, devExt->DiskImage + irpStack->Parameters.Read.ByteOffset.LowPart, irpStack->Parameters.Read.Length); break; case IRP_MJ_WRITE: // шифрование RtlMoveMemory( devExt->DiskImage + irpStack->Parameters.Read.ByteOffset.LowPart, currentAddress, irpStack->Parameters.Read.Length); break; default: information = 0; break; } status = STATUS_SUCCESS; COMPLETE_REQUEST( Irp, status, information ); IoReleaseRemoveLock(&devExt->RemoveLock, Irp); DBGPRINT( DBG_COMP_READ, DBG_LEVEL_VERBOSE, ("ReadWrite - OUT \n" ) ); return status; } // Конец RamDskReadWrite()