如何读去软盘上的数据? (代码帖) 题目见 如何读去软盘上的数据? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 何谓指定单元的数据?物理地址?文件偏移?都是很容易的事情http://lysoft.7u7.net unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type P32Regs = ^T32Regs; //32位寄存器结构 T32Regs = record EBX: Longint; EDX: Longint; ECX: Longint; EAX: Longint; EDI: Longint; ESI: Longint; Flags: Longint; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const FILE_FLAG_DELETE_ON_CLOSE=$04000000; VWIN32_DIOC_DOS_IOCTL = 1; { MS-DOS Int 21h 44xxh functions call } VWIN32_DIOC_DOS_INT25 = 2; { MS-DOS Int 25h function call } VWIN32_DIOC_DOS_INT26 = 3; { MS-DOS Int 26h function call } VWIN32_DIOC_DOS_INT13 = 4; { MS-DOS Int 13h functions call } VWIN32_DIOC_DOS_DRIVEINFO = 6; {MS-DOS Int 21h function 730X}var Form1: TForm1; reg: T32Regs; hDeviceHandle: Thandle; fresult: boolean; cb: DWord;implementation{$R *.DFM}function LockDisk(VMM32Handle:cardinal;disk:byte;LockOrNot:boolean):boolean;var R: T32Regs; cb: DWord;begin if (VMM32Handle=INVALID_HANDLE_VALUE)then begin result:=false; exit; end; fillchar(r, sizeof(r), 0); if LockOrNot=true then begin R.ECX := $084b; R.EBX := $100+disk; //bh:0-3级 0,1,$80,$81... R.EDX := 1; //1允许写,0允许格式化 end else begin R.ECX := $086b; R.EBX := disk; //0,1,$80,$81... end; R.EAX := $440D; DeviceiOControl(VMM32Handle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R, SizeOf(R), cb, nil); Result := (R.Flags and 1 = 0); //and (R.EAX and $FFFF = 0);end;function LockDrive(VMM32Handle:cardinal;drive:byte;LockOrNot:boolean):boolean;var R: T32Regs; cb: DWord;begin if (VMM32Handle=INVALID_HANDLE_VALUE)then begin result:=false; exit; end; fillchar(r, sizeof(r), 0); if LockOrNot=true then begin R.ECX := $084a; R.EBX := $100+drive; //bh:0-4级 0当前盘,1:A,2:B,3:C R.EDX := 1; //1允许写,0允许格式化 end else begin R.ECX := $086A; R.EBX := drive; //0当前盘,1:A,2:B,3:C end; R.EAX := $440D; DeviceiOControl(VMM32Handle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R, SizeOf(R), cb, nil); Result := (R.Flags and 1 = 0); //and (R.EAX and $FFFF = 0);end;procedure TForm1.Button1Click(Sender: TObject);const disk=0; //0表示A盘var boot: array[0..512] of byte; str:string; i:integer;begin hDeviceHandle := CreateFile('\\.\VWIN32', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE, 0); if (hDeviceHandle <> INVALID_HANDLE_VALUE) then begin reg.EAX := $0201; {ah=2表示读,al=1表示1个扇区} reg.EBX := Integer(@boot); {缓冲区} reg.ECX := $0001; reg.EDX := disk; {只能读软盘,0:A盘 1:B盘} reg.Flags := 0; fresult := DeviceIoControl(hDeviceHandle, VWIN32_DIOC_DOS_INT13, @reg, sizeof(reg), @reg, sizeof(reg), cb, nil); if ((reg.Flags and 1) = 1) then raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]); str:=''; for i:=0 to 512-1 do begin str:=str+format('%.2x',[integer(boot[i])]); if i mod 16=15 then str:=str+#13; end; showmessage(str); LockDisk(hDevicehandle,disk,true); //加锁 reg.EAX := $0301; {ah=3表示读,al=1表示1个扇区} reg.EBX := Integer(@boot); {缓冲区} reg.ECX := $0001;{ch=0表示柱面编号,cl=1表示起始扇区编号} reg.EDX := disk; {dh=0磁道编号,disk=0表示A盘} reg.Flags := 0; fresult := DeviceIoControl(hDeviceHandle, VWIN32_DIOC_DOS_INT13, @reg, sizeof(reg), @reg, sizeof(reg), cb, nil); if ((reg.Flags and 1) = 1) then if reg.EAX=$300 then raise exception.create('写保护') else raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]); LockDisk(hDevicehandle,disk,false); //解锁 end;end;end. 同意ly_liuyang(Liu Yang)的看法。否则你必须写个vxd程序直接访问软盘资料。涉及到软件的电气参数(第一个扇区),扇区间的字节间隙,每track扇区数,每扇区的字节数。直接访问软件,这些参数非常麻烦。用API读写软盘,估计达不到你的要求。不会是用软件加密吧 www.2ccc.com上有一个例子,用于读写磁盘 各路delphi高手请指教:第三方控件中twDBGridDD, twDBEditDD是什么控件 请问如何 控制 其它程序 窗体 放到 最前面 ? 急! list index out of bounds(1) delphi如何批量删除文件? 有关StringGrid 请问,有什么好的工具可以下载再线电影? 熟悉LISTVIEW的朋友请进。 求助关于打印的一个问题。? 用idhttp怎么实现对IIS的mime文件类型的新增啊 Delphi初学者问题之六(时间日期) access中的数据类型转换问题 大家来看看,我想实现这一功能,该怎么做?
物理地址?
文件偏移?都是很容易的事情http://lysoft.7u7.net
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
P32Regs = ^T32Regs; //32位寄存器结构
T32Regs = record
EBX: Longint;
EDX: Longint;
ECX: Longint;
EAX: Longint;
EDI: Longint;
ESI: Longint;
Flags: Longint;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
FILE_FLAG_DELETE_ON_CLOSE=$04000000;
VWIN32_DIOC_DOS_IOCTL = 1; { MS-DOS Int 21h 44xxh functions call }
VWIN32_DIOC_DOS_INT25 = 2; { MS-DOS Int 25h function call }
VWIN32_DIOC_DOS_INT26 = 3; { MS-DOS Int 26h function call }
VWIN32_DIOC_DOS_INT13 = 4; { MS-DOS Int 13h functions call }
VWIN32_DIOC_DOS_DRIVEINFO = 6; {MS-DOS Int 21h function 730X}var
Form1: TForm1;
reg: T32Regs;
hDeviceHandle: Thandle;
fresult: boolean;
cb: DWord;
implementation{$R *.DFM}
function LockDisk(VMM32Handle:cardinal;disk:byte;LockOrNot:boolean):boolean;
var
R: T32Regs;
cb: DWord;
begin
if (VMM32Handle=INVALID_HANDLE_VALUE)then
begin
result:=false;
exit;
end;
fillchar(r, sizeof(r), 0);
if LockOrNot=true then
begin
R.ECX := $084b;
R.EBX := $100+disk; //bh:0-3级 0,1,$80,$81...
R.EDX := 1; //1允许写,0允许格式化
end
else begin
R.ECX := $086b;
R.EBX := disk; //0,1,$80,$81...
end;
R.EAX := $440D;
DeviceiOControl(VMM32Handle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R, SizeOf(R), cb, nil);
Result := (R.Flags and 1 = 0); //and (R.EAX and $FFFF = 0);
end;function LockDrive(VMM32Handle:cardinal;drive:byte;LockOrNot:boolean):boolean;
var
R: T32Regs;
cb: DWord;
begin
if (VMM32Handle=INVALID_HANDLE_VALUE)then
begin
result:=false;
exit;
end;
fillchar(r, sizeof(r), 0);
if LockOrNot=true then
begin
R.ECX := $084a;
R.EBX := $100+drive; //bh:0-4级 0当前盘,1:A,2:B,3:C
R.EDX := 1; //1允许写,0允许格式化
end
else begin
R.ECX := $086A;
R.EBX := drive; //0当前盘,1:A,2:B,3:C
end;
R.EAX := $440D;
DeviceiOControl(VMM32Handle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R, SizeOf(R), cb, nil);
Result := (R.Flags and 1 = 0); //and (R.EAX and $FFFF = 0);
end;procedure TForm1.Button1Click(Sender: TObject);
const
disk=0; //0表示A盘
var
boot: array[0..512] of byte;
str:string;
i:integer;
begin
hDeviceHandle := CreateFile('\\.\VWIN32', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hDeviceHandle <> INVALID_HANDLE_VALUE) then
begin
reg.EAX := $0201; {ah=2表示读,al=1表示1个扇区}
reg.EBX := Integer(@boot); {缓冲区}
reg.ECX := $0001;
reg.EDX := disk; {只能读软盘,0:A盘 1:B盘}
reg.Flags := 0;
fresult := DeviceIoControl(hDeviceHandle, VWIN32_DIOC_DOS_INT13, @reg, sizeof(reg), @reg, sizeof(reg), cb, nil);
if ((reg.Flags and 1) = 1) then
raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]); str:='';
for i:=0 to 512-1 do
begin
str:=str+format('%.2x',[integer(boot[i])]);
if i mod 16=15 then str:=str+#13;
end;
showmessage(str);
LockDisk(hDevicehandle,disk,true); //加锁
reg.EAX := $0301; {ah=3表示读,al=1表示1个扇区}
reg.EBX := Integer(@boot); {缓冲区}
reg.ECX := $0001;{ch=0表示柱面编号,cl=1表示起始扇区编号}
reg.EDX := disk; {dh=0磁道编号,disk=0表示A盘}
reg.Flags := 0;
fresult := DeviceIoControl(hDeviceHandle, VWIN32_DIOC_DOS_INT13, @reg, sizeof(reg), @reg, sizeof(reg), cb, nil);
if ((reg.Flags and 1) = 1) then
if reg.EAX=$300 then
raise exception.create('写保护')
else raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]);
LockDisk(hDevicehandle,disk,false); //解锁
end;
end;end.
否则你必须写个vxd程序直接访问软盘资料。
涉及到软件的电气参数(第一个扇区),扇区间的字节间隙,每track扇区数,每扇区的字节数。直接访问软件,这些参数非常麻烦。用API读写软盘,估计达不到你的要求。
不会是用软件加密吧