来自微软的博客:如何找出哪个进程打开了文件?
\n\n\n输入重新启动管理器。
\n重新启动管理器的官方目标是帮助关闭和重新启动正在使用要更新的文件的应用程序。为了做到这一点,它需要跟踪哪些进程持有对哪些文件的引用。这里使用的数据库是\xe2\x80\x99。(为什么内核要跟踪哪些进程打开了文件?因为它与不跟踪您不需要的信息的原则相反:现在它需要信息! )
\n这里\xe2\x80\x99是一个简单的程序,它在命令行上获取文件名并显示哪些进程打开了该文件。
\nRun Code Online (Sandbox Code Playgroud)\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
小智 4
这篇文章解释得很好。它使用 NtQuerySystemInformation 来获取句柄。
http://msdn.microsoft.com/en-us/library/ms724509(VS.85).aspx