Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Partitionstabelle ändern (https://www.delphipraxis.net/136886-partitionstabelle-aendern.html)

WorstNightmare 9. Jul 2009 13:50


Partitionstabelle ändern
 
Hallo,

wie ich schon in einem anderen Thread sagte, möchte ich gerne die Partitionstabelle im MBR ändern. Folgende Dinge sollen geschehen:
  • Physikalisches Laufwerk (Festplatte) von Partition rausfinden (Fertig)
  • MBR von Platte auslesen (Fertig)
  • Partitionstabelle auslesen und parsen (halb fertig)
  • Womöglich Partition aus erweiterter Partition löschen
  • Neue primäre FAT32 (Typ 0xC) Partition anlegen

Die FAT32 Partition muss nur im MBR als solche stehen, was an der Position für Daten sind ist völlig egal, denn da kommt ein spezielles anderes Dateisystem hin.
Bevor ich diesen ganzen Aufwand betreibe, möchte ich erstmal folgendes wissen:
Lassen moderne Windows-Systeme (NT 6) zu, dass ich den MBR einfach mal so überschreibe? (Probleme mit Cache/Registry?)
Ist es egal ob es ein 32/64-Bit System ist?

Dazu muss noch gesagt werden, dass es sich um eine externe Festplatte handelt, also nicht die wo Windows drauf ist.

Fridolin Walther 9. Jul 2009 14:03

Re: Partitionstabelle ändern
 
Ja, das lassen die durchaus zu, vorrausgesetzt es gibt keine Ressourcen Konflikte. Sowohl unter x86 als auch unter allen anderen Systemen sollte es da aber keine Probleme geben. Allerdings muss Du das System danach dann auch dazu bringen den MBR neu einzulesen, was imho schwieriger ist als den MBR zu schreiben ;). Ich würde vermuten das es dazu notwendig wäre ein entsprechendes Signal an den Festplatten Treiber zu schicken. Aber das ist reine Spekulation meinerseits.

himitsu 9. Jul 2009 14:06

Re: Partitionstabelle ändern
 
ganz ehrlich, vergiß den Weg,
wenn schon, dann nimm ein anderen Marker für ein Dateisystem.

1. wenn du etwas als FAT32 ausgiebst, dann sollte es auch güliges FAT32 sein, denn
1.1. den FAT32-Treiber des Systems wird es nicht gefallen
1.2. CheckDisk könnte dir deine "andere" Nicht-FAT-Partition zerschießen
2. ...

Erstmal mußt du die Festplatte bei Windows abmelden/Sperren und erst dann
kannst du einfach direkt auf die Platte zugreifen und kannst den MBR direkt verändern.

WorstNightmare 9. Jul 2009 14:41

Re: Partitionstabelle ändern
 
Zitat:

Zitat von himitsu
ganz ehrlich, vergiß den Weg,
wenn schon, dann nimm ein anderen Marker für ein Dateisystem.

1. wenn du etwas als FAT32 ausgiebst, dann sollte es auch güliges FAT32 sein, denn
1.1. den FAT32-Treiber des Systems wird es nicht gefallen
1.2. CheckDisk könnte dir deine "andere" Nicht-FAT-Partition zerschießen
2. ...

Hm, ich denke das macht nichts. Dieses andere Dateisystem benutzen schon viele seit einiger Zeit, alle hatten keine Probleme, ich selbst auch nicht. Windows macht da keine Murren, sagt lediglich "Auf dem Datenträger befindet sich kein bekanntes Dateisystem, möglicherweise müssen sie ihn formatieren, bevor sie ihn benutzen können."

Zitat:

Zitat von himitsu
Erstmal mußt du die Festplatte bei Windows abmelden/Sperren und erst dann
kannst du einfach direkt auf die Platte zugreifen und kannst den MBR direkt verändern.

Ja genau, so macht es Acronis Disk Director auch. Gibt es Möglichkeiten sowas aus Delphi heraus zu veranlassen?

Fridolin Walther 9. Jul 2009 15:16

Re: Partitionstabelle ändern
 
Zitat:

Zitat von himitsu
Erstmal mußt du die Festplatte bei Windows abmelden/Sperren und erst dann
kannst du einfach direkt auf die Platte zugreifen und kannst den MBR direkt verändern.

Das ist beim Zugriff auf den MBR nicht notwendig.

himitsu 9. Jul 2009 15:54

Re: Partitionstabelle ändern
 
Wenn der MBR verändert werden soll schon.
Wenn er nur den Typ einer nicht gemappten Partition hätte ändern wollen, dann wäre es ver mutlich noch gut gegangen, aber wenn der den MBR umbauen will (z.B. eine Partition einfügen) und windows dieses Laufwerk auch zugänglich machen soll, dann muß er Windows auch die möglichkeit geben den MBR neu einzulesen.


schau mal in Luckies Diskimage (auf seiner Webseite), da wird zwar nur eine Partition (die der Diskette) gesperrt, aber evtl. findest du über diese Funktion im MSDN weitere/passendere Befehle.

Fridolin Walther 9. Jul 2009 16:10

Re: Partitionstabelle ändern
 
Zitat:

Zitat von himitsu
Wenn der MBR verändert werden soll schon.

Nein. Wenn es so wäre, wären MBR Killer kein Problem im Malware Bereich und auch MBR Rootkits wären ein weniger großes Problem. Du kannst problemlos den MBR des Bootlaufwerks lesen und schreiben vom Usermode aus ohne das das Laufwerk abgemeldet werden müsste. Kannst es gerne mal in ner VM testen.

WorstNightmare 9. Jul 2009 18:50

Re: Partitionstabelle ändern
 
Also ich mache mir da schon Sorgen...
Ich habe jetzt implementiert, dass wenn das Ziel-Laufwerk NTFS ist, im MBR hingeschrieben wird, dass es FAT32 ($C) ist. Windows scheint das sch***** egal zu sein, selbst nach einem Neustart kann ich das Volume noch ohne Probleme als NTFS Laufwerk benutzen.

Wenn ich jetzt aber Partitionen aus erweiterten lösche und dafür eins in der Partitionstabelle erstelle, dann MUSS ich Windows ja irgendwie mitteilen, dass ich da rumgestrickt habe, damit ein Laufwerksbuchstabe zugewiesen wird und ich dann drauf rumschreiben kann.

himitsu 9. Jul 2009 19:25

Re: Partitionstabelle ändern
 
ich sagte ja,
- Laufwerk abmelden und beim Anmelden wird der MBR neu eingelesen

bei NTFS hast du daß problem, daß selbst ohne daß es gemountet ist (kein Laufwerksbuchstabe und so)
einige Systemprozesse auf die Partition zugreifen.

und es kann passieren, daß windows einige werte zurückschreibt, wenn es beendet wird, drum wird das Laufwerk wohhl dann auch nach'm Neustart wieder geladen.

und ich weiß nicht wie die Fehlerbehebung in Windows diesbezüglich aussieht, aber nur weil der Marker in der MBR was anderes besagt, geben die Angaben im Partitionsbootrecord immernoch NTFS an.

Muetze1 9. Jul 2009 20:30

Re: Partitionstabelle ändern
 
Beachte bitte das es auch eine GUID Partitionstabelle gibt. Diese ist nicht kompatibel mit der alten Partitionstabelle. Es wird aber noch eine alte geschrieben als Dummy, welche einfach angibt die gesamte Platte belegt zu haben. (Wikiepedia: GUID Partition Table)

WorstNightmare 9. Jul 2009 20:43

Re: Partitionstabelle ändern
 
Zitat:

Zitat von Muetze1
Beachte bitte das es auch eine GUID Partitionstabelle gibt. Diese ist nicht kompatibel mit der alten Partitionstabelle. Es wird aber noch eine alte geschrieben als Dummy, welche einfach angibt die gesamte Platte belegt zu haben. (Wikiepedia: GUID Partition Table)

Deswegen fragte ich wegen 64-Bit, ich hatte da auch sowas gelesen. Findet man solche GUID Tabellen auch auf externen Platten?

hathor 10. Jul 2009 09:11

Re: Partitionstabelle ändern
 
Ein anderes Problem sind herstellerspezifische MBR, die Code enthalten, um eine spezielle Taste zu aktivieren, die beim Booten die allererste primäre Partition (ca. 5-10GB gross) aktiviert, um Wiederherstellungsfunktionen auszuführen.
Diese heissen bei ACER (F10) z.B. PQSERVICE, bei LENOVO (grüne Thinkvantagetaste) Service Partition ServiceV002.
Wer den MBR ändert, hat keinen direkten Zugriff mehr auf die Wiederherstellungsfunktionen.

Muetze1 10. Jul 2009 10:50

Re: Partitionstabelle ändern
 
Zitat:

Zitat von WorstNightmare
Zitat:

Zitat von Muetze1
Beachte bitte das es auch eine GUID Partitionstabelle gibt. Diese ist nicht kompatibel mit der alten Partitionstabelle. Es wird aber noch eine alte geschrieben als Dummy, welche einfach angibt die gesamte Platte belegt zu haben. (Wikiepedia: GUID Partition Table)

Deswegen fragte ich wegen 64-Bit, ich hatte da auch sowas gelesen. Findet man solche GUID Tabellen auch auf externen Platten?

Das hat nichts mit 64 Bit zu tun.

WorstNightmare 10. Jul 2009 13:16

Re: Partitionstabelle ändern
 
@hathor und Muetze1:
Ich glaube das ist in meinem Fall beides ziemlich egal. So eine Wiederherstellungspartition werde ich wohl kaum auf einer gewöhnlichen externen (mein Code wird ausschließlich auf externe Datenträger angewandt) finden.
Würde sie eine GUID-Partitionstabelle haben, würde sie auch das Zielsystem (kein PC) denke ich nicht mehr oder nicht richtig erkennen.

hathor 10. Jul 2009 13:26

Re: Partitionstabelle ändern
 
Zitat:

Zitat von WorstNightmare
[*]Partitionstabelle auslesen und parsen (halb fertig)

Brauchst Du dazu noch etwas?

http://www.guylhem.net/r-mirror/disk...rescue-src.zip
http://www.torry.net/vcl/filedrv/diskaccess/diskacc.zip

WorstNightmare 10. Jul 2009 15:00

Re: Partitionstabelle ändern
 
Das ist mittlerweile auch fertig.

Jetzt muss ich ein logisches Laufwerk aus der erweiterten Partitionstabelle entfernen, das ist halb fertig. Ich denke das schaffe ich ohne Hilfe.

WorstNightmare 10. Jul 2009 22:08

Re: Partitionstabelle ändern
 
So, die Partition die ich nicht will wird jetzt auch aus erweiterten Partitionstabellen entfernt, egal wie tief sie in diesen vergraben ist.

Allerdings merkt Windows davon nichts und ich kann immer noch auf das Volume zugreifen. Erst wenn ich den USB-Stecker raus- und reinsteck ist das Volume verschwunden.
Ich habe den Kontrollcode FSCTL_DISMOUNT_VOLUME entdeckt, kann ich den Datenträger damit kicken?
Sollte ich es auf der Festplatte (\\.\PHYSICALDRIVEX) oder der Partition (\\.\X: ) ausführen?
Und vor oder nachdem ich rumgeschrieben habe?

hathor 11. Jul 2009 06:49

Re: Partitionstabelle ändern
 
WM_DriveSettings: Diese Message wird ausgelöst, um dem Hauptfenster mitzuteilen, daß sich etwas bei den Einstellungen zu den Lauf-
werken geändert hat.
WM_DEVICECHANGE...

Du musst WINDOWS mitteilen, dass sich mit dem Drive etwas geändert hat...

DBT_DEVICEREMOVECOMPLETE Event

The system broadcasts the DBT_DEVICEREMOVECOMPLETE device event when a device or piece of media has been physically removed.

To broadcast this device event, the system uses the WM_DEVICECHANGE message with wParam set to DBT_DEVICEREMOVECOMPLETE and lParam set as described following.
http://msdn.microsoft.com/de-de/libr...,VS.85%29.aspx
.
http://delphi.icm.edu.pl/ftp/d40free/mpdrpane.zip

WorstNightmare 11. Jul 2009 09:39

Re: Partitionstabelle ändern
 
Hm, so kann mein Programm herausfinden, dass etwas verändert wurde, aber das bringt mir nichts, das weiß es ja eh.

Kann ich diese Message auch irgendwie an Windows zurück senden?

hathor 11. Jul 2009 10:07

Re: Partitionstabelle ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guckst Du hier:

http://msdn.microsoft.com/en-us/library/dd188152.aspx

WorstNightmare 11. Jul 2009 10:42

Re: Partitionstabelle ändern
 
Delphi-Quellcode:
  hDisk := CreateFile('\\.\N:', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

  if hDisk = INVALID_HANDLE_VALUE then
    raise Exception.Create('fail');

  if not DeviceIOControl(hDisk, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, written, nil) then
    SHowmessage('fail2');

  CloseHandle(hDisk);
Es kommt immer fail2, auch wenn ich es mit der gesamten Festplatte versuche... :(

Zu deinem anderen Link:
VolumeInfo.Refresh Method
Checks the hardware to refresh information about volumes.
Namespace: Microsoft.SPOT.IO

Das klingt ja wunderbar, aber ich denke von Delphi aus kann ich nicht auf diesen Namespace zugreifen, oder? :wink:

hathor 11. Jul 2009 13:16

Re: Partitionstabelle ändern
 
Versuche es mit IOCTL_VOLUME_OFFLINE:

Delphi-Quellcode:
(*BOOL DeviceIoControl(
  (HANDLE) hDevice,            // handle to device
  IOCTL_VOLUME_OFFLINE,        // dwIoControlCode
  NULL,                        // lpInBuffer
  0,                           // nInBufferSize
  NULL,                        // lpOutBuffer
  0,                           // nOutBufferSize
  (LPDWORD) lpBytesReturned,   // number of bytes returned
  (LPOVERLAPPED) lpOverlapped); // OVERLAPPED structure
---- *)
if DeviceIOControl(hDevice, IOCTL_VOLUME_OFFLINE, nil, 0, @dg,
        sizeof(dg), dummy, nil) = true then
      begin...

WorstNightmare 11. Jul 2009 15:53

Re: Partitionstabelle ändern
 
So, auf MSDN stand bei IOCTL_VOLUME_OFFLINE, dass man ruhig alles hintereinander ausführen soll:

Delphi-Quellcode:
  hDisk := CreateFile('\\.\N:', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

  if hDisk = INVALID_HANDLE_VALUE then
    raise Exception.Create('opening failed');

  if not LockVolume(hDisk) then
    Showmessage('not locked!!');

  if not DeviceIOControl(hDisk, FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, written, nil) then
    Showmessage('dismounting failed');

  if not DeviceIOControl(hDisk, IOCTL_VOLUME_OFFLINE, nil, 0, nil, 0, written, nil) then
    Showmessage('still online!!!');

  CloseHandle(hDisk);
Der Code ansich funktioniert, es kommt keine Meldung.
In Windows wird das Laufwerk als "Lokaler Datenträger" angezeigt, hat keine Größe und ich habe auch keinen Zugriff mehr darauf. Kann ich jetzt noch irgendwas danach ausführen, dass Windows ihn endgültig rauswirft?

Aber dass er jetzt schonmal unbenutzbar ist finde ich gut, danke für die bisherige Hilfe.

Auf MSDN steht auch noch, dass man danach das Gerät "Deinstallieren" kann, ich konnte aber nicht herausfinden wie das geht.

Ich habe auch folgende Codes ausprobiert, alle schlugen mit False als Ergebnis fehl (Funktion/Anforderung wird nicht unterstützt)

IOCTL_STORAGE_RESET_DEVICE
IOCTL_DISK_EJECT_MEDIA
IOCTL_DISK_REMOVE_DEVICE
IOCTL_STORAGE_EJECT_MEDIA

Edit: Ich mach mal einen neuen Thread auf, das hat ja nicht mehr 100%ig was mit der eigentlich Frage zu tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz