论坛上的我已经查看了
他们方法,,我差多试过了,,
2000下没有问题,,可是98下,,老是读不出
高手能能帮我试一下

解决方案 »

  1.   

    Windows 9x下读写逻辑扇区的方法:interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
     TDiskIO=packed Record
        dwStartSector:longint;
        wSectors     :smallint;
        lpBuffer     :pchar;
     end;
     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;
      buffer:TDiskio;
      hDeviceHandle:THandle;
      reg:T32Regs;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);
    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
       drive=3;  //c盘
    var
      cb:DWORD;
      str:string;
      i:integer;
      boot:array[0..512-1]of byte;
    begin
        hDeviceHandle:=CreateFile('\\.\VWIN32',0,0, nil,0, FILE_FLAG_DELETE_ON_CLOSE, 0);
        if(hDeviceHandle<>INVALID_HANDLE_VALUE) then
         begin
           buffer.dwStartSector:=0;
           buffer.wSectors:=1;
           buffer.lpBuffer:=@boot;
           reg.EAX:=$7305;
           reg.EBX:=Integer(@buffer);
           reg.ECX:=-1;
           reg.EDX:=drive;//1-A 2-b 3-c
           reg.ESI:=0;//读
           reg.Flags:=0;
           DeviceIoControl(hDeviceHandle,VWIN32_DIOC_DOS_DRIVEINFO,@reg,sizeof(reg),@reg,sizeof(reg),cb,nil);
           if ((reg.Flags and 1)=1) then
              raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]);
        end;
        str:='';
        for i:=0 to buffer.wSectors*512-1 do
        begin
          str:=str+format('%.2x',[integer(boot[i])]);
          if i mod 16=15 then str:=str+#13;
        end;
        showmessage(str);
        LockDrive(hDeviceHandle,drive,true);
        if(hDeviceHandle<>INVALID_HANDLE_VALUE) then
         begin
           buffer.dwStartSector:=0;
           buffer.wSectors:=1;
           buffer.lpBuffer:=@boot;
           reg.EAX:=$7305;
           reg.EBX:=Integer(@buffer);
           reg.ECX:=-1;
           reg.EDX:=drive;//1-A 2-b 3-c
           reg.ESI:=1;//写
           reg.Flags:=0;
           DeviceIoControl(hDeviceHandle,VWIN32_DIOC_DOS_DRIVEINFO,@reg,sizeof(reg),@reg,sizeof(reg),cb,nil);
           if ((reg.Flags and 1)=1) then
              raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]);
        end;
        LockDrive(hDeviceHandle,drive,false);
    end;
      

  2.   

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
     TDiskIO=packed Record
        dwStartSector:longint;
        wSectors     :smallint;
        lpBuffer     :pchar;
     end;
     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;
      buffer:TDiskio;
      hDeviceHandle:THandle;
      reg:T32Regs;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);
    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
       drive=3;  //c盘
    var
      cb:DWORD;
      str:string;
      i:integer;
      boot:array[0..512-1]of byte;
    begin
        hDeviceHandle:=CreateFile('\\.\VWIN32',0,0, nil,0, FILE_FLAG_DELETE_ON_CLOSE, 0);
        if(hDeviceHandle<>INVALID_HANDLE_VALUE) then
         begin
           buffer.dwStartSector:=0;
           buffer.wSectors:=1;
           buffer.lpBuffer:=@boot;
           reg.EAX:=$7305;
           reg.EBX:=Integer(@buffer);
           reg.ECX:=-1;
           reg.EDX:=drive;//1-A 2-b 3-c
           reg.ESI:=0;//读
           reg.Flags:=0;
           DeviceIoControl(hDeviceHandle,VWIN32_DIOC_DOS_DRIVEINFO,@reg,sizeof(reg),@reg,sizeof(reg),cb,nil);
           if ((reg.Flags and 1)=1) then
              raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]);
        end;
        str:='';
        for i:=0 to buffer.wSectors*512-1 do
        begin
          str:=str+format('%.2x',[integer(boot[i])]);
          if i mod 16=15 then str:=str+#13;
        end;
        showmessage(str);
        LockDrive(hDeviceHandle,drive,true);
        if(hDeviceHandle<>INVALID_HANDLE_VALUE) then
         begin
           buffer.dwStartSector:=0;
           buffer.wSectors:=1;
           buffer.lpBuffer:=@boot;
           reg.EAX:=$7305;
           reg.EBX:=Integer(@buffer);
           reg.ECX:=-1;
           reg.EDX:=drive;//1-A 2-b 3-c
           reg.ESI:=1;//写
           reg.Flags:=0;
           DeviceIoControl(hDeviceHandle,VWIN32_DIOC_DOS_DRIVEINFO,@reg,sizeof(reg),@reg,sizeof(reg),cb,nil);
           if ((reg.Flags and 1)=1) then
              raise exception.createfmt('错误代码:%.2x',[reg.EAX and $FFFF]);
        end;
        LockDrive(hDeviceHandle,drive,false);
    end;
      

  3.   

    读出了这些EB58904D5357494E342E310002082000
    0200000000F800003F00FF003F000000
    FC8A3801FF4D00000000000002000000
    01000600000000000000000000000000
    800029051574324E4F204E414D452020
    20204641543332202020FA33C98ED1BC
    F87B8EC1BD7800C576001E561655BF22
    05897E00894E02B10BFCF3A48ED9BD00
    7CC645FE0F8B46188845F9384E407D25
    8BC199BB0007E89700721A83EB3A66A1
    1C7C663B078A57FC750680CA02885602
    80C31073EDBF0200837E160075458B46
    1C8B561EB903004940750142BB007EE8
    5F007326B0F84F741D8B463233D2B903
    003BC8771E8B760E3BCE73172BF10346
    1C13561EEBD1730BEB27837E2A007703
    E9FD02BE7E7DAC9803F0AC84C074173C
    FF7409B40EBB0700CD10EBEEBE817DEB
    E5BE7F7DEBE098CD165E1F668F04CD19
    4156666A00525006536A016A108BF460
    807E020E7504B442EB1D919233D2F776
    1891F776184287CAF7761A8AF28AE8C0
    CC020ACCB801028A5640CD13618D6410
    5E720A40750142035E0B4975B4C30D0A
    496E76616C69642073797374656D2064
    69736B0D0A4469736B20492F4F206572
    726F720D0A5265706C61636520746865
    206469736B2C20616E64207468656E20
    707265737320616E79206B65790D0A00
    6B65790D0A000000494F202020202020
    5359534D53444F532020205359537E01
    0057494E424F4F5420535953000055AA大侠知道,,那些位是可能改写的