ReadFile from raw disk -> access denied



  • Heyho,

    Ich versuche den MBR meiner HDD bzw. meines usb flash speichers zu lesen. Das Handle kann ich erstellen, jedoch kann ich nicht davon lesen. GetLastError() liefert mir acces denied zurück. Kenn mich mit der WinAPI net dolle aus. Von daher kanns auch sein, dass ich die Sache ganz falsch angehe ^^... Wie schaffens denn etliche Disk Editor Programme den MBR auszulesen?

    Hier mein Code:

    #include <Windows.h>
    #include <stdio.h>
    
    int main(void)
    {
    	char buffer[513] = {'\0'};
    	int i;
    	BOOL bResult = 0;
    	HANDLE hDevice;
    
    	hDevice = CreateFileA("\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    
    	if (hDevice != INVALID_HANDLE_VALUE)
    	{
    		bResult = ReadFile(hDevice, buffer, 512, NULL, NULL);
    
    		if (bResult)
    		{
    			for (i = 0; i < 512; ++i)
    			{
    				printf("%02x ", buffer[i]);
    				if (!((i + 1) % 16)) printf("\n");
    			}
    		}
    		else printf("Could not read from raw disk!\nError: %d\n", GetLastError());
    	}
    	else printf("Could not create handle to raw disk!\nError: %d\n", GetLastError());
    
    	system("pause");
    }
    

    Benutze PhysicalDrive0 für meine HDD im Laptop auf der Windows 7 am laufen ist und PhysicalDrive1 für meinen USB Stick. Ändere ich den zweiten Parameter von 0 auf GENERIC_READ kann ich nicht einmal das Handle zur raw disk erstellen. Habe die Programme auch als Admin ausgeführt (deshalb das system("pause");) was auch nicht geholfen hat und den USB Stick hab ich auch via Windows ausgeworfen in der Hoffnung, dass er net mehr gemountet ist und ich dann zugreifen kann. Leider auch vergeblich.



  • Der 2. Parameter bei CreateFileA() a sollte GENERIC_READ sein. Beim 4. Parameter von ReadFile() solltest du die tatsächlich gelesenen Bytes entnehmen.

    Edit: Die Ausgabe von printf solltest du auch nochmal überdenken.

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx



  • -lowbyte- schrieb:

    Der 2. Parameter bei CreateFileA() a sollte GENERIC_READ sein. Beim 4. Parameter von ReadFile() solltest du die tatsächlich gelesenen Bytes entnehmen.

    Wie bereits geschrieben kann ich mit GENERIC_READ nicht einmal das Handle erstellen. Ich meine da kam dann auch direkt ACCESS_DENIED.
    Das entnehmen der gelesenen bytes hat auch net geholfen.

    -lowbyte- schrieb:

    Edit: Die Ausgabe von printf solltest du auch nochmal überdenken.

    Hab in meiner bearbeiteten Version char zu unsigned char gewechselt damit die Ausgabe richtig funktioniert. Hab ich noch was übersehen?

    Hab nach dem durchstöbern von StackExchange endlich ne super Lösung gefunden. Anstatt die WinAPI zu benutzen, einfach die fopen() fread() Funktionen benutzen. Klappt super! [insert Microsoft flaming] 😉 Hier mal das funktionierende Programm.

    #include <Windows.h>
    #include <stdio.h>
    
    int main(void)
    {
    	unsigned char buffer[512] = {'\0'};
    	int i;
    
    	FILE *disk = fopen("\\\\.\\PhysicalDrive0", "rb+");
    
    	if (disk)
    	{
    		fread(buffer, 1, 512, disk);
    		for (i = 0; i < 512; ++i)
    		{
    			printf("%02X ", buffer[i]);
    			if (!((i + 1) % 16)) printf("\n");
    		}
    
    		fclose(disk);
    	}
    	else printf("Couldn't open raw disk!\nRun software with administrator privileges!\n");
    
    	system("pause");
    }
    

Anmelden zum Antworten