用什么方法可以修改软盘零磁道的前五个字节的数据?
我用尽了方法也只能使用DISKEDITER将零磁道的数据读出来,但是怎么都修改不了。我该怎么做?请各位大哥指教。

解决方案 »

  1.   

    code segment byte public ;segment registers remain intact
    assume cs:code ;all other registers will be destroyed
    public getsecgetsec: push bp ;save old frame pointer
    mov bp,sp ;get new frame pointer
    mov ax,4[bp] ;put drive number into AL
    xor ah,ah
    mov cx,6[bp] ;number of sectors to fetch
    mov dx,8[bp] ;logical record number of 1st sector
    mov     bx,10[bp] ;pointer to transfer address
    int 25h ;BIOS call
    jc error ;error has occurred if carry flag = 1
    mov al,00H ;NULL to indicate sucessful completion
    jmp done
    error: cmp al,00H ;detect unspecified error code 00H
    jne done ;...change to 0FFh if found to 
    mov al,0FFH ;...differentiate it from success code
    done: xor ah,ah ;return AL only
    popf ;remove flags int 0x25 left on stack
    pop bp ;restore original frame pointer
    ret ;all donecode ends
    end哈哈,上面的代码可以读写扇区,你自己想吧,写磁道需要怎么修改?
      

  2.   

    diskedit可以的,先到help前一个菜单好像是options之类的去掉readonly前的选择。然后再修改。
      

  3.   

    不知道一面的程序对你有没有用:unit Unit1;
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls;type INT13Regs = record
         buffer:pointer;//EBX寄存器
          Drive:BYTE;//磁盘号,dl
         Head:BYTE;//刺头号,dh
         EDX_Hight:WORD;//EDX寄存器
         Sector:BYTE;//起始扇区号,cl
         Track:BYTE;//磁道号,ch
         ECX_Hight:WORD;//ECX寄存器
         Number:BYTE;//要读写的扇区数,al
         CMD:BYTE;//命令:2—读,3—写,5—格式化,ah
         EAX_Hight:WORD;//EAX寄存器
         EDI:DWORD;//EDI寄存器
         ESI:DWORD;//ESI寄存器
         Flags:DWORD;//Flags
         end;
         TVWin32CtlCode = (ccNone,ccVWin32Intloctl,ccVWin32Int26,ccVWin32Int25,ccVWin32Int13);type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        edit1: TEdit;
        RichEdit1: TRichEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Button5: TButton;
        Label3: TLabel;
        Edit4: TEdit;
        Button6: TButton;
        Edit5: TEdit;
        Label4: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Button1Click(Sender: TObject);//98下读取
    var hDev:thandle;
        Abuffer,LPRET:array[0..511] of char;//定义缓冲区,放置读取扇区数据
        int13_registers:INT13Regs;//定义INT13中断的寄存器结构变量
        b_int13_registers,AA:boolean;
        TCOUNT:DWORD;
        i,j:integer;
        Tempstr:string;
    begin
    hDev:=CreateFile('\\.\VWIN32 ',0,0,NIL,0,FILE_FLAG_DELETE_ON_CLOSE,0);
    int13_registers.buffer:=@Abuffer;
    int13_registers.Drive:=0;//0-软盘A;1—软盘B;0x80-硬盘c
     int13_registers.Head:=0;//0面
     int13_registers.Track:=0;//0磁到道
    int13_registers.Sector:=0;//0扇区
    int13_registers.Number:=1;
    int13_registers.CMD:=2;//读操作
    b_int13_registers:=FALSE;
    AA:=DeviceioControl(hDev,ord(ccVWin32Int13),@int13_registers,sizeof(INT13Regs),@int13_registers,sizeof(INT13Regs),TCOUNT,NIL);
    CLOSEHANDLE(hDev);
    //AA:=b_int13_registers;
      for i:=0 to 511do
          begin
          Edit1.text:=Edit1.text+Abuffer[i];
          end;
      end;
    end;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Button2Click(Sender: TObject);//98下写
    var hDev:thandle;
        Abuffer,LPRET:array[0..511] of char;//定义缓冲区,放置读取扇区数据
        int13_registers:INT13Regs;//定义INT13中断的寄存器结构变量
        b_int13_registers,aa:boolean;
        TCOUNT:DWORD;
        i:integer;
    begin
    hDev:=CreateFile('\\.\VWIN32 ',0,0,NIL,0,FILE_FLAG_DELETE_ON_CLOSE,0);
    for i:=0 to 511 do
        begin
        Abuffer[i]:='b';
        end;
    int13_registers.buffer:=@Abuffer;
    int13_registers.Drive:=0;//0-软盘A;1—软盘B;0x80-硬盘c
    int13_registers.Head:=0;
     int13_registers.Track:=0;
    int13_registers.Sector:=0;
    int13_registers.Number:=1;
    int13_registers.CMD:=3;//写入
    b_int13_registers:=DeviceioControl(hDev,4,@int13_registers,sizeof(INT13Regs),@int13_registers,
    sizeof(INT13Regs),TCOUNT,NIL);
    CLOSEHANDLE(hDev);
    end;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Button3Click(Sender: TObject);//2000下读
    var hDev:Thandle;
        dwRet:dword;
        RBuffer:array[0..511] of char;
        Tempstr:string;
        i,j:integer;
        tcount:boolean;
        dwStartSector:integer;
    begin
      dwStartSector:=0;//起始位置
      hDev:=createfile('\\.\A:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
      SetFilePointer(hDev,512*dwStartSector,0,FILE_BEGIN);
      dwRet:=0;
      tcount:=ReadFile(hDev,RBuffer,512,dwRet,0);
      for i:=0 to 511 do
          begin
          Edit1.text=Edit1.text+RBuffer[i];
          end;
        closehandle(hDev);
    end;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.Button4Click(Sender: TObject);//2000下写入
    var hDev:Thandle;
        dwRet:dword;
        RBuffer:array[0..511] of char;
        Tempstr:string;
        i:integer;
         tcount:boolean;
         dwStartSector:integer;
    begin
      dwStartSector:=0;
      hDev:=createfile('\\.\A:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
      SetFilePointer(hDev,512*dwStartSector,0,FILE_BEGIN);
      dwRet:=0;
      for i:=0 to 511 do
          begin
          RBuffer[i]:='a';
          end;
     tcount:=WriteFile(hDev,RBuffer,512,dwRet,0);
     closehandle(hDev);
    end;