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

📄 unitread.pas

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

interface

uses
  SysUtils, WinTypes,WINPROCS, Messages, Classes, Graphics, Controls,
  StdCtrls, Dialogs;

type
  TRegs=packed record
     edi, esi, ebp, RESERVED, ebx, edx, ecx, eax:Longint;
     wFlags, es, ds, fs, gs, ip, cs, sp, ss:WORD;
  end;
  PRegs=^TRegs;
  TDISKRW = packed record
     len,res:byte;
     SecCount,BufferOffset,BufferSegment:word;
     SecLow,SecHigh:longint;
  end;
  PDISKRW=^TDISKRW;

  function WJSReadDisk16(drv:byte;var DiskRW:TDISKRW):boolean;export;
  function WJSWriteDisk16(drv:byte;var DiskRW:TDISKRW):boolean;export;

implementation


function RM_Int (bIntNum:byte;var RegStruct:TRegs):boolean;
var
   r:boolean;
label END1;
begin
   r:=false;
   asm
         pusha
         push es
         mov  ax, 0300h         { DPMI Simulate Real Mode Int }
         mov  bl, bIntNum       { Number of the interrupt to simulate }
         mov  bh, 01h           { Bit 0 = 1; all other bits must be 0 }
         xor  cx, cx            { No words to copy }
         les  di, RegStruct
         int  31h                   { Call DPMI }
         jc   END1                  { CF set if error occurred }
         mov  r, TRUE
   END1:
         pop es
         popa
   end;
   result:=r;
end;

  function WJSReadDisk16(drv:byte;var DiskRW:TDISKRW):boolean;
  var
     callStruct:TRegs;
     DiskRW_Bak,Buffer_Bak:longint;
     DiskRW_WIN_SEG,DiskRW_DOS_SEG:word;
     DiskRW_WIN:PDiskRW;
     Buffer_WIN_SEG,Buffer_DOS_SEG:word;
     Buffer_WIN:Pchar;
  begin
     fillchar(callStruct,sizeof(callstruct),0);

     DiskRW_Bak:=GlobalDosAlloc(sizeof(TDiskRW));
     DiskRW_WIN_SEG:=LOWORD(DiskRW_Bak);
     DiskRW_DOS_SEG:=HIWORD(DiskRW_Bak);
     DiskRW_WIN:=ptr(DiskRW_WIN_SEG,0);
     Buffer_Bak:=GlobalDosAlloc(512*DiskRW.SecCount);
     Buffer_WIN_SEG:=LOWORD(Buffer_Bak);
     Buffer_DOS_SEG:=HIWORD(Buffer_Bak);
     Buffer_WIN:=ptr(Buffer_WIN_SEG,0);

     move(DiskRW, DiskRW_WIN^ ,sizeof(TDiskRW));
     DiskRW_WIN^.BufferOffset:=0;
     DiskRW_WIN^.BufferSegment:=Buffer_DOS_SEG;
  {     callStruct.eax := $0201;
     callStruct.ecx := $0001;
     callStruct.edx := drv;
     callStruct.ebx := 0;
     callStruct.es  := HIWORD(Dos);

     result := RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
     move( ptr(LOWORD(Dos),0)^ , ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^ , 512);
     GlobalDosFree (LOWORD(Dos)); }
     callStruct.eax := $4200;
     callStruct.edx := drv;
     callStruct.esi := 0;
     callStruct.ds := DiskRW_DOS_SEG;
     result:=RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
     if result then
        move( Buffer_WIN^ , ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^ , 512*DiskRW.SecCount);
     GlobalDosFree (Buffer_WIN_SEG);
     move(DiskRW_WIN^ ,DiskRW, sizeof(TDiskRW));
     GlobalDosFree (DiskRW_WIN_SEG);
  end;

  function WJSWriteDisk16(drv:byte;var DiskRW:TDISKRW):boolean;
  var
     callStruct:TRegs;
     DiskRW_Bak,Buffer_Bak:longint;
     DiskRW_WIN_SEG,DiskRW_DOS_SEG:word;
     DiskRW_WIN:PDiskRW;
     Buffer_WIN_SEG,Buffer_DOS_SEG:word;
     Buffer_WIN:Pchar;
  begin
     fillchar(callStruct,sizeof(callstruct),0);

     DiskRW_Bak:=GlobalDosAlloc(sizeof(TDiskRW));
     DiskRW_WIN_SEG:=LOWORD(DiskRW_Bak);
     DiskRW_DOS_SEG:=HIWORD(DiskRW_Bak);
     DiskRW_WIN:=ptr(DiskRW_WIN_SEG,0);
     Buffer_Bak:=GlobalDosAlloc(512*DiskRW.SecCount);
     Buffer_WIN_SEG:=LOWORD(Buffer_Bak);
     Buffer_DOS_SEG:=HIWORD(Buffer_Bak);
     Buffer_WIN:=ptr(Buffer_WIN_SEG,0);

     move(DiskRW, DiskRW_WIN^ ,sizeof(TDiskRW));
     move(ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^, Buffer_WIN^, 512*DiskRW.SecCount);
     DiskRW_WIN^.BufferOffset:=0;
     DiskRW_WIN^.BufferSegment:=Buffer_DOS_SEG;
     callStruct.eax := $4300;
     callStruct.edx := drv;
     callStruct.esi := 0;
     callStruct.ds := DiskRW_DOS_SEG;
     result:=RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
     GlobalDosFree (Buffer_WIN_SEG);
     move(DiskRW_WIN^ ,DiskRW, sizeof(TDiskRW));
     GlobalDosFree (DiskRW_WIN_SEG);
  end;
end.

⌨️ 快捷键说明

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