falsche ausgabe??
-
Hi,
int main(int argc, char *argv[]) { HANDLE hDevice; // handle to the drive to be examined BOOL bResult; // results flag DWORD junk; // discard results DWORD layout[10000]; hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open //|||||||||||||||||||||||||||||||||||||||||||||||||||| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENERIC_READ, // no access to the drive <-- ?????? //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //|||||||||||||||||||||||||||||||||||||||||||||||||||| FILE_SHARE_READ | // share mode FILE_SHARE_WRITE, NULL, // default security attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // do not copy file attributes if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive { printf("%ld", GetLastError()); return (FALSE); } bResult = DeviceIoControl(hDevice, // device to be queried IOCTL_DISK_GET_DRIVE_LAYOUT, // operation to perform NULL, 0, // no input buffer layout, sizeof(*layout), // output buffer &junk, // # bytes returned (LPOVERLAPPED) NULL); // synchronous I/O cout<<junk; return 0; }Er gibt mir immer einen unbrauchbaren Wert "3435973836" zurück! Was mach ich falsch? Ich möchte die harddisk signature id auslesen!
mfg,
domian
-
domian222 schrieb:
Was mach ich falsch?
Du sagst der Funktion DeviceIoControl, dass der Puffer sizeof(*layout) groß ist, das ist 1 DWORD. Mach den Stern da weg.
Darauf wärest du vermutlich selbst gekommen, wenn du bResult und GetLastError geprüft hättest.
-
Hi,
Vielen dank, für die Antwort aber er gibt mir immer noch das gleiche aus:
Und zwar den Wert: 3435973836 (printf("%x", junk);) bringt leider nur falsche raus.
Ich möchte die Signature id der harddisk auslesen. Ich hab ein Programm gefunden, dass den selben Zweck macht. Jedoch hab ich nicht den source code von dem Programm sondern nur alles im debugger angeschaut. Ich hab die funktionen GENERIC_READ etc. angepasst und den dword buffer aber es gibt mir immer noch nen viel zu großen Wert aus und ich kenn meine signatureid!
mfg,
domian22
-
Wenn du dir den Eintrag in der MSDN-Library zu IOCTL_DISK_GET_DRIVE_LAYOUT anschaust, siehst du, dass die Signatur nicht in deiner Variablen junk landet.
-
Hi,
Mit GetOverlappedResult kann man laut msdn die id bekommen:
To retrieve the number of bytes returned, call GetOverlappedResult.
bResult = GetOverlappedResult(hDevice, NULL, &junk, FALSE);
printf("%x", bResult);Was ist daran Falsch?
2.)
Kann man die signatureid mit IOCTL_DISK_SET_DRIVE_LAYOUT ändern?mfg,
domian
-
domian222 schrieb:
Mit GetOverlappedResult kann man laut msdn die id bekommen:
Unsinn.
To retrieve the number of bytes returned, call GetOverlappedResult.
Was interessiert dich die Anzahl der zurückgegebenen Bytes?
lpOutBuffer
[out] Pointer to a buffer that receives a DRIVE_LAYOUT_INFORMATION structure.Da stehen die Informationen drin.
-
Hi,
danke für die Antwort!
printf("%x", layout);
gibt wieder einen komplett falschen Wert aus.
Also muss ich auf die struktur zugreifen:
DRIVE_LAYOUT_INFORMATION *pdg;
printf("%x", pdg->Signature);
gibt nur ne 0 aus
-
domian22 schrieb:
DRIVE_LAYOUT_INFORMATION *pdg;
Wo zeigt dieser Zeiger denn hin? Bestimmt nicht auf den Puffer, den du an DeviceIoControl übergeben hast.
Kann das sein, dass du noch ein paar Lücken bei den Grundlagen hast?
-
Hi,
Kannst du mir ein tipp geben?
mfg,
domian
-
Kann das sein, dass du noch ein paar Lücken bei den Grundlagen hast?
-
domian22 schrieb:
printf("%x", layout);gibt wieder einen komplett falschen Wert aus.
Ja, da mußt du auch auf einzelne Elemente des Arrays zugreifen (mit "printf("%x",layout[i]);")
Also muss ich auf die struktur zugreifen:
DRIVE_LAYOUT_INFORMATION *pdg; printf("%x", pdg->Signature);gibt nur ne 0 aus
Ein guter Anfang - nun mußt du diesen Pointer noch auf eine exisiterende Struktur biegen (atm zeigt er ins Daten-Nirvana).
DeviceIOControl(hDevice,NULL,0,buffer,...); DRIVE_LAYOUT_INFORMATION *pdg=buffer; printf("%x",pdg->Signature);
-
MKF schrieb:
Kann das sein, dass du noch ein paar Lücken bei den Grundlagen hast?
Sorry das ich so unfreundlich war.
Aber ich bin als kleines Kind auf den Kopf gefallen.