Размер HDD

Тема в разделе "WASM.OS.DEVEL", создана пользователем AlexCasual, 5 мар 2012.

  1. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Как низкоуровнево можно получить ПОЛНЫЙ размер харда?
    В MBR информация о разделах уже размеченных,соответсвенно полного размера харда я не получу тупо складывая размеры всех разделов....
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    А разве в нулевом секторе нету этой инфы?
    Смотрите поля NumberOfCylinders, NumberOfHeads и т.п.
     
  3. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    T800
    Какой нулевой сектор?
    MBR содержит таблицу разделов,как я понимаю уже размеченных и из них никак не узнать настоящего размера HDD...
     
  4. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Да что вы пристали то к этой MBR то?

    http://rsdn.ru/forum/asm/4646517.flat.aspx
    это тоже ваше что ли?
     
  5. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    T800
    Нет,не моё...
    Ну и что же тогда такое нулевой сектор?!
     
  6. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    А вам на каком уровне надо? Например можно послать команду ATA IDENTIFY DEVICE. Есть еще и прерывание делающее это же. В винде через DeviceIoControl делается
     
  7. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    IOCTL_DISK_GET_DRIVE_GEOMETRY
     
  8. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Мне нужно на уровне РУЧНОГО разбора файловых структур...
     
  9. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    AlexCasual, ты определись что тебе именно надо.
    Реальный размер диска, или тот что указан в файловой системе или MBR ?
    1) Таблица разделов - там данные нереальный могут быть.
    2) Нулевой сектор - всё зависит от файловой системы в разделе + данные могут быть нереальные.

    По этому необходимо сделать запросы к HDD напрямую через порты или как-нибудь через BIOS Extended CHS.

    К примеру погляди исходники трукрипта, там есть функция GetDriveGeometry
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Понятно, что речь идет о "реальном размере диска".

    "РУЧНОЙ разбор файловых структур" можно и из-под винды делать. Ты лучше скажи, тебе нужно напрямую взаимодействовать с аппаратурой или можно использовать сервис ОС/драйверов. В любом случае и для винды, и для работы на голом железе ответы были даны. Только следует учитывать, что существует два вида размеров диска - пользовательский и заводской. Обычно используется пользовательский размер - слова 60-61 (28-разрядная адресация) или 100-103 (48-разрядная адресация) структуры, возвращаемой IDENTIFY DEVICE. Если нужен заводской размер, то для этого есть спец. команда READ NATIVE MAX ADDRESS (EXT).
     
  11. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    А не наоборот?
     
  12. AlexCasual

    AlexCasual New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2009
    Сообщения:
    120
    Вообще в частности стоит задача о поиске неразмеченных/свободных областей на диске.
     
  13. Буджака

    Буджака New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2017
    Сообщения:
    5
    Адрес:
    Москва
    1. Получаешь информацию о размеченных/занятых областях.
    2. Получаешь геометрию диска, считаешь общий размер.
    3. Сопоставляешь его с п.1
    На каком этапе у Вас трудности?
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Буджака, круто, но посмотрите дату последнего поста )))
     
    Буджака нравится это.
  15. Буджака

    Буджака New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2017
    Сообщения:
    5
    Адрес:
    Москва
    Эхх, некропостингом я занимаюсь.
     
  16. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Не не не! Надоть такую информацию. !

    Буджака,

    Статейку бы сварганил. Ещё бы и на FASM!:good2:
     
  17. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Вот пример на FASM'е для сбора инфы о диске через API.
    Собственно ничего нового.. Но речь о том, как вычислить константы IOCTL, т.к. мой FASM-1.67 в упор отказывался компилить "DeviceIoControl", если в нём 'код операции' задаётся в текстовом виде, типа "IOCTL_Disk_Get_Drive_Geometry". Требует константу..

    В итоге, выловил в гугле файл "MpuNTDeviceIOControl.pas", который цепляю в скрепке.
    В нём имеются базы и алго вычисления всех констант кодов операций. Вот вырезка из этого файла, и пример вычисления константы для "Get_Drive_Geometry":

    const:
    ---------
    IOCTL_DISK_GET_DRIVE_GEOMETRY = (
    (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
    ($0000 shl 2) or METHOD_BUFFERED);

    IOCTL_DISK_GET_MEDIA_TYPES = (
    (IOCTL_DISK_BASE shl 16) or (FILE_ANY_ACCESS shl 14) or
    ($0300 shl 2) or METHOD_BUFFERED);

    IOCTL_DISK_FORMAT_TRACKS = (
    (IOCTL_DISK_BASE shl 16) or ((FILE_READ_ACCESS or FILE_WRITE_ACCESS) shl 14)
    or ($0006 shl 2) or METHOD_BUFFERED);

    Здесь видно, что нужны ещё 6 полей, которые описаны там-же:

    const:
    ----------
    IOCTL_DISK_BASE = FILE_DEVICE_DISK;
    FILE_DEVICE_DISK = 00000007h;
    FILE_ANY_ACCESS = 0;
    FILE_READ_ACCESS = 00000001h;
    FILE_WRITE_ACCESS = 00000002h;
    METHOD_BUFFERED = 0.


    Подставив эти значения в алго первой врезки "IOCTL_DISK_GET_DRIVE_GEOMETRY" получаю в отладчике(GRDB) такое значение:

    ---------------------------------------
    GRDB version 1.7 Copyright (c) LADsoft
    History enabled
    ->a
    0E85:0100 mov eax,7
    0E85:0106 shl eax,10
    0E85:010A mov ebx,0
    0E85:0111 shl ebx,0Е
    0E85:0115 mov ecx,0
    0E85:011C shl ecx,2
    0E85:0120 or eax,ebx
    0E85:0123 or eax,ecx
    0E85:0126 or eax,0 : EAX = 00070000h
    0E85:012A
    ->

    Остальные коды операций вычисляются аналогично, в результате чего имею константы ниже, которые теперь можно подставить в FASM'овский код с "DeviceIoControl":

    00070000h = IOCTL_DISK_GET_DRIVE_GEOMETRY
    00070C00h = IOCTL_DISK_GET_MEDIA_TYPES
    0007C018h = IOCTL_DISK_FORMAT_TRACKS

    Кстати, кое-что можно выловить и из СИ-шного хидера "winioctl.h", но там что-то мутное..
     

    Вложения:

    rococo795 нравится это.
  18. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Код (ASM):
    1.  
    2. ; DeviceIoControl:
    3. ;--------------------------
    4.  
    5. format   PE console
    6. include 'win32ax.inc'
    7. include 'api\kernel32.inc'
    8. entry   start
    9.  
    10. section '.data' data readable writeable
    11. path           db  '\\.\PhysicalDrive0',0    ;устройство
    12. count          dd  0             ;счётчик записаных байт
    13. opCode         =   00070000h     ;константа 'IOCTL_DISK_GET_DRIVE_GEOMETRY'
    14.  
    15. align  16                     ; делаем адрес буфера кратным 16
    16. buff:                         ; DISK_GEOMETRY
    17. totalCyl       dd  0,0        ;   - Всего цилиндров (Large integer)
    18. mediaType      dd  0          ;   - Тип устройства
    19. trackCyl       dd  0          ;   - Треков в цилиндре
    20. secTrack       dd  0          ;   - Секторов в треке
    21. byteSec        dd  0          ;   - Байт в секторе
    22. ;----------------------------------------------
    23.  
    24. section '.code' code readable executable
    25. start:
    26. ;// Открываем устройство (диск) ----------
    27. ; Константы функций лежат в файле: 'FASM\INCLUDE\EQUATES\kernel32.inc'
    28.    invoke   CreateFile, path,80000000h,1,0,3,0,0
    29.    or       eax,eax
    30.    jns      @f                ;EAX = -1, ошибка.
    31.    cinvoke  printf,<'Physical Drive ERROR!!!',0>
    32.    jmp      exit
    33. @@:
    34.    push     eax               ;дескриптор устройства
    35.  
    36. ;// Читаем геометрию диска --------------
    37.    invoke   DeviceIoControl, eax,opCode,0,0,buff,32,count,0
    38.    pop      eax
    39.    invoke   CloseHandle,eax   ;закрыть устройство
    40.  
    41. ;// Выводим 'DISK_GEOMETRY' -------------
    42.    cinvoke  printf, <'Sector size   : %d byte',10,0>,[byteSec]
    43.  
    44. ; Считаем всего секторов
    45.    mov      eax,[trackCyl]
    46.    imul     eax,[secTrack]
    47.    push     eax
    48.    mov      ebx,[totalCyl]
    49.    xor      edx,edx           ;EDX = старшая часть
    50.    mul      ebx               ;EAX = младшая
    51.    cinvoke  printf, <'Total sectors : %d%d',10,0>,edx,eax
    52.  
    53. ; Считаем общий объём диска
    54.    pop      eax
    55.    imul     eax,[byteSec]
    56.    shr      eax,10            ;EAX = один цилиндр в Кбайтах (EAX / 1024)
    57.    imul     eax,[totalCyl]
    58.    shr      eax,10            ;EAX = всего в Мбайтах
    59.    cinvoke  printf, <'---------------',10,\
    60.                      'HDD Capacity  : %d Mb',0>,eax
    61. exit:
    62.    cinvoke  scanf
    63.    invoke   ExitProcess, 0
    64. ;----------------------------------------------
    65. section '.idata' import data readable
    66. library kernel32, 'kernel32.dll',\
    67.         msvcrt, 'msvcrt.dll'
    68.  
    69. import msvcrt,\
    70.        printf, 'printf',\
    71.         scanf, 'scanf'
    72.  
     
    rococo795 нравится это.
  19. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Ну и прицепом ещё пару строк.. Для получения инфы о памяти:
    Код (ASM):
    1.  
    2. ;GlobalMemoryStatus
    3. ;-------------------
    4. format   PE console
    5. include 'win32ax.inc'
    6. include 'api\kernel32.inc'
    7. entry   start
    8.  
    9. section '.data' data readable writeable
    10. buff         dd  8 dup(0)     ; буфер под структуру
    11.  
    12. section '.code' code readable executable
    13. start:
    14.     invoke   GlobalMemoryStatus, buff
    15.  
    16. ;// Всего физической памяти
    17.     mov      eax,[buff+8]
    18.     shr      eax,20           ;в Мбайтах
    19.     cinvoke  printf, <'MEMORY',10,'----------',10,'Total   : %d Mb',10,0>,eax
    20.  
    21. ;// Свободно физ.памяти
    22.     mov      eax,[buff+12]
    23.     shr      eax,20           ;в Мбайтах
    24.     mov      ebx,100          ;..и в процентах
    25.     sub      ebx,[buff+4]
    26.     cinvoke  printf, <'Free    : %d Mb = %d%%',10,10,0>,eax,ebx
    27.  
    28. ;// Файл подкачки
    29.     mov      eax,[buff+16]
    30.     shr      eax,20
    31.     cinvoke  printf, <'PageFile',10,'----------',10,'Total   : %d Mb',10,0>,eax
    32.     mov      eax,[buff+20]
    33.     shr      eax,20
    34.     cinvoke  printf, <'Free    : %d Mb',10,10,0>,eax
    35.  
    36. ;// Виртуальной памяти
    37.     mov      eax,[buff+24]
    38.     shr      eax,20
    39.     cinvoke  printf, <'Virtual',10,'----------',10,'Total   : %d Mb',10,0>,eax
    40.     mov      eax,[buff+28]
    41.     shr      eax,20
    42.     cinvoke  printf, <'Free    : %d Mb',10,0>,eax
    43.  
    44.     cinvoke  scanf
    45.     invoke   ExitProcess, 0
    46. ;----------------------------------------------
    47. section '.idata' import data readable
    48. library kernel32, 'kernel32.dll',\
    49.         msvcrt, 'msvcrt.dll'
    50.  
    51. import msvcrt,\
    52.        printf, 'printf',\
    53.         scanf, 'scanf'
    54.  
     
    rococo795 нравится это.
  20. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    Читаем данные о разделах диска:
    Код (ASM):
    1.  
    2. ;GetVolumeInformation
    3. ;--------------------------
    4. format  PE console
    5. include 'win32ax.inc'
    6. include 'api\kernel32.inc'
    7. entry   start
    8.  
    9. section '.data' data readable writeable
    10.  
    11. PathName       db  'C:\',0     ; выбираем раздел
    12. VolName        db  16 dup(0)   ; буфер под метку тома
    13. VolNameSize    dd  0           ;    ..(размер этого буфера)
    14. VolSN          dd  0           ; серийник тома
    15. MaxLen         dd  0           ; допустимая макс.длина имени файлов
    16. FSflags        dd  0           ; флаги FS
    17. FSName         db  16 dup(0)   ; буфер под тип FS
    18. FSNameSize     dd  0           ;    ..(размер этого буфера)
    19.  
    20. section '.code' code readable executable
    21. start:
    22.     invoke   GetVolumeInformation, PathName, VolName, 16,\
    23.                                    VolSN, MaxLen, FSflags, FSName, 16
    24.  
    25.     cinvoke  printf, PathName
    26.     cinvoke  printf, <' Volume Info',10,'----------------',10,\
    27.                       'Label    : %s',10,0>,VolName
    28.     cinvoke  printf, <'Vol SN   : %08X',10,0>,[VolSN]
    29.     cinvoke  printf, <'FSystem  : %s',10,0>,FSName
    30.     cinvoke  printf, <'fName len: %d',10,0>,[MaxLen]
    31.  
    32.     cinvoke  scanf
    33.     invoke   ExitProcess, 0
    34. ;----------------------------------------------
    35. section '.idata' import data readable
    36. library kernel32, 'kernel32.dll',\
    37.         msvcrt, 'msvcrt.dll'
    38.  
    39. import msvcrt,\
    40.        printf, 'printf',\
    41.         scanf, 'scanf'
    42.  
     
    galenkane и rococo795 нравится это.