题目见 如何读去软盘上的数据? 

解决方案 »

  1.   

    何谓指定单元的数据?
    物理地址?
    文件偏移?都是很容易的事情http://lysoft.7u7.net
      

  2.   

    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.
      

  3.   

    同意ly_liuyang(Liu Yang)的看法。
    否则你必须写个vxd程序直接访问软盘资料。
    涉及到软件的电气参数(第一个扇区),扇区间的字节间隙,每track扇区数,每扇区的字节数。直接访问软件,这些参数非常麻烦。用API读写软盘,估计达不到你的要求。
    不会是用软件加密吧
      

  4.   

    www.2ccc.com上有一个例子,用于读写磁盘