Anz. Prozesse herausfinden, die gerade auf einen Ordner zugreifen



  • Hallo,

    gibt es eine Möglicheit herauszufinden, wieviele Programme gerade auf einen Ordner "zugreifen"?
    Wenn man z.B. im Windows-Explorer einen Ordner umbenennen will, kann sein, dass das nicht geht, weil der Ordner gerade von einem Programm verwendet wird...

    Weiß jemand, wie man sowas anstellen kann bzw. Funktionen kennt, mit denen man das herausbekommen kann?

    mfg



  • Das geht wahscheinlich nicht, weil Windows die Zugriffe regelt. Vielleicht kann Dir ein Mutex-Objekt helfen? Ich weiss aber nicht, ob das auch bei Fremdprozessen wirkt.


  • Mod

    Das ist aber relativ aufwendig. Du müsstest einen Filtertreiber schreiben und Dein programm müsste als Admin gestartet werden.

    Siehe mal nach alten Sourcen von FILEMON von Sysinternals.



  • Zur Not die Ausgabe des Programms Handle von Sysinternals parsen:

    http://technet.microsoft.com/de-de/sysinternals/bb896655.aspx



  • das geht relativ einfach auch im userspace mit undokumentierten api funktionen. stichwort NtQuerySystemInformation, NtQueryObject, etc.


  • Mod

    Aber damit bekommt man doch nicht heraus weclhe fremden Prozesse ein Directory nutzen, oder?



  • hab hier grad nix zum testen installiert aber denke mal es steht im attributes field der OBJECT_BASIC_INFORMATION struktur drin ob es ein directory ist. ich kann ja morgen mal gucken, wenn ich daheim bin



  • /*
     * GetPIDsFromFile - Returns process identifiers of all processes that have
     *			currently opened target file.
     *
     * @lpFileName
     *	Name of the file to look up.
     *
     * @lpPIDs
     *	Pointer to an array of DWORDs that will receive the process identifiers.
     *
     * @dwNumPIDs
     *	Maximum number of entries to store in the buffer pointed to by lpPIDs.
     *
     * @return
     *	The function returns the actual number of entries in lpPIDs on success,
     *		-1 on failure.
     *
     */
    int GetPIDsFromFile( PTCHAR lpFileName, PDWORD lpPIDs, DWORD dwNumPIDs ) {
    	ULONG *p, n, i, count = 0;
    	PSYSTEM_HANDLE_INFORMATION h;
    	HANDLE hProcess;
    	PFN_NtQuerySystemInformation NtQuerySystemInformation =
    		(PFN_NtQuerySystemInformation) GetProcAddress(LoadLibrary("NTDLL"),
    		"NtQuerySystemInformation");
    	PFN_NtQueryObject NtQueryObject = (PFN_NtQueryObject)
    		GetProcAddress(LoadLibrary("NTDLL"), "NtQueryObject");
    	if(!NtQuerySystemInformation || !NtQueryObject)
    		return -1;
    
    	n = 0x1000;
    	p = malloc(sizeof(ULONG) * n);
    
    	while(NtQuerySystemInformation(SystemHandleInformation, p, n * sizeof(*p),
    		0) == STATUS_INFO_LENGTH_MISMATCH) {
    		free(p);
    		n = n * 2;
    		p = malloc(sizeof(ULONG) * n);
    	}
    
    	h = (PSYSTEM_HANDLE_INFORMATION)(p + 1);
    	for(i = 0; i < *p; i++) {
    		HANDLE hObject;
    		OBJECT_BASIC_INFORMATION obi;
    		OBJECT_NAME_INFORMATION *poni;
    		TCHAR szFileName[MAX_PATH];
    
    		if(count >= dwNumPIDs)
    			break;
    
    		if(!(hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, h[i].ProcessId)))
    			continue;
    
    		if(!DuplicateHandle(hProcess, (HANDLE)h[i].Handle, GetCurrentProcess(),
    			&hObject, 0, 0, DUPLICATE_SAME_ATTRIBUTES)) {
    			CloseHandle(hProcess);
    			continue;
    		}
    
    		CloseHandle(hProcess);
    		NtQueryObject(hObject, ObjectBasicInformation, &obi, sizeof(obi), NULL);
    
    		n = obi.NameInformationLength == 0 ? MAX_PATH * sizeof(WCHAR) :
    				obi.NameInformationLength;
    		poni = (POBJECT_NAME_INFORMATION)malloc(n);
    
    		NtQueryObject(hObject, ObjectNameInformation, poni, n, NULL);
    		if(DeviceToDosPath(poni->Name.Buffer, szFileName, sizeof(szFileName))) {
    			if(!_tcscmp(lpFileName, szFileName))
    				lpPIDs[count++] = h[i].ProcessId;
    		}
    
    		CloseHandle(hObject);
    	}
    
    	free(p);
    	return count;
    }
    

    http://www.devfull.de/downloads/openfiles.rar



  • Ist eine interessante Frage. Wünsche verifizierte Nachricht, wie das möglichst einfach geht.


Anmelden zum Antworten