![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить физическую геометрию жесткого диска по Win9x [D6, Win95/98]
Arazel © (2006-06-28 12:52:00)Кто с этим встречался?
Izyum (2006-06-29 17:58:00) [1]PCHS вы не получите в общем случае никакими путями - максимум, что вам будет доступно - это LCHS. Для того что бы узнать _физическую_ геометрию накопителя вам нужно будет получить доступ к микропрограмме накопителя, что не возможно в обычном режиме работы НЖМД, т.е. для того что бы узнать PCHS накопитель придется переводить в технологический режим, что есть табу за семью печатями;)
Arazel (2006-06-29 11:29:00) [2]Удалено модератором
Deka (2006-06-29 10:41:00) [3]Ниразу не видел дисков больше чем с шестью физическими головками. В смысле разобрал и посчитал.
Arazel (2006-06-29 09:29:00) [4]han_malign © (28.06.06 18:03) [3]
И все таки под логические :(
Arazel (2006-06-29 06:08:00) [5]Я нашел один вариянт но оно выводит по другому формату 8o
Test:
DiskEdit от "NU"
Cylinders: 526, Heads: 255, Sectors: 63
умножем все : 8450190
Мои:
Cylinders: 8942, Heads: 15, Sectors: 63
умножем все : 8450190
В конце тоже самое но! Геометрия разная... :(
Может здесь не хвотает по битного выделение?
han_malign© (28.06.06 18:03) [3]
Мне кажется что это работает только для логических дисков
но я проверю ;)
han_malign (2006-06-28 18:03:00) [6]Примерно так:
type
ExtGetDskFreSpcStruc = packed record
ExtFree_Size : Word;
ExtFree_Level : Word;
ExtFree_SectorsPerCluster : LongWord;
ExtFree_BytesPerSector : LongWord;
ExtFree_AvailableClusters : LongWord;
ExtFree_TotalClusters : LongWord;
ExtFree_AvailablePhysSectors : LongWord;
ExtFree_TotalPhysSectors : LongWord;
ExtFree_AvailableAllocationUnits : LongWord;
ExtFree_TotalAllocationUnits : LongWord;
ExtFree_Rsvd : array[0..1] of LongWord;
end;
const
VWIN32_DIOC_DOS_IOCTL = 1; //Performs the specified MS-DOS device I/O control function (Interrupt 21h Function 4400h through 4411h).
VWIN32_DIOC_DOS_INT25 = 2;
VWIN32_DIOC_DOS_INT26 = 3;
VWIN32_DIOC_DOS_INT13 = 4; //Performs Interrupt 13h commands.
VWIN32_DIOC_DOS_DRIVEINFO = 6;
CARRY_FLAG = 1;
type
TDIOCRegisters = packed record
reg_EBX, reg_EDX, reg_ECX, reg_EAX,
reg_EDI, reg_ESI, reg_Flags: LongWord;
end;
function GetDiskFreeInfo(DiskName : AnsiChar; var DiskInfo : ExtGetDskFreSpcStruc) : Boolean;
var
OS : TOSVersionInfo;
r : TDIOCRegisters;
hDev, cb : LongWord;
DiskStr : String[4];
begin
result := False;
FillChar(DiskInfo, sizeof(DiskInfo), 0);
DiskStr := DiskName + ':\'#0;
OS.dwOSVersionInfoSize := sizeof(OS);
GetVersionEx(OS);
case OS.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS : begin
hDev := CreateFile('\\.\VWin32', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_DELETE_ON_CLOSE, 0
);
if hDev <> INVALID_HANDLE_VALUE then begin
FillChar(r, sizeof(r), 0);
with r do begin
reg_EAX := $7303; // Get_ExtFreeSpace
reg_EDI := LongWord(@DiskInfo);
reg_ECX := LongWord(sizeof(DiskInfo));
reg_EDX := LongWord(@DiskStr[1]);
Result := DeviceIOControl(hDev, VWIN32_DIOC_DOS_DRIVEINFO, @r, sizeof(r), @r, sizeof(r), cb, nil) and
(not BOOL(r.reg_Flags and CARRY_FLAG));
end;
CloseHandle(hDev);
end;
end;
VER_PLATFORM_WIN32_NT : begin
with DiskInfo do Result := Boolean(GetDiskFreeSpace(
PChar(@DiskStr[1]), ExtFree_SectorsPerCluster, ExtFree_BytesPerSector,
ExtFree_AvailableClusters, ExtFree_TotalClusters
));
end;
else Exit;
end;
end;
Deka (2006-06-28 14:13:00) [7]Может как-нибудь до таблиц автоопределения биоса достучаться? Хотя наверное не получится...
tesseract (2006-06-28 13:54:00) [8]гм......
LBA вроде не совсем физическая геометрия. А win8x вроде вообще синусов не имеет.