如何从文件名中查找哪个进程具有文件句柄

Sri*_*ian 9 c++ winapi

Windows c ++ API中是否有任何内容可以为我提供一个具有给定文件句柄的进程列表?

bit*_*ift 9

来自微软的博客:如何找出哪个进程打开了文件?

\n
\n

输入重新启动管理器

\n

重新启动管理器的官方目标是帮助关闭和重新启动正在使用要更新的文件的应用程序。为了做到这一点,它需要跟踪哪些进程持有对哪些文件的引用。这里使用的数据库是\xe2\x80\x99。(为什么内核要跟踪哪些进程打开了文件?因为它与不跟踪您不需要的信息的原则相反:现在它需要信息! )

\n

这里\xe2\x80\x99是一个简单的程序,它在命令行上获取文件名并显示哪些进程打开了该文件。

\n
#include <windows.h>\n#include <RestartManager.h>\n#include <stdio.h>\n\nint __cdecl wmain(int argc, WCHAR **argv)\n{\n DWORD dwSession;\n WCHAR szSessionKey[CCH_RM_SESSION_KEY+1] = { 0 };\n DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);\n wprintf(L"RmStartSession returned %d\\n", dwError);\n if (dwError == ERROR_SUCCESS) {\n   PCWSTR pszFile = argv[1];\n   dwError = RmRegisterResources(dwSession, 1, &pszFile,\n                                 0, NULL, 0, NULL);\n   wprintf(L"RmRegisterResources(%ls) returned %d\\n",\n           pszFile, dwError);\n  if (dwError == ERROR_SUCCESS) {\n   DWORD dwReason;\n   UINT i;\n   UINT nProcInfoNeeded;\n   UINT nProcInfo = 10;\n   RM_PROCESS_INFO rgpi[10];\n   dwError = RmGetList(dwSession, &nProcInfoNeeded,\n                       &nProcInfo, rgpi, &dwReason);\n   wprintf(L"RmGetList returned %d\\n", dwError);\n   if (dwError == ERROR_SUCCESS) {\n    wprintf(L"RmGetList returned %d infos (%d needed)\\n",\n            nProcInfo, nProcInfoNeeded);\n    for (i = 0; i < nProcInfo; i++) {\n     wprintf(L"%d.ApplicationType = %d\\n", i,\n                              rgpi[i].ApplicationType);\n     wprintf(L"%d.strAppName = %ls\\n", i,\n                              rgpi[i].strAppName);\n     wprintf(L"%d.Process.dwProcessId = %d\\n", i,\n                              rgpi[i].Process.dwProcessId);\n     HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,\n                                   FALSE, rgpi[i].Process.dwProcessId);\n     if (hProcess) {\n      FILETIME ftCreate, ftExit, ftKernel, ftUser;\n      if (GetProcessTimes(hProcess, &ftCreate, &ftExit,\n                          &ftKernel, &ftUser) &&\n          CompareFileTime(&rgpi[i].Process.ProcessStartTime,\n                          &ftCreate) == 0) {\n       WCHAR sz[MAX_PATH];\n       DWORD cch = MAX_PATH;\n       if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) &&\n           cch <= MAX_PATH) {\n        wprintf(L"  = %ls\\n", sz);\n       }\n      }\n      CloseHandle(hProcess);\n     }\n    }\n   }\n  }\n  RmEndSession(dwSession);\n }\n return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

  • 请注意,重新启动管理器需要与 Rstrtmgr.lib 链接 (4认同)