VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 403|回复: 3

[求助] 最后红色所添加的代码导致蓝屏,想问一下为什么

[复制链接]
39_avatar_middle
在线会员 535638819zsm 发表于 2018-7-12 22:09:15 | 显示全部楼层 |阅读模式
3驿站币
PreWrite(
    __inout PFLT_CALLBACK_DATA Data,
    __in PCFLT_RELATED_OBJECTS FltObjects,
    __deref_out_opt PVOID *CompletionContext
    )
/*++

Routine Description:

    This routine demonstrates how to swap buffers for the WRITE operation.

    Note that it handles all errors by simply not doing the buffer swap.

Arguments:

    Data - Pointer to the filter callbackData that is passed to us.

    FltObjects - Pointer to the FLT_RELATED_OBJECTS data structure containing
        opaque handles to this filter, instance, its associated volume and
        file object.

    CompletionContext - Receives the context that will be passed to the
        post-operation callback.

Return Value:

    FLT_PREOP_SUCCESS_WITH_CALLBACK - we want a postOpeation callback
    FLT_PREOP_SUCCESS_NO_CALLBACK - we don't want a postOperation callback
    FLT_PREOP_COMPLETE -
--*/
{
    NTSTATUS status;
    PFLT_IO_PARAMETER_BLOCK iopb = Data->Iopb;
    FLT_PREOP_CALLBACK_STATUS FltStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;

        PVOID newBuf = NULL;
    PMDL newMdl = NULL;
    PPRE_2_POST_CONTEXT p2pCtx;

        PVOID origBuf;
        ULONG writeLen = iopb->Parameters.Write.Length;
        LARGE_INTEGER writeOffset = iopb->Parameters.Write.ByteOffset ;
   
        PVOLUME_CONTEXT volCtx = NULL;
        PSTREAM_CONTEXT pStreamCtx = NULL ;

        BOOLEAN bIsSystemProcess = FALSE ;
        BOOLEAN bIsPPTFile = FALSE ;
        //BOOLEAN bIsCADFile = FALSE ;

        KIRQL OldIrql ;
        WCHAR* aa = L"Volume1";
        WCHAR* bb = NULL;
        //UINT64 i;
        //PUCHAR new_buffer;

    try {
                       
                status = FltGetVolumeContext( FltObjects->Filter,FltObjects->Volume,&volCtx );
        if (!NT_SUCCESS(status))
            __leave;

                status = Ctx_FindOrCreateStreamContext(Data,FltObjects,FALSE,&pStreamCtx,NULL) ;
                if (!NT_SUCCESS(status))
                        __leave ;

                if (!Ps_IsCurrentProcessMonitored(pStreamCtx->FileName.Buffer, pStreamCtx->FileName.Length / sizeof(WCHAR), &bIsSystemProcess, &bIsPPTFile/*, &bIsCADFile*/))
                        __leave ;


                // if fast io, disallow it and pass
                if (FLT_IS_FASTIO_OPERATION(Data))
                {// disallow fast io path
                        DbgPrint("fastIO  pass\n");
                        FltStatus = FLT_PREOP_DISALLOW_FASTIO ;
                        __leave ;
                }  

                // update file real size in stream context timely
                // since file size can be extended in cached io path, so we record file size here
                if (!(Data->Iopb->IrpFlags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
                {
                        SC_LOCK(pStreamCtx, &OldIrql) ;
                        if ((writeLen + writeOffset.QuadPart) > pStreamCtx->FileValidLength.QuadPart)
                        {//extend file size
                                pStreamCtx->FileValidLength.QuadPart = writeLen + writeOffset.QuadPart ;
                        }
                        SC_UNLOCK(pStreamCtx, OldIrql) ;
                        __leave ;
                }

                // if write length is zero, pass
        if (writeLen == 0)
                        __leave;

                SC_LOCK(pStreamCtx, &OldIrql) ;
                // sometimes paging/nocached write request is lauched by read-only file object and only
                // write parital data of the file, under this condition, if the file has not been encrypted,
                // encryption will lead to corrupt of file(since partial data in file is plaintext and partial
                // is ciphertext), so we verify here, if file has not been encrypted and fileobject has no
                // write access, just pass. But for powerpnt process, we set "has been write" flag for the file
                // and encrypted in pre-close routine
                if (!pStreamCtx->bIsFileCrypt && !FltObjects->FileObject->WriteAccess)
                {
                        if (bIsSystemProcess == POWERPNT_PROCESS)
                        {// for exception of powerpnt process, we just set write flag for the file
                                //DbgPrint("其他TMP文件");
                                pStreamCtx->bHasPPTWriteData = TRUE ;
                        }
                        //if (bIsSystemProcess == ACAD_PROCESS)
                        //{// for exception of powerpnt process, we just set write flag for the file
                        //        pStreamCtx->bHasCADWriteData = TRUE;
                        //}
                        SC_UNLOCK(pStreamCtx, OldIrql) ;               
                        __leave ;
                }

                // This judgement is only for powerpnt process. If it's a temporary file of powerpnt document,
                // going on encrypting. Otherwise, set "has been write" flag for the file and encrypted in
                // pre-close routine
                // If user modify ppt document and click "close" button in powerpnt, tmp file is generated.
                // If user click "save" button in powerpnt, no tmp file generated and partial data of the file
                // is flush back to disk.
                // This judgement can distinguish such two situations.
                if (bIsPPTFile && !pStreamCtx->bIsFileCrypt && (bIsSystemProcess == POWERPNT_PROCESS))
                {// powerpnt document(not tmp file)
                        pStreamCtx->bHasPPTWriteData = TRUE ;
                        DbgPrint("11111!\n");
                        SC_UNLOCK(pStreamCtx, OldIrql) ;               
                        __leave ;
                }//if a ppt tmp file, encrypting directly


                //if (bIsCADFile && !pStreamCtx->bIsFileCrypt && (bIsSystemProcess == ACAD_PROCESS))
                //{// powerpnt document(not tmp file)
                //        pStreamCtx->bHasCADWriteData = TRUE;
                //        DbgPrint("CAD!\n");
                //        SC_UNLOCK(pStreamCtx, OldIrql);
                //        __leave;
                //}


                DbgPrint("2222 !\n");
                SC_UNLOCK(pStreamCtx, OldIrql) ;
                //if (bIsWORDFile && !pStreamCtx->bIsFileCrypt && (bIsSystemProcess == WINWORD_PROCESS))
                //{// winword document(not tmp file)
                //        pStreamCtx->bHasPPTWriteData = TRUE ;
                //        SC_UNLOCK(pStreamCtx, OldIrql) ;               
                //        __leave ;
                //}//if a word tmp file, encrypting directly
                //SC_UNLOCK(pStreamCtx, OldIrql) ;

                // nocache write length must sector size aligned
        if (FlagOn(IRP_NOCACHE,iopb->IrpFlags))
            writeLen = (ULONG)ROUND_TO_SIZE(writeLen,volCtx->SectorSize);

        newBuf = ExAllocatePoolWithTag( NonPagedPool, writeLen,BUFFER_SWAP_TAG );
        if (newBuf == NULL)
            leave;

        //  We only need to build a MDL for IRP operations.  We don't need to
        //  do this for a FASTIO operation because it is a waste of time since
        //  the FASTIO interface has no parameter for passing the MDL to the
        //  file system.
        if (FlagOn(Data->Flags,FLTFL_CALLBACK_DATA_IRP_OPERATION))
                {
            newMdl = IoAllocateMdl( newBuf, writeLen, FALSE,FALSE, NULL );
            if (newMdl == NULL)
                leave;
            MmBuildMdlForNonPagedPool( newMdl );
        }

        //  If the users original buffer had a MDL, get a system address.
        if (iopb->Parameters.Write.MdlAddress != NULL)
                {
            origBuf = MmGetSystemAddressForMdlSafe( iopb->Parameters.Write.MdlAddress,  NormalPagePriority );
            if (origBuf == NULL)
                        {
                Data->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
                Data->IoStatus.Information = 0;
                FltStatus = FLT_PREOP_COMPLETE;
                leave;
            }
        }
                else
                {
            //  There was no MDL defined, use the given buffer address.
            origBuf = iopb->Parameters.Write.WriteBuffer;
        }

        //  Copy the memory, we must do this inside the try/except because we
        //  may be using a users buffer address
        try {
                       
                        RtlCopyMemory( newBuf,origBuf,writeLen );

                        do {

                                // This judgement is useless in fact.
                                if ((pStreamCtx->bEncryptOnWrite|| pStreamCtx->bIsFileCrypt) && \
                                        (Data->Iopb->IrpFlags & ( \
                                         IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO)))
                                {
                                        KeEnterCriticalRegion() ;
                                        ///if (NULL == pStreamCtx->aes_ctr_ctx)
                                        ///{// use current key to decrypt file data
                                                ///if (data_crypt(volCtx->aes_ctr_ctx, newBuf, Data->Iopb->Parameters.Write.ByteOffset.QuadPart, writeLen))
                                                ///{
                                                ///        KeLeaveCriticalRegion() ;
                                                ///        break ;
                                                ///}
                                        ///}
                                        ///else
                                        ///{// use file specified key to encrypt file data(this must be history key)
                                                ///if (data_crypt(pStreamCtx->aes_ctr_ctx, newBuf, Data->Iopb->Parameters.Write.ByteOffset.QuadPart, writeLen))
                                                ///{
                                                ///        KeLeaveCriticalRegion() ;
                                                ///        break ;
                                                ///}
                                        ///}
                                        //DbgPrint("加密操作File_EncryptBuffer\n");

                                        CHAR  wszFilePathName[260] = { 0 };
                                        RtlCopyMemory(wszFilePathName, pStreamCtx->FileName.Buffer, pStreamCtx->FileName.Length);
                                        DbgPrint("需要加密的文件名:%S\n", wszFilePathName);
                                        //
                                        bb = wcsstr(wszFilePathName, aa);
                                        if (bb != NULL)
                                        {
                                                /*SC_LOCK(pStreamCtx, &OldIrql);*/

                                                SC_UNLOCK(pStreamCtx, OldIrql);
                                                DbgPrint("!非加密目录,写的时候不加密了");
                                                leave;
                                        }

最佳答案

查看完整内容

看看参数有没有位空的,wszFilePathName 或者 aa,或者值不正确的




上一篇:已找到
下一篇:JS初始化问题

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-7-12 22:09:16 | 显示全部楼层

看看参数有没有位空的,wszFilePathName 或者 aa,或者值不正确的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-7-13 00:55:25 | 显示全部楼层
是这句话吗?bb = wcsstr(wszFilePathName, aa);

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

39_avatar_middle
ico_lz  楼主| 535638819zsm 发表于 2018-7-13 09:28:49 | 显示全部楼层
Syc 发表于 2018-7-13 00:55
是这句话吗?bb = wcsstr(wszFilePathName, aa);

对,就是这句话

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-16 10:38

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表