CD-Rom emulation (Project 4)
~
PHASE 1 by Animadei



~
Courtesy of Reverser's page of reverse engineering
~

PHASE 1 by Animadei



~
This asm file introduces to all future good crackers the BASIS of cd-rom emulation, which has an obvious importance for our trade. As animadei himeself writes to me:
I've taken the liberty to give my cd-emulator source as a small
contribution to the cracking community.  There's a file attached to this
letter.  ECD "Emulate CD" - introduces emulating a CD and substitutions
of drives like "subst.exe
This kind of cracking is very important, because once you understand the techniques used by Animadei in its Cd-Rom emulator, you'll be able to prepare easily your own cracking tools


; EMULATE CD-ROM  -  DESIGNED BY ANIMADEI  12/25/1995  OVER 48+ HRS OF WORK
; Stat: make option for MSCDEX to reply regardless because of some games
;       that don't call MSCDEX properly.  12/26/1995


.MODEL TINY
.CODE
ORG 0100H

;********************************EQUATES*************************************
  CHK1 EQU 1995H                                  ; CHECK LOADED ID 1
  CHK2 EQU 1227H                                  ; CHECK LOADED ID 2
  UNLOAD_TSR EQU 0F00DH                           ; UNLOAD ID QUE
;****************************************************************************

START:

  JMP BEGINNING_CODE

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@INTERRUPT CODES@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
TSR_START:

;-- CD CALLS -------------------------------------------------------------
  CMP AX,1100H                                    ; MSCDEX DRIVER CHECK
  JNZ @@NOT_MSCDEX_CHECK

  PUSH BP
  MOV BP,SP
  CMP BYTE PTR CS:[REPLY_MSCDEX],0FFH
  JNZ @@DONT_REPLY
  MOV AL,0FFH
 @@DONT_REPLY:
  CMP WORD PTR SS:[BP+08H],0DADAH
  POP BP
  JZ @@YES_MSCDEX_CHECK
  JMP @@IRET
  @@YES_MSCDEX_CHECK:
  MOV AL,0FFH
  PUSH BP
  MOV BP,SP
  MOV WORD PTR SS:[BP+08H],0ADADH
  POP BP
  IRET                                            ; RETURN
  @@NOT_MSCDEX_CHECK:

  ; { AH CHECK }
  CMP AH,15H
  JNZ @@NOT_ABOUT_CDROM

  ; { CASE OF AL }
  CMP AL,00H                                      ; EXTENDED DRIVES CHECK
  JZ @@EXTENDED_DRIVES_CHECK

  CMP AL,01H                                      ; LIST OF DRIVES
  JZ @@IRET
; CMP AL,02H                                      ; COPYRIGHT MESSAGE
; JZ @@IRET
; CMP AL,03H                                      ; GET ABSTRACT NAME
; JZ @@IRET
; CMP AL,04H                                      ; GET BIBLIOGICAL FILE
; JZ @@IRET
  CMP AL,0BH                                      ; CDROM DRIVE CHECK
  JZ @@CDROM_DRIVE_CHECK
  CMP AL,0CH                                      ; MSCDEX VERSION
  JZ @@MSCDEX_VER
  CMP AL,0DH                                      ; STORE CDROM DRIVE LETTER TO ES:BX
  JZ @@GET_CD_LETTERS
  CMP AL,10H                                      ; SEND CD ROM REQUEST
  JZ @@SEND_CD_REQ

;-- JUMP TO ORGINAL INT 2F -----------------------------------------------

  @@NOT_ABOUT_CDROM:                              ; JUST A LABEL
  DB 0EAH                                         ; RETURN BACK TO REAL INT 2F INTERRUPT
  JMP_ADDR: DD ?

;-- JUMP BACK FROM INTERRUPT -----------------------------------------------

  @@IRET:
  IRET                                            ; RETURN

;-- PROCEDURES -----------------------------------------------------------
  @@EXTENDED_DRIVES_CHECK:
  MOV BX,01H
  XOR CX,CX
  MOV CL,BYTE PTR CS:[EDRIVE]
  IRET                                            ; RETURN

  @@CDROM_DRIVE_CHECK:
  CMP CL,BYTE PTR CS:[EDRIVE]
  JZ @@CD_CHECK
  XOR AX,AX
  MOV BX,0ADADH
  IRET
  @@CD_CHECK:
  MOV AX,0FFFFH
  MOV BX,0ADADH
  IRET                                            ; RETURN

  @@GET_CD_LETTERS:
  PUSH AX
  MOV AL,BYTE PTR CS:[EDRIVE]
  MOV BYTE PTR ES:[BX],AL
  POP AX
  IRET                                            ; RETURN

  @@SEND_CD_REQ:
  CMP CL,BYTE PTR CS:[EDRIVE]
  JNZ @@NOT_EQU
  MOV WORD PTR ES:[BX+03H],0100H
  IRET                                            ; RETURN
  @@NOT_EQU:
  MOV WORD PTR ES:[BX+03H],8001H
  IRET                                            ; RETURN

;--------------------------- UNLOADING SEQUENCE -----------------------------
  @@MSCDEX_VER:

  CMP BX,CHK1                                     ; CHECK IF WE'RE BEING CALLED
  JNZ @@NOT_CALLING_US

  CMP CX,UNLOAD_TSR                               ; CHECK TO UNLOAD TSR
  MOV CX,CHK2                                     ; SIGNAL WE'RE ALIVE!
  JNZ @@NOT_CALLING_US

;-- UNLOAD --
  PUSH AX
  PUSH DX
  PUSH DS
  PUSH ES
  PUSH DI
  PUSH SI

  MOV AX,352FH                                    ; CHECK IF ADDR INT IS THE SAME
  INT 21H
  MOV AX,CS
  MOV DX,ES
  CMP AX,DX
  MOV CL,00H                                      ; FLAG FOR ERROR
  JNZ @@INT_NOT_SAME
  CMP BX,OFFSET TSR_START
  JNZ @@INT_NOT_SAME
  LDS DX,DWORD PTR CS:[JMP_ADDR]
  MOV AX,252FH
  INT 21H

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; RESTORE SUBST DRIVE HERE!
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  LES DI,DWORD PTR CS:[SUBST_ADDR]                ; RETORE ORIGINAL SUBST DATA
  MOV SI,OFFSET ORG_SUBST_DATA
  MOV CX,88D
  PUSH CS
  POP DS
  CLD
  REP MOVSB
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  cli                                             ; Unload TSR
  mov AH,49h
  mov ES,CS:[2CH]
  int 21h
  mov AH,49h
  PUSH CS
  POP ES
  int 21h
  sti

  MOV CL,01H                                      ; REPLY THAT WE'VE UNLOADED
  @@INT_NOT_SAME:
  MOV CH,00H
  POP SI
  POP DI
  POP ES
  POP DS
  POP DX
  POP AX

;---------
  @@NOT_CALLING_US:
  MOV BX,0217H
  IRET                                            ; RETURN

;-- DATA -----------------------------------------------------------------
  REPLY_MSCDEX: DB ?                              ; IF PROG NEEDS TO REPLY MSCDEX AT ALL TIMES
  EDRIVE: DB ?                                    ; EMULATED DRIVE
  SUBST_ADDR: DD ?                                ; WHERE ORG EMU ADDR IS LOC
  ORG_SUBST_DATA: DB 88D DUP (?)                  ; SAVED SUBST DATA
;-------------------------------------------------------------------------
TSR_END:





;############################################################################
;#########################MAIN PROGRAM STARTS HERE###########################
;############################################################################

BEGINNING_CODE:

  CLD                                             ; FOR FORWARD REFERENCE

  CALL BEGIN_PARSING                              ; PARSE AND OTHERS MISC THINGS

  MOV AH,62H                                      ; FREE MEM BEFORE ALLOC
  INT 21H
  MOV ES,BX
  MOV AH,62H
  INT 21H

; ALTERNATIVE MEMORY ALLOCATION BY KEEP - TAKES MORE MEMORY!
; MOV DX,((OFFSET TSR_END - OFFSET START) + 0FFH)/0FH + 01H
; mov ax,3100h                                    ; { Keep(0) }
; int 21h

  MOV DX,OFFSET TSR_END                           ; TERMINATE & STAY RESIDENT
  INT 27H





;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%THESE FOLLOWING CODES ARE NOT LOADED TO MEMORY BY INT 27%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

BEGIN_PARSING:

  ;--------------------                           ; PRINT MAIN TITLE
    MOV DX,OFFSET MAIN
    CALL P
  ;--------------------

  MOV AH,30H                                      ; CHECK DOS VERSION:
  INT 21H                                         ; ECD NEEDS DOS 4.0+
  CMP AL,04H
  JAE @DOS_VER_OK
  MOV DX,OFFSET DOS_ERROR
  CALL P
  MOV AL,01H
  JMP @EXIT
 @DOS_VER_OK:

  MOV WORD PTR [EXTRA],'\:'                       ; A MUST: "C:\BLAH" (THIS IS
  MOV BYTE PTR [TEMP_CHANGE],'\'                  ; DONE TO SAVE SOME BYTES

  MOV BYTE PTR [REPLY_MSCDEX],00H                 ; SET FLAGS TO FALSE "INITIALIZE"

  MOV SI,81H                                      ; LET'S BEGIN PARSING
  CALL SKIP_BLANKS                                ; SKIP ALL BLANKS
  LODSW

  CMP AL,'/'                                      ; OPTION:  UNLOAD
  JNZ @OK___PASS1
  CMP AH,'a'
  JZ @OK___MSCDEX_FLAG
  CMP AH,'A'
  JZ @OK___MSCDEX_FLAG
  CMP AH,'u'
  JZ @OK___OK_UNLOAD
  CMP AH,'U'
  JZ @OK___OK_UNLOAD
  JMP @HELP

 @OK___MSCDEX_FLAG:
  MOV BYTE PTR [REPLY_MSCDEX],0FFH                ; OPTION: MSCDEX REPLIES AT
INT 3H
;;;;
;  DEC SI                                          ; ALL TIMES
  CALL SKIP_BLANKS
  LODSW
  JMP @OK___PASS1

 @OK___OK_UNLOAD:
  MOV AX,150CH                                    ; UNLOAD!
  MOV BX,CHK1
  MOV CX,0F00DH
  INT 2FH
  OR CX,CX                                        ; CHECK IF ANY ERROR OCCURRED
  JNZ @OK____UNLOADED                             ; WHILE UNLOADING
  MOV DX,OFFSET UNLOAD_ERR2
  CALL P
  MOV AL,01H
  JMP @EXIT
 @OK____UNLOADED:
  CMP CL,01H                                      ; IF 0 THEN WE'RE NOT LOADED
  JZ @OK___UNLOAD_IT
  MOV DX,OFFSET NOT_LOADED
  CALL P
  XOR AX,AX
  JMP @EXIT
 @OK___UNLOAD_IT:
  MOV DX,OFFSET UNLOAD_OK
  CALL P
  XOR AX,AX
  JMP @EXIT
 @OK___PASS1:

  CALL CHECK4ALPHADRV                             ; DRIVES ARE ALPHA CHARS ONLY
  MOV BYTE PTR [DRIVE],AL                         ; SAVE THE EMU DRIVE

  CALL SKIP_BLANKS
  CMP AL,0DH
  JNZ @OK___PASS2
 @OK___CUR_DIR:
  MOV SI,OFFSET DIRECTORY                         ; GET CURRENT DIRECTORY
  CALL GET_CUR_DIR
  ADD AL,41H
  MOV BYTE PTR [XDRIVE],AL                        ; SAVE THE SUBST DRIVE
  JMP @END_PARSING_FOR_DIR
 @OK___PASS2:

  PUSH SI                                         ; CHECK FOR USER DEFINED SUBST
  POP DI                                          ; DRIVE
  LODSW
  CMP AH,':'
  JZ @OK___DRIVE_SPECIFIED
  MOV SI,OFFSET DIRECTORY                         ; GET CURRENT DIRECTORY
  CALL GET_CUR_DIR                                ; * THIS IS ONLY TEMP: JUST
  ADD AL,41H                                      ; TO GET THE CUR DRIVE *
  MOV BYTE PTR [XDRIVE],AL                        ; SAVE THE SUBST DRIVE

  MOV SI,DI
  CALL SKIP_BLANKS
  JMP @GOT_DRIVE
 @OK___DRIVE_SPECIFIED:
  CALL CHECK4ALPHADRV                             ; DRIVES ARE ALPHA CHARS ONLY
  MOV BYTE PTR [XDRIVE],AL
 @GOT_DRIVE:

  MOV DI,OFFSET DIR1
  CALL COPY_STR
  CMP BYTE PTR [DI],'\'
  JZ @OK___CONV
  CMP BYTE PTR [DI],0DH
  JZ @OK___CONV
  CMP BYTE PTR [DI],20H
  JNZ @OK___PASS3
 @OK___CONV:
  DEC DI
 @OK___PASS3:
  INC DI
  XOR AX,AX
  STOSB

  CALL CHANGE_TO_TEMP_DIR
  CALL CHANGE_BACK_TO_ORG_dIR

 @END_PARSING_FOR_DIR:


;##########################################################################
;**************************************************************************
;                          SUBST THE FAKE DRIVE
;**************************************************************************
;##########################################################################

  MOV AX,150CH                                    ; CHECK IF WE ARE LOADED
  MOV BX,CHK1  
  INT 2FH
  CMP CX,CHK2
  JNZ @@NOT_LOADED
  MOV DX,OFFSET UNLOAD_ERR1
  CALL P
  MOV AL,01H
  JMP @EXIT
 @@NOT_LOADED:

  MOV AH,19H
  INT 21H
  MOV DL,AL
  MOV AH,0EH
  INT 21H
  MOV DL,BYTE PTR [DRIVE]
  MOV BYTE PTR [DRIVE_ERR],DL
  SUB DL,41H
  MOV AH,00H
  CMP DL,AL
  JL @OK___DRIVES_LISTED_IN_DOS
  MOV DX,OFFSET DRIVE_ERR
  CALL P
  MOV AL,01H
  JMP @EXIT
 @OK___DRIVES_LISTED_IN_DOS:

  MOV DX,OFFSET NO_SPEC                           ; PRINT EMULATED DRIVE
  CALL P

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUBST DRIVE HERE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  CALL CHANGE_TO_TEMP_DIR

  MOV AH,52H                                      ; GET MCB OF DOS ADDRESS
  INT 21H

  CWD
  MOV DL,BYTE PTR [DRIVE]                      
  SUB DL,41H      
  MOV BYTE PTR [EDRIVE],DL                        ; SAVE EMULATED DRIVE

  MOV AX,88D                                      ; GET ADDRESS OF DESCRIPTION
  IMUL DX                                         ; OF DISKS
  LES BX,DWORD PTR ES:[BX+18H]                    
  MOV WORD PTR [TEMP_ADDR+02H],ES                 ; TEMP ADDR FOR SUBST DRIVE CALC
  MOV WORD PTR [TEMP_ADDR+00H],BX
  MOV CX,ES
  ADD AX,CX
  ADC BX,0000H
  MOV WORD PTR [SUBST_ADDR+02H],BX                ; SAVE CALCULATED ADDRESS
  MOV WORD PTR [SUBST_ADDR+00H],AX

  PUSH CS                                         ; CHANGE TO DOS'S LIST OF DRIVES
  POP ES                                          
  MOV DI,OFFSET ORG_SUBST_DATA                    ; ES:DI - ORG SUBST DATA
  LDS SI,DWORD PTR [SUBST_ADDR]                   ; DS:SI - LIST OF DRIVES
  MOV CX,88D                                      ; SAVE SUBST DRIVE'S DATA                                      
  REP MOVSB                                       ; SAVE FOUND DRIVE DATA

  PUSH CS
  POP DS
  LES DI,DWORD PTR [SUBST_ADDR]                   ; ES:DI - EMU DRIVE
  CWD
  MOV DL,BYTE PTR [XDRIVE]
  SUB DL,41H
  MOV CX,88D
  MOV AX,CX
  IMUL DX
  MOV SI,WORD PTR [TEMP_ADDR+02H]                 
  MOV BX,WORD PTR [TEMP_ADDR+00H]
  ADD SI,AX
  ADC BX,0000H
  MOV DS,BX                                       ; DS:SI - SUBST DRIVE
  REP MOVSB                                       ; REPLACE WITH NEW DRIVE DATA

  LDS SI,DWORD PTR CS:[SUBST_ADDR+00H]            ; STORE LENGTH OF SPECIFIED
  CALL STRING_LENGTH                              ; DIRECTORY 'STRING' TO EMU
  XCHG AH,AL                                      ; DRIVE
  LES DI,DWORD PTR CS:[SUBST_ADDR+00H]
  ADD DI,4FH
  STOSW


  CALL CHANGE_BACK_TO_ORG_DIR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  MOV AX,352FH                                    ; SAVE ORG INT 2F ADDR
  INT 21H
  MOV WORD PTR [JMP_ADDR+02H],ES
  MOV WORD PTR [JMP_ADDR+00H],BX

  MOV DX,OFFSET TSR_START                         ; SET INTERRUPT VECT TO OUR CODE
  MOV AX,252FH
  INT 21H

  RET                                             ; RETURN TO MAIN PROGRAM

;-------------------------
 @EXIT:
  MOV AH,4CH
  INT 21H
;-------------------------
 @HELP:
  MOV DX,OFFSET HELP
  CALL P
  XOR AX,AX
  JMP @EXIT
;-------------------------
 P PROC                                           ; PRINT TO SCREEN
   PUSH AX
   MOV AH,09H
   INT 21H
   POP AX
   RET
 ENDP

 SKIP_BLANKS PROC                                 ; SKIP BLANKS WHILE PARSING
  @LOOP_AGAIN:
   LODSB
   CMP AL,0DH
   JZ @OK_DONE
   CMP AL,' '
   JZ @LOOP_AGAIN
  @OK_DONE:
   DEC SI
   RET
 ENDP

 COPY_STR PROC                                    ; COPIES A STRING FROM ONE
   PUSH CX                                        ; DESTINATION TO THE OTHER
   MOV CX,00FFH
  @LOOP_LOOP:
   LODSB
   CMP AL,0DH
   JZ @OK___FINISHED
   CMP AL,' '
   JZ @OK___FINISHED
   STOSB
   LOOP @LOOP_LOOP                                            
   MOV AH,0FFH                                    ; AH = FF = ERROR
  @OK___FINISHED:
   DEC DI
   POP CX
   RET
 ENDP

 STRING_LENGTH PROC                               ; REPORT THE LENGTH OF A STRING
   PUSH CX
   MOV CX,00FFH
   CBW
  @LOOPING:
   INC AH
   LODSB
   CMP AL,00H
   JZ @OK___WITHIN_BOUNDRY
   LOOP @LOOPING
   MOV AH,0FFH                                    ; AH = FF = ERROR
  @OK___WITHIN_BOUNDRY:
   POP CX
   RET
 ENDP

 CHECK4ALPHADRV PROC
   CMP AH,':'
   JZ @OK__REQ_SYMBOL                             ; CHECK IF EMU DRIVE SPECIFIED
   JMP @HELP
  @OK__REQ_SYMBOL:

   CMP AL,'a'                                     ; CHECK FOR ALPHA CHARACTERS
   JB @NO_CAPS
   SUB AL,20H                                     ; CONVERT TO CAPS IF NECESSARY
  @NO_CAPS:
   CMP AL,'A'
   JGE @OK___CHAR1
   JMP @HELP
  @OK___CHAR1:
   CMP AL,'Z'
   JLE @OK___CHAR2
   JMP @HELP
  @OK___CHAR2:
   RET
 ENDP

 GET_CUR_DIR PROC
   MOV AH,19H                                     ; GET CURRENT DRIVE
   INT 21H
   PUSH AX                                        ; SAVE AX
   XOR DX,DX
   MOV AH,47H                                     ; GET CURRENT DIRECTORY
   INT 21H
   POP AX                                         ; RETURN AX
   JNC @OK___GOT_DIRECTORY
   MOV DX,OFFSET ERROR1
   CALL P
   MOV AL,01H
   JMP @EXIT
  @OK___GOT_DIRECTORY:
   RET
 ENDP

 CHANGE_TO_TEMP_DIR PROC
   MOV SI,OFFSET TEMP_CUR_DIR                      ; TEST FOR THE VALIDITY OF THE
   CALL GET_CUR_DIR                                ; USER SPECIFIED DRIVE AND PATH
   MOV BYTE PTR [TEMP_DRIVE],AL

   MOV DL,BYTE PTR [XDRIVE]                        ; CHANGE DRIVE
   SUB DL,41H

   MOV AH,0EH                                      
   INT 21H
   MOV AH,19H                                      ; SEE IF WE'VE CHANGED DRIVES
   INT 21H
   CMP DL,AL
   JNZ @PRINT_ERROR

   MOV DX,OFFSET DIR1                              ; NOW CHANGE TO THE SPECIFIED
   MOV AH,3BH                                      ; DIRECTORY
   INT 21H
   JNC @DIR_TEST_OK
  @PRINT_ERROR:
   MOV DX,OFFSET ERROR2
   CALL P
   MOV AL,01H
   JMP @EXIT
  @DIR_TEST_OK:
   RET
 ENDP

 CHANGE_BACK_TO_ORG_DIR PROC
   PUSH CS
   PUSH CS
   POP DS
   POP ES

   MOV DL,BYTE PTR [TEMP_DRIVE]                    ; GO BACK TO ORIGINAL DRIVE
   MOV AH,0EH                                      ; AND DIRECTORY
   INT 21H
   MOV AH,19H
   INT 21H
   CMP AL,DL
   JNZ @PRINT_ERROR
   MOV DX,OFFSET TEMP_CHANGE                       ; RETURN TO ORG DIRECTORY
   MOV AH,3BH
   INT 21H
   JC @PRINT_ERROR
   RET
 ENDP

;-------------------------
  E EQU 0DH,0AH
  S EQU '$'

  MAIN:        DB 'EMULATE CD-ROM (R)  -  DESIGNED BY ANIMADEI[T]  -  12/25/1995',E,E,S

  HELP:        DB '[HELP]   ECD [OPT: /A] [SUBST DRIVE:] [DRIVE:(\)(DIRECTORY)(\)]',E,E
               DB '         MSCDEX REPLY REGARDLESS:  ECD /A ...ETC.',E,E
               DB '         INSTALL:  ECD A:',E
               DB '                   ECD Y: C:.',E
               DB '                   ECD X:B:DOS\',E
               DB '                   ECD Z: D:\WINDOWS',E
               DB '         UNLOAD!:  ECD /U',E,S

  UNLOAD_OK:   DB 'UNLOAD OK!',E,S
  NOT_LOADED:  DB 'NOT RESIDENT!',E,S
  UNLOAD_ERR1: DB 'ALREADY LOADED!',E,S
  UNLOAD_ERR2: DB "CAN'T UNLOAD!",E,S

  DOS_ERROR:   DB 'NEED DOS VERSION 4.0+ TO EXECUTE ECD!',E,S

  DRIVE_ERR:   DB ?
               DB ': NOT LISTED WITHIN LASTDRIVE!',E,S

  NO_SPEC:     DB 'EMULATING = '
  DRIVE:       DB ?
               DB ':',E,S

  ERROR1:      DB "CAN'T GET CURRENT DIRECTORY!",E,S
  ERROR2:      DB "CAN'T GET SPECIFIED DIRECTORY!",E,S
;-------------------------
      XDRIVE: DB ?
       EXTRA: DB ?
        DIR1: DB ?
   DIRECTORY: DB (70H - 4H) DUP (?)
              DB ?

  TEMP_DRIVE: DB ?
 TEMP_CHANGE: DB ?
TEMP_CUR_DIR: DB (70H) DUP (?)
              DB ?

   TEMP_ADDR: DD ?
;-------------------------

END START

That's all folk, however, I must stress that it is really a simple method of emulating MSCDEX.EXE, and returning values that it would in reality. If you need to simulate an actual physical sector reads like on some CD's, then you'd just trap the address, check how many bytes being read, dump it to disk, and make an additional code to the assembly source I submitted to write it all back when read's to that sector is detected by interrupt traps.
Easy as pie!
(c) Animadei, May 1997. All rights reversed.

You are deep inside reverser's page of reverse engineering, choose your way out:

Back to Project 4
homepage links red anonymity +ORC students' essays academy database
antismut tools cocktails search_forms mail_fravia
Is cracking illegal?