Драйвер, шифрование, виртуальный диск

Тема в разделе "WASM.NT.KERNEL", создана пользователем Waster, 11 май 2011.

  1. Waster

    Waster New Member

    Публикаций:
    0
    Регистрация:
    9 май 2011
    Сообщения:
    1
    Шифрую данные на вирт. диске.
    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()
     
  2. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    смотри TrueCrypt
     
  3. JivotnoE

    JivotnoE New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    10
    или FreeOTFE