o派大猩o 2022-06-27 15:02 采纳率: 0%
浏览 33
已结题

关于CEF下载文件到C盘遇到的问题!(语言-c++)

问题遇到的现象和发生背景

CEF自制浏览器HOOK下载的文件,拦截写文件过程
1、保存的文件路径是C盘发现CEF下载过程是先写数据到.tmp文件,最后通过重命名的方式生成目标文件,导致DLL里面HOOK WriteFile勾不到实际的文件。
2、在OnBrowserDownloadUpdated里面获取到的SuggestedFileName是空的。
3、但是设置保存路径是D盘就直接是写目标文件。

问题相关代码,请勿粘贴截图
//写文件钩子函数
NTSTATUS WINAPI NtWriteFileHook(
    HANDLE           FileHandle,
    HANDLE           Event,
    PIO_APC_ROUTINE  ApcRoutine,
    PVOID            ApcContext,
    PIO_STATUS_BLOCK IoStatusBlock,
    PVOID            Buffer,
    ULONG            Length,
    PLARGE_INTEGER   ByteOffset,
    PULONG           Key
    )
{
    NTSTATUS status = 0;
    
    std::wstring strPath = FileHandleToPath(FileHandle);
    std::string strTemp = TCHARToChar(strPath.c_str());

    if (strTemp.find(g_config.tempPath) != std::string::npos)
    {
        ULONG size = Length;
        myFileInfo pkt;
        pkt.data = (BYTE*)Buffer;
        pkt.dataSize = Length;
        pkt.filePath = strPath;
        mergePacket(pkt);
        memcpy(Buffer, g_nullData, size);//稀疏文件
    }

    status = _NtWriteFileFunc(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key);
    
    return status;
}


//文件下载线程
unsigned int cef_DonwloadListManager::AsynDownload()
{
    while(!m_bExit)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));

        asynDownloadItem item;
        m_mtxAsynDownload.lock();
        if(!m_lsAsynDownload.empty())
        {
            item = m_lsAsynDownload.front();
            m_lsAsynDownload.pop();
        }
        m_mtxAsynDownload.unlock();

        if(item.callback != NULL)
        {
            char chFile[1024] = { 0 };
            std::string strName = item.fileName.toStdString();;
            char *pFile = chFile;
            cef_DonwloadListManager::instance()->SendFileNameToCloudDoc(strName.c_str(),&pFile);//这里会返回一个文件的绝对路径
            pFile = NULL;

            QFile f(chFile);
            if(f.exists())
            {
                f.remove();
            }

            CefString temp(chFile);
            item.callback->Continue(temp, false);
            item.callback = NULL;
            qDebug()<<__FUNCTION__<< QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz ")<< "begin download file = " << chFile <<endl;

        }

    }

    return 0;
}
我的解答思路和尝试过的方法

1、尝试过Hook SetInformationFile里面的rename,但是和设计不符,设计是通过HOOK WriteFile获取到每次的数据buffer,再以流的形式上传服务器。

我想要达到的结果

1、怎么样才能让CEF下载直接写目标文件,而不是通过重命名.temp的方式生成目标文件?

  • 写回答

2条回答 默认 最新

  • churuxu 2022-06-27 17:13
    关注

    你要解决X问题,觉得Y是最好的方法,然后问Y怎么做,为什么不问X怎么做呢

    评论

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 赞助了问题酬金10元 6月29日
  • 创建了问题 6月27日

悬赏问题

  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等