00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
#if     REALLY
00030 
#define PREFIX_ES               0x00000100
00031 
#define PREFIX_CS               0x00000200
00032 
#define PREFIX_SS               0x00000400
00033 
#define PREFIX_DS               0x00000800
00034 
#define PREFIX_FS               0x00001000
00035 
#define PREFIX_GS               0x00002000
00036 
#define PREFIX_OPER32           0x00004000
00037 
#define PREFIX_ADDR32           0x00008000
00038 
#define PREFIX_LOCK             0x00010000
00039 
#define PREFIX_REPNE            0x00020000
00040 
#define PREFIX_REP              0x00040000
00041 
#define PREFIX_SEG_ALL          0x00003f00
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
typedef struct _REGINFO {
00051         ULONG RiSegSs;
00052         ULONG RiEsp;
00053         ULONG RiEFlags;
00054         ULONG RiSegCs;
00055         ULONG RiEip;
00056         PKIA32_FRAME RiTrapFrame;
00057         ULONG RiCsLimit;
00058         ULONG RiCsBase;
00059         ULONG RiSsLimit;
00060         ULONG RiSsBase;
00061         ULONG RiPrefixFlags;
00062         
00063         
00064         
00065         
00066         ULONG RiInstLength;
00067         PUCHAR RiLinearAddr;
00068         UCHAR RiOpcode;
00069         KXDESCRIPTOR RiCsDescriptor;
00070         KXDESCRIPTOR RiSsDescriptor;
00071 } REGINFO, *PREGINFO;
00072 
00073 
#define BOP_OPCODE      0xc4c4
00074 
00075 
#define DPMISTACK_EXCEPTION_OFFSET 0x1000
00076 
00077 
00078 
00079 
00080 
#define DPMISTACK_OFFSET        (DPMISTACK_EXCEPTION_OFFSET - 0x20)
00081 
00082 
#ifdef  NEEDED
00083 
00084 
00085 
00086 
00087 
00088 
#define STYPE_DATA                  0x12
00089 
#define STYPE_CODE                  0x18
00090 
#define STYPE_EXECWRITE_MASK    0x1a
00091 
00092 
00093 
00094 
00095 
00096 
00097 
#define UNSCRAM_BASE_OFFSET     0
00098 
#define UNSCRAM_BASE_MASK       0x0ffffffff
00099 
#define UNSCRAM_GET_BASE(x) ((PUCHAR) ((x) & UNSCRAM_BASE_MASK))
00100 
00101 
00102 
#define UNSCRAM_LIMIT_OFFSET    32
00103 
#define UNSCRAM_LIMIT_MASK      0x0fffff
00104 
#define UNSCRAM_GET_LIMIT(x) (((x) >> UNSCRAM_LIMIT_OFFSET) & UNSCRAM_LIMIT_MASK)
00105 
00106 
00107 
00108 
#define UNSCRAM_STYPE_OFFSET    52
00109 
#define UNSCRAM_STYPE_MASK      0x1f
00110 
#define UNSCRAM_GET_STYPE(x) (((x) >> UNSCRAM_STYPE_OFFSET) & UNSCRAM_STYPE_MASK)
00111 
00112 
00113 
#define UNSCRAM_DPL_OFFSET      57
00114 
#define UNSCRAM_DPL_MASK        0x3
00115 
#define UNSCRAM_GET_DPL(x) (((x) >> UNSCRAM_DPL_OFFSET) & UNSCRAM_DPL_MASK)
00116 
00117 
00118 
#define UNSCRAM_PRESENT_OFFSET  59
00119 
#define UNSCRAM_PRESENT_MASK    0x1
00120 
#define UNSCRAM_GET_PRESENT(x) (((x) >> UNSCRAM_PRESENT_OFFSET) & UNSCRAM_PRESENT_MASK)
00121 
00122 
00123 
#define UNSCRAM_BIG_OFFSET      62
00124 
#define UNSCRAM_BIG_MASK        0x1
00125 
#define UNSCRAM_GET_BIG(x) (((x) >> UNSCRAM_BIG_OFFSET) & UNSCRAM_BIG_MASK)
00126 
00127 
00128 
#define UNSCRAM_GRAN_OFFSET     63
00129 
#define UNSCRAM_GRAN_MASK       0x1
00130 
#define UNSCRAM_GET_GRAN(x) (((x) >> UNSCRAM_GRAN_OFFSET) & UNSCRAM_GRAN_MASK)
00131 
00132 
00133 
#define UNSCRAM_FLAGS_OFFSET    52
00134 
#define UNSCRAM_FLAGS_MASK              0xfff
00135 
#define UNSCRAM_GET_FLAGS(x) (((x) >> UNSCRAM_FLAGS_OFFSET) & UNSCRAM_FLAGS_MASK)
00136 
00137 
#define UNSCRAM_EXPAND_IS_DOWN(x)       ((((x) >> UNSCRAM_STYPE_OFFSET) & 0x1c) == 0x14)
00138 
#define UNSCRAM_GRAN_IS_LARGE(x)        ((x) & (UNSCRAM_GRAN_MASK << UNSCRAM_GRAN_OFFSET))
00139 
#define UNSCRAM_IS_PRESENT(x)   ((x) & (UNSCRAM_PRESENT_MASK << UNSCRAM_PRESENT_OFFSET))
00140 
#define UNSCRAM_ACCESS_BIG(x)   ((x) & (UNSCRAM_BIG_MASK << UNSCRAM_BIG_OFFSET))
00141 
00142 
#endif  // NEEDED
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 
00159 
00160 
#define SANITIZE_FLAGS_IA32(eFlags) (\
00161 
        ((((eFlags) & EFLAGS_V86_MASK) && KeIA32VdmIoplAllowed) ? \
00162 
        (((eFlags) & KeIA32EFlagsAndMaskV86) | KeIA32EFlagsOrMaskV86) : \
00163 
        ((EFLAGS_INTERRUPT_MASK) | ((eFlags) & EFLAGS_USER_SANITIZE)))
00164 
00165 
extern ULONG 
KeIA32EFlagsAndMaskV86;
00166 
extern ULONG 
KeIA32EFlagsOrMaskV86;
00167 
extern BOOLEAN 
KeIA32VdmIoplAllowed;
00168 
extern ULONG 
KeIA32VirtualIntExtensions;
00169 
00170 
#define UNSCRAM_LIMIT_OFFSET    32
00171 
#endif