1 $if (_WDMDDK_) 2 /** Kernel definitions for AMD64 **/ 3 4 /* Interrupt request levels */ 5 #define PASSIVE_LEVEL 0 6 #define LOW_LEVEL 0 7 #define APC_LEVEL 1 8 #define DISPATCH_LEVEL 2 9 #define CMCI_LEVEL 5 10 #define CLOCK_LEVEL 13 11 #define IPI_LEVEL 14 12 #define DRS_LEVEL 14 13 #define POWER_LEVEL 14 14 #define PROFILE_LEVEL 15 15 #define HIGH_LEVEL 15 16 17 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL 18 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA) 19 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) 20 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) 21 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320) 22 23 #define PAGE_SIZE 0x1000 24 #define PAGE_SHIFT 12L 25 26 #define EFLAG_SIGN 0x8000 27 #define EFLAG_ZERO 0x4000 28 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) 29 30 typedef struct _KFLOATING_SAVE 31 { 32 ULONG Dummy; 33 } KFLOATING_SAVE, *PKFLOATING_SAVE; 34 35 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; 36 37 #define KeQueryInterruptTime() \ 38 (*(volatile ULONG64*)SharedInterruptTime) 39 40 #define KeQuerySystemTime(CurrentCount) \ 41 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime 42 43 #define KeQueryTickCount(CurrentCount) \ 44 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount 45 46 #define KeGetDcacheFillSize() 1L 47 48 #define YieldProcessor _mm_pause 49 #define MemoryBarrier __faststorefence 50 #define FastFence __faststorefence 51 #define LoadFence _mm_lfence 52 #define MemoryFence _mm_mfence 53 #define StoreFence _mm_sfence 54 #define LFENCE_ACQUIRE() LoadFence() 55 56 FORCEINLINE 57 VOID 58 KeMemoryBarrier( 59 VOID) 60 { 61 // FIXME: Do we really need lfence after the __faststorefence ? 62 FastFence(); 63 LFENCE_ACQUIRE(); 64 } 65 66 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() 67 68 _IRQL_requires_max_(HIGH_LEVEL) 69 _IRQL_saves_ 70 FORCEINLINE 71 KIRQL 72 KeGetCurrentIrql(VOID) 73 { 74 return (KIRQL)__readcr8(); 75 } 76 77 _IRQL_requires_max_(HIGH_LEVEL) 78 FORCEINLINE 79 VOID 80 KeLowerIrql( 81 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql) 82 { 83 //ASSERT((KIRQL)__readcr8() >= NewIrql); 84 __writecr8(NewIrql); 85 } 86 87 _IRQL_requires_max_(HIGH_LEVEL) 88 _IRQL_raises_(NewIrql) 89 _IRQL_saves_ 90 FORCEINLINE 91 KIRQL 92 KfRaiseIrql( 93 _In_ KIRQL NewIrql) 94 { 95 KIRQL OldIrql; 96 97 OldIrql = (KIRQL)__readcr8(); 98 //ASSERT(OldIrql <= NewIrql); 99 __writecr8(NewIrql); 100 return OldIrql; 101 } 102 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) 103 104 _IRQL_requires_max_(DISPATCH_LEVEL) 105 _IRQL_saves_ 106 _IRQL_raises_(DISPATCH_LEVEL) 107 FORCEINLINE 108 KIRQL 109 KeRaiseIrqlToDpcLevel( 110 VOID) 111 { 112 return KfRaiseIrql(DISPATCH_LEVEL); 113 } 114 115 FORCEINLINE 116 KIRQL 117 KeRaiseIrqlToSynchLevel(VOID) 118 { 119 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 120 } 121 122 FORCEINLINE 123 PKTHREAD 124 KeGetCurrentThread(VOID) 125 { 126 return (struct _KTHREAD *)__readgsqword(0x188); 127 } 128 129 _Always_(_Post_satisfies_(return<=0)) 130 _Must_inspect_result_ 131 _IRQL_requires_max_(DISPATCH_LEVEL) 132 _Kernel_float_saved_ 133 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) 134 FORCEINLINE 135 NTSTATUS 136 KeSaveFloatingPointState( 137 _Out_ PKFLOATING_SAVE FloatSave) 138 { 139 UNREFERENCED_PARAMETER(FloatSave); 140 return STATUS_SUCCESS; 141 } 142 143 _Success_(1) 144 _Kernel_float_restored_ 145 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) 146 FORCEINLINE 147 NTSTATUS 148 KeRestoreFloatingPointState( 149 _In_ PKFLOATING_SAVE FloatSave) 150 { 151 UNREFERENCED_PARAMETER(FloatSave); 152 return STATUS_SUCCESS; 153 } 154 155 /* VOID 156 * KeFlushIoBuffers( 157 * IN PMDL Mdl, 158 * IN BOOLEAN ReadOperation, 159 * IN BOOLEAN DmaOperation) 160 */ 161 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) 162 163 /* x86 and x64 performs a 0x2C interrupt */ 164 #define DbgRaiseAssertionFailure __int2c 165 166 $endif /* _WDMDDK_ */ 167 $if (_NTDDK_) 168 169 #define PAUSE_PROCESSOR YieldProcessor(); 170 171 #define KERNEL_STACK_SIZE 0x6000 172 #define KERNEL_LARGE_STACK_SIZE 0x12000 173 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE 174 175 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 176 177 #define EXCEPTION_READ_FAULT 0 178 #define EXCEPTION_WRITE_FAULT 1 179 #define EXCEPTION_EXECUTE_FAULT 8 180 181 #if !defined(RC_INVOKED) 182 183 #define CONTEXT_AMD64 0x100000 184 185 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) 186 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) 187 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) 188 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) 189 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) 190 191 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) 192 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) 193 194 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x40L) 195 196 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000 197 #define CONTEXT_SERVICE_ACTIVE 0x10000000 198 #define CONTEXT_EXCEPTION_REQUEST 0x40000000 199 #define CONTEXT_EXCEPTION_REPORTING 0x80000000 200 201 #endif /* !defined(RC_INVOKED) */ 202 203 #define INITIAL_MXCSR 0x1f80 204 #define INITIAL_FPCSR 0x027f 205 206 typedef struct DECLSPEC_ALIGN(16) _CONTEXT { 207 ULONG64 P1Home; 208 ULONG64 P2Home; 209 ULONG64 P3Home; 210 ULONG64 P4Home; 211 ULONG64 P5Home; 212 ULONG64 P6Home; 213 ULONG ContextFlags; 214 ULONG MxCsr; 215 USHORT SegCs; 216 USHORT SegDs; 217 USHORT SegEs; 218 USHORT SegFs; 219 USHORT SegGs; 220 USHORT SegSs; 221 ULONG EFlags; 222 ULONG64 Dr0; 223 ULONG64 Dr1; 224 ULONG64 Dr2; 225 ULONG64 Dr3; 226 ULONG64 Dr6; 227 ULONG64 Dr7; 228 ULONG64 Rax; 229 ULONG64 Rcx; 230 ULONG64 Rdx; 231 ULONG64 Rbx; 232 ULONG64 Rsp; 233 ULONG64 Rbp; 234 ULONG64 Rsi; 235 ULONG64 Rdi; 236 ULONG64 R8; 237 ULONG64 R9; 238 ULONG64 R10; 239 ULONG64 R11; 240 ULONG64 R12; 241 ULONG64 R13; 242 ULONG64 R14; 243 ULONG64 R15; 244 ULONG64 Rip; 245 union { 246 XMM_SAVE_AREA32 FltSave; 247 struct { 248 M128A Header[2]; 249 M128A Legacy[8]; 250 M128A Xmm0; 251 M128A Xmm1; 252 M128A Xmm2; 253 M128A Xmm3; 254 M128A Xmm4; 255 M128A Xmm5; 256 M128A Xmm6; 257 M128A Xmm7; 258 M128A Xmm8; 259 M128A Xmm9; 260 M128A Xmm10; 261 M128A Xmm11; 262 M128A Xmm12; 263 M128A Xmm13; 264 M128A Xmm14; 265 M128A Xmm15; 266 } DUMMYSTRUCTNAME; 267 } DUMMYUNIONNAME; 268 M128A VectorRegister[26]; 269 ULONG64 VectorControl; 270 ULONG64 DebugControl; 271 ULONG64 LastBranchToRip; 272 ULONG64 LastBranchFromRip; 273 ULONG64 LastExceptionToRip; 274 ULONG64 LastExceptionFromRip; 275 } CONTEXT; 276 277 #define PCR_MINOR_VERSION 1 278 #define PCR_MAJOR_VERSION 1 279 280 typedef struct _KPCR 281 { 282 _ANONYMOUS_UNION union 283 { 284 NT_TIB NtTib; 285 _ANONYMOUS_STRUCT struct 286 { 287 union _KGDTENTRY64 *GdtBase; 288 struct _KTSS64 *TssBase; 289 ULONG64 UserRsp; 290 struct _KPCR *Self; 291 struct _KPRCB *CurrentPrcb; 292 PKSPIN_LOCK_QUEUE LockArray; 293 PVOID Used_Self; 294 }; 295 }; 296 union _KIDTENTRY64 *IdtBase; 297 ULONG64 Unused[2]; 298 KIRQL Irql; 299 UCHAR SecondLevelCacheAssociativity; 300 UCHAR ObsoleteNumber; 301 UCHAR Fill0; 302 ULONG Unused0[3]; 303 USHORT MajorVersion; 304 USHORT MinorVersion; 305 ULONG StallScaleFactor; 306 PVOID Unused1[3]; 307 ULONG KernelReserved[15]; 308 ULONG SecondLevelCacheSize; 309 ULONG HalReserved[16]; 310 ULONG Unused2; 311 PVOID KdVersionBlock; 312 PVOID Unused3; 313 ULONG PcrAlign1[24]; 314 } KPCR, *PKPCR; 315 316 FORCEINLINE 317 PKPCR 318 KeGetPcr(VOID) 319 { 320 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); 321 } 322 323 FORCEINLINE 324 ULONG 325 KeGetCurrentProcessorNumber(VOID) 326 { 327 return (ULONG)__readgsword(0x184); 328 } 329 330 $endif /* _NTDDK_ */ 331