Re[2]: Драйвер, шифрующий данные
От: ReadOnly  
Дата: 10.10.12 12:47
Оценка:
Здравствуйте, x64, Вы писали:

x64>Какие именно данные шифровать собрался (файлы, том, диск, ...)?

Все. Сейчас поясню: любые файлы, которые будут передаваться на этот USB накопитель должны быть зашифрованы. В идеале — эти данные невозможно будет прочесть с компа, на котором не установлен ЭТОТ драйвер. Именно драйвер. (см. продолжение)

x64>Этот момент требует дополнительных пояснений.

(продолжение ->) Мне не нужны программы, которые шифруют данные, это я уже делал, правда не сильно хорошо получилось — но речь не об этом. Сейчас мне нужно свести шифрование на уровень драйвера. В исходниках некоторых драйверов (стандартных, прилагающихся к WinDDK) есть пример подобного драйвера и даже его поэтапное написание (видимо для самообучения). Вот код, который, по моему мнению, и нужно пускать на шифрование:
VOID 
EvtIoRead(
    IN WDFQUEUE         Queue,
    IN WDFREQUEST       Request,
    IN size_t           Length
    )   
{
    WDFUSBPIPE                  pipe;
    NTSTATUS                    status;
    WDFMEMORY                   reqMemory;
    PDEVICE_CONTEXT             pDeviceContext;
    BOOLEAN                     ret;
    
    UNREFERENCED_PARAMETER(Length);

    pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
    
    pipe = pDeviceContext->BulkReadPipe;
    
    status = WdfRequestRetrieveOutputMemory(Request, &reqMemory);
    if(!NT_SUCCESS(status)){
        goto Exit;
    }
   
    status = WdfUsbTargetPipeFormatRequestForRead(pipe,
                                        Request,
                                        reqMemory,
                                        NULL // Offsets
                                        ); 
    if (!NT_SUCCESS(status)) {
        goto Exit;
    }

    WdfRequestSetCompletionRoutine(Request,
                            EvtRequestReadCompletionRoutine,
                            pipe);
    ret = WdfRequestSend(Request, 
                    WdfUsbTargetPipeGetIoTarget(pipe), 
                    WDF_NO_SEND_OPTIONS);
    
    if (ret == FALSE) {
        status = WdfRequestGetStatus(Request);
        goto Exit;
    } else {
        return;
    }
   
Exit:
    WdfRequestCompleteWithInformation(Request, status, 0);

    return;
}

VOID
EvtRequestReadCompletionRoutine(
    IN WDFREQUEST                  Request,
    IN WDFIOTARGET                 Target,
    PWDF_REQUEST_COMPLETION_PARAMS CompletionParams,
    IN WDFCONTEXT                  Context
    )
{    
    NTSTATUS    status;
    size_t      bytesRead = 0;
    PWDF_USB_REQUEST_COMPLETION_PARAMS usbCompletionParams;

    UNREFERENCED_PARAMETER(Target);
    UNREFERENCED_PARAMETER(Context);

    status = CompletionParams->IoStatus.Status;
    
    usbCompletionParams = CompletionParams->Parameters.Usb.Completion;
    
    bytesRead =  usbCompletionParams->Parameters.PipeRead.Length;
    
    if (NT_SUCCESS(status)){
        KdPrint(("Number of bytes read: %I64d\n", (INT64)bytesRead));  
    } else {
        KdPrint(("Read failed - request status 0x%x UsbdStatus 0x%x\n",
                status, usbCompletionParams->UsbdStatus));

    }

    WdfRequestCompleteWithInformation(Request, status, bytesRead);

    return;
}


Это только процедуры чтения. Но какая из них работает напрямую с памятью разобраться не смог. Так же хочу обратить внимание, что при сборке драйвера и попытке его установки на XP системе происходит ошибка:
>ЗЫ. Собирал несколько драйверов через WinDDK для XP (в нем есть исходники USB \osrusbfx2\), собрал успешно. Но когда их пытался поставить через KmdManager, то он выдавал ошибку: "Не удается найти указанный файл".

AA>А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).

Конечно же не хранить полностью ключ на накопителе )) Лишь часть, а остальное доставать, к примеру, из номера накопителя и из этого набора генерировать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.