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哈哈,上面的代码可以读写扇区,你自己想吧,写磁道需要怎么修改?
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哈哈,上面的代码可以读写扇区,你自己想吧,写磁道需要怎么修改?
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;