home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / warptlk3.zip / TOOLKIT / H / V8086.H < prev    next >
Text File  |  1995-08-24  |  13KB  |  363 lines

  1. /***************************************************************************
  2. *
  3. * Module Name: V8086.H
  4. *
  5. * OS/2 public header file.
  6. *
  7. * Copyright (c) 1987 - 1992  IBM Corporation
  8. *
  9. *****************************************************************************/
  10.  
  11.  
  12. /*INT32*/
  13.  
  14. /***ET+ Low memory defines - used by VBIOS */
  15.  
  16. #define IVT_START               0       /* Interrupt vector table start */
  17. #define IVT_LEN                 0x400   /*     "        "     "   length */
  18. /*end*/
  19.  
  20. /***ET+ flVdmStatus flags */
  21.  
  22. #define VDM_STATUS_VPM_32       0x00000001      /* 32 bit DPMI app */
  23. #define VDM_STATUS_VPM_32_BIT   0
  24. #define VDM_STATUS_VPM_APP      0x00000002      /* DPMI app started */
  25. #define VDM_STATUS_VPM_APP_BIT  1
  26. #define VDM_STATUS_VPM_EXEC     0x00000004      /* in VDM protected mode */
  27. #define VDM_STATUS_VPM_EXEC_BIT 2
  28. #define VDM_STATUS_VPM_TRAPMODE 0x00000008      /* V86 mode at kernel entry? */
  29. #define VDM_STATUS_VPM_TRAP_BIT 3
  30. #define VDM_STATUS_VPM_IF_FLAG  0x00000010      /* Virtual IF flag */
  31. #define VDM_STATUS_VPM_IF_BIT   4
  32. #define VDM_STATUS_VPM_08_HOOK  0x00000020      /* protect 08h hooked? */
  33. #define VDM_STATUS_VPM_08_BIT   5
  34. #define VDM_STATUS_VPM_1C_HOOK  0x00000040      /* protect 1Ch hooked? */
  35. #define VDM_STATUS_VPM_1C_BIT   6
  36. #define VDM_STATUS_VPM_PERM     0x00000080      /* protected mode allowed? */
  37. #define VDM_STATUS_VPM_PERM_BIT 7
  38. #define VDM_STATUS_VPM_XDOS     0x00000100      /* DOS API Extension active? */
  39. #define VDM_STATUS_VPM_XDOS_BIT 8
  40. #define VDM_STATUS_VPM_TERM     0x00000200      /* VDM terminating? */
  41. #define VDM_STATUS_VPM_TERM_BIT 9
  42. #define VDM_STATUS_VPM_EM_FLAG  0x00000400      /* Virtual EM flag */
  43. #define VDM_STATUS_VPM_EM_BIT   10
  44. #define VDM_STATUS_VPM_TASK_SW  0x00000800      /* Task switch for HW int */
  45. #define VDM_STATUS_VPM_TASK_BIT 11
  46. /*end*/
  47.  
  48. /***ET+ VDHInstallIntHook options */
  49.  
  50. #define VDH_ASM_HOOK            0x00000001L
  51. /*end*/
  52.  
  53. /***ET+ VDHInstallIOHook options */
  54.  
  55. #define VDHIIH_ASM_HOOK         VDH_ASM_HOOK
  56. #define VDHIIH_ALWAYS_TRAP      0x00000002L
  57. #define VDHIIH_NO_SIMULATE      0x00000004L
  58. #define VDHIIH_IGNORE           0x00000010L
  59. /*end*/
  60.  
  61. /***ET+ VDHSetIOHookState options */
  62.  
  63. #define SETIO_TRAP              TRUE
  64. #define SETIO_NOTRAP            FALSE
  65. /*end*/
  66.  
  67. /***ET+ I/O type flags - VDHInstallIOPort pfnOther handler */
  68.  
  69. #define IO_TYPE_SHIFT           8
  70. #define IO_TYPE_MASK            0x00000F00L
  71. #define IO_TYPE_INPUT           0x00000100L
  72. #define IO_TYPE_OUTPUT          0x00000000L
  73. #define IO_TYPE_STRING          0x00000200L
  74. #define IO_TYPE_BYTE            0x00000400L
  75. #define IO_TYPE_WORD            0x00000000L
  76. #define IO_TYPE_DWORD           0x00000800L
  77.  
  78. #define IO_TYPE_ADDR32          0x00001000L
  79. #define IO_TYPE_REP             0x00002000L
  80. #define IO_TYPE_REVERSE         0x00008000L
  81.  
  82. #define IO_SEG_SHIFT            16
  83. #define IO_SEG_MASK             0x000f0000L
  84. #define IO_SEG_ES               0x00000000L
  85. #define IO_SEG_CS               0x00010000L
  86. #define IO_SEG_SS               0x00020000L
  87. #define IO_SEG_DS               0x00030000L
  88. #define IO_SEG_FS               0x00040000L
  89. #define IO_SEG_GS               0x00050000L
  90. /*end*/
  91.  
  92. /***ET+ VDHCheckPagePerm and private DPMI options */
  93.  
  94. #define VPMPG_W            0x00000002      /* Writable */
  95. #define VPMPG_U            0x00000004      /* user mode accessible */
  96. #define VPMPG_X            0x00000008      /* eXecutable */
  97. #define VPMPG_R            0x00000010      /* Readable */
  98. #define VPMPG_RESERVED     0x00001000      /* Reserved for system use */
  99. /*end*/
  100.  
  101.  
  102. /***ET+ VDHAllocHook options */
  103.  
  104. #define VDH_CONTEXT_HOOK                0
  105. #define VDH_STI_HOOK                    1
  106. #define VDH_RETURN_HOOK                 2
  107. #define VDH_TIMER_HOOK                  3
  108. #define VDH_BP_HOOK                     4
  109. /*end*/
  110.  
  111. /***ET+ VDHArmContextHook options */
  112.  
  113. #define GLOBAL_CONTEXT_HOOK     ((HVDM) -1)
  114. /*end*/
  115.  
  116. /***ET+ VDHArmReturnHook options */
  117.  
  118. #define VDHARH_NORMAL_RET               0
  119. #define VDHARH_NORMAL_IRET              1
  120. #define VDHARH_RECURSIVE_RET            2
  121. #define VDHARH_RECURSIVE_IRET           3
  122. #define VDHARH_CSEIP_HOOK               4
  123. #define VDHARH_RECURSIVE_CSEIP_HOOK     5
  124. #define VDHARH_ALWAYS_ARM_HOOK          0x80000000
  125. /*end*/
  126.  
  127. /***ET+ VDHArmReturnHook recursive user stack usage
  128.  *
  129.  *      VDHARH_RECURSIVE_CSEIP_HOOK stack usage will vary depend
  130.  *      on the VDM protected mode "bitness".   If 32 bit, there
  131.  *      will be 8 bytes on the stack; otherwise, 4 bytes.
  132.  */
  133.  
  134. #define VDHARH_RECURSIVE_STACK_USAGE    4
  135. /*end*/
  136.  
  137. /***ET+ VDHPushFarCall user stack usage */
  138.  
  139. #define VDHPFC_STACK_USAGE              4
  140. /*end*/
  141.  
  142. /***ET+ VDHPushInt user stack usage */
  143.  
  144. #define VDHPI_STACK_USAGE               6
  145. /*end*/
  146.  
  147. /***ET+ VDHPushRegs/VDHPopRegs flags */
  148.  
  149. #define VDHREG_AX               0x00000001L
  150. #define VDHREG_BX               0x00000002L
  151. #define VDHREG_CX               0x00000004L
  152. #define VDHREG_DX               0x00000008L
  153. #define VDHREG_SI               0x00000010L
  154. #define VDHREG_DI               0x00000020L
  155. #define VDHREG_BP               0x00000040L
  156. #define VDHREG_SP               0x00000080L
  157. #define VDHREG_DS               0x00000100L
  158. #define VDHREG_ES               0x00000200L
  159. #define VDHREG_SS               0x00000400L
  160. #define VDHREG_FLAG             0x00000800L
  161. #define VDHREG_EREGS            0x10000000L        /* Push/Pop 32 bit values */
  162. #define VDHREG_ALL              (VDHREG_AX | VDHREG_BX | \
  163.                                  VDHREG_CX | VDHREG_DX | \
  164.                                  VDHREG_SI | VDHREG_DI | \
  165.                                  VDHREG_BP | VDHREG_SP | \
  166.                                  VDHREG_DS | VDHREG_ES | \
  167.                                  VDHREG_SS | VDHREG_FLAG)
  168. #define VDHREG_GENERAL          (VDHREG_AX | VDHREG_BX | \
  169.                                  VDHREG_CX | VDHREG_DX | \
  170.                                  VDHREG_SI | VDHREG_DI | \
  171.                                  VDHREG_BP | VDHREG_DS | \
  172.                                  VDHREG_ES | VDHREG_FLAG)
  173. /*end*/
  174.  
  175. /***ET+ CRF - Client Register Frame
  176.  *
  177.  *      The EBX register points to the CRF structure on entry
  178.  *      to I/O port handlers and VDD interrupt handlers.  VDDs
  179.  *      can retrieve or modify the client's registers with this
  180.  *      interface.
  181.  */
  182.  
  183. typedef struct crf_s {
  184.         ULONG crf_edi;
  185.         ULONG crf_esi;
  186.         ULONG crf_ebp;
  187.         ULONG crf_padesp;
  188.         ULONG crf_ebx;
  189.         ULONG crf_edx;
  190.         ULONG crf_ecx;
  191.         ULONG crf_eax;
  192.         ULONG crf_pad2[2];
  193.         ULONG crf_eip;
  194.         USHORT crf_cs;
  195.         USHORT crf_padcs;
  196.         ULONG crf_eflag;
  197.         ULONG crf_esp;
  198.         USHORT crf_ss;
  199.         USHORT crf_padss;
  200.         USHORT crf_es;
  201.         USHORT crf_pades;
  202.         USHORT crf_ds;
  203.         USHORT crf_padds;
  204.         USHORT crf_fs;
  205.         USHORT crf_padfs;
  206.         USHORT crf_gs;
  207.         USHORT crf_padgs;
  208.         ULONG crf_alteip;               /* other modes register set */
  209.         USHORT crf_altcs;
  210.         USHORT crf_altpadcs;
  211.         ULONG crf_alteflag;
  212.         ULONG crf_altesp;
  213.         USHORT crf_altss;
  214.         USHORT crf_altpadss;
  215.         USHORT crf_altes;
  216.         USHORT crf_altpades;
  217.         USHORT crf_altds;
  218.         USHORT crf_altpadds;
  219.         USHORT crf_altfs;
  220.         USHORT crf_altpadfs;
  221.         USHORT crf_altgs;
  222.         USHORT crf_altpadgs;
  223. } CRF;
  224.  
  225. typedef CRF *PCRF;
  226. /*end*/
  227.  
  228.  
  229. /***ET+ Macros to improve VDM register manipulations from C */
  230.  
  231. #define AX(pcrf)    WORDOF(pcrf->crf_eax,0)
  232. #define AL(pcrf)    BYTEOF(pcrf->crf_eax,0)
  233. #define AH(pcrf)    BYTEOF(pcrf->crf_eax,1)
  234. #define BX(pcrf)    WORDOF(pcrf->crf_ebx,0)
  235. #define BL(pcrf)    BYTEOF(pcrf->crf_ebx,0)
  236. #define BH(pcrf)    BYTEOF(pcrf->crf_ebx,1)
  237. #define CX(pcrf)    WORDOF(pcrf->crf_ecx,0)
  238. #define CL(pcrf)    BYTEOF(pcrf->crf_ecx,0)
  239. #define CH(pcrf)    BYTEOF(pcrf->crf_ecx,1)
  240. #define DX(pcrf)    WORDOF(pcrf->crf_edx,0)
  241. #define DL(pcrf)    BYTEOF(pcrf->crf_edx,0)
  242. #define DH(pcrf)    BYTEOF(pcrf->crf_edx,1)
  243. #define SI(pcrf)    WORDOF(pcrf->crf_esi,0)
  244. #define DI(pcrf)    WORDOF(pcrf->crf_edi,0)
  245. #define BP(pcrf)    WORDOF(pcrf->crf_ebp,0)
  246. #define SP(pcrf)    WORDOF(pcrf->crf_esp,0)
  247. #define CS(pcrf)    WORDOF(pcrf->crf_cs,0)
  248. #define IP(pcrf)    WORDOF(pcrf->crf_eip,0)
  249. #define DS(pcrf)    WORDOF(pcrf->crf_ds,0)
  250. #define ES(pcrf)    WORDOF(pcrf->crf_es,0)
  251. #define SS(pcrf)    WORDOF(pcrf->crf_ss,0)
  252. #define FL(pcrf)    WORDOF(pcrf->crf_eflag,0)
  253.  
  254. /* General purpose macros */
  255.  
  256. #define INT_PIC1BASE    0x08
  257. #define INT_PIC2BASE    0x70
  258. #define INTFROMIRQ(irq) (((irq) < 8)? (irq) + INT_PIC1BASE: \
  259.                                       (irq) - 8 + INT_PIC2BASE)
  260. /* VDHReadUBuf and VDHWriteUBuf flags */
  261.  
  262. #define VPM_FAULT_IF_RW_SET     0x01
  263. #define VPM_FAULT_IF_SU_SET     0x02
  264. #define VPM_SEL_PRESENT         0x04
  265. #define VPM_SEL_WRITEABLE       0x08
  266. #define VPM_FAULT_IF_RO         0x10
  267. #define VPM_SEL_IS_SS           0x20
  268. #define VPM_PROT_READ           0x40
  269. #define VPM_PROT_WRITE          0x80
  270. #define VPM_XCPTRET_ALT         0x100
  271. #define VPM_NO_SIM_EXCPT        0x200
  272.  
  273. /***ET+ Hook routine typedefs */
  274.  
  275. typedef BYTE HOOKENTRY BIH(ULONG, PCRF);        /* I/O hook routines */
  276. typedef VOID HOOKENTRY BOH(BYTE, ULONG, PCRF);
  277. typedef WORD HOOKENTRY WIH(ULONG, PCRF);
  278. typedef VOID HOOKENTRY WOH(WORD, ULONG, PCRF);
  279. typedef BOOL HOOKENTRY OTH(ULONG, PULONG, ULONG, ULONG, PCRF);
  280.  
  281. typedef BYTE (*HOOKENTRY PBIH)(ULONG, PCRF);    /* pointers to I/O hook routines */
  282. typedef VOID (*HOOKENTRY PBOH)(BYTE, ULONG, PCRF);
  283. typedef WORD (*HOOKENTRY PWIH)(ULONG, PCRF);
  284. typedef VOID (*HOOKENTRY PWOH)(WORD, ULONG, PCRF);
  285. typedef BOOL (*HOOKENTRY POTH)(ULONG, PULONG, ULONG, ULONG, PCRF);
  286.  
  287. typedef BOOL HOOKENTRY FNHOOK(PCRF);            /* hook routine */
  288. typedef BOOL (*HOOKENTRY PFNHOOK)(PCRF);        /* pointer to hook routine */
  289.  
  290. typedef VOID HOOKENTRY FNARM();                 /* arm hook routine */
  291. typedef VOID (*HOOKENTRY PFNARM)();             /* pointer to arm hook routine */
  292.  
  293. /***ET+ IOH - I/O Port Hook Entry
  294.  *
  295.  *      This is the structure for the parameter to the VDHInstallIOHook
  296.  *      service.  Only the byte input and output handlers are required.
  297.  *      A null (0) entry indicates that the type of I/O should be
  298.  *      simulated.  The structure passed by VDHInstallIOHook is
  299.  *      copied and saved away after the NULLs are replaced with the
  300.  *      addresses of the simulation routines.
  301.  */
  302.  
  303. typedef struct ioh_s {
  304.         PBIH ioh_pbihByteInput;                 /* byte input handler */
  305.         PBOH ioh_pbohByteOutput;                /* byte output handler */
  306.         PWIH ioh_pwihWordInput;                 /* word input handler */
  307.         PWOH ioh_pwohWordOutput;                /* word output handler */
  308.         POTH ioh_pothOther;                     /* dword and string I/O handler */
  309. } IOH;
  310.  
  311. typedef IOH *PIOH;                              /* pointer to IOH entry */
  312. /*end*/
  313.  
  314.  
  315. /* 8086 emulation VDH services */
  316.  
  317. BOOL   VDHENTRY VDHInstallIOHook(HVDM, PORT, ULONG, PIOH, FLAGS);
  318. VOID   VDHENTRY VDHRemoveIOHook(HVDM, PORT, ULONG, PIOH);
  319. VOID   VDHENTRY VDHSetIOHookState(HVDM, PORT, ULONG, PIOH, BOOL);
  320. BOOL   VDHENTRY VDHInstallIntHook(HVDM, ULONG, PFNHOOK, FLAGS);
  321. HHOOK  VDHENTRY VDHAllocHook(ULONG, PFNARM, ULONG);
  322. PVOID  VDHENTRY VDHQueryHookData(HHOOK);
  323. VOID   VDHENTRY VDHFreeHook(HHOOK);
  324. VOID   VDHENTRY VDHArmContextHook(HHOOK, HVDM);
  325. VOID   VDHENTRY VDHArmSTIHook(HHOOK, HVDM);
  326. BOOL   VDHENTRY VDHArmReturnHook(HHOOK, ULONG);
  327. VPVOID VDHENTRY VDHArmBPHook(HHOOK);
  328. BOOL   VDHENTRY VDHPushInt(ULONG);
  329. BOOL   VDHENTRY VDHPopInt(VOID);
  330. BOOL   VDHENTRY VDHPushRegs(FLAGS);
  331. BOOL   VDHENTRY VDHPopRegs(FLAGS);
  332. BOOL   VDHENTRY VDHPushStack(ULONG,PVOID);
  333. BOOL   VDHENTRY VDHPopStack(ULONG,PVOID);
  334. VOID   VDHENTRY VDHSetA20(BOOL);
  335. BOOL   VDHENTRY VDHQueryA20(VOID);
  336. VOID   VDHENTRY VDHSetFlags(ULONG);
  337. VOID   VDHENTRY VDHSwitchToV86(VOID);
  338. VOID   VDHENTRY VDHSwitchToVPM(VOID);
  339. BOOL   VDHENTRY VDHCheckVPMIntVector(ULONG);
  340. BOOL   VDHENTRY VDHGetVPMIntVector(ULONG,PFPFN);
  341. BOOL   VDHENTRY VDHGetSelBase(SEL,PULONG);
  342. BOOL   VDHENTRY VDHChangeVPMIF(BOOL);
  343. BOOL   VDHENTRY VDHReadUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
  344. BOOL   VDHENTRY VDHWriteUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
  345. BOOL   VDHENTRY VDHCheckPagePerm(ULONG,PVOID,ULONG,ULONG);
  346. BOOL   VDHENTRY VDHRaiseException(ULONG,ULONG,ULONG);
  347. BOOL   VDHENTRY VDHStartHWInt(BOOL);
  348. BOOL   VDHENTRY VDHGetVPMExcept(ULONG,PFPFN,PBYTE);
  349. BOOL   VDHENTRY VDHProbeUBuf(SEL,ULONG,ULONG,ULONG);
  350. BOOL   VDHENTRY VDHPrepVPMIret(HHOOK);
  351. BOOL   VDHENTRY VDHPopVPMFarRet(VOID);
  352. BOOL   VDHENTRY VDHRegisterAPI(PSZ, PFNHOOK, PFNHOOK);
  353.  
  354. BOOL VDHENTRY VDHSetVPMIntVector(ULONG, FPFN);
  355. BOOL VDHENTRY VDHSetVPMExcept(ULONG, FPFN, BYTE);
  356. BOOL VDHENTRY VDHPushFarCall(FPFN);
  357.  
  358. FPFN VDHENTRY VDHArmVPMBPHook(HHOOK);
  359. VOID VDHENTRY VDHEndUseVPMStack(VOID);
  360. VOID VDHENTRY VDHBeginUseVPMStack(VOID);
  361.  
  362. extern ULONG flVdmStatus;
  363.