|
![]() |
|
Registriert seit: 5. Jan 2005 Ort: Stadthagen 9.454 Beiträge Delphi 10 Seattle Enterprise |
#1
Oder man wirft einen Blick in die Doku
![]() 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. ![]()
Code:
der folgende Ausgabe produziert
#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; }
Code:
Das hast du doch gesucht ... oder etwa nicht ...
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:\ 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) |
![]() |
Registriert seit: 27. Jan 2003 Ort: Bodenwerder 1.126 Beiträge Delphi XE4 Architect |
#2
Okay, mühsam ernährt sich das Eichhörnchen
![]() ![]() Jetzt bin schon mal einen Schritt weiter:
Code:
Nicht an der komischen Formatierung stören, das mach ich nur zum Testen.
\\?\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:\ 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 |
![]() |
hathor
(Gast)
n/a Beiträge |
#3
WMI_GetWin32DiskDriveInfo
Delphi-Quellcode:
program GetDiskDriveInfo;
{$APPTYPE CONSOLE} uses System.SysUtils, Winapi.ActiveX, System.Win.ComObj, System.Variants; function VarToInt(const AVariant: Variant): integer; begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end; function WmiDateToTDatetime(vDate : OleVariant) : TDateTime; var FWbemDateObj : OleVariant; begin; FWbemDateObj := CreateOleObject('WbemScripting.SWbemDateTime'); FWbemDateObj.Value:=vDate; Result:=FWbemDateObj.GetVarDate; end; procedure GetCIM_PhysicalMediaInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM CIM_PhysicalMedia','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Capacity %d',[VarToInt(FWbemObject.Capacity)]));// Uint64 Writeln(Format('Caption %s',[VarToStr(FWbemObject.Caption)]));// String Writeln(Format('CleanerMedia %s',[VarToStr(FWbemObject.CleanerMedia)]));// Boolean Writeln(Format('CreationClassName %s',[VarToStr(FWbemObject.CreationClassName)]));// String Writeln(Format('Description %s',[VarToStr(FWbemObject.Description)]));// String Writeln(Format('HotSwappable %s',[VarToStr(FWbemObject.HotSwappable)]));// Boolean Writeln(Format('InstallDate %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime Writeln(Format('Manufacturer %s',[VarToStr(FWbemObject.Manufacturer)]));// String Writeln(Format('MediaDescription %s',[VarToStr(FWbemObject.MediaDescription)]));// String Writeln(Format('MediaType %d',[VarToInt(FWbemObject.MediaType)]));// Uint16 Writeln(Format('Model %s',[VarToStr(FWbemObject.Model)]));// String Writeln(Format('Name %s',[VarToStr(FWbemObject.Name)]));// String Writeln(Format('OtherIdentifyingInfo %s',[VarToStr(FWbemObject.OtherIdentifyingInfo)]));// String Writeln(Format('PartNumber %s',[VarToStr(FWbemObject.PartNumber)]));// String Writeln(Format('PoweredOn %s',[VarToStr(FWbemObject.PoweredOn)]));// Boolean Writeln(Format('Removable %s',[VarToStr(FWbemObject.Removable)]));// Boolean Writeln(Format('Replaceable %s',[VarToStr(FWbemObject.Replaceable)]));// Boolean Writeln(Format('SerialNumber %s',[TRIM(VarToStr(FWbemObject.SerialNumber))]));// String Writeln(Format('SKU %s',[VarToStr(FWbemObject.SKU)]));// String Writeln(Format('Status %s',[VarToStr(FWbemObject.Status)]));// String Writeln(Format('Tag %s',[VarToStr(FWbemObject.Tag)]));// String Writeln(Format('Version %s',[VarToStr(FWbemObject.Version)]));// String Writeln(Format('WriteProtectOn %s',[VarToStr(FWbemObject.WriteProtectOn)]));// Boolean Writeln('----------------------------------------------------------------------'); FWbemObject:=Unassigned; end; end; //------------------------------------------------------------------------------ procedure GetWin32_DiskDriveInfo; const WbemUser =''; WbemPassword =''; WbemComputer ='localhost'; wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; FWbemDateObj : OleVariant; Dt : TDateTime; I : Integer; Data : array of WORD;//Byte; params: OleVariant; //TVarArray; // EventDate : TDateTime; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Writeln(Format('Availability %d',[VarToInt(FWbemObject.Availability)]));// Uint16 Writeln(Format('BytesPerSector %d',[VarToInt(FWbemObject.BytesPerSector)]));// Uint32 // Writeln(Format('Capabilities %d',[VarToInt(FWbemObject.Capabilities)]));// Array of Uint16 if not VarIsNull(FWbemObject.Capabilities) then begin Data := FWbemObject.Capabilities; for I:= VarArrayLowBound(data,1) to VarArrayHighBound(data,1) do Writeln('Capabilities: '+IntToStr(Data[I]));// Array of WORD /Uint16 end; // Writeln(Format('CapabilityDescriptions %s',[VarToStr(FWbemObject.CapabilityDescriptions)]));// Array of VarToStr if not VarIsNull(FWbemObject.CapabilityDescriptions) then begin Params := FWbemObject.CapabilityDescriptions; for I:= VarArrayLowBound(Params,1) to VarArrayHighBound(Params,1) do Writeln('CapabilityDescriptions: '+ VarToStr(Params[I]));// Array of VarToStr end; Writeln(Format('Caption %s',[VarToStr(FWbemObject.Caption)]));// VarToStr Writeln(Format('CompressionMethod %s',[VarToStr(FWbemObject.CompressionMethod)]));// String Writeln(Format('ConfigManagerErrorCode %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32 Writeln(Format('ConfigManagerUserConfig %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean Writeln(Format('CreationClassName %s',[VarToStr(FWbemObject.CreationClassName)]));// String Writeln(Format('DefaultBlockSize %d',[VarToInt(FWbemObject.DefaultBlockSize)]));// Uint64 Writeln(Format('Description %s',[VarToStr(FWbemObject.Description)]));// String Writeln(Format('DeviceID %s',[VarToStr(FWbemObject.DeviceID)]));// String Writeln(Format('ErrorCleared %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean Writeln(Format('ErrorDescription %s',[VarToStr(FWbemObject.ErrorDescription)]));// String Writeln(Format('ErrorMethodology %s',[VarToStr(FWbemObject.ErrorMethodology)]));// String Writeln(Format('FirmwareRevision %s',[VarToStr(FWbemObject.FirmwareRevision)]));// String Writeln(Format('Index %d',[VarToInt(FWbemObject.Index)]));// Uint32 // Writeln(Format('InstallDate %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime // Writeln(Format('InstallDate %s',[WmiDateToTDatetime(FWbemObject.InstallDate)])); // dt:= WmiDateToTDatetime(FWbemObject.InstallDate); Writeln(Format('InterfaceType %s',[VarToStr(FWbemObject.InterfaceType)]));// String Writeln(Format('LastErrorCode %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32 Writeln(Format('Manufacturer %s',[VarToStr(FWbemObject.Manufacturer)]));// String Writeln(Format('MaxBlockSize %d',[VarToInt(FWbemObject.MaxBlockSize)]));// Uint64 Writeln(Format('MaxMediaSize %d',[VarToInt(FWbemObject.MaxMediaSize)]));// Uint64 Writeln(Format('MediaLoaded %s',[VarToStr(FWbemObject.MediaLoaded)]));// Boolean Writeln(Format('MediaType %s',[VarToStr(FWbemObject.MediaType)]));// String Writeln(Format('MinBlockSize %d',[VarToInt(FWbemObject.MinBlockSize)]));// Uint64 Writeln(Format('Model %s',[VarToStr(FWbemObject.Model)]));// String Writeln(Format('Name %s',[VarToStr(FWbemObject.Name)]));// String Writeln(Format('NeedsCleaning %s',[VarToStr(FWbemObject.NeedsCleaning)]));// Boolean Writeln(Format('NumberOfMediaSupported %d',[VarToInt(FWbemObject.NumberOfMediaSupported)]));// Uint32 Writeln(Format('Partitions %d',[VarToInt(FWbemObject.Partitions)]));// Uint32 Writeln(Format('PNPDeviceID %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String Writeln(Format('PowerManagementCapabilities %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16 Writeln(Format('PowerManagementSupported %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean Writeln(Format('SCSIBus %d',[VarToInt(FWbemObject.SCSIBus)]));// Uint32 Writeln(Format('SCSILogicalUnit %d',[VarToInt(FWbemObject.SCSILogicalUnit)]));// Uint16 Writeln(Format('SCSIPort %d',[VarToInt(FWbemObject.SCSIPort)]));// Uint16 Writeln(Format('SCSITargetId %d',[VarToInt(FWbemObject.SCSITargetId)]));// Uint16 Writeln(Format('SectorsPerTrack %d',[VarToInt(FWbemObject.SectorsPerTrack)]));// Uint32 Writeln(Format('SerialNumber %s',[TRIM(VarToStr(FWbemObject.SerialNumber))]));// String Writeln(Format('Signature %d',[VarToInt(FWbemObject.Signature)]));// Uint32 Writeln(Format('Size %d',[VarToInt(FWbemObject.Size)]));// Uint64 Writeln(Format('Status %s',[VarToStr(FWbemObject.Status)]));// String Writeln(Format('StatusInfo %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16 Writeln(Format('SystemCreationClassName %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String Writeln(Format('SystemName %s',[VarToStr(FWbemObject.SystemName)]));// String Writeln(Format('TotalCylinders %d',[VarToInt(FWbemObject.TotalCylinders)]));// Uint64 Writeln(Format('TotalHeads %d',[VarToInt(FWbemObject.TotalHeads)]));// Uint32 Writeln(Format('TotalSectors %d',[VarToInt(FWbemObject.TotalSectors)]));// Uint64 Writeln(Format('TotalTracks %d',[VarToInt(FWbemObject.TotalTracks)]));// Uint64 Writeln(Format('TracksPerCylinder %d',[VarToInt(FWbemObject.TracksPerCylinder)]));// Uint32 Writeln('----------------------------------------------------------------------'); FWbemObject:=Unassigned; end; end; begin try CoInitialize(nil); try GetCIM_PhysicalMediaInfo; WriteLn('----------------------------------------------------------------------'); GetWin32_DiskDriveInfo; finally CoUninitialize; end; except on E:EOleException do Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end. Geändert von hathor ( 7. Okt 2015 um 14:18 Uhr) |
![]() |
Registriert seit: 9. Apr 2006 1.684 Beiträge Delphi 5 Professional |
#4
Vor vielen Jahren hab ich mal etwas ähnliches gesucht und daraus diese Funktion(en) gebastelt:
Delphi-Quellcode:
Ich sehe gerade, dass da wahrscheinlich ein schickes Speicherleck drin ist, und auch sonst ist der Code eher suboptimal - naja, ist eben alter Code (und wahrscheinlich weniger schlimm als der Code von jemand anders, den ich seit vorgestern in den Fingern habe).
function GetLD(Drive: Char): Cardinal;
var Buffer : String; begin Buffer := Format('\\.\%s:',[Drive]); Result := CreateFile(PChar(Buffer), GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); If Result = INVALID_HANDLE_VALUE Then begin Result := CreateFile(PChar(Buffer), GENERIC_READ, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); end; end; function GetPhysicalDiskNumber(Drive: Char): shortint; var LD : DWORD; DiskExtents : PVolumeDiskExtents; DiskExtent : TDiskExtent; BytesReturned : Cardinal; begin Result := -1; LD := GetLD(Drive); If LD = INVALID_HANDLE_VALUE Then Exit; Try DiskExtents := AllocMem(Max_Path); DeviceIOControl(LD, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, DiskExtents, MAX_PATH, BytesReturned, nil); If DiskExtents^.NumberOfDiskExtents > 0 Then begin DiskExtent := DiskExtents^.Extents[0]; Result := DiskExtent.DiskNumber; end; Finally CloseHandle(LD); end; end; MfG Dalai |
![]() |
Registriert seit: 27. Jan 2003 Ort: Bodenwerder 1.126 Beiträge Delphi XE4 Architect |
#5
@Hathor: Okay über WMI geht's natürlich, und wenn ich am Ende das anders nicht hinbekomme, werde ich es wohl auch so machen müssen. Aber unabhängig davon hat mich jetzt ein bisschen der Ergeiz gepackt, das mal so zum Laufen zu kriegen.
@Dalai: Das Funktioniert sicher auch. Aber damit kann ich ja nur die Paritionen ansprechen, die auch über ein LW-Buchstaben verfügen. Ich habe mir mittlerweise das hier zusammengebastelt. (Man muss hier von Basteln sprechen, denn diese C-Übersetzung aus dem MSDN fällt mir echt schwer).
Delphi-Quellcode:
(Man denke sich jetzt zu obigen Code noch eine Form mit Memo und Button)
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) mmo1: TMemo; btn1: TButton; procedure btn1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; const PARTITION_BASIC_DATA_GUID = 'ebd0a0a2-b9e5-4433-87c0-68b6b72699c7'; PARTITION_ENTRY_UNUSED_GUID = '00000000-0000-0000-0000-000000000000'; PARTITION_SYSTEM_GUID = 'c12a7328-f81f-11d2-ba4b-00a0c93ec93b'; PARTITION_MSFT_RESERVED_GUID = 'e3c9e316-0b5c-4db8-817d-f92df00215ae'; PARTITION_LDM_METADATA_GUID = '5808c8aa-7e8f-42e0-85d2-e1e90434cfb3'; PARTITION_LDM_DATA_GUID = 'af9b60a0-1431-4f62-bc68-3311714a69ad'; PARTITION_MSFT_RECOVERY_GUID = 'de94bba4-06d1-4d40-a16a-bfd50179d6ac'; GTP_ATTRIBUTE_PLATFORM_REQUIRED = $0000000000000001; GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER = $8000000000000000; GPT_BASIC_DATA_ATTRIBUTE_HIDDEN = $4000000000000000; GTP_BASIC_data_ATTRIBUTE_SHADOW_COPY = $2000000000000000; GTP_BASIC_DATA_ATTRIBUTE_READ_ONLY = $1000000000000000; Type PARTITION_STYLE = type Integer; PARTITION_INFORMATION_MBR = record PartitionType: Byte; BootIndicator: BOOL; RecognizedPartition: BOOL; HiddenSecorts: DWORD; end; PARTITION_INFORMATION_GPT = record PartitonType: TGUID; PartitionId: TGUID; Attributes: DWORD64; Name: WCHAR; end; _PARTITION_INFORMATION_EX = record PartitionStyle: PARTITION_STYLE; StartingOffset: LARGE_INTEGER; PartitionLength: LARGE_INTEGER; PartitionNumber: ULONG; RewritePartition: Boolean; case Integer of 0: (Mbr: PARTITION_INFORMATION_MBR); 1: (Gpt: PARTITION_INFORMATION_GPT); end; const PARTITION_STYLE_MBR = PARTITION_STYLE(0); PARTITION_STYLE_GPT = PARTITION_STYLE(1); PARTITION_STYLE_RAW = PARTITION_STYLE(2); // function FindFirstVolume(lpszVolumeName: LPTSTR; cchBufferLength: DWord): THandle; stdcall; external 'kernel32.dll' name 'FindFirstVolumeW'; // function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPTSTR; cchBufferLength: DWORD): BOOL; stdcall; external 'kernel32.dll' name 'FindNextVolumeW'; // function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external 'kernel32.dll' name 'FindVolumeClose'; // function GetVolumePathNames(lpszVolumeName: LPCTSTR; lpszVolumePathName: LPTSTR; cchBufferLength: DWORD; lpcchReturnLength: PDWORD): BOOL; stdcall; external 'kernel32.dll' name 'GetVolumePathNamesForVolumeNameW'; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var h, p: Integer; Device: string; hDevice: Cardinal; PARTITION_INFORMATION_EX: _PARTITION_INFORMATION_EX; Len: Cardinal; StartOffset, PartLength: Int64; begin for h := 1 to 9 do begin Device:='\\.\Harddisk1'+IntToStr(h); hdevice:=CreateFile(PChar(Device), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX, nil, 0, @PARTITION_INFORMATION_EX, SizeOf(PARTITION_INFORMATION_EX), Len, nil); StartOffset:=PARTITION_INFORMATION_EX.StartingOffset.QuadPart; PartLength:=PARTITION_INFORMATION_EX.PartitionLength.QuadPart; mmo1.Lines.Add(Device+' = '+IntToStr(StartOffset)+' - '+IntToStr(PartLength)); CloseHandle(hDevice); ZeroMemory(@PARTITION_INFORMATION_EX, 0); end; //end; end; end; end. Ist jetzt nur ein Testprogramm um mir die Funktion etwas besser zu verdeutlichen. Sind sicherlich viele Fehler drin. Aber so grundsätzlich kommt da schon mal was raus. Ob das dann natürlich korrekt ist, steht noch mal auf einem anderen Blatt. Und leider bekomme ich für jede Harddisk exakt die gleichen Werte. Und weiterhin ist das ja auch noch nicht so wirklich was ich will. Denn eigenlich möchte ich sowas wie '//./Harddisk1/Partition1' ansprechen, aber da bekomme ich von CreateFile immer ein ungültiges Handle. Aber soweit ich das gelesen habe muss man doch auch Partitionen ansprechen können.
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 |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |