|
![]() |
|
Registriert seit: 27. Jan 2003 Ort: Bodenwerder 1.126 Beiträge Delphi XE4 Architect |
#1
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 |
#2
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 |
#3
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 |
#4
@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 |
![]() |
![]() |