Source file: /~heha/hs/dos/dosmisc.zip/SRC/FINDRAMD.PAS

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
Wrong umlauts? - Assume file is ANSI (CP1252) encoded