我想开发一个基于FileDisk-17 opensource项目的encryption虚拟磁盘 。
这是我的解决scheme:
在IPR_MJ_READ
,当ZwReadFile
返回时,我使用函数DecryptData
来解密ZwReadFile
读取的数据。
在IPR_MJ_WRITE
,在调用ZwWriteFile
之前,我使用函数“ EncryptData
”来encryption将要写入磁盘的数据。
我把EncryptData
& DecryptData
函数放在一个C源文件中。
问题是; 当我加载我的驱动程序时,我得到每次ERROR_PROC_NOT_FOUND(127)
错误代码,即使EncryptData
或DecryptData
函数中只有一行。
谁能告诉我是什么原因造成的以及如何解决?
switch (io_stack->MajorFunction) { case IRP_MJ_READ: system_buffer = (PUCHAR) MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); if (system_buffer == NULL) { irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; irp->IoStatus.Information = 0; break; } buffer = (PUCHAR) ExAllocatePool(PagedPool, io_stack->Parameters.Read.Length); if (buffer == NULL) { irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; irp->IoStatus.Information = 0; break; } ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, buffer, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); *if(bEncrypt) { cipher = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool, irp->IoStatus.Information, 'TAG'); if(cipher) { **DecryptData**(buffer, cipher, irp->IoStatus.Information); RtlCopyMemory(system_buffer, cipher, irp->IoStatus.Information); ExFreePool(cipher); } else { irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; irp->IoStatus.Information = 0; break; } }* else { RtlCopyMemory(system_buffer, buffer, io_stack->Parameters.Read.Length); ExFreePool(buffer); }
crypto.c
VOID EncryptData(PUCHAR src, PUCHAR dst, ULONG length) { BF_LONG data[2]; BF_KEY key; BF_set_key(&key, pCryptoInformation->CryptoKey, sizeof(pCryptoInformation->CryptoKey)); } VOID DecryptData(PUCHAR src, PUCHAR dst, ULONG length) { BF_LONG data[2]; BF_KEY key; BF_set_key(&key, pCryptoInformation->CryptoKey, sizeof(pCryptoInformation->CryptoKey)); }