Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с диском на физическом уровне
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Shadow
smile.gif ВОт начал было ASM мотреть и вот по
----------
|int 13h WINDOWS XP недает даже читать диск
----------
говорит что приложение использует прямой доступ
как сделать так чтабы WINDOWS не прерывал
работу программы ВОТ :-[
GLuk
Работай с под голой ДОС, либо обращайся напрямую к контроллеру... smile.gif
Shadow
;D Гы ГЫ я гадасть делаю мне прямо из под WINOW
и надо то ВОТ
----
что бы пользователь не подозревал
GLuk
Тогда напрямую к контроллеру... :D
Shadow
Нашол пару прерываний DOS УРА int 26h запсь
из доса выкидывает но пишет на дискету в 0
дорогу инфу от чего она читаетсь
но
места свободнога на ней 0
занятого 0
записать ничего нельзя
и нелечится WINDOWS
--------
интересно а с винтом ето пройдет???
--------
GLuk
Под XP, вряд-ли
Shadow
Гм пробовать на св не буду  :P
Shadow
smile.gif ГМ вот примерно что получилось
mov ax,0
mov dx,0
mov cx,5
mov es,[ds:bx] ; вот ето что значит???? пока не прочел
int 26h
работает корректно пака дискета норамльная ;D
GLuk
Цитата
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
;D насчет регистров ето понятно
и что загрузочную понятно
у книге написанно
------
про буффер неочень то
в книшге нету инфы или не увидел
---
как в него чего-то положить(буффер)
типа -=BEST HACKER=-
строки
GLuk
var S:String[20];
Begin
  S:='-=BEST HACKER=-';
asm
lea bx,S+1   {+1 потому что 1 байт - размер строки}
{теперь DS:BX - содержит строку S + разное говно
после нее}
end;
End.

А вообще, после формирования динамических данных, работай со строковыми регистрами
Shadow
;D YES УРРРРРА  заработало
помотрел вредакторе диска угу есть строчечка
GLuk
Попробовал бы с загрузочной дискеты - просмотреть содержимое бут-сектора... в плане деассемблировать и попробовать написать свой бут  ;)
Shadow
;D ДЫК ТУДА МОНО ВИРУСНЫЙ КОД ПОЛОЖИТЬ
;D
правда все поппытки
скопировать БУТ с целой дискеты
и записать на другую
подвинды чегото не удается
портить удается а вот читать чеггто нет
:'(
Shadow
вот исходник типа дискету лечить
его загрузочную область
читать с хорошей дисукеты
и ззаписать на плохую
но чего то не работает
-------------------------------------
.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
Попробуй вот этот:  ;)
Только откомпиль в 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
УГУ ПРОБУЮ
GLuk
Получается ???  :)
Shadow
sad.gif чегоето нет чегто читает чегото пишет на дискету
а еффекта нет всравно загр сектор содержит строку
которую писал туда -портильщиком=
решил короче создать портильщик чтоб
он туда писал загрузинфу прямо в кодах
перепещу HEX коды из редактора вручную
поставлю место строки и попробую так
---
чегото не прав делаем ???
Shadow
:P ВИНДЫ ГОВОРЯТ
фишка в том что пока дискета хорошая
он портит а когда плохая он уже даже портить не
может винды нендают говорят что дискета нестандартная и Брррр  :P :-[ :'(
GLuk
{Эххх - попробуй вот это :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
Должно блин работать, на все, эти самые - 100%  ;)
Shadow
:D да блин вот паока дискета целая то программа работает т.е. портит записывает, но
когда испортилась и пытаешся записать то винд выдает сообщение от том что попытка записи на диск несовместимого формата блин
----
ВОТ НЮ ИЛАДНО ИЗ ПОД  DOS работет
GLuk
ААА!!! Должно работать из-под винды  >:(
Тестировал на XP, 98 SE, MS-DOS 6.22 и 95OSR2, блин smile.gif
Shadow
:D интерактивную среду написал ужо
книга abel
помогает
из под виндовс  работает только до определ момента
портить портит а когда испортит и происходит попытка обращения к нему то винды выдвают
сообщение что произшол доступ к нестандартной
форматированной дискете и выкидывает
ВОООТ !!!!!
а так все работает
GLuk
Попробую переписать, чтобы обращалась к контроллеру НГМД... :P
Shadow
:D ето через порты или прерывания ??? :smile.gif
GLuk
Через порты...
GLuk
Что-то такая хрень получается. Типа чижика-пыжика...в смысле звука, издаваемого этим самым контроллером НГМД. А еще подумай насчет граф. движка...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.