Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从临时目录中删除卷影副本dll_C++_Windows_Dll_Shadow Copy - Fatal编程技术网

C++ 从临时目录中删除卷影副本dll

C++ 从临时目录中删除卷影副本dll,c++,windows,dll,shadow-copy,C++,Windows,Dll,Shadow Copy,我们的许多exe动态加载B.dll。B.dll在临时文件中复制自身并重新加载%TMP%\B-.dll。我试图使用此代码将B-.dll标记为删除,但由于“访问被拒绝”而失败,这无疑是因为LoadLibrary调用: char ourDllPath[MAX_PATH]; // ... set ourDllPath to absolute path... char tempPath[MAX_PATH]; DWORD dwRetVal

我们的许多exe动态加载B.dll。B.dll在临时文件中复制自身并重新加载%TMP%\B-.dll。我试图使用此代码将B-.dll标记为删除,但由于“访问被拒绝”而失败,这无疑是因为LoadLibrary调用:

        char ourDllPath[MAX_PATH];
        // ... set ourDllPath to absolute path...

        char tempPath[MAX_PATH];  
        DWORD dwRetVal = GetTempPath(MAX_PATH, tempPath); 
        char shadowPath[MAX_PATH];
        UINT uRetVal = GetTempFileNameA(tempPath, "FOO_", 0, shadowPath);
        BOOL ok = CopyFileA(ourDllPath, shadowPath, false);
        HMODULE hShadowDll = LoadLibraryA(shadowPath);
        typedef int (WINAPI *PRESUMEFOO)();
        PRESUMEFOO onload2 = (PRESUMEFOO)GetProcAddress(hShadowDll,"_Resume_Foo@0");

        BOOL ok2 = DeleteFileA(shadowPath); // Fails with "Access is denied"
但是,根据here(),这应该是可能的:

DeleteFile函数在关闭时将文件标记为删除。因此,直到文件的最后一个句柄关闭后,文件才会删除


关于如何在Windows server操作系统上关闭时将当前打开的文件标记为删除,您有什么想法吗?

要设置处置标志,您必须能够使用删除访问打开句柄,并且共享规则仍然适用。但是,我不确定问题是LoadLibrary没有指定FILE\u SHARE\u DELETE,还是DeleteFile没有指定FILE\u SHARE\u READ(或者两者都有)。如果LoadLibrary确实指定了FILE_SHARE_DELETE,则您可以使用FILE_SHARE_READ自己打开该文件,并使用SetFileInformationByHandle和FileDispositionInfo设置删除标志。值得一试。但我认为LoadLibrary阻止了这一切。我试图对LoadLibrary返回的句柄调用SetFileInformationByHandle,但访问被拒绝。然后,我尝试使用CreateFile获得我自己的文件句柄(设置file_SHARE_DELETE和file_FLAG_DELETE_ON_CLOSE)。如果我先这么做,LoadLibrary就会失败。如果我在调用LoadLibrary后这样做,它会被拒绝访问。我尝试了其他几种排列方式——包括在调用LoadLibrary后成功删除文件的排列方式——但随后该过程就失败了,可能是因为文件在读取/分页之前被删除了。是的,我也做了一些测试,但这样做似乎是不可能的。恐怕您必须跟踪这些文件,并在卸载相关库后删除每个文件。或者,可以使用MoveFileEx计划在下次重新启动时删除文件。(或者,当LoadLibrary打开DLL时,您可以挂接NtCreateFile并在关闭时添加文件\u标志\u删除\u,但API挂接既棘手又不受支持。)MoveFileEx(MOVEFILE\u延迟\u直到\u重新启动)将是一个很酷的选择,但它需要priv,并且我们的进程没有priv。哦,好吧。不幸的是,dll一直使用到进程退出,所以我没有地方卸载它。谢谢你的建议。我得想另一个办法。