![]() |
Partitionstabelle ändern
Hallo,
wie ich schon in einem anderen Thread sagte, möchte ich gerne die Partitionstabelle im MBR ändern. Folgende Dinge sollen geschehen:
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. |
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.
|
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. |
Re: Partitionstabelle ändern
Zitat:
Zitat:
|
Re: Partitionstabelle ändern
Zitat:
|
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. |
Re: Partitionstabelle ändern
Zitat:
|
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. |
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. |
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. (
![]() |
Re: Partitionstabelle ändern
Zitat:
|
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. |
Re: Partitionstabelle ändern
Zitat:
|
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. |
Re: Partitionstabelle ändern
Zitat:
![]() ![]() |
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. |
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? |
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. ![]() . ![]() |
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? |
Re: Partitionstabelle ändern
Liste der Anhänge anzeigen (Anzahl: 1)
|
Re: Partitionstabelle ändern
Delphi-Quellcode:
Es kommt immer fail2, auch wenn ich es mit der gesamten Festplatte versuche... :(
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); 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: |
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... |
Re: Partitionstabelle ändern
So, auf MSDN stand bei IOCTL_VOLUME_OFFLINE, dass man ruhig alles hintereinander ausführen soll:
Delphi-Quellcode:
Der Code ansich funktioniert, es kommt keine Meldung.
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); 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 04:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz