StreamLine Posted December 4, 2009 Posted December 4, 2009 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
GamingMasteR Posted December 4, 2009 Posted December 4, 2009 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]
StreamLine Posted December 4, 2009 Author Posted December 4, 2009 thank you for your reply, i will try the first method you mentioned howerver could you explain more about the second method.
GamingMasteR Posted December 5, 2009 Posted December 5, 2009 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]
RaX Posted December 29, 2009 Posted December 29, 2009 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);
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now