Ethi1989
驱动牛犊
驱动牛犊
  • 注册日期2010-08-09
  • 最后登录2011-10-19
  • 粉丝1
  • 关注0
  • 积分27分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2348回复:1

透明加密WinWord保存文件时出现权限不足,(此时还未开始加密)

楼主#
更多 发布于:2010-12-16 12:36
我是以寒江独钓的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;
}
Ethi1989
驱动牛犊
驱动牛犊
  • 注册日期2010-08-09
  • 最后登录2011-10-19
  • 粉丝1
  • 关注0
  • 积分27分
  • 威望211点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-12-16 16:44
权限不足已经解决了,是自己把Read和Write 给干掉了
但是现在提示“内存或磁盘空间不足,保存失败”
游客

返回顶部