|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"フロッピーディスクの直接アクセス"
// DOSのINT25, INT26に相当するルーチンと、そのサンプルとして1ドラ
//イブでのフロッピーディスクコピープログラムをコンソールアプリで作って
//みました。以下のプログラムを2本に切り分け、同じディレクトリにおき、
//DELPHIからFDCOPY.DPRを開いてコンパイルしてください。
//確認は、DELPHI2.0です。
// なお、AドライブからAドライブへのコピーですから、DOS/Vマシン
//で、1.44Mタイプ専用の(手抜き)プログラムです。カレントディレク
//トリに'FDCOPY.TMP'というイメージファイルができます。
// #169 では、キーワードを付け忘れましたので再アップです。
------------------------------- FDCOPY.DPR -------------------------
program FDCOPY;
{$APPTYPE CONSOLE}
uses Windows, Absio ;
const Nsect = 36 ;
const Drv = 0 ; { A Drive Only }
const FileName = 'FDCOPY.TMP' ;
const Length = 18432 ;
const SectNum = 2880 ;
function ChkFDD : Bool ;
var
Buf : array [1..2048] of Char ;
Sect : Integer ;
begin
Result := True ;
absread( Drv, 1, 0, Buf ) ;
Sect := Ord( Buf[21]) * 256 + Ord( Buf[20] ) ;
if Sect <> SectNum then begin
Write( 'フロッピーが 1.44 Mタイプではありません!' ) ;
Result := False ;
end ;
end ;
var
fl : file ;
i : Integer ;
LSect : Integer ;
Sect : Integer ;
Ask : String ;
Buf : Array [1..Length] of Char ;
begin
Write('コピー元フロッピーを A ドライブにいれてリターン');
ReadLn( Ask ) ;
if Not ChkFDD then Exit ;
AssignFile( fl, FileName ) ;
ReWrite( fl, 1 ) ;
for i:= 0 to 79 do begin
Lsect := i * NSect ;
absread( Drv, Nsect, Lsect, Buf ) ;
BlockWrite( fl, Buf, Length ) ;
end ;
CloseFile( fl ) ;
Write('コピー先フロッピーを A ドライブにいれてリターン');
ReadLn( Ask ) ;
if Not ChkFDD then Exit ;
AssignFile( fl, FileName ) ;
Reset( fl, 1 ) ;
for i := 0 to 79 do begin
Lsect := i * NSect ;
BlockRead( fl, Buf, Length ) ;
abswrite( Drv, Nsect, Lsect, Buf ) ;
end ;
CloseFile( fl ) ;
end.
--------------------------- ABSIO.PAS -------------------------------
unit Absio ;
interface
uses Windows ;
function absread( drive: Integer ; { Drive 0:A 1:B 2:C .....}
nsects : Integer ; { 読み込むセクター数 }
lsects : Integer ; { 読込開始セクター番号 }
var Buffer { 読込バッファ }
) : Word;
function abswrite( drive: Integer ; { Drive 0:A 1:B 2:C .....}
nsects : Integer ; { 書込むセクター数 }
lsects : Integer ; { 書込開始セクター番号 }
var Buffer { 書込バッファ }
) : Word;
implementation
const
VWIN32_DIOC_DOS_IOCTL = 1 ;
VWIN32_DIOC_DOS_INT25 = 2 ;
VWIN32_DIOC_DOS_INT26 = 3 ;
type
TDevIOCtrlRegs = packed record
EBX: DWord;
EDX: DWord;
ECX: DWord;
EAX: DWord;
EDI: DWord;
ESI: DWord;
Flg: DWord;
end;
{ フロッピーディスクの入力(int 25h) ルーチン }
function absread ;
var
hDevice: THandle;
Reg: TDevIOCtrlRegs;
cb: DWord;
begin
hDevice := CreateFile( '\\.\vwin32', 0, 0, nil, 0, 0, 0 );
with Reg do begin
EAX := drive ;
EBX := DWORD(@Buffer) ;
ECX := nsects ;
EDX := lsects ;
end;
DeviceIOControl( hDevice, VWIN32_DIOC_DOS_INT25,
@Reg, SizeOf( Reg ), @Reg, SizeOf( Reg ),
cb, nil );
result := ( Reg.EAX and $ffff );
CloseHandle( hDevice );
end;
{ フロッピーディスクの出力(int 26h) ルーチン }
function abswrite ;
var
hDevice: THandle;
Reg: TDevIOCtrlRegs;
cb: DWord;
begin
hDevice := CreateFile( '\\.\vwin32', 0, 0, nil, 0, 0, 0 );
with Reg do begin
EAX := drive ;
EBX := DWORD(@Buffer) ;
ECX := nsects ;
EDX := lsects ;
end;
DeviceIOControl( hDevice, VWIN32_DIOC_DOS_INT26,
@Reg, SizeOf( Reg ), @Reg, SizeOf( Reg ),
cb, nil );
result := ( Reg.EAX and $ffff );
CloseHandle( hDevice );
end;
end.
---------- END of Program -------------------------------------------
QZB02574 Dr.陳
Original document by Dr.陳 氏 ID:(QZB02574)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|