HyperDbg Debugger
Loading...
Searching...
No Matches
PlatformIntrinsics.h
Go to the documentation of this file.
1
12#pragma once
13
14#if defined(__linux__)
16#endif // defined(__linux__)
17
19// CR Registers //
21
22//
23// READCR0
24//
25extern inline ULONG_PTR
26 CpuReadCr0(VOID);
27
28//
29// WRITECR0
30//
31extern inline VOID
32CpuWriteCr0(ULONG_PTR Cr0Value);
33
34//
35// READCR2
36//
37extern inline ULONG_PTR
38 CpuReadCr2(VOID);
39
40//
41// WRITECR2
42//
43extern inline VOID
44CpuWriteCr2(ULONG_PTR Cr2Value);
45
46//
47// READCR3
48//
49extern inline ULONG_PTR
50 CpuReadCr3(VOID);
51
52//
53// WRITECR3
54//
55extern inline VOID
56CpuWriteCr3(ULONG_PTR Cr3Value);
57
58//
59// READCR4
60//
61extern inline ULONG_PTR
62 CpuReadCr4(VOID);
63
64//
65// WRITECR4
66//
67extern inline VOID
68CpuWriteCr4(ULONG_PTR Cr4Value);
69
70//
71// READCR8
72//
73extern inline ULONG_PTR
74 CpuReadCr8(VOID);
75
76//
77// WRITECR8
78//
79extern inline VOID
80CpuWriteCr8(ULONG_PTR Cr8Value);
81
83// MSR Instructions //
85
86//
87// RDMSR
88//
89extern inline UINT64
90CpuReadMsr(ULONG MsrAddress);
91
92//
93// WRMSR
94//
95extern inline VOID
96CpuWriteMsr(ULONG MsrAddress, UINT64 MsrValue);
97
99// Debug Register Instructions //
101
102//
103// MOV DR (read)
104//
105#if defined(_WIN32) || defined(_WIN64)
106# define CpuReadDr(DrNumber) __readdr(DrNumber)
107#elif defined(__linux__)
108# define CpuReadDr(DrNumber) \
109 ({ \
110 ULONG_PTR __val; \
111 switch (DrNumber) \
112 { \
113 case 0: \
114 __asm__ volatile("mov %%dr0, %0" : "=r"(__val)); \
115 break; \
116 case 1: \
117 __asm__ volatile("mov %%dr1, %0" : "=r"(__val)); \
118 break; \
119 case 2: \
120 __asm__ volatile("mov %%dr2, %0" : "=r"(__val)); \
121 break; \
122 case 3: \
123 __asm__ volatile("mov %%dr3, %0" : "=r"(__val)); \
124 break; \
125 case 6: \
126 __asm__ volatile("mov %%dr6, %0" : "=r"(__val)); \
127 break; \
128 case 7: \
129 __asm__ volatile("mov %%dr7, %0" : "=r"(__val)); \
130 break; \
131 default: \
132 __val = 0; \
133 break; \
134 } \
135 __val; \
136 })
137#else
138# error "Unsupported platform"
139#endif
140
141//
142// MOV DR (write)
143//
144#if defined(_WIN32) || defined(_WIN64)
145# define CpuWriteDr(DrNumber, DrValue) __writedr(DrNumber, DrValue)
146#elif defined(__linux__)
147# define CpuWriteDr(DrNumber, DrValue) \
148 do \
149 { \
150 switch (DrNumber) \
151 { \
152 case 0: \
153 __asm__ volatile("mov %0, %%dr0" : : "r"((ULONG_PTR)(DrValue))); \
154 break; \
155 case 1: \
156 __asm__ volatile("mov %0, %%dr1" : : "r"((ULONG_PTR)(DrValue))); \
157 break; \
158 case 2: \
159 __asm__ volatile("mov %0, %%dr2" : : "r"((ULONG_PTR)(DrValue))); \
160 break; \
161 case 3: \
162 __asm__ volatile("mov %0, %%dr3" : : "r"((ULONG_PTR)(DrValue))); \
163 break; \
164 case 6: \
165 __asm__ volatile("mov %0, %%dr6" : : "r"((ULONG_PTR)(DrValue))); \
166 break; \
167 case 7: \
168 __asm__ volatile("mov %0, %%dr7" : : "r"((ULONG_PTR)(DrValue))); \
169 break; \
170 default: \
171 break; \
172 } \
173 } while (0)
174#else
175# error "Unsupported platform"
176#endif
177
179// CPUID Instructions //
181
182//
183// CPUID
184//
185extern inline VOID
186CpuCpuId(INT32 * CpuInfo, INT32 FunctionId);
187
188//
189// CPUID (with sub-leaf)
190//
191extern inline VOID
192CpuCpuIdEx(INT32 * CpuInfo, INT32 FunctionId, INT32 SubFunctionId);
193
195// TSC Instructions //
197
198//
199// RDTSC
200//
201extern inline UINT64
202 CpuReadTsc(VOID);
203
204//
205// RDTSCP
206//
207extern inline UINT64
208CpuReadTscp(UINT32 * Aux);
209
211// Interlocked (Atomic) Operations //
213
214extern inline INT64
215CpuInterlockedExchange64(INT64 volatile * Target, INT64 Value);
216
217extern inline INT64
218CpuInterlockedExchangeAdd64(INT64 volatile * Addend, INT64 Value);
219
220extern inline INT64
221CpuInterlockedIncrement64(INT64 volatile * Addend);
222
223extern inline INT64
224CpuInterlockedDecrement64(INT64 volatile * Addend);
225
226extern inline INT64
227CpuInterlockedCompareExchange64(INT64 volatile * Destination, INT64 ExChange, INT64 Comparand);
228
230// Descriptor Table Instructions //
232
233//
234// SIDT
235//
236extern inline VOID
237CpuSidt(VOID * Idtr);
238
240// TLB Instructions //
242
243//
244// INVLPG
245//
246extern inline VOID
247CpuInvlpg(VOID * Address);
248
250// String Store Instructions //
252
253//
254// STOSQ
255//
256extern inline VOID
257CpuStosQ(UINT64 * Destination, UINT64 Value, SIZE_T Count);
258
260// Bit Scan Instructions //
262
263//
264// BSF 64
265//
266extern inline UCHAR
267CpuBitScanForward64(ULONG * Index, UINT64 Mask);
268
270// Misc Instructions //
272
273//
274// NOP
275//
276extern inline VOID
277 CpuNop(VOID);
278
279//
280// PAUSE
281//
282extern inline VOID
283 CpuPause(VOID);
284
285//
286// Segment Limit
287//
288extern inline ULONG
290
292// I/O Port Instructions //
294
295//
296// IN Byte
297//
298extern inline UINT8
299CpuIoInByte(UINT16 Port);
300
301//
302// IN Word
303//
304extern inline UINT16
305CpuIoInWord(UINT16 Port);
306
307//
308// IN Dword
309//
310extern inline UINT32
311CpuIoInDword(UINT16 Port);
312
313//
314// IN Byte String
315//
316extern inline VOID
318
319//
320// IN Word String
321//
322extern inline VOID
324
325//
326// IN Dword String
327//
328extern inline VOID
330
331//
332// OUT Byte
333//
334extern inline VOID
336
337//
338// OUT Word
339//
340extern inline VOID
342
343//
344// OUT Dword
345//
346extern inline VOID
348
349//
350// OUT Byte String
351//
352extern inline VOID
354
355//
356// OUT Word String
357//
358extern inline VOID
360
361//
362// OUT Dword String
363//
364extern inline VOID
VOID CpuWriteCr2(ULONG_PTR Cr2Value)
Write CR2.
Definition PlatformIntrinsics.c:83
UINT8 CpuIoInByte(UINT16 Port)
Read a byte from an I/O port.
Definition PlatformIntrinsics.c:573
UINT64 CpuReadTsc(VOID)
Read Time-Stamp Counter.
Definition PlatformIntrinsics.c:295
UCHAR CpuBitScanForward64(ULONG *Index, UINT64 Mask)
Bit scan forward (64-bit).
Definition PlatformIntrinsics.c:486
VOID CpuPause(VOID)
Execute PAUSE (spin-wait hint).
Definition PlatformIntrinsics.c:523
INT64 CpuInterlockedCompareExchange64(INT64 volatile *Destination, INT64 ExChange, INT64 Comparand)
Atomic 64-bit compare-exchange.
Definition PlatformIntrinsics.c:396
VOID CpuCpuIdEx(INT32 *CpuInfo, INT32 FunctionId, INT32 SubFunctionId)
Execute CPUID with sub-leaf.
Definition PlatformIntrinsics.c:274
ULONG_PTR CpuReadCr3(VOID)
Read CR3.
Definition PlatformIntrinsics.c:100
VOID CpuIoOutByte(UINT16 Port, UINT8 Value)
Write a byte to an I/O port.
Definition PlatformIntrinsics.c:690
INT64 CpuInterlockedDecrement64(INT64 volatile *Addend)
Atomic 64-bit decrement.
Definition PlatformIntrinsics.c:381
INT64 CpuInterlockedExchangeAdd64(INT64 volatile *Addend, INT64 Value)
Atomic 64-bit exchange-add.
Definition PlatformIntrinsics.c:351
VOID CpuWriteCr4(ULONG_PTR Cr4Value)
Write CR4.
Definition PlatformIntrinsics.c:155
ULONG_PTR CpuReadCr4(VOID)
Read CR4.
Definition PlatformIntrinsics.c:136
VOID CpuInvlpg(VOID *Address)
Invalidate TLB entry for a virtual address.
Definition PlatformIntrinsics.c:440
INT64 CpuInterlockedIncrement64(INT64 volatile *Addend)
Atomic 64-bit increment.
Definition PlatformIntrinsics.c:366
ULONG_PTR CpuReadCr0(VOID)
Read CR0.
Definition PlatformIntrinsics.c:28
VOID CpuWriteCr0(ULONG_PTR Cr0Value)
Write CR0.
Definition PlatformIntrinsics.c:47
VOID CpuIoOutByteString(UINT16 Port, UINT8 *Data, UINT32 Count)
Write a byte string to an I/O port.
Definition PlatformIntrinsics.c:745
VOID CpuCpuId(INT32 *CpuInfo, INT32 FunctionId)
Execute CPUID.
Definition PlatformIntrinsics.c:255
VOID CpuIoInWordString(UINT16 Port, UINT16 *Data, UINT32 Size)
Read a word string from an I/O port.
Definition PlatformIntrinsics.c:653
VOID CpuIoOutWord(UINT16 Port, UINT16 Value)
Write a word to an I/O port.
Definition PlatformIntrinsics.c:708
UINT16 CpuIoInWord(UINT16 Port)
Read a word from an I/O port.
Definition PlatformIntrinsics.c:593
VOID CpuWriteMsr(ULONG MsrAddress, UINT64 MsrValue)
Write an MSR.
Definition PlatformIntrinsics.c:233
UINT64 CpuReadTscp(UINT32 *Aux)
Read Time-Stamp Counter and Processor ID.
Definition PlatformIntrinsics.c:315
INT64 CpuInterlockedExchange64(INT64 volatile *Target, INT64 Value)
Atomic 64-bit exchange.
Definition PlatformIntrinsics.c:336
ULONG_PTR CpuReadCr8(VOID)
Read CR8.
Definition PlatformIntrinsics.c:172
VOID CpuWriteCr8(ULONG_PTR Cr8Value)
Write CR8.
Definition PlatformIntrinsics.c:191
UINT32 CpuIoInDword(UINT16 Port)
Read a dword from an I/O port.
Definition PlatformIntrinsics.c:613
VOID CpuIoOutDword(UINT16 Port, UINT32 Value)
Write a dword to an I/O port.
Definition PlatformIntrinsics.c:726
VOID CpuStosQ(UINT64 *Destination, UINT64 Value, SIZE_T Count)
Store UINT64 value to memory Count times.
Definition PlatformIntrinsics.c:463
ULONG_PTR CpuReadCr2(VOID)
Read CR2.
Definition PlatformIntrinsics.c:64
VOID CpuNop(VOID)
Execute NOP.
Definition PlatformIntrinsics.c:508
VOID CpuIoInDwordString(UINT16 Port, UINT32 *Data, UINT32 Size)
Read a dword string from an I/O port.
Definition PlatformIntrinsics.c:672
VOID CpuIoInByteString(UINT16 Port, UINT8 *Data, UINT32 Size)
Read a byte string from an I/O port.
Definition PlatformIntrinsics.c:634
VOID CpuWriteCr3(ULONG_PTR Cr3Value)
Write CR3.
Definition PlatformIntrinsics.c:119
UINT64 CpuReadMsr(ULONG MsrAddress)
Read an MSR.
Definition PlatformIntrinsics.c:213
VOID CpuSidt(VOID *Idtr)
Store Interrupt Descriptor Table Register.
Definition PlatformIntrinsics.c:419
VOID CpuIoOutWordString(UINT16 Port, UINT16 *Data, UINT32 Count)
Write a word string to an I/O port.
Definition PlatformIntrinsics.c:764
ULONG CpuSegmentLimit(UINT32 Selector)
Return the segment limit for a selector.
Definition PlatformIntrinsics.c:541
VOID CpuIoOutDwordString(UINT16 Port, UINT32 *Data, UINT32 Count)
Write a dword string to an I/O port.
Definition PlatformIntrinsics.c:783
_In_ UINT16 Selector
Definition Segmentation.h:50
unsigned short UINT16
Definition BasicTypes.h:53
signed int INT32
Definition BasicTypes.h:50
unsigned char UCHAR
Definition BasicTypes.h:34
unsigned char UINT8
Definition BasicTypes.h:52
unsigned int UINT32
Definition BasicTypes.h:54
unsigned long ULONG
Definition BasicTypes.h:31
RequestedActionOfThePacket Value(0x1) 00000000
Start of Optional Data
Definition script_buffer.hex.txt:8