阅读:1846回复:3
看了寒江独钓的透明加密的一点想法,望各位指点
书中代码没问题,但并没有实现修改加密,我想改进一下
思路是:对于原来的文件,同样是在有写意愿时,在IRP_MJ_CREATE的预处理中,将原来的数据往后移动4K(标记长度) 然后在原文件的起始处添加标记4K,同时设置需要进行后处理的标记,传递下去,把刚才的文件,加入到加密表中 大概思路就这样,对于小于4K的文件,现在测试成功,对于大于4K的文件,非常不稳定,有时行,有时不行 望大侠们指点,谢谢 |
|
沙发#
发布于:2009-08-18 16:37
引用第2楼confused_ddk于2009-08-18 15:16发表的 : Thanks very much for your kind answers,and I will follow your advice,trying to resolve the problems. |
|
板凳#
发布于:2009-08-18 15:16
There are many reasons can crash your fragile codes, such as cache/memory file etc., try to search why on osr's list.
http://www.osronline.com/showlists.cfm?list=ntfsd |
|
地板#
发布于:2009-08-17 20:17
我使用的是从前往后移动的方法,代码如下:
NTSTATUS cfLargeFileInsertHeader(PDEVICE_OBJECT next_dev, PFILE_OBJECT file, LARGE_INTEGER orig_file_size) //原来的文件长度 { LARGE_INTEGER ReadOffset,WriteOffset; ULONG length,totallength=0; NTSTATUS status=STATUS_SUCCESS; BOOLEAN EndofFile=FALSE; ReadOffset.QuadPart=WriteOffset.QuadPart=0; length=CF_FILE_HEADER_SIZE;//读出第一块 memset(&ReadData,0,sizeof(ReadData)); status=cfFileReadWrite(next_dev,file,&ReadOffset,&length,ReadData.Data,TRUE); if(!NT_SUCCESS(status)) { KdPrint(("cfFileInserHeader read data,Error %x\n",status)); ASSERT(FALSE); return status; } //这里status 等于success的 if(length!=CF_FILE_HEADER_SIZE) { //第一次读,文件的长度本来是大于CF_FILE_HEADER_SIZE的,但是没有读到这么长,错误 KdPrint(("cfFileInserHeader read data not complete,Error %x\n",status)); ASSERT(FALSE); return status; } ReadData.len=length; totallength+=length; //保存前一块的内容 RtlCopyMemory(&WriteData,&ReadData,sizeof(ReadData)); length=CF_FILE_HEADER_SIZE; status=cfFileReadWrite(next_dev, file, &WriteOffset, &length, header_flags, //写上标记 FALSE); //写 if(!NT_SUCCESS(status)) { KdPrint(("cfFileInserHeader second write ,Error %x\n",status)); ASSERT(FALSE); return status; } ReadOffset.QuadPart+=length; WriteOffset.QuadPart+=length; //长度大于4K的 while(ReadOffset.QuadPart<orig_file_size.QuadPart) { memset(&ReadData,0,sizeof(ReadData)); if(totallength+CF_FILE_HEADER_SIZE<=orig_file_size.QuadPart) { length=CF_FILE_HEADER_SIZE;//每次读的长度 } else { length=(ULONG)orig_file_size.QuadPart-totallength; EndofFile=TRUE; } status=cfFileReadWrite(next_dev, file, &ReadOffset, &length, ReadData.Data, TRUE); //读 if(!NT_SUCCESS(status)) { KdPrint(("cfFileInserHeader read data,Error %x\n",status)); ASSERT(FALSE); return status; } ReadData.len=length; totallength+=length; if(length==0) break; status=cfFileReadWrite(next_dev, file, &WriteOffset, &WriteData.len, //写的长度是上次读的长度 WriteData.Data, //写上一次的数据 FALSE); //写 if(!NT_SUCCESS(status)) { KdPrint(("cfFileInserHeader first write ,Error %x\n",status)); ASSERT(FALSE); return status; } RtlCopyMemory(&WriteData,&ReadData,sizeof(ReadData)); ReadOffset.QuadPart+=length; WriteOffset.QuadPart+=length; if(EndofFile) break; } status=cfFileReadWrite( next_dev, file, &WriteOffset, &WriteData.len, //写的长度是上次读的长度 WriteData.Data, //写上一次的数据 FALSE); //写 if(!NT_SUCCESS(status)) { KdPrint(("cfFileInserHeader first write ,Error %x\n",status)); ASSERT(FALSE); return status; } return status; } |
|