Форум: "WinAPI";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизКак получить физическую геометрию жесткого диска по Win9x Найти похожие ветки
← →
Arazel © (2006-06-28 12:52) [0]Кто с этим встречался?
← →
tesseract © (2006-06-28 13:54) [1]гм......
LBA вроде не совсем физическая геометрия. А win8x вроде вообще синусов не имеет.
← →
Deka © (2006-06-28 14:13) [2]Может как-нибудь до таблиц автоопределения биоса достучаться? Хотя наверное не получится...
← →
han_malign © (2006-06-28 18:03) [3]Примерно так:
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;
← →
Arazel © (2006-06-29 06:08) [4]Я нашел один вариянт но оно выводит по другому формату 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]
Мне кажется что это работает только для логических дисков
но я проверю ;)
← →
Arazel © (2006-06-29 09:29) [5]han_malign © (28.06.06 18:03) [3]
И все таки под логические :(
← →
Deka © (2006-06-29 10:41) [6]Ниразу не видел дисков больше чем с шестью физическими головками. В смысле разобрал и посчитал.
← →
Arazel © (2006-06-29 11:29) [7]Удалено модератором
← →
Izyum © (2006-06-29 17:58) [8]PCHS вы не получите в общем случае никакими путями - максимум, что вам будет доступно - это LCHS. Для того что бы узнать _физическую_ геометрию накопителя вам нужно будет получить доступ к микропрограмме накопителя, что не возможно в обычном режиме работы НЖМД, т.е. для того что бы узнать PCHS накопитель придется переводить в технологический режим, что есть табу за семью печатями;)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c