С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Весельчак-У
35 / 35 / 20
Регистрация: 11.08.2012
Сообщений: 142

Получить количество физических дисков

18.10.2017, 19:34. Показов 2499. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите, пожалуйста!
Как программно получить количество физических дисков на компьютере?
Сейчас считаю диски вызовами API-функции CreateFile до тех пор пока она не вернёт INVALID_HANDLE_VALUE. Но, может быть есть другой, более рациональный способ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2017, 19:34
Ответы с готовыми решениями:

Определить и вывести на экран количество логических дисков
Помогите, пожалуйста. Необходимо в tasm определить и вывести на экран количество логических дисков. Заранее спасибо.

Получить список физических дисков
Здравствуйте! Как можно получить список имен физических дисков в формате PhysicalDriveN, где N - номер диска?

Получить имена физических дисков (не путать с метками)
Я вот эти имена имею ввиду.

10
36 / 7 / 1
Регистрация: 25.02.2015
Сообщений: 53
18.10.2017, 20:09
Прочитать в реестре. Как работать с реестром виндовс написано в Ассемблер для Windows. 4 изд. Пирогова.
1
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
19.10.2017, 09:48
Функция GetLogicalDrives() в WinAPI возвращает DWORD, в котором единичными битами отмечены присутствующие в системе диски.
4
0 / 0 / 0
Регистрация: 19.10.2017
Сообщений: 1
19.10.2017, 21:35
alexcoder, ТС вроде бы об физических дисках спрашивал. А функция возвращает информацию о логических.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
19.10.2017, 21:51
иоконтрол тоже возвращает, если не ошибаюсь.
у негож есть параметров туева хуча
когдато писал такаю хрень,
дескриптор тестить, пока не вернёт ошибку:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
; DeviceIoControl:
;--------------------------
;   HANDLE hDevice,             // дескриптор устройства
;   DWORD dwIoControlCode,      // код операции
;   LPVOID lpInBuffer,          // адрес буфера записи
;   DWORD nInBufferSize,        //   ..(размер этого буфера)
;   LPVOID lpOutBuffer,         // адрес буфера чтения
;   DWORD nOutBufferSize,       //   ..(размер этого буфера)
;   LPDWORD lpBytesReturned,    // счётчик записаных байт
;   LPOVERLAPPED lpOverlapped   // NULL
;   ------------------
; возвращает геометрию
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
format   PE console
include 'win32ax.inc'
include 'api\kernel32.inc'
entry   start
 
section '.data' data readable writeable
path           db  '\\.\PhysicalDrive0',0    ;устройство
count          dd  0             ;счётчик записаных байт
opCode         =   00070000h     ;константа 'IOCTL_DISK_GET_DRIVE_GEOMETRY'
 
align  16                     ;делаем адрес буфера кратным 16
buff:                         ;*Структура 'DISK_GEOMETRY'
totalCyl       dd  0,0        ;   - Всего цилиндров (Large integer)
mediaType      dd  0          ;   - Тип устройства
trackCyl       dd  0          ;   - Треков в цилиндре
secTrack       dd  0          ;   - Секторов в треке
byteSec        dd  0          ;   - Байт в секторе
;----------------------------------------------
 
section '.code' code readable executable
start:
;// Открываем устройство (диск) ----------
; Константы API лежат в файле: 'FASM\INCLUDE\EQUATES\kernel32.inc'
   invoke   CreateFile, path,80000000h,1,0,3,0,0
   or       eax,eax
   jns      @f                ;EAX = -1, ошибка.
   cinvoke  printf,<'Physical Drive ERROR!!!',0>
   jmp      exit
 
@@:
   push     eax               ;дескриптор устройства
;// Читаем геометрию диска --------------
; Константы IOCTL (opCode) лежат в СИ'шном хидере: 'winioctl.h'
; в инклудах FASM'а их нет.
   invoke   DeviceIoControl, eax,opCode,0,0,buff,32,count,0
   pop      eax
   invoke   CloseHandle,eax   ;закрыть устройство
 
;// Выводим 'DISK_GEOMETRY' -------------
   cinvoke  printf, <'Sector size   : %d byte',10,0>,[byteSec]
 
; Считаем всего секторов
   mov      eax,[trackCyl]
   imul     eax,[secTrack]
   push     eax
   mov      ebx,[totalCyl]
   xor      edx,edx           ;EDX = старшая часть
   mul      ebx               ;EAX = младшая
   cinvoke  printf, <'Total sectors : %d%d',10,0>,edx,eax
 
; Считаем общий объём диска
   pop      eax
   imul     eax,[byteSec]
   shr      eax,10            ;EAX = один цилиндр в Кбайтах (EAX / 1024)
   imul     eax,[totalCyl]
   shr      eax,10            ;EAX = всего в Мбайтах
   cinvoke  printf, <'---------------',10,\
                     'HDD Capacity  : %d Mb',0>,eax
exit:
   cinvoke  scanf
   invoke   ExitProcess, 0
;----------------------------------------------
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
        msvcrt, 'msvcrt.dll'
 
import msvcrt,\
       printf, 'printf',\
        scanf, 'scanf'
информация о разделах:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
;fasm-code
;GetVolumeInformation
;--------------------------
format   PE console
include 'win32ax.inc'
include 'api\kernel32.inc'
entry   start
 
section '.data' data readable writeable
 
PathName       db  'F:\',0     ; выбираем раздел
VolName        db  16 dup(0)   ; буфер под метку тома
VolNameSize    dd  0           ;    ..(размер этого буфера)
VolSN          dd  0           ; серийник тома
MaxLen         dd  0           ; допустимая макс.длина имени файлов
FSflags        dd  0           ; флаги FS
FSName         db  16 dup(0)   ; буфер под тип FS
FSNameSize     dd  0           ;    ..(размер этого буфера)
 
section '.code' code readable executable
start:
    invoke   GetVolumeInformation, PathName, VolName, 16,\
                                   VolSN, MaxLen, FSflags, FSName, 16
 
    cinvoke  printf, PathName
    cinvoke  printf, <' Volume Info',10,'----------------',10,\
                      'Label    : %s',10,0>,VolName
    cinvoke  printf, <'Vol SN   : %08X',10,0>,[VolSN]
    cinvoke  printf, <'FSystem  : %s',10,0>,FSName
    cinvoke  printf, <'fName len: %d',10,0>,[MaxLen]
 
    cinvoke  scanf
    invoke   ExitProcess, 0
;----------------------------------------------
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
        msvcrt, 'msvcrt.dll'
 
import msvcrt,\
       printf, 'printf',\
        scanf, 'scanf'
инфа о памяти:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
;GlobalMemoryStatus
;-------------------
;struct:
;    dw_Length;          ; размер структуры (8*4 байта)
;    dw_MemoryLoad;      ; занято в процентах
;    dw_TotalPhys;       ; /всего памяти
;    dw_AvailPhys;       ; свободно
;    dw_TotalPageFile;   ; /файл подкачки
;    dw_AvailPageFile;   ; свободно подкачки
;    dw_TotalVirtual;    ; /всего виртуальной
;    dw_AvailVirtual;    ; свободно виртуальной
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
format   PE console
include 'win32ax.inc'
include 'api\kernel32.inc'
entry   start
 
section '.data' data readable writeable
buff         dd  8 dup(0)     ; буфер под структуру
 
section '.code' code readable executable
start:
    invoke   GlobalMemoryStatus, buff        ; !!!
;// Всего физической памяти
    mov      eax,[buff+8]
    shr      eax,20           ;в Мбайтах
    cinvoke  printf, <'MEMORY',10,'----------',10,'Total   : %d Mb',10,0>,eax
 
;// Свободно
    mov      eax,[buff+12]
    shr      eax,20           ;в Мбайтах
    mov      ebx,100          ;..и в процентах
    sub      ebx,[buff+4]
    cinvoke  printf, <'Free    : %d Mb = %d%%',10,10,0>,eax,ebx
 
;// Файл подкачки
    mov      eax,[buff+16]
    shr      eax,20
    cinvoke  printf, <'PageFile',10,'----------',10,'Total   : %d Mb',10,0>,eax
    mov      eax,[buff+20]
    shr      eax,20
    cinvoke  printf, <'Free    : %d Mb',10,10,0>,eax
 
;// Виртуальной памяти
    mov      eax,[buff+24]
    shr      eax,20
    cinvoke  printf, <'Virtual',10,'----------',10,'Total   : %d Mb',10,0>,eax
    mov      eax,[buff+28]
    shr      eax,20
    cinvoke  printf, <'Free    : %d Mb',10,0>,eax
 
    cinvoke  scanf
    invoke   ExitProcess, 0
;----------------------------------------------
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
        msvcrt, 'msvcrt.dll'
 
import msvcrt,\
       printf, 'printf',\
        scanf, 'scanf'
Добавлено через 6 минут
хрень какая-то. кому и для чего это нужно - хэ. голимые усы
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
19.10.2017, 22:50
R71MT, последнюю прогу исправил под GlobalMemoryStatusEx, ибо старый вариант не канает для тех, у кого > 4Гб

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
;GlobalMemoryStatusEx
;--------------------
;struct:
;  [+00h] DWORD     dwLength;                 ; размер структуры (8*4 байта)
;  [+04h] DWORD     dwMemoryLoad;             ; занято в процентах  
;  [+08h] DWORDLONG ullTotalPhys;             ; /всего памяти       
;  [+10h] DWORDLONG ullAvailPhys;             ; свободно            
;  [+18h] DWORDLONG ullTotalPageFile;         ; /файл подкачки      
;  [+20h] DWORDLONG ullAvailPageFile;         ; свободно подкачки   
;  [+28h] DWORDLONG ullTotalVirtual;          ; /всего виртуальной  
;  [+30h] DWORDLONG ullAvailVirtual;          ; свободно виртуальной
;  [+38h] DWORDLONG ullAvailExtendedVirtual;  ; зарезервировано
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
format   PE console
include 'win32ax.inc'
entry   start
 
section '.data' data readable writeable
buff     dd  8*8
         dd  15 dup(0)     ; буфер под структуру
 
section '.code' code readable executable
start:
    invoke   GlobalMemoryStatusEx, buff        ; !!!
;// Всего физической памяти
    mov      eax,[buff+08h]
    mov      edx,[buff+08h+4]
    shrd     eax,edx,20           ;в Мбайтах
    cinvoke  printf, <'MEMORY',10,'----------',10,'Total   : %d Mb',10,0>,eax
;// Свободно
    mov      eax,[buff+10h]
    mov      edx,[buff+10h+4]
    shrd     eax,edx,20           ;в Мбайтах
    mov      edx,100          ;..и в процентах
    sub      edx,[buff+04h]
    cinvoke  printf, <'Free    : %d Mb = %d%%',10,10,0>,eax,edx
 
;// Файл подкачки
    mov      eax,[buff+18h]
    mov      edx,[buff+18h+4]
    shrd     eax,edx,20           ;в Мбайтах
    cinvoke  printf, <'PageFile',10,'----------',10,'Total   : %d Mb',10,0>,eax
    mov      eax,[buff+20h]
    mov      edx,[buff+20h+4]
    shrd     eax,edx,20           ;в Мбайтах
    cinvoke  printf, <'Free    : %d Mb',10,10,0>,eax
 
;// Виртуальной памяти
    mov      eax,[buff+28h]
    mov      edx,[buff+28h+4]
    shrd     eax,edx,20           ;в Мбайтах
    cinvoke  printf, <'Virtual',10,'----------',10,'Total   : %d Mb',10,0>,eax
    mov      eax,[buff+30h]
    mov      edx,[buff+30h+4]
    shrd     eax,edx,20           ;в Мбайтах
    cinvoke  printf, <'Free    : %d Mb',10,0>,eax
 
    cinvoke  scanf
    invoke   ExitProcess, 0
;----------------------------------------------
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
        msvcrt, 'msvcrt.dll'
 
import kernel32,\
       GlobalMemoryStatusEx, 'GlobalMemoryStatusEx',\
       ExitProcess, 'ExitProcess'
 
import msvcrt,\
       printf, 'printf',\
        scanf, 'scanf'
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
19.10.2017, 23:05
Jin X, сенкью!
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
19.10.2017, 23:07
Цитата Сообщение от Jin X Посмотреть сообщение
размер структуры (8*4 байта)
Здесь только 8*8...

Добавлено через 10 секунд
Не исправил...
0
 Аватар для Весельчак-У
35 / 35 / 20
Регистрация: 11.08.2012
Сообщений: 142
20.10.2017, 01:17  [ТС]
Цитата Сообщение от 2expres Посмотреть сообщение
Прочитать в реестре. Как работать с реестром виндовс написано в Ассемблер для Windows. 4 изд. Пирогова.
Спасибо! То, что надо!
Как прочитать данные из реестра, я разберусь. Но никак не могу найти, где именно в реестре эта информация...
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
20.10.2017, 12:43
Цитата Сообщение от Весельчак-У Посмотреть сообщение
Но никак не могу найти, где именно в реестре эта информация...
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Enum\IDE и HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Enum\SCSI (не знаю, в чём принципиальная разница в этих ключах и будут ли отображаться в IDE реальные SCSI-устройства)
Возможно ещё HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Enum\PCIIDE
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
20.10.2017, 22:10
Jin X, там нужен код. Он ID возвращает
...а есле станет седрдцу тяжко, поднимайте в небо голубей
Вложения
Тип файла: zip Глумление над реестром.zip (149.7 Кб, 10 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2017, 22:10
Помогаю со студенческими работами здесь

Размещение виртуальных дисков VirtualBox на сетевых физических дисках
доброго утра уважаемые форумчане. есть старый компьютер со 100 мюитной сетевой картой и довольно шустрыми дисками - они шустрее чем...

Получить список физических HDD и их томов
Т.е. надо вывести на форму информацию в виде: HDD0 - Seagate 123456 part1 - Disk C: part2 - Disk D: и так далее. И ещё вопрос по...

Как получить информацию о физических дисках на ПК?
Есть необходимость получить информацию о ФИЗИЧЕСКИХ дисках на компе. Для начала, хотя бы параметры... или хотя бы наличие, кол-во... и...

Количество физических HDD
Желательно wmi Как на C# вывести кол физических HDD, кол-во cd-dvd устройств??? для вывода использую textbox.

Количество физических процессоров обязательное условие?
При сравнении показателей Windows 7 Home Basic и Windows 7 Professional натолкнулась на понятие &quot;Кол-во физических процессоров&quot;....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru