Мониторинг активности HDD на Ассемблере
В качестве предисловия коротенький анекдот из времен MS-DOS: "- Висим... - Не висим. - Висим! - Не висим, говорю - диском дpыгает." И действительно, активность жесткого диска, выражавшаяся в моргании соответствующего индикатора на корпусе, говорила о работе процесса, просто надо было подождать. Но иногда такие индикаторы отсутствовали или системник стоял в таком месте, что их не было видно. В этих случаях приходилось решать задачу различными программами, которые отображали активность жесткого диска как-нибудь иначе, например, морганием светодиода ScrollLock на клавиатуре.Вот и мне захотелось сделать что-нибудь подобное. Естественно, на Ассемблере. Для начала некоторые данные, о которых не знает FASM.
Code (Assembler) : Убрать нумерацию
- struct DISK_PERFORMANCE
- BytesRead dq ?
- BytesWritten dq ?
- ReadTime dq ?
- WriteTime dq ?
- IdleTime dq ?
- ReadCount dd ?
- WriteCount dd ?
- QueueDepth dd ?
- SplitCount dd ?
- QueryTime dd ?
- StorageDeviceNumber dd ?
- StorageManagerName rd 8
- ends
- IOCTL_DISK_PERFORMANCE = 0x70020
А вот и сам код. Он максимально упрощен и заточен на мониторинг самого первого диска в системе. В качестве индикаторов используются обычные текстовые поля.
Code (Assembler) : Убрать нумерацию
- szDrive du '\\.\PhysicalDrive0',0
- ...
- ; Открыть диск для работы
- invoke CreateFile,szDrive,0,0,0,OPEN_EXISTING,0,0
- cmp eax,-1
- je .wmclose
- mov [hhd],eax
- ; Инициализация времени чтения и записи
- mov dword [read_time],0
- mov dword [read_time+4],0
- mov dword [write_time],0
- mov dword [write_time+4],0
Code (Assembler) : Убрать нумерацию
- ; Получить информацию о диске
- invoke DeviceIoControl,[hhd],IOCTL_DISK_PERFORMANCE,\
- 0,0,perf,sizeof.DISK_PERFORMANCE,tmp,0
- .chk_read:
- ; Время последнего чтения отличается?
- mov eax,dword[perf.ReadTime]
- cmp dword[read_time],eax
- jne @f
- mov eax,dword[perf.ReadTime+4]
- cmp dword[read_time+4],eax
- jne @f
- ; Выключить индикатор
- mov ebx,FALSE
- jmp .set_read
- @@:
- ; Актуализировать время чтения
- mov eax,dword[perf.ReadTime]
- mov dword[read_time],eax
- mov eax,dword[perf.ReadTime+4]
- mov dword[read_time+4],eax
- ; Включить индикатор
- mov ebx,TRUE
- .set_read:
- ; Включить или выключить индикатор
- invoke GetDlgItem,[hwnddlg],ID_READ
- invoke EnableWindow,eax,ebx
- .chk_write:
- ; Время последней записи отличается?
- mov eax,dword[perf.WriteTime]
- cmp dword[write_time],eax
- jne @f
- mov eax,dword[perf.WriteTime+4]
- cmp dword[write_time+4],eax
- jne @f
- ; Выключить индикатор
- mov ebx,FALSE
- jmp .set_write
- @@:
- ; Актуализировать время записи
- mov eax,dword[perf.WriteTime]
- mov dword[write_time],eax
- mov eax,dword[perf.WriteTime+4]
- mov dword[write_time+4],eax
- ; Включить индикатор
- mov ebx,TRUE
- .set_write:
- ; Включить или выключить индикатор
- invoke GetDlgItem,[hwnddlg],ID_WRITE
- invoke EnableWindow,eax,ebx
В приложении пример программы с исходным текстом, которая мониторит активность жесткого диска.
Просмотров: 662 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария