如何从文件名查找哪个进程对某个文件具有句柄
how to find which process has a handle on a file from the file name
在Windows c++ API中是否有任何东西可以给我一个具有给定文件句柄的进程列表?
来自微软的博客:我如何发现哪个进程打开了文件?
进入重启管理器。
重新启动管理器的官方目标是帮助关闭和重新启动正在使用您想要更新的文件的应用程序。为了做到这一点,它需要跟踪哪些进程持有对哪些文件的引用。这个数据库在这里很有用。(为什么内核要跟踪哪个进程打开了一个文件?因为这与不记录你不需要的信息的原则是相反的:现在它需要这些信息了!)
下面是一个简单的程序,它在命令行中接受文件名,并显示哪些进程打开了该文件。#include <windows.h> #include <RestartManager.h> #include <stdio.h> int __cdecl wmain(int argc, WCHAR **argv) { DWORD dwSession; WCHAR szSessionKey[CCH_RM_SESSION_KEY+1] = { 0 }; DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey); wprintf(L"RmStartSession returned %dn", dwError); if (dwError == ERROR_SUCCESS) { PCWSTR pszFile = argv[1]; dwError = RmRegisterResources(dwSession, 1, &pszFile, 0, NULL, 0, NULL); wprintf(L"RmRegisterResources(%ls) returned %dn", pszFile, dwError); if (dwError == ERROR_SUCCESS) { DWORD dwReason; UINT i; UINT nProcInfoNeeded; UINT nProcInfo = 10; RM_PROCESS_INFO rgpi[10]; dwError = RmGetList(dwSession, &nProcInfoNeeded, &nProcInfo, rgpi, &dwReason); wprintf(L"RmGetList returned %dn", dwError); if (dwError == ERROR_SUCCESS) { wprintf(L"RmGetList returned %d infos (%d needed)n", nProcInfo, nProcInfoNeeded); for (i = 0; i < nProcInfo; i++) { wprintf(L"%d.ApplicationType = %dn", i, rgpi[i].ApplicationType); wprintf(L"%d.strAppName = %lsn", i, rgpi[i].strAppName); wprintf(L"%d.Process.dwProcessId = %dn", i, rgpi[i].Process.dwProcessId); HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, rgpi[i].Process.dwProcessId); if (hProcess) { FILETIME ftCreate, ftExit, ftKernel, ftUser; if (GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser) && CompareFileTime(&rgpi[i].Process.ProcessStartTime, &ftCreate) == 0) { WCHAR sz[MAX_PATH]; DWORD cch = MAX_PATH; if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) && cch <= MAX_PATH) { wprintf(L" = %lsn", sz); } } CloseHandle(hProcess); } } } } RmEndSession(dwSession); } return 0; }
http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx?fid=422864&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2277170
这篇文章解释得很好。它使用NtQuerySystemInformation来获取句柄。
http://msdn.microsoft.com/en-us/library/ms724509 (VS.85) . aspx
相关文章:
- 确定文件句柄是否为管道句柄
- 如何从文件句柄获取包含目录的句柄
- 将C文件句柄分配给C 文件流
- 调用posix_spawn时关闭所有文件句柄
- 保持潜在的文件句柄
- 在先前关闭的文件句柄上的 fclose() 上出现双重释放错误
- 正在从内存中获取文件句柄
- HANDLE(IntPtr)已过时,kernel32.dll,安全文件句柄到IntPtr
- JNI 问题:DLL 中的文件句柄出现符号查找错误C++
- 有没有办法使用一个文件句柄将手表放在千个目录上
- 将文件句柄重定向到字符缓冲区
- SQLite:在 WAL 模式下持久化文件句柄
- Windows -- 继承子进程中的控制台文件句柄
- 如何获取进程的文件句柄
- 关闭提前退出的程序的文件句柄时的Linux 3.14策略
- c++ boost asio Windows文件句柄async_read_until无限循环-没有eof.< /
- 查找当前打开的文件句柄数(不是lsof)
- 使用FindFile和文件句柄的c++内存泄漏
- 获取现有的文件句柄
- 如何根据要写入的数据类型动态选择文件句柄