'Hex-Viewer'



  • Der folgende Code (stellt die ersten 512 Bytes hexadezimal dar) funktioniert bei Disketten, nicht aber mit der Festplatte oder einem USB-Modem (Fehler bei 'ReadFile(...)').

    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	BYTE inhalt[512];
    	DWORD gelesen;
    	HANDLE floppy=CreateFile(L"\\\\.\\A:", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    	if(floppy!=NULL)
    	{
    		if(ReadFile(floppy, inhalt, 512, &gelesen, NULL))
    		{
    			for(unsigned short j=0; j<32; ++j)
    			{
    				for(unsigned short i=j*16; i<(j+1)*16; ++i) printf("%2x ", inhalt[i]);
    				cout << '\n';
    			}
    		}
    		else cout << "Fehler beim Lesen.\n";
    	}
    	else cout << "Fehler beim Erstellen.\n";
    	return 0;
    }
    

    Hab auch die .exe als Administrator ausgeführt, kein Unterschied. Wo liegt da das Problem? 😕



  • CreateFile(..) gibt nicht NULL zurück wenns schief geht:
    http://msdn.microsoft.com/en-us/library/aa914735.aspx

    Vermutlich geht dieser Aufruf schonmal schief...


  • Mod

    theta schrieb:

    CreateFile(..) gibt nicht NULL zurück wenns schief geht:
    http://msdn.microsoft.com/en-us/library/aa914735.aspx

    Vermutlich geht dieser Aufruf schonmal schief...

    Nö! Ein weit verbreiteter Irrtum...
    Bei Fehlern kommt INVALID_HANDLE_VALUE zurück.



  • Gut, hab ich das wo falsch gelesen. Jetzt kommt immerhin ein 'Fehler beim Erstellen'.

    #include <Windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	BYTE inhalt[512];
    	DWORD gelesen;
    	HANDLE floppy=CreateFile(L"\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    	if(floppy!=INVALID_HANDLE_VALUE)
    	{
    		if(ReadFile(floppy, inhalt, 512, &gelesen, NULL))
    		{
    			for(unsigned short j=0; j<32; ++j)
    			{
    				for(unsigned short i=j*16; i<(j+1)*16; ++i) printf("%2x ", inhalt[i]);
    				cout << '\n';
    			}
    		}
    		else cout << "Fehler beim Lesen.\n";
    	}
    	else cout << "Fehler beim Erstellen.\n";
    	return 0;
    }
    


  • Dann liegt dein Fehler wohl bei

    HANDLE floppy=CreateFile(L"\\\.\\C:", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    Vielleicht verhindert die Windows API diesen Zugriff prinzipiell aus Sicherheitsgründen. "\\\.\\C:" wirkt auch so falsch.



  • "\\\.\\C:" sollte die Windows-Partition \.\C: öffnen. "\\\.\\PhysicalDrive0", was die Festplatte wäre (laut Win7-Datenträgerverwaltung "Datenträger 0"), geht genauso wenig.

    msdn schrieb:

    "\.\PhysicalDrive0" Opens the first physical drive.
    "\.\C:" Opens the C: volume.



  • Martin Richter schrieb:

    theta schrieb:

    CreateFile(..) gibt nicht NULL zurück wenns schief geht:
    http://msdn.microsoft.com/en-us/library/aa914735.aspx

    Vermutlich geht dieser Aufruf schonmal schief...

    Nö! Ein weit verbreiteter Irrtum...
    Bei Fehlern kommt INVALID_HANDLE_VALUE zurück.

    @Martin: Ehm.. jetzt bin ich ein wenig verwirrt. Ich schätze mal Du hast mein Post nicht so genau gelesen... 🤡

    @Thuruk: Es ist nicht verboten GetLastError() aufzurufen - das würde ev. ein wenig mehr Licht ins Dunkle bringen.



  • @Thuruk: Es ist nicht verboten GetLastError() aufzurufen - das würde ev. ein wenig mehr Licht ins Dunkle bringen.

    Auf PhysicalDrive0 (Festplatte) kann man nur als Admin zugreifen, auf C: (Windows-Partition) gar nicht, da von einem anderen Prozess verwendet.

    Na gut, funktioniert, ich hab endlich den Windows-Bootsektor. 😃

    In Zukunft schau ich mir das erst mal genauer an, sry. 🙄


  • Mod

    theta schrieb:

    @Martin: Ehm.. jetzt bin ich ein wenig verwirrt. Ich schätze mal Du hast mein Post nicht so genau gelesen... 🤡

    Sorry! Tut mir leid. Ich habe es wirklich nicht richtig gelesen!


Anmelden zum Antworten