Вверх ↑
Ответов: 4633
Рейтинг: 749
#1: 2014-04-03 18:45:01 ЛС | профиль | цитата
MBTY, попробуй указывать диск не через DeviceID, а через букву
\\.\A:
\\.\B:
\\.\C:
и т.д.

------------ Дoбавленo в 18.45:
Вот, вроде то, что тебе нужно.

Add(MainForm,2953706,21,105)
{
Position=1
}
Add(Button,3342741,168,147)
{
Left=15
Top=60
Caption="Get info"
link(onClick,4153675:doEnum,[])
}
Add(InlineCode,4153675,224,147)
{
WorkPoints=#6:doEnum|
EventPoints=#8:onResult|
DataPoints=#10:DiskLetter|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|30:uses windows, kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: DiskLetter:THI_Event;|27: onResult:THI_Event; |51: procedure doEnum(var _Data:TData; index:word);|5: end;|0:|14:implementation|0:|0:|59:procedure THiAsmClass.doEnum(var _Data:TData; index:word); |4:type|29: TDiskExtent = packed record|22: DiskNumber: DWORD;|35: _dummy1: DWORD; // Выравнивание|42: StartingOffset: Int64;//LARGE_INTEGER;|40: ExtentLength: Int64;//LARGE_INTEGER;|6: end;|2: |76: // Один логический том может располагаться на нескольких физических дисках|71: // поэтому возвращается массив Extents для каждого физического диска.|56: // Обычно лог. диск располагается на одном физ. диске.|30: TDiskExtents = packed record|31: NumberOfDiskExtents: DWORD;|35: _dummy1: DWORD; // Выравнивание|40: Extents: array[0..0] of TDiskExtent;|6: end;|31: PDiskExtents = ^TDiskExtents;|2: |5:const|52: IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = $00560000;|2: |3:var|14: HF: THandle;|20: Buf: PDiskExtents;|24: BufLen, OutLen: DWORD;|15: Disk: string;|13: I: Integer;|5:begin|44: Disk := ReadString(_Data, DiskLetter, '');|32: if Length(Disk) = 0 then exit;|2: |24: Disk := '\\.\' + Disk;|0:|31: HF := CreateFile(PChar(Disk),|40: 0, // no access to the drive|61: FILE_SHARE_READ or FILE_SHARE_WRITE,// share mode|59: nil, // default security attributes|44: OPEN_EXISTING, // disposition|48: 0, // file attributes|15: 0);|0:|4: |41: if HF = INVALID_HANDLE_VALUE then Exit;|2: |113: BufLen := SizeOf(TDiskExtents) + 5*SizeOf(TDiskExtent); // Итого, до 6 физических дисков на один логический том|0:|22: GetMem(Buf, BufLen);|29: FillChar(Buf^, BufLen, #0);|2: |64: if DeviceIoControl(HF, // handle to device|77: IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, // dwIoControlCode|71: nil, // lpInBuffer|75: 0, // nInBufferSize|58: Buf, // output buffer|67: BufLen, // size of output buffer|67: OutLen, // number of bytes returned|58: nil // OVERLAPPED structure|5: )|8: then|9: begin|119: //_debug('Success! OutLen = ' + Int2Str(OutLen) + '; NumberOfDiskExtents = '+ Int2Str(Buf^.NumberOfDiskExtents));|51: for I := 0 to Buf^.NumberOfDiskExtents - 1 do|11: begin|31: with Buf^.Extents[I] do|13: begin|71: //_debug(Int64_2Str(I64(ExtentLength))); // Размер физ. диска|73: _hi_OnEvent(onResult, '\\.\PHYSICALDRIVE'+Int2Str(DiskNumber));|12: end;|10: end;|8: end;|2: |23: FreeMem(Buf, BufLen);|18: CloseHandle(HF);|4:end;|0:|0:|4:end.|
link(onResult,3576306:doAdd,[])
link(DiskLetter,7658131:Text,[])
}
Add(Edit,7658131,224,84)
{
Left=15
Top=20
Text="C:"
}
Add(Memo,3576306,308,147)
{
Left=15
Top=100
Width=240
Height=150
}
карма: 26

0