Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Работа с диском на физическом уровне

Автор: Shadow 24.03.2003 10:09

smile.gif ВОт начал было ASM мотреть и вот по
----------
|int 13h WINDOWS XP недает даже читать диск
----------
говорит что приложение использует прямой доступ
как сделать так чтабы WINDOWS не прерывал
работу программы ВОТ :-[

Автор: GLuk 24.03.2003 10:23

Работай с под голой ДОС, либо обращайся напрямую к контроллеру... smile.gif

Автор: Shadow 24.03.2003 10:30

;D Гы ГЫ я гадасть делаю мне прямо из под WINOW
и надо то ВОТ
----
что бы пользователь не подозревал

Автор: GLuk 24.03.2003 10:47

Тогда напрямую к контроллеру... :D

Автор: Shadow 24.03.2003 11:29

Нашол пару прерываний DOS УРА int 26h запсь
из доса выкидывает но пишет на дискету в 0
дорогу инфу от чего она читаетсь
но
места свободнога на ней 0
занятого 0
записать ничего нельзя
и нелечится WINDOWS
--------
интересно а с винтом ето пройдет???
--------

Автор: GLuk 24.03.2003 11:46

Под XP, вряд-ли

Автор: Shadow 24.03.2003 12:10

Гм пробовать на св не буду  :P

Автор: Shadow 24.03.2003 23:22

smile.gif ГМ вот примерно что получилось
mov ax,0
mov dx,0
mov cx,5
mov es,[ds:bx] ; вот ето что значит???? пока не прочел
int 26h
работает корректно пака дискета норамльная ;D

Автор: GLuk 25.03.2003 1:40

Цитата
smile.gif ГМ вот примерно что получилось
mov ax,0
mov dx,0
mov cx,5
mov es,[ds:bx] ; вот ето что значит???? пока не прочел
int 26h
работает корректно пака дискета норамльная ;D




AX - номер логического диска (0-A, 1-B)..
DX - стартовый номер логического сектора
CX - количество секторов для записи
DS:BX - буфер с секторами, полными вирусов и спама  ;) (для дос выше 4.х это может быть адрес управляющего блока).

а [DS:BX] - это хрень, компилятор проигнорирует DS: и это будет выглядеть следующим образом:
mov es,[bx] что эквивалентно mov es,ds:[bx], а зачем инициализировать ES, я не знаю, т.к. - это не нужно. Нужно инициализировать DS:BX как адрес твоего буфера с секторами для записи... :o

А в данном примере ты гадишь загрузочную запись + 4 сектора всяким мусором, расположенным по адресу DS:[BX]  ;D

Автор: Shadow 25.03.2003 2:24

;D насчет регистров ето понятно
и что загрузочную понятно
у книге написанно
------
про буффер неочень то
в книшге нету инфы или не увидел
---
как в него чего-то положить(буффер)
типа -=BEST HACKER=-
строки

Автор: GLuk 25.03.2003 10:00

var S:String[20];
Begin
  S:='-=BEST HACKER=-';
asm
lea bx,S+1   {+1 потому что 1 байт - размер строки}
{теперь DS:BX - содержит строку S + разное говно
после нее}
end;
End.

А вообще, после формирования динамических данных, работай со строковыми регистрами

Автор: Shadow 25.03.2003 13:04

;D YES УРРРРРА  заработало
помотрел вредакторе диска угу есть строчечка

Автор: GLuk 25.03.2003 14:50

Попробовал бы с загрузочной дискеты - просмотреть содержимое бут-сектора... в плане деассемблировать и попробовать написать свой бут  ;)

Автор: Shadow 26.03.2003 4:01

;D ДЫК ТУДА МОНО ВИРУСНЫЙ КОД ПОЛОЖИТЬ
;D
правда все поппытки
скопировать БУТ с целой дискеты
и записать на другую
подвинды чегото не удается
портить удается а вот читать чеггто нет
:'(

Автор: Shadow 26.03.2003 8:55

вот исходник типа дискету лечить
его загрузочную область
читать с хорошей дисукеты
и ззаписать на плохую
но чего то не работает
-------------------------------------
.MODEL SMALL
.STACK 100H
.DATA
;msg  db '-=ENTER    DISK=-',10,13,'$'
;msg1 db '-=No       DISK=-',10,13,'$'
;msg2 db '-=ENTER DISK #2=-',10,13,'$'

paramdisk label word
maxlen            dw 6400            
dataread      dw 6400 dup(?)

.CODE
START:
     mov ax,3
     int 10h
     mov ax,@data
     mov ds,ax
     ;mov dx,offset msg
     ;mov bx,offset msg2
     ;mov ah,9
     ;int 21h
     mov ah,1
     int 21h
     ;xor dl,dl
     ;-------------DISK_READ----------
     mov ah,2            ;function read
     mov al,1            ;sectors col-vo
     mov cx,1              ;sector/cylindir
     mov dl,0              ;NUMBER DISK a:
     mov dh,0            ;number head
     mov es,paramdisk
     mov bx,paramdisk
     int 13h
     mov ax,0000
     ;jb a yes disck flag CF=0 --->to label <a:> no disk flag CF=1
;      mov dx,offset msg2
;      mov ah,9
;      int 21h
     mov ah,1
     int 21h
;--------------DISK WRITE----------------------------
     mov ah,3
     mov al,1
     mov cx,1
     mov dl,0
     mov dh,0
     mov es,paramdisk
     mov bx,[offset paramdisk]
     
     int 13h
;      mov ax,0
;      mov dx,0
;      mov cx,2
;      mov bx,offset paramdisk
;      mov es,[bx]
;      int 26h
;      mov ah,3
;      mov al,2
;      mov ch,0
;      mov cl,0
;      mov dh,0
;      mov dl,0
;      mov es:bx,[paramdisk]
;      mov ds,es:[bx]
;      int 13h
     ;-----------------
     call exit_p
     a:
     ;mov dx,offset msg1
     ;mov ah,9
     ;int 21h
     mov ah,1
     int 21h
     ;----EXIT------
     call exit_p
     
exit_p proc near
     mov ah,4ch      ;|
     mov al,0      ;| -EXIT to DOS;
     int 21h            ;|/
endp exit_p
end start

Автор: GLuk 26.03.2003 9:59

Попробуй вот этот:  ;)
Только откомпиль в com-формате  :P
а для этого в том редакторе нужно выставить параметры в опции Compiler...
И зачем ты делаешь - это, обращаясь к BIOS, ДОС делает - это точно также (в смысле обращаясь к биос), но предоставляет более удобную систему адресации сектора... smile.gif

.8086
.MODEL TINY
.CODE
ORG 100h
START:
       mov ax,3                ; Чистим экран
       int 10h
       lea dx,Msg              ; Мессага о вставке первой дискеты
       mov ah,9
       int 21h
       mov ah,0                ;
       int 16h                 ; Ждем клавишу
       mov al,0                ; Номер диска (A:)
       mov cx,1                ; Читаем 1 сектор
       xor dx,dx               ; Стартовый сектор (boot)
       lea bx,Buf              ; DS:BX - буфер для чтения
       int 25h                 ; читаем
       jc  @ErMes            ; при ошибке - выдаем мессагу
       lea dx,Msg2             ; сообщение о вставке второй дискеты
       mov ah,9
       int 21h
       mov ah,0
       int 16h                 ; ждем клавишу
       mov al,0                ; Номер диска (A:)
       mov cx,1                ; Пишем 1 сектор
       xor dx,dx               ; Номер стартового сектора
       lea bx,Buf              ; DS:BX - буфер
       int 26h                 ; Пишем
       jc  @ErMes            ; не выходит - мессага
       jmp @Exit
@ErMes: lea dx,Msg1
       mov ah,9
       int 21h
@Exit : mov ax,4C00h
       int 21h

Msg  db 'Enter disk, then press key...',10,13,'$'
Msg1 db 'IO Error...',10,13,'$'
Msg2 db 'Enter disk #2 then press key...',10,13,'$'
Buf  db 512 dup (1)

End start

Автор: Shadow 26.03.2003 11:42

УГУ ПРОБУЮ

Автор: GLuk 26.03.2003 12:24

Получается ???  :)

Автор: Shadow 26.03.2003 13:29

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

Автор: Shadow 26.03.2003 16:30

:P ВИНДЫ ГОВОРЯТ
фишка в том что пока дискета хорошая
он портит а когда плохая он уже даже портить не
может винды нендают говорят что дискета нестандартная и Брррр  :P :-[ :'(

Автор: GLuk 26.03.2003 22:08

{Эххх - попробуй вот это :o}


Uses
   Crt;
Var
  Buf:array[1..512] of Char;
  i:Integer;
  Name:String;
Begin
    ClrScr;
    Name:='boot!sec.bin'#0;
    WriteLn('Вставьте дискету и нажмите any key...');
    asm
       mov ah,0
       int 16h
       mov al,0        {Номер логического диска}
       mov cx,1        {Количество секторов для чтения}
       mov dx,0        {Номер стартового сектора}
       lea bx,Buf      {Смещение к нашему буферу}
       int 25h         {читаем}
    end;
    WriteLn('Прочитали...смотрим содержимое:');
    {Выводим, пропуская перевод строки и возврат каретки, дабы не уехало...}
    For i:=1 to 512 do If (Buf[i]<>#10) or (Buf[i]<>#13) then Write(Buf[i]);
    asm
       {Сохранить, прочитанный сектор на диск под именем Name}
       mov ax,3D02h    {Открыть файл}
       lea dx,Name     {Адрес имени}
       inc dx          {Пропускаем байт размера стринга}
       int 21h
       jnc @AlrExst    {Уже есть}
       mov ah,3Ch      {Если нет - создаем}
       mov cx,20h      {Атрибут - архивный}
       int 21h         {Обращаемся к ДОС}
@AlrExst:mov bx,ax      {Дескриптор}
       mov ah,40h      {Запись}
       mov cx,512      {Кол-во байт для записи}
       lea dx,Buf      {Буфер с прочитанным содержимым нулевого сектора}
       int 21h         {пишем}
       mov ah,3Eh      {Закрыть файл}
       int 21h
    end;
    WriteLn('Вставьте следующую дискету then press any key...');
    {Можешь оформить в виде отдельных процедур}
    {А заодно просмотреть содержимое бут-сектора на ЖД - файл boot!sec.bin}
    asm
       mov ah,0
       int 16h
       mov ax,3D02h    {Открыть файл с содержимым бут-сектора}
       lea dx,Name     {Адрес имени}
       inc dx          {Пропускаем байт размера стринга}
       int 21h
       mov bx,ax       {Сохр. дескриптор}
       mov ah,3Fh      {Читать из файла}
       mov cx,512      {512 байт читать}
       lea dx,Buf      {Буфер для чтения}
       int 21h         {читаем}
       mov ah,3Eh      {Закрыть файл}
       int 21h
       mov al,0        {Номер логического диска}
       mov cx,1        {Количество записываемых секторов}
       mov dx,0        {Номер стартового сектора}
       lea bx,Buf      {Буфер}
       int 26h         {пишешь}
    end;
End.

Автор: GLuk 26.03.2003 23:11

Должно блин работать, на все, эти самые - 100%  ;)

Автор: Shadow 28.03.2003 19:05

:D да блин вот паока дискета целая то программа работает т.е. портит записывает, но
когда испортилась и пытаешся записать то винд выдает сообщение от том что попытка записи на диск несовместимого формата блин
----
ВОТ НЮ ИЛАДНО ИЗ ПОД  DOS работет

Автор: GLuk 28.03.2003 20:51

ААА!!! Должно работать из-под винды  >:(
Тестировал на XP, 98 SE, MS-DOS 6.22 и 95OSR2, блин smile.gif

Автор: Shadow 3.04.2003 17:08

:D интерактивную среду написал ужо
книга abel
помогает
из под виндовс  работает только до определ момента
портить портит а когда испортит и происходит попытка обращения к нему то винды выдвают
сообщение что произшол доступ к нестандартной
форматированной дискете и выкидывает
ВОООТ !!!!!
а так все работает

Автор: GLuk 3.04.2003 21:56

Попробую переписать, чтобы обращалась к контроллеру НГМД... :P

Автор: Shadow 6.04.2003 17:24

:D ето через порты или прерывания ??? :smile.gif

Автор: GLuk 6.04.2003 20:45

Через порты...

Автор: GLuk 6.04.2003 23:45

Что-то такая хрень получается. Типа чижика-пыжика...в смысле звука, издаваемого этим самым контроллером НГМД. А еще подумай насчет граф. движка...