VR7: 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