;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; SYSROUT21 - Call Module Service ; IN: AL = 21d ; AH = Function NR ; EDI = POINTER TO AN 8BYTE MODULE ID ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SERVICEMOD_DATA_SEL DW 0 SYSROUT21_FOUND_ADDR DD 0 SYSROUT21_AX DW 0 LASTMOD_ID DB 'Unknown ',0 LASTMOD_REQUEST DB 0 MODCALL DB 'ModuleCall: ',0 MODNOTFOUND_MSG DB 'Module not found !',13,10,0 SYSROUT21: POP EAX PUSHAD MOV [LASTMOD_REQUEST], AH MOV [SYSROUT21_AX], AX MOV ESI, LASTMOD_ID MOV EAX, [FS:EDI] MOV [DS:ESI], EAX MOV EAX, [FS:EDI+4] MOV [DS:ESI+4], EAX XOR EAX, EAX MOV dword [SYSROUT21_FOUND_ADDR], 0 MOV ESI, [GS:600H+116] MATCHNEXTMODENTRY2: MOV EAX, [GS:ESI] CMP EAX, 0 JE MATCHMODLISTDONE2 MOV EAX, [GS:ESI] CMP EAX, [FS:EDI] JNE NOTTHISMOD2 MOV EAX, [GS:ESI+4] CMP EAX, [FS:EDI+4] JNE NOTTHISMOD2 MOV [SYSROUT21_FOUND_ADDR], ESI JMP MATCHMODLISTDONE2 NOTTHISMOD2: ADD ESI, 128 JMP MATCHNEXTMODENTRY2 MATCHMODLISTDONE2: POPAD MOV EDI, [SYSROUT21_FOUND_ADDR] CMP EDI, 0 JE near SYSROUT21_MODNOTFOUND PUSHAD MOV EDI, MODCALL MOV AL, 38 MOV DL, 1 INT 20H MOV EDI, LASTMOD_ID MOV AL, 38 MOV DL, 1 INT 20H MOV EDI, ONE_SPACE MOV AL, 38 MOV DL, 1 INT 20H MOV BX, [SYSROUT21_AX] MOV AL, 39 MOV AH, 2 MOV DL, 1 INT 20H MOV EDI, ONE_SPACE MOV AL, 38 MOV DL, 1 INT 20H MOV AX, [SYSROUT21_AX] ; FUNCTION MOVZX EAX, AH ; REORGANIZE SHL EAX, 2 ; * 4 ADD EAX, [GS:EDI+28] ; ADD TABLE OFFSET ADD EAX, [GS:EDI+12] ; ADD ABSOLUTE OFFSET OF CODE-START MOV EBX, [GS:EAX] ; READ THE DWORD THERE MOV AL, 39 MOV AH, 4 MOV DL, 1 INT 20H MOV EDI, CR_LF MOV AL, 38 MOV DL, 1 INT 20H POPAD MOV AX, [GS:EDI+10] MOV [SERVICEMOD_DATA_SEL], AX MOV AX, [GS:EDI+8] MOV [SERVICEMOD_CODE_SEL], AX MOV AX, [SYSROUT21_AX] ; FUNCTION MOVZX EAX, AH ; REORGANIZE SHL EAX, 2 ; * 4 ADD EAX, [GS:EDI+28] ; ADD TABLE OFFSET ADD EAX, [GS:EDI+12] ; ADD ABSOLUTE OFFSET OF CODE-START MOV EAX, [GS:EAX] ; READ THE DWORD THERE MOV [SERVICEMOD_CODE_OFS], EAX DB 0EAH ; MAKE A BIG JMP DD CALL_MOD_SERVICE DW 10H CALL_MOD_SERVICE: PUSH DS ; PUSH FS MOV AX, [SYSROUT21_AX] PUSH DX MOV DX, [SERVICEMOD_DATA_SEL] MOV DS, DX ; PREPARE THE DS ; MOV FS, DX ; PREPARE THE FS POP DX DB 09AH ; MAKE A BIG CALL !! SERVICEMOD_CODE_OFS DD 0 SERVICEMOD_CODE_SEL DW 0 ;--- [ Returns Here....] --- ; POP FS POP DS JMP ENDOF_SYSROUT21 SYSROUT21_MODNOTFOUND: MOV EDI, MODNOTFOUND_MSG MOV AL, 38 MOV DL, 1 INT 20H ENDOF_SYSROUT21: POP DS POP FS IRETD