2011-08-03 48 views
6

Windows C++ API中有什麼能給我一個給定文件句柄的進程列表?如何從文件名中找到哪個進程對文件有句柄

+0

什麼你的文檔中的研究揭示了這麼遠? –

+0

在linux中有這個fuser。顯然這些窗口相當於被稱爲Handle(僅通過searning windows fuser)。這是一個不是api調用的命令,但可能有助於您的搜索 – frankc

+0

我現在唯一的想法是使用文件名調用handle.exe,並且會給我提供詳細信息。如果現有的api能夠做到這一點,我不想爲此啓動一個流程。 –

回答

1

從微軟的博客:How do I find out which process has a file open?

輸入Restart Manager

重新啓動管理器的正式目標是幫助關閉和重新啓動正在使用您要更新的文件的應用程序。爲了做到這一點,它需要跟蹤哪些進程持有對哪些文件的引用。這是在這裏使用的數據庫。 (爲什麼是內核跟蹤哪些進程有一個文件打開,因爲它是沒有保持跟蹤你不需要信息的原則相反:?!現在它需要的信息)

這裏有一個簡單的程序,在命令行上輸入文件名並顯示哪些進程已打開該文件。

#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; 
} 
相關問題