阅读:2451回复:1
透明加密WinWord保存文件时出现权限不足,(此时还未开始加密)
我是以寒江独钓的sfilter作为模板的,代码已经在记事本测试通过了,但在word中却无法使用,我将加密的那部分注释掉,只加入文件头,但出现权限不足
以下是相关代码,希望指点 NTSTATUS TEFS_WriteEncryptionLogo(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject ) { static WCHAR wszHead[HEAD_SIZE/sizeof(WCHAR)]={L'E',L'N',L'C',L'R',L'Y',L'P',L'T',L'I',L'O',L'N'}; ULONG uLength=HEAD_SIZE; LARGE_INTEGER larFileOffset={0}; LARGE_INTEGER larFileSize={0}; NTSTATUS Status; larFileOffset.QuadPart=0; larFileSize.QuadPart=HEAD_SIZE; Status=TEFS_SetEndOfFile(FileObject,DeviceObject,&larFileSize); if (!NT_SUCCESS(Status)) { return Status; } Status=TEFS_SetAllocationSize(FileObject,DeviceObject,&larFileSize); if (!NT_SUCCESS(Status)) { return Status; } Status=TEFS_IrpWrite(FileObject,DeviceObject,wszHead,uLength,&larFileOffset); return Status; } (以下这一段是仿照寒江独钓的例子) SF_RET TEFS_CreatePre(IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp, IN PFILE_OBJECT File, IN PDEVICE_OBJECT DeviceObject) { UNICODE_STRING path = { 0 }; ULONG uLength=0; NTSTATUS Status; SF_RET sfReturn = SF_IRP_PASS; PFILE_OBJECT pFileObject = NULL; HANDLE hFile; ULONG uInformation = 0; LARGE_INTEGER larFileSize,larFileOffset = { 0 }; BOOLEAN bDirectory,bInEncryptionTable; BOOLEAN bEncrptionFile=FALSE; UNICODE_STRING ustrPath; WCHAR szBuffer[128]={0}; ULONG uNeedLength=0; // 获得打开访问期望。 ULONG uDesiredAccess = IrpSp->Parameters.Create.SecurityContext->DesiredAccess; WCHAR wszHead[10] = {L'E',L'N',L'C',L'R',L'Y',L'P',L'T',L'I',L'O',L'N'}; WCHAR wszHeadBuff[10] = { 0 }; ULONG uDisp; if(IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE) return SF_IRP_PASS; RtlInitEmptyUnicodeString(&ustrPath,szBuffer,128*sizeof(WCHAR)); Status=GetFileName(File,&ustrPath,&uNeedLength); if (!NT_SUCCESS(Status)) { if (Status==STATUS_BUFFER_TOO_SMALL) { ustrPath.Buffer=ExAllocatePoolWithTag(NonPagedPool,uNeedLength,TEFS_MEM_TAG); if (ustrPath.Buffer==NULL) { Status=STATUS_INSUFFICIENT_RESOURCES; Irp->IoStatus.Status = Status; Irp->IoStatus.Information = uInformation; IoCompleteRequest(Irp, IO_NO_INCREMENT); return SF_IRP_COMPLETED; } ustrPath.Length=uNeedLength; ustrPath.MaximumLength=uNeedLength; } else { Irp->IoStatus.Status = Status; Irp->IoStatus.Information = uInformation; IoCompleteRequest(Irp, IO_NO_INCREMENT); return SF_IRP_COMPLETED; } Status=GetFileName(File,&ustrPath,&uNeedLength); } if (Status==STATUS_FILE_INVALID) { return SF_IRP_PASS; } do { hFile=TEFS_CreateFileObject(DeviceObject,&ustrPath,IrpSp,&Status,&pFileObject,&uInformation); if(!NT_SUCCESS(Status)) { sfReturn = SF_IRP_COMPLETED; break; } cfListLock(); bInEncryptionTable = cfIsFileCrypting(pFileObject); cfListUnlock(); if(bInEncryptionTable) { sfReturn = SF_IRP_PASS; break; } Status=TEFS_IsFileObject(pFileObject,DeviceObject,&larFileSize,&bDirectory); if(!NT_SUCCESS(Status)) { sfReturn = SF_IRP_COMPLETED; break; } if(bDirectory) { sfReturn = SF_IRP_PASS; break; } if(larFileSize.QuadPart == 0 && (uDesiredAccess & (FILE_WRITE_DATA| FILE_APPEND_DATA))) { KdPrint(("FCB=%x,FileSize=%I64d\n",pFileObject->FsContext,larFileSize.QuadPart)); TEFS_WriteEncryptionLogo(pFileObject,DeviceObject); //2010-12-16,跟踪文件长度 Status=TEFS_IsFileObject(pFileObject,DeviceObject,&larFileSize,&bDirectory); if(!NT_SUCCESS(Status)) { sfReturn = SF_IRP_COMPLETED; break; } KdPrint(("FCB=%x,FileSize=%I64d\n",pFileObject->FsContext,larFileSize.QuadPart)); sfReturn = SF_IRP_GO_ON; break; } if(larFileSize.QuadPart < HEAD_SIZE) { sfReturn = SF_IRP_PASS; break; } Status=TEFS_ReadEncryptionLogo(pFileObject,DeviceObject,&bEncrptionFile); if (!NT_SUCCESS(Status)) { sfReturn=SF_IRP_PASS; break; } if (bEncrptionFile) { sfReturn=SF_IRP_GO_ON; break; } sfReturn = SF_IRP_PASS; } while(0); if(path.Buffer != NULL) ExFreePool(path.Buffer); if(hFile != NULL) ZwClose(hFile); if(sfReturn == SF_IRP_GO_ON) { cfFileCacheClear(pFileObject); } if(pFileObject != NULL) ObDereferenceObject(pFileObject); if(sfReturn == SF_IRP_COMPLETED) { Irp->IoStatus.Status = Status; Irp->IoStatus.Information = uInformation; IoCompleteRequest(Irp, IO_NO_INCREMENT); } uDisp = FILE_OPEN; IrpSp->Parameters.Create.Options &= 0x00ffffff; IrpSp->Parameters.Create.Options |= (uDisp << 24); return sfReturn; } |
|
沙发#
发布于:2010-12-16 16:44
权限不足已经解决了,是自己把Read和Write 给干掉了
但是现在提示“内存或磁盘空间不足,保存失败” |
|