Windows C++ API中有什麼能給我一個給定文件句柄的進程列表?如何從文件名中找到哪個進程對文件有句柄
6
A
回答
2
1
從微軟的博客:How do I find out which process has a file open?
重新啓動管理器的正式目標是幫助關閉和重新啓動正在使用您要更新的文件的應用程序。爲了做到這一點,它需要跟蹤哪些進程持有對哪些文件的引用。這是在這裏使用的數據庫。 (爲什麼是內核跟蹤哪些進程有一個文件打開,因爲它是沒有保持跟蹤你不需要信息的原則相反:?!現在它需要的信息)
這裏有一個簡單的程序,在命令行上輸入文件名並顯示哪些進程已打開該文件。
#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 %d\n", dwError); if (dwError == ERROR_SUCCESS) { PCWSTR pszFile = argv[1]; dwError = RmRegisterResources(dwSession, 1, &pszFile, 0, NULL, 0, NULL); wprintf(L"RmRegisterResources(%ls) returned %d\n", 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 %d\n", 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 = %d\n", i, rgpi[i].ApplicationType); wprintf(L"%d.strAppName = %ls\n", i, rgpi[i].strAppName); wprintf(L"%d.Process.dwProcessId = %d\n", 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" = %ls\n", sz); } } CloseHandle(hProcess); } } } } RmEndSession(dwSession); } return 0; }
相關問題
- 1. Win32API - 如何從進程句柄獲取進程的文件名?
- 2. 如何從exe文件的名稱查找窗口句柄
- 3. 從Win64bit的外部進程文件句柄獲取文件名 - C#
- 4. 如何從文件對象中找到當前文件名?
- 5. 共享文件句柄只對某個進程及其孩子
- 6. 別名文件句柄到STDOUT perl
- 7. 「從文件句柄中獲取文件名」的錯誤編碼
- 8. 從文件句柄中獲取文件名?
- 9. 從文件句柄值中獲取文件名
- 10. 我可以在Perl中找到文件句柄的文件名嗎?
- 11. 從一個m文件傳遞句柄到其他m文件
- 12. 程序文件句柄
- 13. 查找短期存在的句柄與哪個文件關聯
- 14. 從進程得到句柄
- 15. 如何查找我的進程在Linux中打開的文件句柄?
- 16. 列出Windows中打開文件句柄的所有者進程?
- 17. 檢查文件是否被進程文件句柄鎖定
- 18. Perl - Win32 - 如何從另一個進程無阻塞地讀取文件句柄?
- 19. 如何從Delphi的服務名稱/句柄中找到進程ID?
- 20. 如何關閉來自父進程的文件句柄C#
- 21. 使用文件句柄獲取文件名(或刪除文件)
- 22. 從cURL中刪除文件句柄(CURLOPT_FILE)
- 23. 誰在Windows中擁有文件句柄?
- 24. 如何從Python文件句柄打開.NET FileStream對象?
- 25. Node.js子進程,訪問事件句柄中的進程對象?
- 26. 寫文件(句柄)的內容,以不同的文件句柄
- 27. 另一個進程文件句柄上的SetFilePointer()失敗
- 28. 如何找到哪些進程已寫入Linux上的文件
- 29. perl中同一個文件的兩個文件句柄
- 30. 如何找出哪些文件正被另一個進程
什麼你的文檔中的研究揭示了這麼遠? –
在linux中有這個fuser。顯然這些窗口相當於被稱爲Handle(僅通過searning windows fuser)。這是一個不是api調用的命令,但可能有助於您的搜索 – frankc
我現在唯一的想法是使用文件名調用handle.exe,並且會給我提供詳細信息。如果現有的api能夠做到這一點,我不想爲此啓動一個流程。 –