'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.aspxVermutlich geht dieser Aufruf schonmal schief...
-
theta schrieb:
CreateFile(..) gibt nicht NULL zurück wenns schief geht:
http://msdn.microsoft.com/en-us/library/aa914735.aspxVermutlich 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.aspxVermutlich 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.
-
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!