Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
1

Чтение секторов жесткого диска

26.05.2010, 10:16. Просмотров 5545. Ответов 5
Метки нет (Все метки)

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

можете посоветовать статейку по операциям с жестким диском ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2010, 10:16
Ответы с готовыми решениями:

Чтение секторов жёсткого в DOS
Добрый вечер! Проблема заключается именно в том, что программа должна работать под DOS, и ей не...

С++ чтение секторов диска
как по очереди прочитать все сектора на диске? по идее должна использоваться функция...

Чтение секторов диска (debug)
Всем привет, прошу прощения если дублирую. Задача в следующем. Нужно считать 1 сектор ЖД и первый...

Чтение жесткого диска (загрузчика)
Привет всем! Работать с файлами я умею. Но как работать с конкретным местом в жестком диске не...

5
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
30.06.2010, 08:25  [ТС] 2
нужно прочитать произвольный сектор жесткого диска...
решил для примера прочитать самый первый сектор 0-ой или 1-ый (тестил резултат один и тот же)
winhex'ом просматривал содержимое...
в результате я получаю неизвестно что...
т. е. я вижу просто
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
read_sector:
    call IsReadATA  ; ждем пока порт освободится
    mov dx, 0x1f2   ; порт 1F2h
    mov al, 1       ; читаем 1 сектор
    out dx, al      ; записываем значение в порт
    inc dx          ; порт 1F3h
    mov al, 1       ; |LBA7|LBA6|LBA5|LBA4|LBA3|LBA2|LBA1|LBA0
    out dx, al      ; зписываем значение в порт
    inc dx          ; порт 1F4h
    mov al, 0       ; |LBA15|LBA14|LBA13|LBA12|LBA11|LBA10|LBA9|LBA8|
    out dx, al      ; записываем значение в порт
    inc dx          ; порт 1F5h
    mov al, 0       ; |LBA23|LBA22|LBA21|LBA20|LBA19|LBA18|LBA17|LBA16
    out dx, al      ; записываем значение в порт
    inc dx          ; порт 1F6h
    mov al, 11100000b   ; |1|1(LBA)|DEV|1|LBA27|LBA26|LBA25|LBA24|
    out dx, al      ; записываем значение в порт
    call IsReadATA  ; ждем пока порт освободится
    mov dx, 0x1F0   ; порт 1F0h для данных
    mov cx, 256     ; количество читаемых слов
    ;mov di, data_sector    ; указываем адрес буфера
    mov di, 0          ; es = 0xb900
    rep insw        ; читаем все данные
    ret
    
;data_sector db 512 dup (?)
 
IsReadATA:
    mov dx, 0x1F7   ; указываем порт
    repeat1:
    in al, dx       ; читаем порт состояния
    test al, 0x80   ; проверяем бит 7
    jnz repeat1
    ret
 
print:
    mov ax, 0xb800
    mov es, ax
    mov ax, 0xb900
    mov ds, ax
    xor si, si
    mov ah, 0x0f
    xor di, di
    mov cx, 512
    again:
    lodsb
    stosw
    loop again
    ret
получал на экран ничего...
одни нули походу...

Добавлено через 9 часов 6 минут
в ходе поиска нужно информации обнаружил, что мне нужно использовать 48-битный LBA...
но что-то нигде нет примера как его использовать...
0
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
04.07.2010, 21:23  [ТС] 3
ну я уже сам разобрался что к чему...
0
43 / 40 / 4
Регистрация: 29.03.2010
Сообщений: 233
05.07.2010, 09:10 4
замечательно поговорил сам с собой)
поведай хоть, как разобрался?
0
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
05.07.2010, 15:56  [ТС] 5
в итоге я решил уйти от портов... и сделал с помощью прерывания биоса...
вот код, процедуры чтения сектора жесткого диска:
Assembler
1
2
3
4
5
6
7
8
9
10
11
read_sector:
    mov ah, 0x02
    mov al, 0x01    ; один сектор
    xor bx, bx      ; es:bx буфер данных
    mov cx, 0x0002      ; ch - номер цилиндра cl 0 номер начального сектора
    mov dh, 0       ; номер головки
    mov dl, 0x80    ; первый жесткий диск
    push 0xb900
    pop es
    int 0x13
    ret
чтение почему-то длится около минуты...
а вот запись довольно-таки быстро....

в этом коде я читаю второй сеткор...
что бы прочитать самый первый сектор нужно писать:
Assembler
1
mov cx, 0x0001
0
230 / 60 / 17
Регистрация: 11.03.2010
Сообщений: 294
07.07.2010, 21:37  [ТС] 6
хотелось бы услышать ответ на вопрос: "Почему я получаю результат где-то около минуты ?"
З.Ы. код выполняется в реальном режиме....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2010, 21:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чтение сырых данных с жесткого диска
Здравствуйте. Мне нужно найти потерянные данные (старые исходные коды) в не размеченной области...

[NASM] Чтение с жесткого диска через порты
Здравствуйте, нашел в инете пример чтения данных с жесткого диска на masm для DOS, переделал...

Как называется драйвер отвечающий за чтение жесткого диска ?
При установке windows 7 установщику понадобился драйвер для чтения (или что-то подобное) жестокого...

Чтение данных из главной загрузочной загрузочной записи жесткого диска
нашла пример CODE SEGMENT ASSUME CS:CODE, DS:CODE, SS:CODE, ESrCODE ;ORG 10OH BEGIN:...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.