Jump to content
Tuts 4 You

Handles of a given file


StreamLine

Recommended Posts

Posted

I am designing a delete function for a file manager i am coding however, i want to be able to delete a file even if you get that stupid windows "cant not delete due to blah" message. programs like unlocker. http://ccollomb.free.fr/unlocker/ search for all open handles for a given file and close them how is this acheived? i know after all handles are closed the obvious DeleteFileA is callled to delete the file.

example, file1.txt has handle 1 and handle 2 open.

search and find the handes CloseHandle(1) close handle(2)

deleteFileA(file.txt);

Delphi prefered but would settle with other langs and convert my self.

TIA

Posted

Hi,

1- Enumerate all processes opened handles via NtQuerySystemInformation .

2- Query all returned handles and check if it belogs to the victim file .

3- Close the victim file handles via NtDuplicateObject + DUPLICATE_CLOSE_SOURCE .

4- Delete the file .

Or :

You can modify the filesystem directly and delete the file entry .

Good luck,

[GM]

Posted

thank you for your reply, i will try the first method you mentioned :P howerver could you explain more about the second method.

Posted

Hello,

Every file is represented as an entry in the filesystem on physical disk, the referred method is achieved by 1st knowing the filesystem type of the partition (NTFS/FAT32/FAT12 .. etc) .

Second you need to walk through the files entries and manipulate it by directly writing data to the disk and mark the victim file entry as "deleted", this depends on the filesystem type .

You can start from here :
/>http://www.ntfs.com/

Good luck,

[GM]

  • 4 weeks later...
Posted

I once did something similar using a GetFileSize loop, but you will need to know the size of the file you are trying to obtain the handle for.

I am not sure if this will work, I am not even sure if my code will work but maybe you can use the idea. I think can convert the code to delphi easily enough.


int i, filesize;
int expected_file_size=1234; // The size of he file you are looking forfor (i=0; i < 65536; i++)
{
filesize = GetFileSize(i, NULL);
if (filesize == expected_file_size)
{
break;
}
}
CloseHandle(i);

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...