Source file: /~heha/hs/hdsleepw.zip/HDSLEEP.ASM

;******************************************************************************
title	HDSLEEP - A simple virtual device driver example
;******************************************************************************
;   Title:    HDSLEEP.386 - Harddisk-Abschalt-Programm
;   Module:   HDSLEEP.ASM - Core code
;   Version:  1.00
;******************************************************************************
;   Functional Description:
;	Abschalten der Festplatte nach 10 Minuten oder
;	je nach Eintrag in HDSleepTimeOut=dddd in der [386enh]-Sektion
;	in der SYSTEM.INI

        .386p
;==============================================================================
;                     I N C L U D E S   &   E Q U A T E S
;==============================================================================
        .XLIST
        INCLUDE VMM.Inc
        INCLUDE Debug.Inc
	INCLUDE BlockDev.Inc
        .LIST

HDSLEEP_Major_Ver      equ     01h
HDSLEEP_Minor_Ver      equ     00h
HDSLEEP_Device_ID      equ     Undefined_Device_ID

;==============================================================================
;           V I R T U A L   D E V I C E   D E C L A R A T I O N
;==============================================================================

Declare_Virtual_Device  HDSLEEP, HDSLEEP_Major_Ver, HDSLEEP_Minor_Ver,\
			HDSLEEP_Control_Proc, HDSLEEP_Device_ID,\
                        BlockDev_Init_Order+16,,

;==============================================================================
;                          I N I T   D A T A
;==============================================================================

VxD_IDATA_SEG
Keyname	db	"hdsleeptimeout",0	;Eintrag in der [386enh]-Sektion

VxD_IDATA_ENDS

;==============================================================================
;                  N O N - P A G E A B L E   D A T A
;==============================================================================

VxD_LOCKED_DATA_SEG
spm	dd	60		;Sekunden pro Minute (für MUL benötigt)
TimeOut	dd	0		;10 Minuten sind normal (wird gesetzt)
DecCnt	dd	0		;zählt die Sekunden abwärts
RealProc dd	?		;beinhaltet Adresse der ursprünglichen Funktion

VxD_LOCKED_DATA_ENDS

;==============================================================================
;                          I N I T   C O D E
;==============================================================================

VxD_ICODE_SEG

BeginProc HDSLEEP_Device_Init
   
	Trace_Out "HDSLEEP: Device_Init"
;Profilstring auslesen
	mov	eax,10		;Minuten
	xor	esi,esi		;Standard-Sektion=[386enh]
	mov	edi,OFFSET32 Keyname
	VMMCall	Get_Profile_Decimal_Int
	mul	[spm]		;Sekunden draus machen
	mov	[TimeOut],eax
;Blocktreiber-Funktion anzapfen	
	mov	eax,BlockDev_Send_Command
	mov	esi,OFFSET32 HookProc
	VMMCall	Hook_Device_Service
	jc	notinst
	mov	[RealProc],esi
;Timerproc anspringen, ist im gelockten Codesegment
        jmp	Timerproc
notinst:
	;stc
	ret
EndProc HDSLEEP_Device_Init


VxD_ICODE_ENDS

VxD_LOCKED_CODE_SEG

;==============================================================================
;                      N O N P A G E A B L E   C O D E
;==============================================================================
BeginProc HDSLEEP_Control_Proc
	Control_Dispatch Device_Init, HDSLEEP_Device_Init
        clc
        ret
EndProc HDSLEEP_Control_Proc

BeginProc HookProc, High_Freq
	Trace_Out "Festplatte: uuuUUUIII..."
	push	[TimeOut]
	pop	[DecCnt]
	jmp	[RealProc]
EndProc HookProc

BeginProc TimerProc
	dec	[DecCnt]
	jnz	nonzero
	Trace_Out "Festplatte: IIIiiiuuu..."
	push	ecx
	 xor	ecx,ecx
	 VMMCall Begin_Critical_Section
	pop	ecx
	mov	ah,0e0h		;Kommando-Byte: standby immediate (sofort AUS)
wake:	push	 edx
	 xor	 al,al
	 mov	 dx,01f6h
	 out	 dx,al		;out 1f6,00
	 mov	 al,ah
	 inc	 dx
	 out	 dx,al		;out 1f7,e0/10
	 mov	 al,10h
	 dec	 dx
	 out	 dx,al		;out 1f6,10
	 xchg	 al,ah
	 inc	 dx
	 out	 dx,al		;out 1f7,e0/10
	pop	 edx
	VMMCall	End_Critical_Section
nonzero:
	mov	eax,1000	;Millisekunden
	xor	edx,edx		;Keine Referenzdaten
	mov	esi,OFFSET32 TimerProc
	VMMCall	Set_Global_Time_Out
	clc
	ret
EndProc TimerProc

VxD_LOCKED_CODE_ENDS

	END

;---------------------------------------------------------------------------
;  End of File: HDSLEEP.asm
;---------------------------------------------------------------------------

Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded