Environment: Windows NT4 SP6, Windows 2000
This is a command line utility to close and delete a file which is locked
by another process. I doesn’t work with modules.
Usage
FORCEDEL.EXE [/S] filename /S Soft delete. Like the "del" command filename File name you want to delete
How does it work?
- Query the used file handles (system wide), and search for the processes
which are using the file we want to delete. -
Start a remote thread (CreateRemoteThread) to close the given handle in
every found process (#1)
For more information, check out the CodeGuru article entitled,
Examine Information on Windows NT System Level Primitives.
Code
The following code closes a handle in a remote process. The handle must be
remote process specific.
/* Note: 1. SE_DEBUG privilege must be enabled. 2. The function works with every kind of HANDLE 3. It will bother the remote process :) 4. The handles will be invalid after you closed them remotely */ //Close a handle in a remote process DWORD CloseRemoteHandle( DWORD processID, HANDLE handle ) { HANDLE ht = 0; DWORD rc = 0; _tprintf( _T("Closing handle in process #%d ... "), processID ); // open the process HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, processID ); if ( hProcess == NULL ) { rc = GetLastError(); _tprintf( _T("OpenProcess() failedn") ); return rc; } // load kernel32.dll HMODULE hKernel32 = LoadLibrary( _T("kernel32.dll") ); // CreateRemoteThread() ht = CreateRemoteThread( hProcess, 0, 0, (DWORD(__stdcall *)(void*))GetProcAddress(hKernel32,"CloseHandle"), handle, 0, &rc ); if ( ht == NULL ) { //Something is wrong with the privileges, //or the process doesn't like us rc = GetLastError(); _tprintf( _T("CreateRemoteThread() failedn") ); goto cleanup; } switch ( WaitForSingleObject( ht, 2000 ) ) { case WAIT_OBJECT_0: //Well done rc = 0; _tprintf( _T("Okn"), rc ); break; default: //Oooops, shouldn't be here rc = GetLastError(); _tprintf( _T("WaitForSingleObject() failedn") ); goto cleanup; break; } cleanup: //Closes the remote thread handle CloseHandle( ht ); //Free up the kernel32.dll if ( hKernel32 != NULL) FreeLibrary( hKernel32 ); //Close the process handle CloseHandle( hProcess ); return rc; }