program FindRamDisk;
{Batch-Hilfsprogramm: Findet Laufwerksbuchstaben der (ersten) RAM-Disk
und setzt Umgebungsvariable RAMDISK=<laufwerk>:, wenn gefunden
Und wenn man schon beim Aufräumen der Windows98-Bootdiskette ist,
sollte man sich noch nach einem besseren RAM-Laufwerkstreiber
umsehen, z.B. TDISK (mit der Möglichkeit der Größenveränderung)}
{$G+}
function IsRamDrive(Drv:Integer):Boolean; assembler;
{Eine RAM-Disk wird hierbei an der fehlenden FAT-Kopie erkannt}
asm
mov al,0
push ax
push ds
push ss
pop ds
sub sp,$200 {Dynamische Stackreservierung zum Sektorlesen}
mov bx,sp {BX=Sektorzeiger}
mov ax,[Drv]
mov cx,1 {Anzahl=1}
xor dx,dx {Sektor 0}
int $25
jc @@NoRAM
mov bx,sp {Achtung: BX ist 2 tiefergelegt!}
{ cmp byte ptr ss:[bx+$17],$f8 {Nochmals auf "Festplatte" testen}
{ jne @@NoRAM}
cmp byte ptr ss:[bx+$12],1 {Eine FAT?}
jne @@NoRAM
mov word ptr ss:[bx+$204],1 {gepushtes AX verändern!!}
@@NoRAM:
add sp,$202 {Stack freigeben, 2 mehr wegen Int25}
pop ds
pop ax
end;
const
env: array[0..11]of Char='RAMDRIVE=c:';
function InsertEnvVar:Boolean; assembler;
asm mov es,[PrefixSeg]
mov es,es:[$16]
mov ax,es:[$2C]
dec ax
mov es,ax
mov dx,es:[3] {Länge Env-Speicher}
shl dx,4 {in Bytes}
inc ax
mov es,ax
cld
xor di,di
xor ax,ax
mov cx,dx
@@l1: repne scasb
mov bx,di {Potentielle Einfügestelle}
dec cx
scasb {Doppel-Null?}
jnz @@l1
cmp word ptr es:[di],1
jnz @@no_ext
scasw
sub cx,2
repne scasb
jnz @@err {Da MUSS eine Null kommen!}
@@no_ext:
cmp cx,12
jl @@err {und es müssen noch 12 Bytes Platz sein}
push ds
push es
pop ds
mov si,di
add di,12
mov cx,si
sub cx,bx {Anzahl Bytes}
std
dec si
dec di
rep movsb {hinterschieben, Platz machen}
cld
pop ds
mov si,offset env
mov di,bx
mov cx,12
rep movsb
mov al,1
jmp @@e
@@err:
mov al,0
@@e:
end;
var
drv: Integer;
envp: PChar;
begin
for drv:=2 to 25 do begin
if IsRamDrive(drv) then begin
env[9]:=Char(drv+Ord('A'));
WriteLn(env);
if not InsertEnvVar
then WriteLn('Unzureichend oder defekter Umgebungsspeicher!');
exit;
end;
end;
end.
Detected encoding: OEM (CP437) | 1
|
|