⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 在delphi中实现windows核心编程.原书光盘代码核心编程.原书光盘代码
💻 PAS
字号:
unit Unit1;

interface

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;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -