AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

Ein Thema von Captnemo · begonnen am 6. Okt 2015 · letzter Beitrag vom 7. Okt 2015
Antwort Antwort
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 6. Okt 2015, 17:26
Hi,

Ich will aus ein oder mehreren Festplatte die partitionen auslesen, und nicht nur die, die auch einen Laufwerksbuchstaben haben.

Meine Mountpoint kriege ich jetzt wunderbar.

Code:
\\?\Volume{30e008b5-f5d1-11e2-be6b-806e6f6e6963}\
\\?\Volume{2b9cf42e-43ae-11e3-be9a-60a44ccd60fd}\
\\?\Volume{d1c41ef1-1c62-11e4-bed6-60a44ccd60fd}\
\\?\Volume{30e008b4-f5d1-11e2-be6b-806e6f6e6963}\
\\?\Volume{ab813b75-2ac8-11e4-bedb-806e6f6e6963}\
\\?\Volume{238e20f9-4c25-11e5-bf27-806e6f6e6963}\
Das pass auch gut zu meinen Partitionen bzw. vorhandenen Medien (siehe JPG im Anhang).

Aber wie kann ich jetzt daraus auf
  1. Welche HDD?
  2. Welche Partion auf der HDD?
  3. Wenn Laufwerksbuchstabe, dann welcher?
  4. Welcher Medientyp?
kommen?

Ich habe zwar schon ein bisschen was gefunden über PARTITION_INFORMATION_EX bzw. IOCTL_DISK_GET_PARTITION_INFO_EX, aber ich beiß mir da schon an der Deklaration die Zähne aus.
Vielleicht ist das aber auch der falsche Weg? Ich finde aber auch im Inet sehr wenig, was mir auf die Sprünge hilft. Wäre über ein bisschen Hilfe dankbar.
Angehängte Grafiken
Dateityp: jpg Partitionen.jpg (90,9 KB, 17x aufgerufen)
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo ( 6. Okt 2015 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 6. Okt 2015, 19:17
Guck mal, ob mein Programm SysInfo (http://michael-puff.de/Programmierung/Delphi/Programme/) das anzeigt, was du willst. Ist mit Quellcode.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 6. Okt 2015, 19:49
Oder man wirft einen Blick in die Doku https://msdn.microsoft.com/en-us/lib...25(VS.85).aspx und schaut sich das Beispiel an. Schon weiß man, wohin der Gaul laufen muss.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 7. Okt 2015, 07:03
Stichworte:

GetVolumePathNamesForVolumeName
-> C:\

QueryDosDevice
-> \Device\HarddiskVolume1

Beide nehmen dein Volume '\\?\Volume{c4ee0265-bada-11dd-9cd5-806e6f6e6963}\', jedoch muss bei QueryDosDevice auf 'Volume{c4ee0265-bada-11dd-9cd5-806e6f6e6963}' abgeschnitten werden....
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 7. Okt 2015, 07:32
Guck mal, ob mein Programm SysInfo (http://michael-puff.de/Programmierung/Delphi/Programme/) das anzeigt, was du willst. Ist mit Quellcode.
Danke. Im Grund entspricht das, was du THDInfo ausliest, schon ganz dem, was ich benötige. Nur holtst du die das die Parition über die Laufwerksbuchstben. Ich möchte aber auch die Partitionen erfassen, die keinen Laufwerksbuchstbaben haben, wie z.B. die System-reserved von Win7+, oder andere, denen man ggf. aus eigenen Gründen keinen LW-Buchstaben zugeordnet hat.

Oder man wirft einen Blick in die Doku https://msdn.microsoft.com/en-us/lib...25(VS.85).aspx und schaut sich das Beispiel an. Schon weiß man, wohin der Gaul laufen muss.
Mit der Funktion FindFirstVolume und etc. hole ich mir ja bereit die VolumeNames. Mir geht es ja darum, daraus jetzt
a) die HDD's zu Nummerieren (Quasi entsprechend ihrem Anschluss am SATA. SATA1=HDD1, SATA2=HDD2 usw).
b) Festzustellen, welche der Partitionsnamen zu welcher HDD gehörte und in der richtigen Reihenfolge
c) Dazu möglich noch den LW-Buchstaben zu erfahren
d) Den Mediatyp auszulesen (Wobei das bei vorhandenem LW-Buchstabe sicherlich nicht das Problem wäre. Aber auch bei Partitionen ohne LW-Buchstaben von Interesse)

Dazu habe ich im MSDN ja was über PARTITION_INFORMATION_EX bzw. IOCTL_DISK_GET_PARTITION_INFO_EX gelesen, komme aber mit der Umsetzung der deklaration nach Delphi nicht wirklich klar. Liegt sicherlich an mir, weil ich mich dabei immer etwas schwer tue.

Stichworte:

GetVolumePathNamesForVolumeName
-> C:\

QueryDosDevice
-> \Device\HarddiskVolume1

Beide nehmen dein Volume '\\?\Volume{c4ee0265-bada-11dd-9cd5-806e6f6e6963}\', jedoch muss bei QueryDosDevice auf 'Volume{c4ee0265-bada-11dd-9cd5-806e6f6e6963}' abgeschnitten werden....
Damit kann ich schon mal was anfangen. GetVolumePathNamesForVolumeName liefert mir schon mal den Laufwerksbuchstaben. Was mir QueryDosDevice liefert werde ich mir gleich mal ansehen. Aber wie bekomme ich die Zuordnung, welche Partition am Ende zu welcher HDD gehört?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 7. Okt 2015, 08:48
Oder man wirft einen Blick in die Doku https://msdn.microsoft.com/en-us/lib...25(VS.85).aspx und schaut sich das Beispiel an. Schon weiß man, wohin der Gaul laufen muss.
Mit der Funktion FindFirstVolume und etc. hole ich mir ja bereit die VolumeNames. Mir geht es ja darum, daraus jetzt
a) die HDD's zu Nummerieren (Quasi entsprechend ihrem Anschluss am SATA. SATA1=HDD1, SATA2=HDD2 usw).
b) Festzustellen, welche der Partitionsnamen zu welcher HDD gehörte und in der richtigen Reihenfolge
c) Dazu möglich noch den LW-Buchstaben zu erfahren
d) Den Mediatyp auszulesen (Wobei das bei vorhandenem LW-Buchstabe sicherlich nicht das Problem wäre. Aber auch bei Partitionen ohne LW-Buchstaben von Interesse)

Dazu habe ich im MSDN ja was über PARTITION_INFORMATION_EX bzw. IOCTL_DISK_GET_PARTITION_INFO_EX gelesen, komme aber mit der Umsetzung der deklaration nach Delphi nicht wirklich klar. Liegt sicherlich an mir, weil ich mich dabei immer etwas schwer tue.
Auf der Seite (vom Link) finden wir
Zitat:
Examples

For an example, see Displaying Volume Paths.
Und wenn wir dem Link folgen finden wir
Code:
#include <windows.h>
#include <stdio.h>

void DisplayVolumePaths(
        __in PWCHAR VolumeName
        )
{
    DWORD CharCount = MAX_PATH + 1;
    PWCHAR Names    = NULL;
    PWCHAR NameIdx  = NULL;
    BOOL  Success  = FALSE;

    for (;;)
    {
        //
        //  Allocate a buffer to hold the paths.
        Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];

        if ( !Names )
        {
            //
            //  If memory can't be allocated, return.
            return;
        }

        //
        //  Obtain all of the paths
        //  for this volume.
        Success = GetVolumePathNamesForVolumeNameW(
            VolumeName, Names, CharCount, &CharCount
            );

        if ( Success )
        {
            break;
        }

        if ( GetLastError() != ERROR_MORE_DATA )
        {
            break;
        }

        //
        //  Try again with the
        //  new suggested size.
        delete [] Names;
        Names = NULL;
    }

    if ( Success )
    {
        //
        //  Display the various paths.
        for ( NameIdx = Names;
              NameIdx[0] != L'\0';
              NameIdx += wcslen(NameIdx) + 1 )
        {
            wprintf(L" %s", NameIdx);
        }
        wprintf(L"\n");
    }

    if ( Names != NULL )
    {
        delete [] Names;
        Names = NULL;
    }

    return;
}

void __cdecl wmain(void)
{
    DWORD CharCount           = 0;
    WCHAR DeviceName[MAX_PATH] = L"";
    DWORD Error               = ERROR_SUCCESS;
    HANDLE FindHandle          = INVALID_HANDLE_VALUE;
    BOOL  Found               = FALSE;
    size_t Index               = 0;
    BOOL  Success             = FALSE;
    WCHAR VolumeName[MAX_PATH] = L"";

    //
    //  Enumerate all volumes in the system.
    FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));

    if (FindHandle == INVALID_HANDLE_VALUE)
    {
        Error = GetLastError();
        wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
        return;
    }

    for (;;)
    {
        //
        //  Skip the \\?\ prefix and remove the trailing backslash.
        Index = wcslen(VolumeName) - 1;

        if (VolumeName[0]    != L'\\' ||
            VolumeName[1]    != L'\\' ||
            VolumeName[2]    != L'?' ||
            VolumeName[3]    != L'\\' ||
            VolumeName[Index] != L'\\')
        {
            Error = ERROR_BAD_PATHNAME;
            wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
            break;
        }

        //
        //  QueryDosDeviceW does not allow a trailing backslash,
        //  so temporarily remove it.
        VolumeName[Index] = L'\0';

        CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName));

        VolumeName[Index] = L'\\';

        if ( CharCount == 0 )
        {
            Error = GetLastError();
            wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
            break;
        }

        wprintf(L"\nFound a device:\n %s", DeviceName);
        wprintf(L"\nVolume name: %s", VolumeName);
        wprintf(L"\nPaths:");
        DisplayVolumePaths(VolumeName);

        //
        //  Move on to the next volume.
        Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));

        if ( !Success )
        {
            Error = GetLastError();

            if (Error != ERROR_NO_MORE_FILES)
            {
                wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
                break;
            }

            //
            //  Finished iterating
            //  through all the volumes.
            Error = ERROR_SUCCESS;
            break;
        }
    }

    FindVolumeClose(FindHandle);
    FindHandle = INVALID_HANDLE_VALUE;

    return;
}
der folgende Ausgabe produziert
Code:
Found a device:
 \Device\HarddiskVolume2
Volume name: \\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\
Paths: C:\

Found a device:
 \Device\CdRom0
Volume name: \\?\Volume{4c1b02c4-d990-11dc-99ae-806e6f6e6963}\
Paths: D:\
Das hast du doch gesucht ... oder etwa nicht ...

Ja, das ist kein Delphi, aber man erkennt die Richtung, wohin man laufen muss ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#7

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 7. Okt 2015, 12:14
Okay, mühsam ernährt sich das Eichhörnchen (Dank an SirRufo....ich hab's tatsächlich nicht gesehen )

Jetzt bin schon mal einen Schritt weiter:

Code:
\\?\Volume{30e008b5-f5d1-11e2-be6b-806e6f6e6963}\ | 25 | \Device\HarddiskVolume2 | 0 | C:\
\\?\Volume{2b9cf42e-43ae-11e3-be9a-60a44ccd60fd}\ | 25 | \Device\HarddiskVolume3 | 0 | D:\
\\?\Volume{d1c41ef1-1c62-11e4-bed6-60a44ccd60fd}\ | 25 | \Device\HarddiskVolume5 | 0 | I:\
\\?\Volume{30e008b4-f5d1-11e2-be6b-806e6f6e6963}\ | 25 | \Device\HarddiskVolume1 | 0 |
\\?\Volume{ab813b75-2ac8-11e4-bedb-806e6f6e6963}\ | 25 | \Device\HarddiskVolume4 | 0 | L:\
\\?\Volume{238e20f9-4c25-11e5-bf27-806e6f6e6963}\ | 16 | \Device\CdRom0 | 0 | E:\
Nicht an der komischen Formatierung stören, das mach ich nur zum Testen.
Ich habe also nun mein VolumeName, mein DeviceName und auch meinen dazugehörigen Laufwerksbuchstaben.
HarddiskVolume1 ist meine System-reserved-Partition, HarddiskVolume4 ist mein CardReader und CdRom0 eben mein DVD-Laufwerk.

Wenn ich mir zu den Laufwerken noch die VolumeInfos auslesen, dann könnte ich ja auch feststellen, ob ein Volume überhaupt einen Inhalt hat.

Aber was mir wirklich noch zu meinem Glück fehlt, ist das zuordnet der DeviceNames zu den Physikalischen HDD's. Hat dazu noch jemand eine Idee?

Und da die Nummer hinter HarddiskVolume anzunehmenderweise in chronologischer Reihenfolge des Erstellens der Partition vergeben wird, gibt diese mir auch keinen Aufschluss darüber, in welcher Reihenfolge diese auf der Platte angeordnet sind. Dazu könnte ich ggf. aber Start- und Endsektor auslesen, dann könnte ich mir das schon irgendwie zusammenreimen.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Zu Mountpoints Festplatte/Parition bzw. Laufwerksbuchstabe auslesen

  Alt 7. Okt 2015, 08:38
Guck mal, ob mein Programm SysInfo (http://michael-puff.de/Programmierung/Delphi/Programme/) das anzeigt, was du willst. Ist mit Quellcode.
SYSINFO 3.2 braucht nach 11 Jahren mal ein Update...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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