📄 code16.asm
字号:
;*****************************************************************************
;* *
;* PROT - A softdog killer *
;* Copyright (C) 1996, by Li Wen_xian *
;* All rights reserved *
;* *
;* This file is: CODE16.ASM, the 16 bit DOS entry/exit code. *
;* *
;*****************************************************************************
INCLUDE EQUMAC.INC
CODE16_FILE EQU 1
INCLUDE EXTERNAL.INC
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG
PUBLIC BACK16
PUBLIC PM2REAL
PUBLIC ENTRY
PUBLIC _TSR
PUBLIC _RTCSIP
BEG16 EQU $
IDTSAV DF 0 ;space to save old IDT
XZRO DF 0 ;constant to inhibit IDT
;area to save stack pointer
SOFFSAV DW 0
SSEGSAV DW 0
TEMP EQU THIS FWORD ;space to load GDT
TLIM DW GDTLEN
TEMD DD 0
;old keyboard interrupt vector -- we have to catch reboots
KEYCHAIN EQU THIS DWORD
KEYOFF DW ?
KEYSEG DW ?
INTM DB 0 ;interrupt mask - pic 1
INTMAT DB 0 ;interrupt mask - AT pic 2
;psp
PSP DW 0
PS2 DB 0 ;1 if PS/2 w/Microchannel
PC386 DB 0 ;1 if INTEL INBOARD PC found
IBPC DB 'INBRDPC%',0 ;device name for inboard
_RTCSIP DD 0 ;CS & IP 0
DW 0 ;FLAGS 4
DW 0 ;ES 6
DW 0 ;DS 8
DW 0 ;SS A
DW 0 ;BP C
DW 0 ;SP E
DW 0 ;DI 10
DW 0 ;SI 12
DW 0 ;DX 14
DW 0 ;CX 16
DW 0 ;BX 18
DW 0 ;AX 1A
;error messages
NOT386M DB 'Error: this program requires an'
DB '80386 or 80486'
DB 'processor.',13,10,'$'
VM86M DB 'Error: this program will not execute '
DB 'in VM86 mode!!'
DB 13,10,'$'
;cane messages
VERS DB 'Softdog killer v1.0 Copyright (C) 1996, by Li Wenxian',13,10
DB 'All Rights Reserved',13,10,'$'
HELPMSG DB '-------------------------HELP------------------------',13,10
DB ' CANE -----Emulate the softdog',13,10
DB ' CANE /Axxx -----Analyse the softdog,xxx=extend mem kept',13,10
DB ' CANE /R -----Read the softdog file',13,10
DB ' CANE /W -----Write the softdog file',13,10
DB ' CANE /U -----Free memory and to dos',13,10
DB ' CANE /H -----Help',13,10,'$'
NOTINMEM DB 'Softdog killer not in memory!!',13,10,'$'
RIGHTFREE DB 'Softdog killer has been freed successfully',13,10,'$'
ERRORFREE DB 'Softdog killer cannot be freed',13,10,'$'
DATAERROR DB 'File cane.lad error!!',13,10,'$'
NOTCORRECT DB 'Illegal parametre!!!',13,10,'$'
MEMORYLACK DB 'Memory not enough!!!',13,10,'$'
FILENAME DB 'CANE0378.LAD',0
GDTAREA DB 16 DUP(0)
DW 0FFFFH ;src seg limit
DW 0 ;src ptr low
DB 0 ;src ptr high
DB 93H ;src rights
DW 0
DW 0FFFFH ;desc seg limit
DW 0 ;desc ptr low
DB 0 ;desc ptr high
DB 93H ;desc rights
DW 0
DB 16 DUP(0)
_HANDLE DW 0
_EXTENDADDR DD 0
_EXTENDLEN DD 0
_EXTSIZE DW 0
_WRITECOUNTER DD 0
_READCOUNTER DD 0
RWBUFFER DB 400H DUP (0)
;16 bit ss/sp for return to real mode
LOAD16 DD OFFSET SSEG1
DW SEL_RDATA
;**************************************************************************
;* Begin program *
;**************************************************************************
ENTRY LABEL FAR
START PROC NEAR
CALL SETPARALLEL
CALL CHECKEXT
CALL GETPARA ;get para 0: cane, 1: cane /a, 2: cane /w
; 3: cane /u, 4: cane /?
CMP AL,0
JZ EMULATION
CMP AL,1
JZ ANALYSIS
CMP AL,2
JZ WRITEFILE
CMP AL,3
JZ CANEQUIT
CMP AL,4
JZ CANEHELP
CMP AL,5
JZ READFILE
MOV AX,4C00H
INT 21H
EMULATION:
MOV AX,DAT32
MOV FS,AX
MOV FS:EXEFLAG,0 ;emulation
JMP CANESTART
ANALYSIS:
MOV AX,DAT32
MOV FS,AX
MOV FS:EXEFLAG,1 ;analysis
JMP CANESTART
WRITEFILE:
CALL WRITEDATAFILE
MOV AX,4C00H
INT 21H
READFILE:
CALL READDATAFILE
MOV AX,4C00H
INT 21H
CANEQUIT:
CALL FREESPACE
MOV AX,4C00H
INT 21H
CANEHELP:
CALL HELPUSER
MOV AX,4C00H
INT 21H
CANESTART:
PUSH CS ;set up DS segment,save PSP
POP DS
MOV AX,ES
MOV PSP,AX ;save PSP
MOV BX,DAT32
MOV ES,BX
MOV ES:_PSP,AX ;save PSP to global var
;check to see if we are running on a 386/486
XOR AX,AX
PUSH AX
POPF
PUSHF
POP AX
AND AX,0F000H
CMP AX,0F000H
JNZ SHORT NOT86
NOT386:
MOV DX,OFFSET NOT386M
NOT386EXIT:
MOV AH,9
INT 21H
MOV AX,4C80H
INT 21H
;here if it is 286 or better
NOT86:
MOV AX,0F000H
PUSH AX
POPF
PUSHF
POP AX
AND AX,0F000H
JZ NOT386
;if we got here we are on an 80386/486
;check PM flag
SMSW AX
AND AX,1 ;are we in protected mode?
MOV DX,OFFSET VM86M
JNZ NOT386EXIT
;Ok. we are clear to proceed
;See if we are on a Micro Channel PS/2
MOV AX,0C400H ;get POS address
INT 15H
JC SHORT TRYIB
MOV PS2,1
JMP SHORT ATSTYLE
;see if we are on an INTEL INBOARD/386 PC is so set flags in
;dat32 and in this segment
TRYIB:
MOV DX,OFFSET IBPC
MOV AX,3D00H
INT 21H ;try to open device driver
;jump if AT - CLASS machine
JC SHORT ATSTYLE
MOV BX,AX ;close device
MOV AH,3EH
INT 21H
MOV PC386,1
MOV ES:_PC386,1
ATSTYLE:
;display version information
MOV DX,OFFSET VERS
MOV AH,09H
INT 21H
;Create segments
PUSH GDTSEG
POP ES
MOV EDX,OFFSET GDT ;es:edx gdt address
MOV EBX,CS
SHL EBX,4 ;calc segment base address
MOV ECX,0FFFFH ;64 K limit (don't change)
MOV AH,ER_CODE ;read/exec code seg
XOR AL,AL ;size 16
MOV SI,SEL_CODE16 ;descriptor
CALL MAKE_DESC ;make code seg(16 bit/real)
XOR EBX,EBX ;base
MOV SI,SEL_DATA0 ;descriptor
XOR ECX,ECX
DEC ECX ;ecx=ffffffff
MOV AL,1 ;size 32
MOV AH,RW_DATA
CALL MAKE_DESC ;make data (4G @ zero base)
XOR EAX,EAX
INT 12H ;get the actual mem
MOVZX ECX,AX
SHL ECX,10
;get free memory segment
LOADFREE BX ;base
SUB ECX,EBX
DEC ECX ;limit
MOV SI,SEL_FREE ;descriptor
MOV AL,1 ;size 32
MOV AH,RW_DATA
CALL MAKE_DESC
XOR EAX,EAX
MOV AH,88H ;get top of extended memory
INT 15H
SHL EAX,10
OR EAX,EAX ;any extended present?
MOV ECX,EAX
JNZ SHORT EXTPRES
MOV ECX,1
EXTPRES:
DEC ECX ;limit
MOV EBX,100000H ;base
MOV SI,SEL_EXT ;descriptor
MOV AL,1 ;size 32
MOV AH,RW_DATA
CALL MAKE_DESC ;make extended memory
XOR EBX,EBX
MOV BX,SEG32
SHL EBX,4 ;base
MOV ECX,SEG32LEN ;limit
MOV AH,ER_CODE
MOV AL,1 ;size 32
MOV SI,SEL_CODE32 ;descriptor
CALL MAKE_DESC ;32 bit code segment
XOR EBX,EBX
MOV BX,USERCODE
SHL EBX,4 ;base
MOV ECX,USERCODELEN ;limit
MOV AH,ER_CODE
MOV AL,1 ;size 32
MOV SI,SEL_UCODE ;descriptor
CALL MAKE_DESC ;make user code
XOR EBX,EBX
MOV BX,USERDATA
SHL EBX,4 ;base
MOV ECX,USERDATALEN ;limit
MOV AH,RW_DATA
MOV AL,1
MOV SI,SEL_UDATA ;descriptor
CALL MAKE_DESC ;make user data
XOR EBX,EBX
MOV BX,SS32
SHL EBX,4 ;always para align stacks !
MOV ECX,SSEG32LEN
MOV AH,RW_DATA ;stack seg is data type
MOV AL,1
MOV SI,SEL_STACK
CALL MAKE_DESC ;make stack
;16 bit data for return to real mode
XOR EBX,EBX
MOV BX,SSEG
SHL EBX,4 ;base
;real mode limit (don't change)
MOV ECX,0FFFFH ;limit
XOR AL,AL ;size 16bit
MOV AH,RW_DATA
MOV SI,SEL_RDATA
CALL MAKE_DESC
XOR EBX,EBX
MOV BX,GDTSEG
SHL EBX,4
ADD EBX,OFFSET GDT
MOV ECX,(GDTLEN)
MOV AL,1
MOV AH,RW_DATA
MOV SI,SEL_GDT
CALL MAKE_DESC
MOV AX,500H ;set video to page 0
INT 10H
MOV AH,0FH ;get mode
INT 10H
MOV EBX,0B0000H ;monochrome
CMP AL,7 ;check for mono
JZ SHORT VIDEOCONT
MOV EBX,0B8000H
VIDEOCONT:
MOV ECX,3999 ;limit for text page
MOV AL,1
MOV AH,RW_DATA
MOV SI,SEL_VIDEO
CALL MAKE_DESC ;make video segment
XOR EBX,EBX
MOV BX,DAT32
SHL EBX,4
MOV ECX,DAT32LEN
MOV AH,RW_DATA
MOV AL,1
MOV SI,SEL_DATA
CALL MAKE_DESC
XOR EBX,EBX
MOV BX,IDTABLE
SHL EBX,4
MOV ECX,IDTLEN
MOV AH,RW_DATA
MOV AL,1
MOV SI,SEL_IDT
CALL MAKE_DESC
XOR EBX,EBX
MOV BX,ISR
SHL EBX,4
MOV ECX,ISRLEN
MOV AH,ER_CODE
MOV AL,1
MOV SI,SEL_ICODE
CALL MAKE_DESC
XOR EBX,EBX
MOV BX,ISR
SHL EBX,4
MOV ECX,ISRLEN
MOV AH,RW_DATA
MOV AL,1
MOV SI,SEL_ISR
CALL MAKE_DESC ;The alias of ISR
XOR EBX,EBX
MOV BX,TSSSEG
SHL EBX,4
;ceat TSSs
MOV ECX,TSSLEN
MOV AH,RW_DATA
MOV AL,1
MOV SI,SEL_TSS0
CALL MAKE_DESC
MOV AH,TSS_DESC
MOV SI,TSS0
CALL MAKE_DESC
ADD EBX,OFFSET TSS1BEG
MOV SI,TSS1
MOV ECX,TSSLEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -