;******************************************************************************
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
|
|