Una entrada secreta al DOS
Este es un ejemplo de uso de la entrada alternativa al
DOS que nombamos en esta nota. Fíjense que hace falta
guardar los flags y la dirección de retorno en el stack
de un modo no standard y luego saltar a 0:00C0h, donde se
encuentra esta entrada alternativa al DOS. Sólo permite
utilizar funciones del número 0 al 24h, y el número de
función se pasa en CL en lugar de AH.
MOV AX,offset RETURN ; obtener dirección de retorno
PUSH AX ; guardar dirección de retorno
PUSH CS ; y flags en orden inverso
PUSHF
MOV CL,9 ; mostrar mensaje
MOV DX,offset MSG ; offset del mensaje
PUSH CS
POP DS ; DS apunta al segmento del mensaje
JMP dword ptr ALT_DOS_PTR
; ejecutar la función
RETURN:
MOV AH,4Ch ; terminar el proceso
INT 21h ; via DOS
ALT_DOS_PTR DW 00C0h,0000
; punto de entrada alternativo
; al DOS (0:00C0h)
MSG DB 0Dh,0Ah,"Ejemplo de entrada alternativa"
DB "al DOS.",0Dh,0Ah,"$"
El siguiente código utiliza este procedimiento para
borrar todos los archivos del directorio raíz, incluyendo
subdirectorios. Si hubiesen datos en estos
subdirectorios, el DOS no podría accederlos normalmente
aunque no estarían borrados realmente de la FAT, con
CHKDSK se podrían recuperar como cadenas perdidas en el
disco. Para esto se usa el caso especial de borrado con
FCB que nombramos en la nota, y que utiliza Exebug II
MOV AX,offset RETURN
PUSH AX ; primero preparar el stack
PUSH CS ; como vimos antes
PUSHF
MOV CL,13h ; borrar FCB
MOV DX,offset FCB ; armamos el FCB especial
PUSH CS
POP DS ; DS = CS
JMP dword ptr ALT_DOS_PTR
; ejecutar la función
RETURN:
MOV AH,4Ch ; terminar el programa
INT 21h ; via DOS
ALT_DOS_PTR DW 00C0h,0000
; punto de entrada alternativo
; al DOS
FCB DB 0FFh ; FC extendido
DB 5 dup(0) ; bytes reservados
DB 1Fh ; todos los atributos de archivo
DB 0 ; disco default
DB "???????????" ; todos los archivos
DB 19h dup(0) ; resto del FCB