{$mode delphi}
uses variants,classes,comserv,comobj,sysutils,activex;
function DriveTypeStr(DriveType:integer): string;
begin
case DriveType of
0 : Result:='Unknown';
1 : Result:='No Root Directory';
2 : Result:='Removable Disk';
3 : Result:='Local Disk';
4 : Result:='Network Drive';
5 : Result:='CD/DVD Disc';
6 : Result:='RAM Disk';
end;
end;
const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
v : olevariant;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LogicalDisk','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Writeln(Format('Device ID %s',[String(FWbemObject.DeviceID)]));
Writeln(Format('DriveType %s',[DriveTypeStr(FWbemObject.DriveType)]));
v:=FWbemObject.Size;
if not varisnull(v) then // can be null for removable drives.
Writeln(Format('Size %d',[ int64(FWbemObject.Size)]));
Writeln('');
FWbemObject:=Unassigned;
end;
end.