Muchos que utilizamos Windows conocemos de la característica de hibernado, la cual permite almacenar el estado actual del sistema en un archivo especial y así apagar la PC con el propósito de regresar a ese mismo estado al volver a encender la PC. Esto acelera el inicio de Windows, además de regresar al estado en el que nos habíamos quedado.
Sin embargo, esta característica se activa únicamente cuando elegimos esa opción al momento de salir de Windows. Lo cual se pierde si es que se apaga la PC por corte de energía eléctrica, cuelgue inesperado, o un reinicio normal.
Para aprovechar de esta característica sin la necesidad de estar eligiendo hibernar por nosotros mismos, Toolwiz BHROM es una herramienta creada con ese propósito, que nos permitirá arrancar Windows desde el archivo de hibernación a pesar de que hayamos reiniciado normalmente, apagado o un reinicio inesperado, siempre va a iniciar desde el modo de hibernación.
Toolwiz BHORM es una sencilla implementación de “Hiberna Una Vez” y “Prosigue Muchas Veces”. Este programa reemplazará el MBR (sector maestro de arranque de nuestra unidad de almacenamiento) e instalará un código de arranque especial que tomará el control del Disco/RAM/BOOT cuando el sistema arranca desde el modo real (16bits), es decir antes de que inicie cualquier otro sistema operativo. También instalará un controlador de disco como filtro que tomará control de todo el acceso al disco cuando Windows esté iniciando.
Toolwiz BHORM es compatible con Windows XP, Vista, Windows 7 e inclusive con Windows 8.
_data segment public
assume cs:_data, ds:_data, es:_data
org 0100h
main:
jmp start
start:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,STACK_BASE
sti
call ReadDiskEx
jmp InstallFilter
InstallFilter:
;call DisplayEnter
;jmp InstallFilter
cli
mov ax,FILTER_SEG
mov ds,ax
mov es,ax
mov ss,ax
mov sp,STACK_BASE
sti
db 0EAh ;jmp FILTER_SEG:FILTER_OFFSET
dw FILTER_OFFSET,FILTER_SEG
InitDap:
ret
DiskAddressPacket:
PacketSize db 16
Reserved db 0
BlockCount dw 20 ;sector number
PacketOffset dw FILTER_OFFSET ;offset
PacketSegment dw FILTER_SEG ;segment
LbaLow dd 2 ;LBA.LOW
LbaHigh dd 0 ;LBA.HIGH
ReadDiskEx:
mov si,offset DiskAddressPacket
add si,ADJUST
mov ah,42h ;read
mov dl,80h ;driver
int 13h
jc ReadDiskError
ret
ReadDiskError:
jmp $
DisplayEnter:
push bp
mov si,offset BootInfo ;display info
add si,ADJUST
mov bp,[si]
mov cx,14
mov ax,1301h
mov bx,000ch
mov dx,0h
int 10h
pop bp
ret
BootInfo db 'hook PBT',13,10
org (100h + 1FEh)
db 55h,0aah
_data ends
end main