Здравствуйте, 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>А хранение ключа на самом накопителе — это не секьюрно вообще нифига. Лучше каким-то образом генерить ключ из пароля или хранить его где-то отдельно (откуда его никто не сможет достать).
Конечно же не хранить полностью ключ на накопителе )) Лишь часть, а остальное доставать, к примеру, из номера накопителя и из этого набора генерировать...