From ebde0bae69ee977394d24493c001ca6af35195ce Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Thu, 12 Feb 2009 21:48:12 +0100 Subject: [PATCH] Add WhoUses, a program to determine which processes access a given file You can use WhoUses to find out which processes would prevent deletion of a given file: WhoUses -m /bin/msys-1.0.dll Signed-off-by: Johannes Schindelin --- mingw/bin/WhoUses.exe | Bin 0 -> 307200 bytes src/WhoUses/.gitignore | 2 + src/WhoUses/Makefile | 14 + src/WhoUses/README | 5 + src/WhoUses/SystemInfo.cpp | 1079 ++++++++++++++++++++++++++++++++++++++++++++ src/WhoUses/SystemInfo.h | 429 ++++++++++++++++++ src/WhoUses/WhoUses.cpp | 264 +++++++++++ 7 files changed, 1793 insertions(+) create mode 100644 mingw/bin/WhoUses.exe create mode 100644 src/WhoUses/.gitignore create mode 100644 src/WhoUses/Makefile create mode 100644 src/WhoUses/README create mode 100644 src/WhoUses/SystemInfo.cpp create mode 100644 src/WhoUses/SystemInfo.h create mode 100644 src/WhoUses/WhoUses.cpp diff --git a/mingw/bin/WhoUses.exe b/mingw/bin/WhoUses.exe new file mode 100644 index 0000000000000000000000000000000000000000..2b96fc12706036250b5019cdf5374c7c72c1c8e7 GIT binary patch literal 307200 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 X@YDOA#AH^ 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 W#5V)pMaa&y&yj2Q-`{`I@Bab9B-uIu literal 0 HcwPel00001 diff --git a/src/WhoUses/.gitignore b/src/WhoUses/.gitignore new file mode 100644 index 00000000..59315abb --- /dev/null +++ b/src/WhoUses/.gitignore @@ -0,0 +1,2 @@ +/WhoUses.exe +/*.o diff --git a/src/WhoUses/Makefile b/src/WhoUses/Makefile new file mode 100644 index 00000000..bd15b7ab --- /dev/null +++ b/src/WhoUses/Makefile @@ -0,0 +1,14 @@ +TARGET=WhoUses.exe + +OBJECTS=WhoUses.o SystemInfo.o + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(CXX) $(CXXFLAGS) -o $@ $^ + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $^ + +clean: + rm $(OBJECTS) $(TARGET) diff --git a/src/WhoUses/README b/src/WhoUses/README new file mode 100644 index 00000000..345fd32f --- /dev/null +++ b/src/WhoUses/README @@ -0,0 +1,5 @@ +This program was taken from + +http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827/ + +and slightly adapted to compile within msysGit. diff --git a/src/WhoUses/SystemInfo.cpp b/src/WhoUses/SystemInfo.cpp new file mode 100644 index 00000000..1585cba5 --- /dev/null +++ b/src/WhoUses/SystemInfo.cpp @@ -0,0 +1,1079 @@ +// Written by Zoltan Csizmadia, zoltan_csizmadia@yahoo.com +// For companies(Austin,TX): If you would like to get my resume, send an email. +// +// The source is free, but if you want to use it, mention my name and e-mail +// address +// +/////////////////////////////////////////////////////////////////////////////// +// +// SystemInfo.cpp v1.1 +// +// History: +// +// Date Version Description +// ---------------------------------------------------------------------------- +// 10/16/00 1.0 Initial version +// 11/09/00 1.1 NT4 doesn't like if we bother the System process fix :) +// SystemInfoUtils::GetDeviceFileName() fix (subst drives +// added) +// NT Major version added to INtDLL class +// +/////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include "SystemInfo.h" + + +#include +using std::stringstream; + +#ifndef WINNT +#error You need Windows NT to use this source code. Define WINNT! +#endif + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemInfoUtils +// +/////////////////////////////////////////////////////////////////////////////// + +// From wide char string to string +void SystemInfoUtils::LPCWSTR2string( LPCWSTR strW, string& str ) +{ +#ifdef UNICODE + // if it is already UNICODE, no problem + str = strW; +#else + str = _T(""); + + TCHAR* actChar = (TCHAR*)strW; + + if ( actChar == _T('\0') ) + return; + + ULONG len = wcslen(strW) + 1; + TCHAR* pBuffer = new TCHAR[ len ]; + TCHAR* pNewStr = pBuffer; + + while ( len-- ) + { + *(pNewStr++) = *actChar; + actChar += 2; + } + + str = pBuffer; + + delete [] pBuffer; +#endif +} + +// From wide char string to unicode +void SystemInfoUtils::Unicode2string( UNICODE_STRING* strU, string& str ) +{ + if ( *(DWORD*)strU != 0 ) + LPCWSTR2string( (LPCWSTR)strU->Buffer, str ); + else + str = _T(""); +} + +// From device file name to DOS filename +BOOL SystemInfoUtils::GetFsFileName( LPCTSTR lpDeviceFileName, + string& fsFileName ) +{ + BOOL rc = FALSE; + + TCHAR lpDeviceName[0x1000]; + TCHAR lpDrive[3] = _T("A:"); + + // Iterating through the drive letters + for ( TCHAR actDrive = _T('A'); actDrive <= _T('Z'); actDrive++ ) { + lpDrive[0] = actDrive; + + // Query the device for the drive letter + if ( QueryDosDevice( lpDrive, lpDeviceName, 0x1000 ) != 0 ) { + // Network drive? + if ( _tcsnicmp( _T("\\Device\\LanmanRedirector\\"), + lpDeviceName, 25 ) == 0 ) { + //Mapped network drive + + char cDriveLetter; + DWORD dwParam; + + TCHAR lpSharedName[0x1000]; + + if ( _stscanf( lpDeviceName, + _T("\\Device\\LanmanRedirector\\;%c:%d\\%s"), + &cDriveLetter, + &dwParam, + lpSharedName ) != 3 ) + continue; + + _tcscpy( lpDeviceName, + _T("\\Device\\LanmanRedirector\\") ); + _tcscat( lpDeviceName, lpSharedName ); + } + + // Is this the drive letter we are looking for? + if ( _tcsnicmp( lpDeviceName, lpDeviceFileName, + _tcslen( lpDeviceName ) ) == 0 ) + { + fsFileName = lpDrive; + fsFileName += (LPCTSTR)( lpDeviceFileName + + _tcslen( lpDeviceName ) ); + + rc = TRUE; + + break; + } + } + } + + return rc; +} + +// From DOS file name to device file name +BOOL SystemInfoUtils::GetDeviceFileName( LPCTSTR lpFsFileName, + string& deviceFileName ) +{ + BOOL rc = FALSE; + TCHAR lpDrive[3]; + + // Get the drive letter + // unfortunetaly it works only with DOS file names + _tcsncpy( lpDrive, lpFsFileName, 2 ); + lpDrive[2] = _T('\0'); + + TCHAR lpDeviceName[0x1000]; + + // Query the device for the drive letter + if ( QueryDosDevice( lpDrive, lpDeviceName, 0x1000 ) != 0 ) + { + // Subst drive? + if ( _tcsnicmp( _T("\\??\\"), lpDeviceName, 4 ) == 0 ) + { + deviceFileName = lpDeviceName + 4; + deviceFileName += lpFsFileName + 2; + + return TRUE; + } + else + // Network drive? + if ( _tcsnicmp( _T("\\Device\\LanmanRedirector\\"), + lpDeviceName, 25 ) == 0 ) { + //Mapped network drive + + char cDriveLetter; + DWORD dwParam; + + TCHAR lpSharedName[0x1000]; + + if ( _stscanf( lpDeviceName, + _T("\\Device\\LanmanRedirector\\;%c:%d\\%s"), + &cDriveLetter, + &dwParam, + lpSharedName ) != 3 ) + return FALSE; + + _tcscpy( lpDeviceName, + _T("\\Device\\LanmanRedirector\\") ); + _tcscat( lpDeviceName, lpSharedName ); + } + + _tcscat( lpDeviceName, lpFsFileName + 2 ); + + deviceFileName = lpDeviceName; + + rc = TRUE; + } + + return rc; +} + +//Get NT version +DWORD SystemInfoUtils::GetNTMajorVersion() +{ + OSVERSIONINFOEX osvi; + BOOL bOsVersionInfoEx; + + // Try calling GetVersionEx using the OSVERSIONINFOEX structure, + // which is supported on Windows 2000. + // + // If that fails, try using the OSVERSIONINFO structure. + + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + + bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi); + + if( bOsVersionInfoEx == 0 ) + { + // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. + + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) + return FALSE; + } + + return osvi.dwMajorVersion; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// INtDll +// +/////////////////////////////////////////////////////////////////////////////// +INtDll::PNtQuerySystemInformation INtDll::NtQuerySystemInformation = NULL; +INtDll::PNtQueryObject INtDll::NtQueryObject = NULL; +INtDll::PNtQueryInformationThread INtDll::NtQueryInformationThread = NULL; +INtDll::PNtQueryInformationFile INtDll::NtQueryInformationFile = NULL; +INtDll::PNtQueryInformationProcess INtDll::NtQueryInformationProcess = NULL; +DWORD INtDll::dwNTMajorVersion = SystemInfoUtils::GetNTMajorVersion(); + +BOOL INtDll::NtDllStatus = INtDll::Init(); + +BOOL INtDll::Init() +{ + // Get the NtDll function pointers + NtQuerySystemInformation = (PNtQuerySystemInformation) + GetProcAddress( GetModuleHandle( _T( "ntdll.dll" ) ), + _T("NtQuerySystemInformation") ); + + NtQueryObject = (PNtQueryObject) + GetProcAddress( GetModuleHandle( _T( "ntdll.dll" ) ), + _T("NtQueryObject") ); + + NtQueryInformationThread = (PNtQueryInformationThread) + GetProcAddress( GetModuleHandle( _T( "ntdll.dll" ) ), + _T("NtQueryInformationThread") ); + + NtQueryInformationFile = (PNtQueryInformationFile) + GetProcAddress( GetModuleHandle( _T( "ntdll.dll" ) ), + _T("NtQueryInformationFile") ); + + NtQueryInformationProcess = (PNtQueryInformationProcess) + GetProcAddress( GetModuleHandle( _T( "ntdll.dll" ) ), + _T("NtQueryInformationProcess") ); + + return NtQuerySystemInformation != NULL && + NtQueryObject != NULL && + NtQueryInformationThread != NULL && + NtQueryInformationFile != NULL && + NtQueryInformationProcess != NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemProcessInformation +// +/////////////////////////////////////////////////////////////////////////////// + +SystemProcessInformation::SystemProcessInformation( BOOL bRefresh ) +{ + m_pBuffer = (UCHAR*)VirtualAlloc ((void*)0x100000, + BufferSize, + MEM_COMMIT, + PAGE_READWRITE); + + if ( bRefresh ) + Refresh(); +} + +SystemProcessInformation::~SystemProcessInformation() +{ + VirtualFree( m_pBuffer, 0, MEM_RELEASE ); +} + +BOOL SystemProcessInformation::Refresh() +{ + m_ProcessInfos.clear(); + m_pCurrentProcessInfo = NULL; + + if ( !NtDllStatus || m_pBuffer == NULL ) + return FALSE; + + // query the process information + if ( INtDll::NtQuerySystemInformation( 5, m_pBuffer, BufferSize, NULL ) + != 0 ) + return FALSE; + + DWORD currentProcessID = GetCurrentProcessId(); //Current Process ID + + SYSTEM_PROCESS_INFORMATION* pSysProcess = + (SYSTEM_PROCESS_INFORMATION*)m_pBuffer; + do + { + // fill the process information map + m_ProcessInfos[pSysProcess->dUniqueProcessId] = pSysProcess; + + // we found this process + if ( pSysProcess->dUniqueProcessId == currentProcessID ) + m_pCurrentProcessInfo = pSysProcess; + + // get the next process information block + if ( pSysProcess->dNext != 0 ) + pSysProcess = (SYSTEM_PROCESS_INFORMATION*) + ((UCHAR*)pSysProcess + pSysProcess->dNext); + else + pSysProcess = NULL; + + } while ( pSysProcess != NULL ); + + return TRUE; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemThreadInformation +// +/////////////////////////////////////////////////////////////////////////////// + +SystemThreadInformation::SystemThreadInformation( DWORD pID, BOOL bRefresh ) +{ + m_processId = pID; + + if ( bRefresh ) + Refresh(); +} + +BOOL SystemThreadInformation::Refresh() +{ + // Get the Thread objects ( set the filter to "Thread" ) + SystemHandleInformation hi( m_processId ); + BOOL rc = hi.SetFilter( _T("Thread"), TRUE ); + + m_ThreadInfos.clear(); + + if ( !rc ) + return FALSE; + + THREAD_INFORMATION ti; + + // Iterating through the found Thread objects + for (list::iterator iter = hi.m_HandleInfos.begin(); iter != hi.m_HandleInfos.end(); iter++) { + SystemHandleInformation::SYSTEM_HANDLE& h = *iter; + + ti.ProcessId = h.ProcessID; + ti.ThreadHandle = (HANDLE)h.HandleNumber; + + // This is one of the threads we are lokking for + if ( SystemHandleInformation::GetThreadId( ti.ThreadHandle, + ti.ThreadId, ti.ProcessId ) ) + m_ThreadInfos.push_back( ti ); + } + + return TRUE; +} + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemHandleInformation +// +/////////////////////////////////////////////////////////////////////////////// + +SystemHandleInformation::SystemHandleInformation( DWORD pID, BOOL bRefresh, + LPCTSTR lpTypeFilter ) +{ + m_processId = pID; + + // Set the filter + SetFilter( lpTypeFilter, bRefresh ); +} + +SystemHandleInformation::~SystemHandleInformation() +{ +} + +BOOL SystemHandleInformation::SetFilter( LPCTSTR lpTypeFilter, BOOL bRefresh ) +{ + // Set the filter ( default = all objects ) + m_strTypeFilter = lpTypeFilter == NULL ? _T("") : lpTypeFilter; + + return bRefresh ? Refresh() : TRUE; +} + +const string& SystemHandleInformation::GetFilter() +{ + return m_strTypeFilter; +} + +BOOL SystemHandleInformation::IsSupportedHandle( SYSTEM_HANDLE& handle ) +{ + //Here you can filter the handles you don't want in the Handle list + + // Windows 2000 supports everything :) + if ( dwNTMajorVersion >= 5 ) + return TRUE; + + //NT4 System process doesn't like if we bother his internal security :) + if ( handle.ProcessID == 2 && handle.HandleType == 16 ) + return FALSE; + + return TRUE; +} + +BOOL SystemHandleInformation::Refresh() +{ + DWORD size = 0x2000; + DWORD needed = 0; + DWORD i = 0; + BOOL ret = TRUE; + string strType; + + m_HandleInfos.clear(); + + if ( !INtDll::NtDllStatus ) + return FALSE; + + // Allocate the memory for the buffer + SYSTEM_HANDLE_INFORMATION* pSysHandleInformation = + (SYSTEM_HANDLE_INFORMATION*) + VirtualAlloc( NULL, size, MEM_COMMIT, PAGE_READWRITE ); + + if ( pSysHandleInformation == NULL ) + return FALSE; + + // Query the needed buffer size for the objects ( system wide ) + if ( INtDll::NtQuerySystemInformation( 16, pSysHandleInformation, + size, &needed ) != 0 ) + { + if ( needed == 0 ) + { + ret = FALSE; + goto cleanup; + } + + // The size was not enough + VirtualFree( pSysHandleInformation, 0, MEM_RELEASE ); + + pSysHandleInformation = (SYSTEM_HANDLE_INFORMATION*) + VirtualAlloc( NULL, size = needed + 256, + MEM_COMMIT, PAGE_READWRITE ); + } + + if ( pSysHandleInformation == NULL ) + return FALSE; + + // Query the objects ( system wide ) + if ( INtDll::NtQuerySystemInformation( 16, pSysHandleInformation, + size, NULL ) != 0 ) + { + ret = FALSE; + goto cleanup; + } + + // Iterating through the objects + for ( i = 0; i < pSysHandleInformation->Count; i++ ) + { + if ( !IsSupportedHandle( pSysHandleInformation->Handles[i] ) ) + continue; + + // ProcessId filtering check + if ( pSysHandleInformation->Handles[i].ProcessID == + m_processId || m_processId == (DWORD)-1 ) { + BOOL bAdd = FALSE; + + if ( m_strTypeFilter == _T("") ) + bAdd = TRUE; + else + { + // Type filtering + GetTypeToken( (HANDLE)pSysHandleInformation + ->Handles[i].HandleNumber, + strType, + pSysHandleInformation + ->Handles[i].ProcessID ); + + bAdd = strType == m_strTypeFilter; + } + + // That's it. We found one. + if ( bAdd ) + { + pSysHandleInformation->Handles[i].HandleType = + (WORD)(pSysHandleInformation + ->Handles[i].HandleType % 256); + + m_HandleInfos.push_back( pSysHandleInformation + ->Handles[i] ); + + } + } + } + +cleanup: + + if ( pSysHandleInformation != NULL ) + VirtualFree( pSysHandleInformation, 0, MEM_RELEASE ); + + return ret; +} + +HANDLE SystemHandleInformation::OpenProcess( DWORD processId ) +{ + // Open the process for handle duplication + return ::OpenProcess( PROCESS_DUP_HANDLE, TRUE, processId ); +} + +HANDLE SystemHandleInformation::DuplicateHandle( HANDLE hProcess, + HANDLE hRemote ) +{ + HANDLE hDup = NULL; + + // Duplicate the remote handle for our process + ::DuplicateHandle( hProcess, hRemote, GetCurrentProcess(), &hDup, + 0, FALSE, DUPLICATE_SAME_ACCESS ); + + return hDup; +} + +//Information functions +BOOL SystemHandleInformation::GetTypeToken( HANDLE h, string& str, + DWORD processId ) +{ + ULONG size = 0x2000; + UCHAR* lpBuffer = NULL; + BOOL ret = FALSE; + + HANDLE handle; + HANDLE hRemoteProcess = NULL; + BOOL remote = processId != GetCurrentProcessId(); + + if ( !NtDllStatus ) + return FALSE; + + if ( remote ) + { + // Open the remote process + hRemoteProcess = OpenProcess( processId ); + + if ( hRemoteProcess == NULL ) + return FALSE; + + // Duplicate the handle + handle = DuplicateHandle( hRemoteProcess, h ); + } + else + handle = h; + + // Query the info size + INtDll::NtQueryObject( handle, 2, NULL, 0, &size ); + + lpBuffer = new UCHAR[size]; + + // Query the info size ( type ) + if ( INtDll::NtQueryObject( handle, 2, lpBuffer, size, NULL ) == 0 ) + { + str = _T(""); + SystemInfoUtils::LPCWSTR2string( (LPCWSTR)(lpBuffer+0x60), + str ); + + ret = TRUE; + } + + if ( remote ) + { + if ( hRemoteProcess != NULL ) + CloseHandle( hRemoteProcess ); + + if ( handle != NULL ) + CloseHandle( handle ); + } + + if ( lpBuffer != NULL ) + delete [] lpBuffer; + + return ret; +} + +BOOL SystemHandleInformation::GetType( HANDLE h, WORD& type, DWORD processId ) +{ + string strType; + + type = OB_TYPE_UNKNOWN; + + if ( !GetTypeToken( h, strType, processId ) ) + return FALSE; + + return GetTypeFromTypeToken( strType.c_str(), type ); +} + +BOOL SystemHandleInformation::GetTypeFromTypeToken( LPCTSTR typeToken, + WORD& type ) +{ + const WORD count = 27; + string constStrTypes[count] = { + _T(""), _T(""), _T("Directory"), _T("SymbolicLink"), + _T("Token"), _T("Process"), _T("Thread"), _T("Unknown7"), + _T("Event"), _T("EventPair"), _T("Mutant"), _T("Unknown11"), + _T("Semaphore"), _T("Timer"), _T("Profile"), + _T("WindowStation"), _T("Desktop"), _T("Section"), _T("Key"), + _T("Port"), _T("WaitablePort"), _T("Unknown21"), + _T("Unknown22"), _T("Unknown23"), _T("Unknown24"), + _T("IoCompletion"), _T("File") }; + + type = OB_TYPE_UNKNOWN; + + for ( WORD i = 1; i < count; i++ ) + if ( constStrTypes[i] == typeToken ) + { + type = i; + return TRUE; + } + + return FALSE; +} + +BOOL SystemHandleInformation::GetName( HANDLE handle, string& str, DWORD processId ) +{ + WORD type = 0; + + if ( !GetType( handle, type, processId ) ) + return FALSE; + + return GetNameByType( handle, type, str, processId ); +} + +BOOL SystemHandleInformation::GetNameByType( HANDLE h, WORD type, string& str, DWORD processId ) +{ + ULONG size = 0x2000; + UCHAR* lpBuffer = NULL; + BOOL ret = FALSE; + + HANDLE handle; + HANDLE hRemoteProcess = NULL; + BOOL remote = processId != GetCurrentProcessId(); + DWORD dwId = 0; + + if ( !NtDllStatus ) + return FALSE; + + if ( remote ) + { + hRemoteProcess = OpenProcess( processId ); + + if ( hRemoteProcess == NULL ) + return FALSE; + + handle = DuplicateHandle( hRemoteProcess, h ); + } + else + handle = h; + + stringstream hex; + // let's be happy, handle is in our process space, so query the infos :) + switch( type ) + { + case OB_TYPE_PROCESS: + GetProcessId( handle, dwId ); + + hex << "PID: 0x" << std::hex << dwId; + str = hex.str(); + + ret = TRUE; + goto cleanup; + break; + + case OB_TYPE_THREAD: + GetThreadId( handle, dwId ); + + hex << "TID: 0x" << std::hex << dwId; + + ret = TRUE; + goto cleanup; + break; + + case OB_TYPE_FILE: + ret = GetFileName( handle, str ); + + // access denied :( + if ( ret && str == _T("") ) + goto cleanup; + break; + + }; + + INtDll::NtQueryObject ( handle, 1, NULL, 0, &size ); + + // let's try to use the default + if ( size == 0 ) + size = 0x2000; + + lpBuffer = new UCHAR[size]; + + if ( INtDll::NtQueryObject( handle, 1, lpBuffer, size, NULL ) == 0 ) + { + SystemInfoUtils::Unicode2string( (UNICODE_STRING*)lpBuffer, str ); + ret = TRUE; + } + +cleanup: + + if ( remote ) + { + if ( hRemoteProcess != NULL ) + CloseHandle( hRemoteProcess ); + + if ( handle != NULL ) + CloseHandle( handle ); + } + + if ( lpBuffer != NULL ) + delete [] lpBuffer; + + return ret; +} + +//Thread related functions +BOOL SystemHandleInformation::GetThreadId( HANDLE h, DWORD& threadID, DWORD processId ) +{ + SystemThreadInformation::BASIC_THREAD_INFORMATION ti; + HANDLE handle; + HANDLE hRemoteProcess = NULL; + BOOL remote = processId != GetCurrentProcessId(); + + if ( !NtDllStatus ) + return FALSE; + + if ( remote ) + { + // Open process + hRemoteProcess = OpenProcess( processId ); + + if ( hRemoteProcess == NULL ) + return FALSE; + + // Duplicate handle + handle = DuplicateHandle( hRemoteProcess, h ); + } + else + handle = h; + + // Get the thread information + if ( INtDll::NtQueryInformationThread( handle, 0, &ti, sizeof(ti), NULL ) == 0 ) + threadID = ti.ThreadId; + + if ( remote ) + { + if ( hRemoteProcess != NULL ) + CloseHandle( hRemoteProcess ); + + if ( handle != NULL ) + CloseHandle( handle ); + } + + return TRUE; +} + +//Process related functions +BOOL SystemHandleInformation::GetProcessPath( HANDLE h, string& strPath, DWORD remoteProcessId ) +{ + h; strPath; remoteProcessId; + + stringstream number; + number << remoteProcessId; + strPath = number.str(); + + return TRUE; +} + +BOOL SystemHandleInformation::GetProcessId( HANDLE h, DWORD& processId, DWORD remoteProcessId ) +{ + BOOL ret = FALSE; + HANDLE handle; + HANDLE hRemoteProcess = NULL; + BOOL remote = remoteProcessId != GetCurrentProcessId(); + SystemProcessInformation::PROCESS_BASIC_INFORMATION pi; + + ZeroMemory( &pi, sizeof(pi) ); + processId = 0; + + if ( !NtDllStatus ) + return FALSE; + + if ( remote ) + { + // Open process + hRemoteProcess = OpenProcess( remoteProcessId ); + + if ( hRemoteProcess == NULL ) + return FALSE; + + // Duplicate handle + handle = DuplicateHandle( hRemoteProcess, h ); + } + else + handle = h; + + // Get the process information + if ( INtDll::NtQueryInformationProcess( handle, 0, &pi, sizeof(pi), NULL) == 0 ) + { + processId = pi.UniqueProcessId; + ret = TRUE; + } + + if ( remote ) + { + if ( hRemoteProcess != NULL ) + CloseHandle( hRemoteProcess ); + + if ( handle != NULL ) + CloseHandle( handle ); + } + + return ret; +} + +//File related functions +void SystemHandleInformation::GetFileNameThread( PVOID pParam ) +{ + // This thread function for getting the filename + // if access denied, we hang up in this function, + // so if it times out we just kill this thread + GetFileNameThreadParam* p = (GetFileNameThreadParam*)pParam; + + UCHAR lpBuffer[0x1000]; + DWORD iob[2]; + + p->rc = INtDll::NtQueryInformationFile( p->hFile, iob, lpBuffer, sizeof(lpBuffer), 9 ); + + if ( p->rc == 0 ) + *p->pName = (const char *)lpBuffer; +} + +BOOL SystemHandleInformation::GetFileName( HANDLE h, string& str, DWORD processId ) +{ + BOOL ret= FALSE; + HANDLE hThread = NULL; + GetFileNameThreadParam tp; + HANDLE handle; + HANDLE hRemoteProcess = NULL; + BOOL remote = processId != GetCurrentProcessId(); + + if ( !NtDllStatus ) + return FALSE; + + if ( remote ) + { + // Open process + hRemoteProcess = OpenProcess( processId ); + + if ( hRemoteProcess == NULL ) + return FALSE; + + // Duplicate handle + handle = DuplicateHandle( hRemoteProcess, h ); + } + else + handle = h; + + tp.hFile = handle; + tp.pName = &str; + tp.rc = 0; + + // Let's start the thread to get the file name + hThread = (HANDLE)_beginthread( GetFileNameThread, 0, &tp ); + + if ( hThread == NULL ) + { + ret = FALSE; + goto cleanup; + } + + // Wait for finishing the thread + if ( WaitForSingleObject( hThread, 100 ) == WAIT_TIMEOUT ) + { + // Access denied + // Terminate the thread + TerminateThread( hThread, 0 ); + + str = _T(""); + + ret = TRUE; + } + else + ret = ( tp.rc == 0 ); + +cleanup: + + if ( remote ) + { + if ( hRemoteProcess != NULL ) + CloseHandle( hRemoteProcess ); + + if ( handle != NULL ) + CloseHandle( handle ); + } + + return ret; +} + +////////////////////////////////////////////////////////////////////////////////////// +// +// SystemModuleInformation +// +////////////////////////////////////////////////////////////////////////////////////// + +SystemModuleInformation::SystemModuleInformation( DWORD pID, BOOL bRefresh ) +{ + m_processId = pID; + + if ( bRefresh ) + Refresh(); +} + +void SystemModuleInformation::GetModuleListForProcess( DWORD processID ) +{ + DWORD i = 0; + DWORD cbNeeded = 0; + HMODULE* hModules = NULL; + MODULE_INFO moduleInfo; + + // Open process to read to query the module list + HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); + + if ( hProcess == NULL ) + goto cleanup; + + //Get the number of modules + if ( !(*m_EnumProcessModules)( hProcess, NULL, 0, &cbNeeded ) ) + goto cleanup; + + hModules = new HMODULE[ cbNeeded / sizeof( HMODULE ) ]; + + //Get module handles + if ( !(*m_EnumProcessModules)( hProcess, hModules, cbNeeded, &cbNeeded ) ) + goto cleanup; + + for ( i = 0; i < cbNeeded / sizeof( HMODULE ); i++ ) + { + moduleInfo.ProcessId = processID; + moduleInfo.Handle = hModules[i]; + + //Get module full paths + if ( (*m_GetModuleFileNameEx)( hProcess, hModules[i], moduleInfo.FullPath, _MAX_PATH ) ) + m_ModuleInfos.push_back( moduleInfo ); + } + +cleanup: + if ( hModules != NULL ) + delete [] hModules; + + if ( hProcess != NULL ) + CloseHandle( hProcess ); +} + +BOOL SystemModuleInformation::Refresh() +{ + BOOL rc = FALSE; + m_EnumProcessModules = NULL; + m_GetModuleFileNameEx = NULL; + + m_ModuleInfos.clear(); + + //Load Psapi.dll + HINSTANCE hDll = LoadLibrary( "PSAPI.DLL" ); + + if ( hDll == NULL ) + { + rc = FALSE; + goto cleanup; + } + + //Get Psapi.dll functions + m_EnumProcessModules = (PEnumProcessModules)GetProcAddress( hDll, "EnumProcessModules" ); + + m_GetModuleFileNameEx = (PGetModuleFileNameEx)GetProcAddress( hDll, +#ifdef UNICODE + "GetModuleFileNameExW" ); +#else + "GetModuleFileNameExA" ); +#endif + + if ( m_GetModuleFileNameEx == NULL || m_EnumProcessModules == NULL ) + { + rc = FALSE; + goto cleanup; + } + + // Everey process or just a particular one + if ( m_processId != -1 ) + // For a particular one + GetModuleListForProcess( m_processId ); + else + { + // Get teh process list + DWORD pID; + SystemProcessInformation::SYSTEM_PROCESS_INFORMATION* p = NULL; + SystemProcessInformation pi( TRUE ); + + if ( pi.m_ProcessInfos.empty() ) + { + rc = FALSE; + goto cleanup; + } + + // Iterating through the processes and get the module list + for (map::iterator iter = pi.m_ProcessInfos.begin(); iter != pi.m_ProcessInfos.end(); iter++) { + pID = iter->first; + p = iter->second; + GetModuleListForProcess( pID ); + } + } + + rc = TRUE; + +cleanup: + + //Free psapi.dll + if ( hDll != NULL ) + FreeLibrary( hDll ); + + return rc; +} + +////////////////////////////////////////////////////////////////////////////////////// +// +// SystemWindowInformation +// +////////////////////////////////////////////////////////////////////////////////////// + +SystemWindowInformation::SystemWindowInformation( DWORD pID, BOOL bRefresh ) +{ + m_processId = pID; + + if ( bRefresh ) + Refresh(); +} + +BOOL SystemWindowInformation::Refresh() +{ + m_WindowInfos.clear(); + + // Enumerating the windows + EnumWindows( EnumerateWindows, (LPARAM)this ); + + return TRUE; +} + +BOOL CALLBACK SystemWindowInformation::EnumerateWindows( HWND hwnd, LPARAM lParam ) +{ + SystemWindowInformation* _this = (SystemWindowInformation*)lParam; + WINDOW_INFO wi; + + wi.hWnd = hwnd; + GetWindowThreadProcessId(hwnd, &wi.ProcessId ) ; + + // Filtering by process ID + if ( _this->m_processId == -1 || _this->m_processId == wi.ProcessId ) + { + GetWindowText( hwnd, wi.Caption, MaxCaptionSize ); + + // That is we are looking for + if ( GetLastError() == 0 ) + _this->m_WindowInfos.push_back( wi ); + } + + return TRUE; +}; diff --git a/src/WhoUses/SystemInfo.h b/src/WhoUses/SystemInfo.h new file mode 100644 index 00000000..bd99537e --- /dev/null +++ b/src/WhoUses/SystemInfo.h @@ -0,0 +1,429 @@ +// Written by Zoltan Csizmadia, zoltan_csizmadia@yahoo.com +// For companies(Austin,TX): If you would like to get my resume, send an email. +// +// The source is free, but if you want to use it, mention my name and e-mail address +// +////////////////////////////////////////////////////////////////////////////////////// +// +// SystemInfo.h, v1.1 + +#ifndef SYSTEMINFO_H_INCLUDED +#define SYSTEMINFO_H_INCLUDED + +#ifndef WINNT +#error You need Windows NT to use this source code. Define WINNT! +#endif + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#pragma warning( disable : 4786 ) +#pragma warning( disable : 4200 ) + +#include +#include +#include +using std::map; +using std::string; +using std::list; + +/////////////////////////////////////////////////////////////////////////////// +// +// Typedefs +// +/////////////////////////////////////////////////////////////////////////////// + +typedef struct _UNICODE_STRING +{ + WORD Length; + WORD MaximumLength; + PWSTR Buffer; +} UNICODE_STRING; + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemInfoUtils +// +/////////////////////////////////////////////////////////////////////////////// + +// Helper functions + +class SystemInfoUtils +{ +public: + + /////////////////////////////////////////////////////////////////////// + // String conversion functions + + // From wide char string to string + static void LPCWSTR2string( LPCWSTR strW, string& str ); + // From unicode string to string + static void Unicode2string( UNICODE_STRING* strU, string& str ); + + /////////////////////////////////////////////////////////////////////// + // File name conversion functions + + static BOOL GetDeviceFileName( LPCTSTR, string& ); + static BOOL GetFsFileName( LPCTSTR, string& ); + + /////////////////////////////////////////////////////////////////////// + // Information functions + + static DWORD GetNTMajorVersion(); +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// INtDll +// +/////////////////////////////////////////////////////////////////////////////// + +class INtDll +{ +public: + typedef DWORD (WINAPI *PNtQueryObject)( HANDLE, DWORD, VOID*, DWORD, VOID* ); + typedef DWORD (WINAPI *PNtQuerySystemInformation)( DWORD, VOID*, DWORD, ULONG* ); + typedef DWORD (WINAPI *PNtQueryInformationThread)(HANDLE, ULONG, PVOID, DWORD, DWORD* ); + typedef DWORD (WINAPI *PNtQueryInformationFile)(HANDLE, PVOID, PVOID, DWORD, DWORD ); + typedef DWORD (WINAPI *PNtQueryInformationProcess)(HANDLE, DWORD, PVOID, DWORD, PVOID ); + +public: + static PNtQuerySystemInformation NtQuerySystemInformation; + static PNtQueryObject NtQueryObject; + static PNtQueryInformationThread NtQueryInformationThread; + static PNtQueryInformationFile NtQueryInformationFile; + static PNtQueryInformationProcess NtQueryInformationProcess; + + static BOOL NtDllStatus; + + static DWORD dwNTMajorVersion; + +protected: + static BOOL Init(); +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemProcessInformation +// +/////////////////////////////////////////////////////////////////////////////// + +class SystemProcessInformation : public INtDll +{ +public: + typedef LARGE_INTEGER QWORD; + + typedef struct _PROCESS_BASIC_INFORMATION { + DWORD ExitStatus; + PVOID PebBaseAddress; + DWORD AffinityMask; + DWORD BasePriority; + DWORD UniqueProcessId; + DWORD InheritedFromUniqueProcessId; + } PROCESS_BASIC_INFORMATION; + + typedef struct _VM_COUNTERS + { + DWORD PeakVirtualSize; + DWORD VirtualSize; + DWORD PageFaultCount; + DWORD PeakWorkingSetSize; + DWORD WorkingSetSize; + DWORD QuotaPeakPagedPoolUsage; + DWORD QuotaPagedPoolUsage; + DWORD QuotaPeakNonPagedPoolUsage; + DWORD QuotaNonPagedPoolUsage; + DWORD PagefileUsage; + DWORD PeakPagefileUsage; + } VM_COUNTERS; + + typedef struct _SYSTEM_THREAD + { + DWORD u1; + DWORD u2; + DWORD u3; + DWORD u4; + DWORD ProcessId; + DWORD ThreadId; + DWORD dPriority; + DWORD dBasePriority; + DWORD dContextSwitches; + DWORD dThreadState; // 2=running, 5=waiting + DWORD WaitReason; + DWORD u5; + DWORD u6; + DWORD u7; + DWORD u8; + DWORD u9; + } SYSTEM_THREAD; + + typedef struct _SYSTEM_PROCESS_INFORMATION + { + DWORD dNext; + DWORD dThreadCount; + DWORD dReserved01; + DWORD dReserved02; + DWORD dReserved03; + DWORD dReserved04; + DWORD dReserved05; + DWORD dReserved06; + QWORD qCreateTime; + QWORD qUserTime; + QWORD qKernelTime; + UNICODE_STRING usName; + DWORD BasePriority; + DWORD dUniqueProcessId; + DWORD dInheritedFromUniqueProcessId; + DWORD dHandleCount; + DWORD dReserved07; + DWORD dReserved08; + VM_COUNTERS VmCounters; + DWORD dCommitCharge; + SYSTEM_THREAD Threads[1]; + } SYSTEM_PROCESS_INFORMATION; + + enum { BufferSize = 0x10000 }; + +public: + SystemProcessInformation( BOOL bRefresh = FALSE ); + virtual ~SystemProcessInformation(); + + BOOL Refresh(); + +public: + map< DWORD, SYSTEM_PROCESS_INFORMATION*> m_ProcessInfos; + SYSTEM_PROCESS_INFORMATION* m_pCurrentProcessInfo; + +protected: + UCHAR* m_pBuffer; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemThreadInformation +// +/////////////////////////////////////////////////////////////////////////////// + +class SystemThreadInformation : public INtDll +{ +public: + typedef struct _THREAD_INFORMATION + { + DWORD ProcessId; + DWORD ThreadId; + HANDLE ThreadHandle; + } THREAD_INFORMATION; + + + typedef struct _BASIC_THREAD_INFORMATION { + DWORD u1; + DWORD u2; + DWORD u3; + DWORD ThreadId; + DWORD u5; + DWORD u6; + DWORD u7; + } BASIC_THREAD_INFORMATION; + +public: + SystemThreadInformation( DWORD pID = (DWORD)-1, BOOL bRefresh = FALSE ); + + BOOL Refresh(); + +public: + list< THREAD_INFORMATION > m_ThreadInfos; + DWORD m_processId; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemHandleInformation +// +/////////////////////////////////////////////////////////////////////////////// + +class SystemHandleInformation : public INtDll +{ +public: + enum { + OB_TYPE_UNKNOWN = 0, + OB_TYPE_TYPE = 1, + OB_TYPE_DIRECTORY, + OB_TYPE_SYMBOLIC_LINK, + OB_TYPE_TOKEN, + OB_TYPE_PROCESS, + OB_TYPE_THREAD, + OB_TYPE_UNKNOWN_7, + OB_TYPE_EVENT, + OB_TYPE_EVENT_PAIR, + OB_TYPE_MUTANT, + OB_TYPE_UNKNOWN_11, + OB_TYPE_SEMAPHORE, + OB_TYPE_TIMER, + OB_TYPE_PROFILE, + OB_TYPE_WINDOW_STATION, + OB_TYPE_DESKTOP, + OB_TYPE_SECTION, + OB_TYPE_KEY, + OB_TYPE_PORT, + OB_TYPE_WAITABLE_PORT, + OB_TYPE_UNKNOWN_21, + OB_TYPE_UNKNOWN_22, + OB_TYPE_UNKNOWN_23, + OB_TYPE_UNKNOWN_24, + //OB_TYPE_CONTROLLER, + //OB_TYPE_DEVICE, + //OB_TYPE_DRIVER, + OB_TYPE_IO_COMPLETION, + OB_TYPE_FILE + } SystemHandleType; + +public: + typedef struct _SYSTEM_HANDLE + { + DWORD ProcessID; + WORD HandleType; + WORD HandleNumber; + DWORD KernelAddress; + DWORD Flags; + } SYSTEM_HANDLE; + + typedef struct _SYSTEM_HANDLE_INFORMATION + { + DWORD Count; + SYSTEM_HANDLE Handles[1]; + } SYSTEM_HANDLE_INFORMATION; + +protected: + typedef struct _GetFileNameThreadParam + { + HANDLE hFile; + string* pName; + ULONG rc; + } GetFileNameThreadParam; + +public: + SystemHandleInformation( DWORD pID = (DWORD)-1, BOOL bRefresh = FALSE, LPCTSTR lpTypeFilter = NULL ); + ~SystemHandleInformation(); + + BOOL SetFilter( LPCTSTR lpTypeFilter, BOOL bRefresh = TRUE ); + const string& GetFilter(); + + BOOL Refresh(); + +public: + //Information functions + static BOOL GetType( HANDLE, WORD&, DWORD processId = GetCurrentProcessId() ); + static BOOL GetTypeToken( HANDLE, string&, DWORD processId = GetCurrentProcessId() ); + static BOOL GetTypeFromTypeToken( LPCTSTR typeToken, WORD& type ); + static BOOL GetNameByType( HANDLE, WORD, string& str, DWORD processId = GetCurrentProcessId()); + static BOOL GetName( HANDLE, string&, DWORD processId = GetCurrentProcessId() ); + + //Thread related functions + static BOOL GetThreadId( HANDLE, DWORD&, DWORD processId = GetCurrentProcessId() ); + + //Process related functions + static BOOL GetProcessId( HANDLE, DWORD&, DWORD processId = GetCurrentProcessId() ); + static BOOL GetProcessPath( HANDLE h, string& strPath, DWORD processId = GetCurrentProcessId()); + + //File related functions + static BOOL GetFileName( HANDLE, string&, DWORD processId = GetCurrentProcessId() ); + +public: + //For remote handle support + static HANDLE OpenProcess( DWORD processId ); + static HANDLE DuplicateHandle( HANDLE hProcess, HANDLE hRemote ); + +protected: + static void GetFileNameThread( PVOID /* GetFileNameThreadParam* */ ); + BOOL IsSupportedHandle( SYSTEM_HANDLE& handle ); + +public: + list< SYSTEM_HANDLE > m_HandleInfos; + DWORD m_processId; + +protected: + string m_strTypeFilter; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemModuleInformation +// +/////////////////////////////////////////////////////////////////////////////// + +class SystemModuleInformation +{ +public: + typedef struct _MODULE_INFO + { + DWORD ProcessId; + TCHAR FullPath[_MAX_PATH]; + HMODULE Handle; + } MODULE_INFO; + +public: + typedef DWORD (WINAPI *PEnumProcessModules)( + HANDLE hProcess, // handle to process + HMODULE *lphModule, // array of module handles + DWORD cb, // size of array + LPDWORD lpcbNeeded // number of bytes required + ); + + typedef DWORD (WINAPI *PGetModuleFileNameEx)( + HANDLE hProcess, // handle to process + HMODULE hModule, // handle to module + LPTSTR lpFilename, // path buffer + DWORD nSize // maximum characters to retrieve + ); + +public: + SystemModuleInformation( DWORD pID = (DWORD)-1, BOOL bRefresh = FALSE ); + + BOOL Refresh(); + +protected: + void GetModuleListForProcess( DWORD processID ); + +public: + DWORD m_processId; + list< MODULE_INFO > m_ModuleInfos; + +protected: + PEnumProcessModules m_EnumProcessModules; + PGetModuleFileNameEx m_GetModuleFileNameEx; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// SystemWindowInformation +// +/////////////////////////////////////////////////////////////////////////////// + +class SystemWindowInformation +{ +public: + enum { MaxCaptionSize = 1024 }; + + typedef struct _WINDOW_INFO + { + DWORD ProcessId; + TCHAR Caption[MaxCaptionSize]; + HWND hWnd; + } WINDOW_INFO; + +public: + SystemWindowInformation( DWORD pID = (DWORD)-1, BOOL bRefresh = FALSE ); + + BOOL Refresh(); + +protected: + static BOOL CALLBACK EnumerateWindows( HWND hwnd, LPARAM lParam ); + +public: + DWORD m_processId; + list< WINDOW_INFO > m_WindowInfos; +}; + +#endif diff --git a/src/WhoUses/WhoUses.cpp b/src/WhoUses/WhoUses.cpp new file mode 100644 index 00000000..0deb5a2a --- /dev/null +++ b/src/WhoUses/WhoUses.cpp @@ -0,0 +1,264 @@ +// Written by Zoltan Csizmadia, zoltan_csizmadia@yahoo.com +// For companies(Austin,TX): If you would like to get my resume, send an email. +// +// The source is free, but if you want to use it, mention my name and e-mail +// address +// +/////////////////////////////////////////////////////////////////////////////// +// +// WhoUses.cpp : Defines the entry point for the console application. +// + +#include +#include +#include "SystemInfo.h" + +LPCTSTR GetFileNamePosition( LPCTSTR lpPath ) +{ + LPCTSTR lpAct = lpPath + _tcslen( lpPath ); + + while ( lpAct > lpPath && *lpAct != _T('\\') && *lpAct != _T('/') ) + lpAct--; + + if ( lpAct > lpPath ) + lpAct++; + + return lpAct; +} + +void WhoUsesModule( LPCTSTR lpFileName, BOOL bFullPathCheck ) +{ + string processName; + BOOL bShow = FALSE; + SystemProcessInformation::SYSTEM_PROCESS_INFORMATION* p; + + SystemProcessInformation pi; + SystemModuleInformation mi; + + if ( !mi.Refresh() ) + { + _tprintf( _T("SystemModulesInformation::Refresh() failed.\n") ); + return; + } + + if ( mi.m_ModuleInfos.empty() ) + { + _tprintf( _T("No module information\n") ); + return; + } + + pi.Refresh(); + + _tprintf( _T("%-6s %-20s %s\n"), _T("PID"), _T("Name"), _T("Path") ); + _tprintf( _T("------------------------------------------------------------------\n") ); + + for (list::iterator iter2 = mi.m_ModuleInfos.begin(); iter2 != mi.m_ModuleInfos.end(); iter2++) { + SystemModuleInformation::MODULE_INFO& m = *iter2; + + if ( bFullPathCheck ) + bShow = _tcsicmp( m.FullPath, lpFileName ) == 0; + else + bShow = _tcsicmp( GetFileNamePosition(m.FullPath), lpFileName ) == 0; + + if ( bShow ) + { + p = pi.m_ProcessInfos[m.ProcessId]; + if (p) { + SystemInfoUtils::Unicode2string( &p->usName, processName ); + } + else + processName = ""; + + _tprintf( _T("0x%04X %-20s %s\n"), + m.ProcessId, + processName.c_str(), + m.FullPath ); + } + } +} + +void WhoUsesFile( LPCTSTR lpFileName, BOOL bFullPathCheck ) +{ + BOOL bShow = FALSE; + string name; + string processName; + string deviceFileName; + string fsFilePath; + SystemProcessInformation::SYSTEM_PROCESS_INFORMATION* p; + SystemProcessInformation pi; + SystemHandleInformation hi; + + if ( bFullPathCheck ) + { + if ( !SystemInfoUtils::GetDeviceFileName( lpFileName, deviceFileName ) ) + { + _tprintf( _T("GetDeviceFileName() failed.\n") ); + return; + } + } + + hi.SetFilter( _T("File"), TRUE ); + + if ( hi.m_HandleInfos.empty() ) + { + _tprintf( _T("No handle information\n") ); + return; + } + + pi.Refresh(); + + _tprintf( _T("%-6s %-20s %s\n"), _T("PID"), _T("Name"), _T("Path") ); + _tprintf( _T("------------------------------------------------------\n") ); + + for (list::iterator iter = hi.m_HandleInfos.begin(); iter != hi.m_HandleInfos.end(); iter++) { + SystemHandleInformation::SYSTEM_HANDLE& h = *iter; + + p = pi.m_ProcessInfos[h.ProcessID]; + if (p) { + SystemInfoUtils::Unicode2string( &p->usName, processName ); + } + else + processName = ""; + + //NT4 Stupid thing if it is the services.exe and I call GetName :(( + if ( INtDll::dwNTMajorVersion == 4 && _tcsicmp( processName.c_str(), _T("services.exe" ) ) == 0 ) + continue; + + hi.GetName( (HANDLE)h.HandleNumber, name, (DWORD)h.ProcessID ); + + if ( bFullPathCheck ) + bShow = _tcsicmp( name.c_str(), deviceFileName.c_str() ) == 0; + else + bShow = _tcsicmp( GetFileNamePosition(name.c_str()), lpFileName ) == 0; + + if ( bShow ) + { + if ( !bFullPathCheck ) + { + fsFilePath = ""; + SystemInfoUtils::GetFsFileName( name.c_str(), fsFilePath ); + } + + _tprintf( _T("0x%04X %-20s %s\n"), + h.ProcessID, + processName.c_str(), + !bFullPathCheck ? fsFilePath.c_str() : lpFileName ); + } + } +} + +void EnableDebugPriv( void ) +{ + HANDLE hToken; + LUID sedebugnameValue; + TOKEN_PRIVILEGES tkp; + + // enable the SeDebugPrivilege + if ( ! OpenProcessToken( GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) + { + _tprintf( _T("OpenProcessToken() failed, Error = %d SeDebugPrivilege is not available.\n") , GetLastError() ); + return; + } + + if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ) + { + _tprintf( _T("LookupPrivilegeValue() failed, Error = %d SeDebugPrivilege is not available.\n"), GetLastError() ); + CloseHandle( hToken ); + return; + } + + tkp.PrivilegeCount = 1; + tkp.Privileges[0].Luid = sedebugnameValue; + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) ) + _tprintf( _T("AdjustTokenPrivileges() failed, Error = %d SeDebugPrivilege is not available.\n"), GetLastError() ); + + CloseHandle( hToken ); +} + +void ShowUsage() +{ + _tprintf( _T("WhoUses 1.0 for www.codeguru.com\n") ); + _tprintf( _T("Written by Zoltan Csizmadia, zoltan_csizmadia@yahoo.com \n") ); + _tprintf( _T("\n") ); + _tprintf( _T("Usage: WhoUses.exe [-M] fileName\n") ); + _tprintf( _T("\n") ); + _tprintf( _T(" -M fileName is a module name ( EXE, DLL, ... )\n") ); + _tprintf( _T(" fileName File name\n") ); + _tprintf( _T("\n") ); + _tprintf( _T("Examples:\n") ); + _tprintf( _T("\n") ); + _tprintf( _T(" WhoUses.exe -M kernel32.dll\n") ); + _tprintf( _T(" WhoUses.exe -M c:\\test\\test.dll\n") ); + _tprintf( _T(" WhoUses.exe yourTextFile.txt\n") ); + _tprintf( _T(" WhoUses.exe c:\\pagefile.sys\n") ); + _tprintf( _T(" WhoUses.exe Serial0\n") ); +} + +int _tmain(int argc, TCHAR* argv[]) +{ + ULONG nonSwitchCount = 0; + BOOL bModule = FALSE; + LPCTSTR lpPath = NULL; + BOOL bFullPathCheck = FALSE; + BOOL bUsage = TRUE; + TCHAR lpFilePath[_MAX_PATH]; + + for ( int i = 1; i < argc; i++ ) + { + if ( _tcsicmp( argv[i], _T("-h" ) ) == 0 || _tcsicmp( argv[i], _T("-?" ) ) == 0 ) + { + bUsage = TRUE; + break; + } + else + if ( _tcsicmp( argv[i], _T("-m" ) ) == 0 || _tcsicmp( argv[i], _T("-m" ) ) == 0 ) + { + bModule = TRUE; + } + else + { + if ( nonSwitchCount != 0 ) + { + bUsage = TRUE; + break; + } + + lpPath = argv[i]; + + bUsage = FALSE; + + nonSwitchCount++; + } + } + + if ( bUsage ) + { + ShowUsage(); + return -1; + } + + EnableDebugPriv(); + + bFullPathCheck = GetFileNamePosition( lpPath ) != lpPath ; + + if ( bFullPathCheck ) + { + if ( GetFullPathName( lpPath, _MAX_PATH, lpFilePath, NULL ) == 0 ) + { + _tprintf( _T("GetFullPathName() failed. Error = %d\n"), GetLastError() ); + return -2; + } + } + else + _tcscpy( lpFilePath, GetFileNamePosition( lpPath ) ); + + if ( bModule ) + WhoUsesModule( lpFilePath, bFullPathCheck ); + else + WhoUsesFile( lpFilePath, bFullPathCheck ); + + return 0; +} -- 2.11.4.GIT