Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить физическую геометрию жесткого диска по 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 вроде вообще синусов не имеет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо