⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 equmac.inc

📁 usb加密狗复制小工具 ┆加密狗信息复制工具
💻 INC
字号:
;***************************************************************************
;*                                                                         *
;* PROT - A softdog killer                                                 *
;* Copyright (C) 1996, by Li Wen_xian                                      *
;* All rights reserved                                                     *
;*                                                                         *
;* This file is: EQUMAC.INC, assorted macros and equates.                  *
;*                                                                         *
;***************************************************************************
;EQUates the user may wish to change (one set for each mode)
DOSSTACK        EQU     200H            ;stack size for DOS startup
VM86STACK       EQU     200H            ;stack size for VM86 int
TSRSTACK        EQU     200H            ;stack size for TSR  program
CRITSTACK       EQU     30H             ;stack size for crit errs
PMSTACK         EQU     400H            ;stack size for p-mode stack
PVSTACK         EQU     260             ;P10/VM86 psuedo stack size

;Maximum protected mode interrupt # defined
                TOPINT  EQU     0FFH
;The critical error handler works different for dos 2.x than for
;other DOS versions. In 99% of the cases it won't make any
;difference if you compile with dos=2...
;major dos version number (2,3 or 4)
                DOS     EQU     3

;Access rights equates
;use these with make desc or make seg
RO_DATA         EQU     90H             ;r/o data
RW_DATA         EQU     92H             ;r/w data
RO_STK          EQU     94H             ;r/o stack
RW_STK          EQU     96H             ;r/w stack
EX_CODE         EQU     98H             ;exec only code
ER_CODE         EQU     9AH             ;read/exec code
CN_CODE         EQU     9CH             ;exec only conforming code
CR_CODE         EQU     9EH             ;read/exec conforming code
LDT_DESC        EQU     82H             ;LDT entry
TSS_DESC        EQU     89H             ;TSS entry

;use these with make gate
CALL_GATE       EQU     8CH             ;call gate
TRAP_GATE       EQU     8FH             ;trap gate
INTR_GATE       EQU     8EH             ;int gate
TASK_GATE       EQU     85H             ;task gate

;dpl equates
DPL0            EQU     0
DPL1            EQU     20H
DPL2            EQU     40H
DPL3            EQU     60H
.386P
;macro definitons
;other macros use this to error check parameters
;Give an error if last is blank or too many is not blank
ERRCHK          MACRO   LAST,TOOMANY
IFNB            <TOOMANY>
IF2
                %OUT    TOO MANY PARAMETERS
ENDIF
                .ERR
ENDIF
IFB             <LAST>
IF2
                %OUT    NOT ENOUGH PARAMETERS
ENDIF
                .ERR
ENDIF
                ENDM
;Perform absolute 16 bit jump (in a 16 bit segment)
JMPABS          MACRO   A,B,ERRCK
                ERRCHK  B,ERRCK
                DB      0EAH            ;;absolute 16 bit jump
                DW      OFFSET B
                DW      A
                ENDM

;Perform absolute 32 bit jump (in a 32 bit segment)
JMPABS32        MACRO   A,B,ERRCK
                ERRCHK  B,ERRCK
                DB      0EAH            ;;absolute 32 bit jump
                DD      OFFSET B
                DW      A
                ENDM

;this generates a correct 32 bit offset for a proc call
;since MASM doesn't sign extend 32 bit relative items
CALL32S         MACRO   LBL,ERRCK               ;;short call
                ERRCHK  LBL,ERRCK
                DB      0E8H
                DD      LBL-($+4)
                ENDM
CALL32F         MACRO   SG,LBL,ERRCK            ;far call
                ERRCHK  LBL,ERRCK
                DB      9AH
                DD      OFFSET LBL
                DW      SG
                ENDM

JMP32S          MACRO   LBL,ERRCK               ;;short jump
                ERRCHK  LBL,ERRCK
                DB      0E9H
                DD      LBL-($+4)
                ENDM
;jcc32 uses the condition codes used in the intel literature
;conditional jump macro
JCC32           MACRO   CONDX,LBL,ERRCK
                ERRCHK  LBL,ERRCK
                DB      0FH
IFIDNI          <CONDX>,<A>
                DB      87H
ELSEIFIDNI      <CONDX>,<NBE>
                DB      87H
ELSEIFIDNI      <CONDX>,<AE>
                DB      83H
ELSEIFIDNI      <CONDX>,<C>
                DB      82H
ELSEIFIDNI      <CONDX>,<NAE>
                DB      82H
ELSEIFIDNI      <CONDX>,<B>
                DB      82H
ELSEIFIDNI      <CONDX>,<BE>
                DB      86H
ELSEIFIDNI      <CONDX>,<E>
                DB      84H
ELSEIFIDNI      <CONDX>,<Z>
                DB      84H
ELSEIFIDNI      <CONDX>,<G>
                DB      8FH
ELSEIFIDNI      <CONDX>,<GE>
                DB      8DH
ELSEIFIDNI      <CONDX>,<L>
                DB      8CH
ELSEIFIDNI      <CONDX>,<LE>
                DB      8EH
ELSEIFIDNI      <CONDX>,<NA>
                DB      86H
ELSEIFIDNI      <CONDX>,<NB>
                DB      83H
ELSEIFIDNI      <CONDX>,<NC>
                DB      83H
ELSEIFIDNI      <CONDX>,<NGE>
                DB      8CH
ELSEIFIDNI      <CONDX>,<NL>
                DB      8DH
ELSEIFIDNI      <CONDX>,<NO>
                DB      81H
ELSEIFIDNI      <CONDX>,<NP>
                DB      8BH
ELSEIFIDNI      <CONDX>,<NS>
                DB      89H
ELSEIFIDNI      <CONDX>,<NZ>
                DB      85H
ELSEIFIDNI      <CONDX>,<O>
                DB      80H
ELSEIFIDNI      <CONDX>,<P>
                DB      8AH
ELSEIFIDNI      <CONDX>,<PE>
                DB      8AH
ELSEIFIDNI      <CONDX>,<PO>
                DB      8BH
ELSEIFIDNI      <CONDX>,<S>
                DB      88H
ELSE
                %OUT    JCC32: UNKNOWN CONDITION CODE
                .ERR
ENDIF
                DD      LBL-($+4)
                ENDM
;Override default operand size
OPSIZ           MACRO   NOPARM          ;op size override
                ERRCHK  X,NOPARM
                DB      66H
                ENDM
;Override default address size

ADSIZ           MACRO   NOPARM          ;address size override
                ERRCHK  X,NOPARM
                DB      67H
                ENDM
;delay macro for interrupt controller access
IDELAY          MACRO   NOPARM
                LOCAL   DELAY1,DELAY2
                ERRCHK  X,NOPARM
                JMP     SHORT DELAY1
DELAY1:         JMP     SHORT DELAY2
DELAY2:
                ENDM
;BREAKPOINT     MACROS

;MACRO to turn on NBREAKPOINTS
;if used with no arguments (or a 1), this macro makes NBREAKPOINT
;active if used with an argument> 1, NBREAKPOINT will break after
;that many passes
BREAKON         MACRO   ARG,ERRCK
                ERRCHK  X,ERRCK
                PUSH    DS
                PUSH    SEL_DATA
                POP     DS
                PUSH    EAX
                IFB     <ARG>
                MOV     AL,1
                ELSE
                MOV     AL,&ARG
                ENDIF
                MOV     BPON,AL
                POP     EAX
                POP     DS
                ENDM

;turns off NBREAKPOINT
BREAKOFF        MACRO   NOPARAM
                ERRCHK  X,NOPARAM
                PUSH    DS
                PUSH    SEL_DATA
                POP     DS
                PUSH    EAX
                XOR     AL,AL
                MOV     BPON,AL
                POP     EAX
                POP     DS
                ENDM

BREAKPOINT      MACRO   NOPARM
                ERRCHK  X,NOPARM
                INT     3
                ENDM

;counter breakpoint - use BREAKON to set count control

;BREAKPOINT with memory dump
;usage: BREAKDUMP seg-selector,offset number of words
BREAKDUMP       MACRO   SEG,OFF,CNT,ERRCK
                ERRCHK  CNT,ERRCK
                PUSH    EAX
                MOV     AX,&SEG
                MOV     DUMP_SEG,AX
                MOV     EAX,OFFSET &OFF
                MOV     DUMP_OFF,EAX
                MOV     EAX,&CNT
                MOV     DUMP_CNT,EAX
                POP     EAX
                BREAKPOINT
                ENDM

NBREAKDUMP      MACRO   SEG,OFF,CNT,ERRCK
                ERRCHK  CNT,ERRCK
                LOCAL   NONBP
                PUSH    DS
                PUSH    SEL_DATA
                POP     DS
                PUSHFD
                OR      DS:BPON,0
                JZ      SHORT NONBP
                DEC     BPON
                JNZ     SHORT NONBP
                POPFD
                POP     DS
                BREAKDUMP       SEG,OFF,CNT
NONBP:
                POPFD
                POP     DS
                ENDM
NBREAKPOINT     MACRO   SEG,OFF,CNT,ERRCK
                ERRCHK  CNT,ERRCK
                LOCAL   NONBP
                PUSH    DS
                PUSH    SEL_DATA
                POP     DS
                PUSHFD
                OR      DS:BPON,0
                JZ      SHORT NONBP
                DEC     BPON
                JNZ     SHORT NONBP
                POPFD
                POP     DS
                BREAKPOINT
NONBP:
                POPFD
                POP     DS
                ENDM

;determine linear address of first free byte of memory
;(to nearest paragraph)
LOADFREE        MACRO   REG,ERRCK
                ERRCHK  REG,ERRCK
                XOR     E&REG,E&REG
                MOV     &REG,SEG ZZZGROUP
                SHL     E&REG,4
                ENDM

;Set up PINTFRAME (uses eax)
;load vmstack & vmdata to the ss:esp and ds slots in pintframe
;default ss:esp=ssint1
;default ds=userdata
PROT_STARTUP    MACRO   VMSTACK,VMDATA,ERRCK
                ERRCHK  X,ERRCK
IFB             <VMSTACK>
                MOV     AX,SEG SSINT1
ELSE
                MOV     AX,SEG VMSTACK
ENDIF
                MOV     PINTFRAME.VMSS,EAX
IFB             <VMSTACK>
                MOV     EAX,OFFSET SSINT1
ELSE
                MOV     EAX,OFFSET VMSTACK
ENDIF
                MOV     PINTFRAME.VMESP,EAX
IFB             <VMDATA>
                MOV     AX,SEG USERDATA
ELSE
                MOV     AX,SEG VMDATA
ENDIF
                MOV     PINTFRAME.VMDS,EAX
                ENDM

;start PROT user segments
PROT_CODE       MACRO   NOPARM
                ERRCHK  X,NOPARM
USERCODE        SEGMENT
USERCODEBEG     EQU     $
                ASSUME CS:USERCODE,DS:USERDATA,ES:DAT32
                ENDM

PROT_DATA       MACRO   NOPARM
                ERRCHK  X,NOPARM
USERDATA        SEGMENT
USERDATABEG     EQU     $
                ENDM

PROT_CODE_END   MACRO   NOPARM
                ERRCHK  X,NOPARM
USERCODEEND     EQU     $
USERCODELEN     EQU     (USERCODEEND-USERCODEBEG)-1
                PUBLIC  USERCODELEN
                PUBLIC  USER
USERCODE        ENDS
                ENDM

PROT_DATA_END   MACRO   NOPARM
                ERRCHK  X,NOPARM
USERDATAEND     EQU     $
USERDATALEN     EQU     (USERDATAEND-USERDATABEG)-1
                PUBLIC  USERDATALEN
USERDATA        ENDS
                ENDM
;simplfy programs with no data segment
NODATA          MACRO   NOPARM
                ERRCHK  X,NOPARM
                PROT_DATA
                PROT_DATA_END
                ENDM


;Mnemonic for dos return
BACK2DOS        MACRO   RC,ERRCK
                ERRCHK  X,ERRCK
IFNB            <RC>
                MOV     AL,RC
ENDIF
                JMPABS32 SEL_CODE16,BACK16
                ENDM

BACK2REAL       MACRO   RC,ERRCK
                ERRCHK  X,ERRCK
IFNB            <RC>
                MOV     AL,RC
ENDIF
                JMPABS32 SEL_CODE16,PM2REAL
                ENDM

;variables and macro to create GDT/LDT/IDT entries
C_GDT           =       0
C_LDT           =       0
C_IDT           =       0

;create "next" descriptor with name in table
;if no table specified, use GDT
DESC            MACRO   NAME,TABLE,ERRCK
                PUBLIC  NAME
                DQ      0
IFB             <TABLE>
                NAME    = C_GDT
C_GDT           =       C_GDT+8
ELSE
IFIDNI          <TABLE>,<LDT>
;for LDT selectors,set the T1 bit to one
                NAME    = C_&TABLE OR 4
ELSE
                NAME    = C_&TABLE
ENDIF
C_&TABLE        =       C_&TABLE+8
ENDIF
                ENDM

;Segment defines
DAT32           SEGMENT PARA PUBLIC 'DATA32' USE32
DAT32           ENDS

SEG32           SEGMENT PARA PUBLIC 'CODE32' USE32
SEG32           ENDS

CSEG            SEGMENT PARA PUBLIC 'CODE16' USE16
CSEG            ENDS

TSSSEG          SEGMENT PARA PUBLIC 'DATA32' USE32
TSSSEG          ENDS

USERCODE        SEGMENT PARA PUBLIC 'CODE32' USE32
USERCODE        ENDS

USERDATA        SEGMENT PARA PUBLIC 'DATA32' USE32
USERDATA        ENDS

SSEG            SEGMENT PARA STACK 'STACK' USE16
SSEG            ENDS

SSINT           SEGMENT PARA STACK 'STACK' USE16
SSINT           ENDS

SSTSR           SEGMENT PARA STACK 'STACK' USE16
SSTSR           ENDS

CSTACK          SEGMENT PARA STACK 'STACK' USE16
CSTACK          ENDS

SS32            SEGMENT PARA PUBLIC 'STACK' USE32
SS32            ENDS

GDTSEG          SEGMENT PARA PUBLIC 'CODE32' USE32
GDTSEG          ENDS

ZZZSEG          SEGMENT PARA PUBLIC 'ZZZ' USE16
ZZZSEG          ENDS

ISR             SEGMENT PARA PUBLIC 'CODE32' USE32
ISR             ENDS

IDTABLE         SEGMENT PARA PUBLIC 'DATA32' USE32
IDTABLE         ENDS

ZZZGROUP        GROUP   ZZZSEG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -