ReXGlue SDK
Loading...
Searching...
No Matches
thread.h
Go to the documentation of this file.
1
15
16#pragma once
17
18#include <cstddef>
19#include <cstdint>
20
21#include <rex/assert.h>
25#include <rex/ppc/context.h>
26#include <rex/types.h>
27#include <rex/memory.h>
28
29namespace rex::kernel {
30
32enum IRQL_FLAGS : u8 {
33 kIRQLPassive = 0,
34 kIRQLAPC = 1,
38 kIRQLClock = 116,
39 kIRQLHighest = 124
40};
41
44 kDispatcherManualResetEvent = 0,
45 kDispatcherAutoResetEvent = 1,
46 kDispatcherMutant = 2,
47 kDispatcherQueue = 4,
48 kDispatcherSemaphore = 5,
49 kDispatcherThread = 6,
50 kDispatcherManualResetTimer = 8,
51 kDispatcherAutoResetTimer = 9,
52};
53
64
65constexpr u32 kXCreateSuspended = 0x00000001;
66
67constexpr u32 kXTLSOutOfIndexes = UINT32_MAX;
68
71 struct {
72 u8 type;
73
74 union {
76 u8 abandoned;
78 u8 absolute;
79 u8 npx_irql;
80 u8 signalling;
81 };
82 union {
83 u8 size;
84 u8 hand;
86 u8 process_type;
87 };
88 union {
89 u8 inserted;
90 u8 debug_active;
91 u8 dpc_active;
92 };
93 };
94
95 be_u32 signal_state;
96 be_u32 wait_list_flink;
97 be_u32 wait_list_blink;
98};
99REX_STATIC_ASSERT_SIZE(X_DISPATCH_HEADER, 0x10);
100
102 X_DISPATCH_HEADER header;
103 be_u32 limit;
104};
105REX_STATIC_ASSERT_SIZE(X_KSEMAPHORE, 0x14);
106
114REX_STATIC_ASSERT_SIZE(XKQueue, 0x28);
115
116struct X_KDPC;
117
125REX_STATIC_ASSERT_SIZE(X_KTIMER, 0x28);
126
132 be_u16 flags;
134 u8 pad_15;
135};
136static_assert(offsetof(X_OBJECT_HEADER, object_type_ptr) == 0x8);
137static_assert(offsetof(X_OBJECT_HEADER, flags) == 0xC);
138REX_STATIC_ASSERT_SIZE(X_OBJECT_HEADER, 0x10);
139
141 be_u32 constructor;
142 be_u32 destructor;
143 be_u32 unk_08;
144 be_u32 unk_0c;
145 be_u32 unk_10;
146 be_u32 unk_14;
147 be_u32 pool_tag;
148};
149REX_STATIC_ASSERT_SIZE(X_OBJECT_TYPE, 0x1C);
150
151struct X_KDPC {
152 be_u16 type;
156 be_u32 routine;
157 be_u32 context;
158 be_u32 arg1;
159 be_u32 arg2;
160
162 void Initialize(u32 guest_func, u32 guest_context) {
163 type = 19;
164 inserted_number = 0;
165 target_number = 0;
168 routine = guest_func;
169 context = guest_context;
170 arg1 = 0;
171 arg2 = 0;
172 }
173};
174static_assert(offsetof(X_KDPC, inserted_number) == 0x2);
175static_assert(offsetof(X_KDPC, target_number) == 0x3);
176REX_STATIC_ASSERT_SIZE(X_KDPC, 0x1C);
177
184REX_STATIC_ASSERT_SIZE(X_THREAD_NOTIFICATION, 0xC);
185
189struct XAPC {
191 static constexpr u32 kSize = 40;
193 static constexpr u32 kDummyKernelRoutine = 0xF00DFF00;
195 static constexpr u32 kDummyRundownRoutine = 0xF00DFF01;
196
197 u16 type;
200 be_u32 thread_ptr;
202 be_u32 kernel_routine;
203 be_u32 rundown_routine;
206 be_u32 arg1;
207 be_u32 arg2;
208};
209REX_STATIC_ASSERT_SIZE(XAPC, 40);
210
212 be_u32 fiber_data;
218 rex::be_u32 cr_save;
219 u8 reserved_14[0x08];
220 rex::be_u32 lr_save;
221 u8 reserved_20[0x10];
222 be_u64 sp_save;
224 u8 register_save_area[0xA50 - 0x38];
225};
226REX_STATIC_ASSERT_SIZE(X_FIBER_CONTEXT, 0xA50);
228 "fiber register save area too small for PPCContext non-volatiles");
229
230struct X_KTHREAD;
231struct X_KPROCESS;
232
242REX_STATIC_ASSERT_SIZE(X_KWAIT_BLOCK, 0x18);
243
245struct X_KPRCB {
246 be_ptr<X_KTHREAD> current_thread;
247 be_ptr<X_KTHREAD> next_thread;
248 be_ptr<X_KTHREAD> idle_thread;
249 u8 current_cpu;
250 u8 pad_13[3];
252 be_u32 dpc_clock;
254 be_u32 interrupt_count;
255 be_u32 ipi_frozen;
256 be_u32 ipi_args[3];
260 be_u32 request_summary;
262 be_u32 dpc_lock;
263 X_LIST_ENTRY queued_dpcs_list_head;
264 be_u32 dpc_active;
271 X_KDPC thread_exit_dpc;
272 X_LIST_ENTRY terminating_threads_list;
273 X_KDPC switch_thread_processor_dpc;
274};
275REX_STATIC_ASSERT_SIZE(X_KPRCB, 0x1A8);
276
329static_assert(offsetof(X_KPCR, prcb_data) == 0x100);
330REX_STATIC_ASSERT_SIZE(X_KPCR, 0x2D8);
331
332struct X_KTHREAD {
333 X_DISPATCH_HEADER header;
335 be_u32 unk_10;
336 be_u32 unk_14;
340 rex::be_u32 kernel_time;
341 be_u32 stack_base;
342 be_u32 stack_limit;
344 be_u32 tls_address;
347 u8 alerted[2];
355 kernel::X_TYPED_LIST<XAPC, offsetof(XAPC, list_entry)> apc_lists[2];
368 be_u32 msr_mask;
370 rex::BE<X_STATUS> wait_result;
372 u8 unk_a5[0xB];
377 be_i32 quantum;
386 u8 current_cpu;
403 be_u32 unk_118;
405 be_u32 unk_124;
406 be_u32 unk_128;
407 be_u32 unk_12c;
409 be_u64 create_time;
410 be_u64 exit_time;
411 be_u32 exit_status;
413 be_u32 thread_id;
414 be_u32 start_address;
416 u8 unk_15c[0x4];
417 be_u32 last_error;
418 be_u32 fiber_ptr;
419 u8 unk_168[0x4];
420 be_u32 creation_flags;
421 u8 unk_170[0xC];
422 be_u32 unk_17c;
423 u8 unk_180[0x930];
424};
425REX_STATIC_ASSERT_SIZE(X_KTHREAD, 0xAB0);
426
427} // namespace rex::kernel
428
429namespace rex::kernel {
430
431#pragma pack(push, 4)
432
435 be_u32 notification_routine;
436 be_u32 priority;
438};
439REX_STATIC_ASSERT_SIZE(X_EX_TITLE_TERMINATE_REGISTRATION, 16);
440
442 be_u32 code;
443 be_u32 exception_flags;
445 be_u32 exception_address;
447 be_u32 exception_information[15];
448};
449REX_STATIC_ASSERT_SIZE(X_EXCEPTION_RECORD, 0x50);
450
451#pragma pack(pop)
452
453} // namespace rex::kernel
454
455namespace rex::kernel {
456
458constexpr u32 kXProcTypeIdle = 0;
459constexpr u32 kXProcTypeUser = 1;
460constexpr u32 kXProcTypeSystem = 2;
461
464 X_LIST_ENTRY thread_list;
465 be_i32 quantum;
468 u8 unk_18;
469 u8 unk_19;
470 u8 unk_1a;
473 be_u32 tls_static_data_address;
479 be_u32 tls_slot_bitmap[8];
480 be_u32 unk_50;
482 be_u32 unk_5c;
483};
484REX_STATIC_ASSERT_SIZE(X_KPROCESS, 0x60);
485
493REX_STATIC_ASSERT_SIZE(X_UNKNOWN_TYPE_REFED, 16);
494
531
532} // namespace rex::kernel
Virtual memory flags and typed guest pointers.
Guest list and spin lock structures.
Definition export.h:24
constexpr u32 kXTLSOutOfIndexes
Definition thread.h:67
constexpr u32 kXProcTypeIdle
Definition thread.h:458
X_DISPATCHER_FLAGS
Definition thread.h:43
IRQL_FLAGS
Definition thread.h:32
@ kIRQLDispatch
Definition thread.h:35
@ kIRQLAudio
Definition thread.h:37
@ kIRQLClock
Definition thread.h:38
@ kIRQLDPC
Definition thread.h:36
X_KTHREAD_STATE_FLAGS
Definition thread.h:55
@ kKThreadStateTerminated
Definition thread.h:60
@ kKThreadStateWaiting
Definition thread.h:61
@ kKThreadStateInitialized
Definition thread.h:56
@ kKThreadStateUnknown
Definition thread.h:62
@ kKThreadStateReady
Definition thread.h:57
@ kKThreadStateStandby
Definition thread.h:59
static constexpr size_t kNonVolatileSaveSize
Definition context.h:670
Definition thread.h:496
X_KSPINLOCK tls_lock
Definition thread.h:526
X_OBJECT_TYPE ExMutantObjectType
Definition thread.h:502
X_OBJECT_TYPE IoFileObjectType
Definition thread.h:512
X_OBJECT_TYPE ExThreadObjectType
Definition thread.h:498
X_OBJECT_TYPE ObDirectoryObjectType
Definition thread.h:514
X_KPROCESS system_process
Definition thread.h:523
X_OBJECT_TYPE ExEventObjectType
Definition thread.h:500
X_KPROCESS title_process
Definition thread.h:522
X_KPROCESS idle_process
Definition thread.h:520
X_OBJECT_TYPE ObSymbolicLinkObjectType
Definition thread.h:516
X_OBJECT_TYPE IoCompletionObjectType
Definition thread.h:508
X_OBJECT_TYPE ExTimerObjectType
Definition thread.h:506
X_OBJECT_TYPE ExSemaphoreObjectType
Definition thread.h:504
X_KSPINLOCK dispatcher_lock
Definition thread.h:524
be_u32 ecc_curves[15]
Definition thread.h:529
u8 UsbdBootEnumerationDoneEvent[0x10]
Definition thread.h:527
X_OBJECT_TYPE IoDeviceObjectType
Definition thread.h:510
X_UNKNOWN_TYPE_REFED self_list_object
Definition thread.h:518
X_KSPINLOCK ob_lock
Definition thread.h:525
Definition thread.h:189
be_u32 arg1
Definition thread.h:206
static constexpr u32 kDummyRundownRoutine
Definition thread.h:195
u8 apc_mode
Definition thread.h:198
be_u32 normal_context
Definition thread.h:205
X_LIST_ENTRY list_entry
Definition thread.h:201
u8 enqueued
Definition thread.h:199
static constexpr u32 kDummyKernelRoutine
Definition thread.h:193
be_u32 arg2
Definition thread.h:207
static constexpr u32 kSize
Definition thread.h:191
be_u32 normal_routine
Definition thread.h:204
u16 type
Definition thread.h:197
Definition thread.h:107
X_LIST_ENTRY entry_list_head
Definition thread.h:109
X_LIST_ENTRY thread_list_head
Definition thread.h:112
be_u32 current_count
Definition thread.h:110
be_u32 maximum_count
Definition thread.h:111
Definition thread.h:70
be_u32 signal_state
Definition thread.h:95
Definition thread.h:441
be_u32 exception_record
Definition thread.h:444
be_u32 number_parameters
Definition thread.h:446
X_LIST_ENTRY list_entry
Definition thread.h:437
be_u32 priority
Definition thread.h:436
Definition thread.h:211
be_u32 fiber_data
Definition thread.h:212
u8 register_save_area[0xA50 - 0x38]
Definition thread.h:224
be_u32 stack_limit
Definition thread.h:217
be_u32 stack_base
Definition thread.h:215
be_u32 stack_alloc_base
Definition thread.h:213
be_u64 sp_save
Definition thread.h:222
Definition thread.h:151
X_LIST_ENTRY list_entry
Definition thread.h:155
u8 target_number
Definition thread.h:154
u8 inserted_number
Definition thread.h:153
be_u32 arg1
Definition thread.h:158
be_u32 arg2
Definition thread.h:159
be_u16 type
Definition thread.h:152
void Initialize(u32 guest_func, u32 guest_context)
Definition thread.h:162
be_u32 context
Definition thread.h:157
Definition thread.h:278
be_u32 use_alternative_stack
Definition thread.h:316
be_u32 alt_stack_base_ptr
Definition thread.h:321
u8 background_scheduling_1b
Definition thread.h:303
be_u32 timer_related
Definition thread.h:304
u8 background_scheduling_1a
Definition thread.h:302
u8 background_scheduling_active
Definition thread.h:301
be_u16 unk_0a
Definition thread.h:289
u8 timer_pending
Definition thread.h:294
be_ptr< X_KPRCB > prcb
Definition thread.h:326
be_u32 interrupt_handlers[32]
Definition thread.h:323
u8 unk_20[0x10]
Definition thread.h:305
be_u32 msr_mask
Definition thread.h:281
be_u32 stack_base_ptr
Definition thread.h:318
be_u32 alt_stack_end_ptr
Definition thread.h:322
be_u64 pcr_ptr
Definition thread.h:307
u8 timeslice_ended
Definition thread.h:293
u8 processtype_value_in_dpc
Definition thread.h:291
be_u32 unk_stack_5c
Definition thread.h:314
u8 unk_0f
Definition thread.h:295
be_u32 stack_end_ptr
Definition thread.h:319
u8 unk_2ac[0x2C]
Definition thread.h:327
be_u32 thread_vmx_related
Definition thread.h:297
u8 unk_40[28]
Definition thread.h:313
be_u32 tls_ptr
Definition thread.h:279
u8 current_irql
Definition thread.h:299
be_u32 thread_fpu_related
Definition thread.h:296
u8 unk_60[12]
Definition thread.h:315
Definition thread.h:245
be_u32 ipi_args[3]
Definition thread.h:256
be_u32 dpc_active
Definition thread.h:264
X_LIST_ENTRY dispatcher_ready_list_head[32]
Definition thread.h:270
be_u32 ready_summary_mask
Definition thread.h:269
be_u32 ipi_function
Definition thread.h:258
be_u32 dpc_clock
Definition thread.h:252
be_u32 has_ready_thread_by_priority
Definition thread.h:268
be_u32 interrupt_clock
Definition thread.h:253
be_u32 targeted_ipi_cpus_mask
Definition thread.h:257
be_u32 idle_thread_active
Definition thread.h:266
be_u32 dpc_lock
Definition thread.h:262
X_SINGLE_LIST_ENTRY enqueued_threads_list
Definition thread.h:267
X_KSPINLOCK ready_list_lock
Definition thread.h:265
be_u32 dpc_interrupt_requested
Definition thread.h:261
be_ptr< X_KPRCB > ipi_initiator_prcb
Definition thread.h:259
be_u32 processor_mask
Definition thread.h:251
Definition thread.h:462
u8 unk_1b
Definition thread.h:471
X_KSPINLOCK thread_list_spinlock
Definition thread.h:463
be_u32 unk_5c
Definition thread.h:482
be_u32 unk_50
Definition thread.h:480
u8 process_type
Definition thread.h:478
X_LIST_ENTRY unk_54
Definition thread.h:481
be_u32 tls_slot_bitmap[8]
Definition thread.h:479
u8 is_terminating
Definition thread.h:477
be_u32 thread_count
Definition thread.h:467
be_u16 tls_slot_size
Definition thread.h:476
be_u32 clrdataa_masked_ptr
Definition thread.h:466
be_u32 kernel_stack_size
Definition thread.h:472
be_u32 tls_data_size
Definition thread.h:474
be_u32 tls_raw_data_size
Definition thread.h:475
Definition thread.h:101
be_u32 limit
Definition thread.h:103
Definition list.h:42
Definition thread.h:332
XAPC on_suspend
Definition thread.h:398
be_u32 stack_limit
Definition thread.h:342
be_ptr< X_KPROCESS > process
Definition thread.h:356
X_LIST_ENTRY process_threads
Definition thread.h:401
u8 unk_ca
Definition thread.h:392
u8 boost_disabled
Definition thread.h:382
X_KTIMER wait_timeout_timer
Definition thread.h:338
u8 alerted[2]
Definition thread.h:347
u8 unk_170[0xC]
Definition thread.h:421
u8 unk_168[0x4]
Definition thread.h:419
u8 unk_ba
Definition thread.h:380
X_KSEMAPHORE suspend_sema
Definition thread.h:399
u8 unk_b9
Definition thread.h:379
X_LIST_ENTRY ready_prcb_entry
Definition thread.h:366
be_u32 last_error
Definition thread.h:417
be_u32 stack_kernel
Definition thread.h:343
be_u32 msr_mask
Definition thread.h:368
u8 process_type_dup
Definition thread.h:352
be_u32 unk_124
Definition thread.h:405
be_u32 stack_alloc_base
Definition thread.h:396
u8 suspend_count
Definition thread.h:383
be_u32 fiber_ptr
Definition thread.h:418
X_KSPINLOCK timer_list_lock
Definition thread.h:394
be_i32 quantum
Definition thread.h:377
u8 unk_b8
Definition thread.h:378
u8 thread_state
Definition thread.h:345
u8 unk_15c[0x4]
Definition thread.h:416
be_u32 unk_10
Definition thread.h:335
u8 alertable
Definition thread.h:348
be_u64 create_time
Definition thread.h:409
kernel::X_TYPED_LIST< XAPC, offsetof(XAPC, list_entry)> apc_lists[2]
Definition thread.h:355
be_u32 stack_base
Definition thread.h:341
X_LIST_ENTRY timer_list
Definition thread.h:412
u8 unk_c9
Definition thread.h:391
be_u32 unk_14
Definition thread.h:336
be_u32 unk_17c
Definition thread.h:422
u8 was_preempted
Definition thread.h:384
u8 unk_180[0x930]
Definition thread.h:423
X_KSPINLOCK apc_lock
Definition thread.h:363
rex::be_u32 kernel_time
Definition thread.h:340
X_LIST_ENTRY unk_154
Definition thread.h:415
X_KWAIT_BLOCK wait_timeout_block
Definition thread.h:339
u8 wait_irql
Definition thread.h:371
rex::BE< X_STATUS > wait_result
Definition thread.h:370
be_ptr< X_KPRCB > prcb_alias
Definition thread.h:388
be_ptr< X_KPRCB > prcb
Definition thread.h:387
be_u32 unk_118
Definition thread.h:403
be_u32 tls_address
Definition thread.h:344
u8 process_type
Definition thread.h:353
u8 executing_kernel_apc
Definition thread.h:358
u8 user_apc_pending
Definition thread.h:360
be_u32 unk_12c
Definition thread.h:407
u8 priority
Definition thread.h:350
u8 may_queue_apcs
Definition thread.h:362
u8 unk_c8
Definition thread.h:390
be_u32 num_context_switches_to
Definition thread.h:365
u8 unk_a5[0xB]
Definition thread.h:372
u8 deferred_apc_software_interrupt_state
Definition thread.h:359
i32 apc_disable_count
Definition thread.h:375
u8 fpu_exceptions_on
Definition thread.h:351
X_LIST_ENTRY queue_related
Definition thread.h:404
u8 terminated
Definition thread.h:385
be_u32 unk_128
Definition thread.h:406
u8 unk_cb
Definition thread.h:393
Definition thread.h:118
be_u64 due_time
Definition thread.h:120
X_LIST_ENTRY table_bucket_entry
Definition thread.h:121
be_ptr< X_KDPC > dpc
Definition thread.h:122
be_u32 period
Definition thread.h:123
Definition thread.h:234
be_u16 wait_result_xstatus
Definition thread.h:239
be_u16 wait_type
Definition thread.h:240
be_ptr< X_KWAIT_BLOCK > next_wait_block
Definition thread.h:238
be_ptr< X_DISPATCH_HEADER > object
Definition thread.h:237
X_LIST_ENTRY wait_list_entry
Definition thread.h:235
Definition list.h:24
be_u32 flink_ptr
Definition list.h:25
be_u32 blink_ptr
Definition list.h:26
Definition thread.h:128
be_u32 pointer_count
Definition thread.h:129
be_u32 object_type_ptr
Definition thread.h:131
be_u32 handle_count
Definition thread.h:130
u8 hash_index
Definition thread.h:133
be_u16 flags
Definition thread.h:132
Definition thread.h:140
be_u32 pool_tag
Definition thread.h:147
Definition list.h:30
Definition thread.h:178
be_u32 notify_routine
Definition thread.h:182
X_LIST_ENTRY list_entry
Definition thread.h:180
Definition list.h:197
Definition thread.h:487
be_u32 points_to_self
Definition thread.h:490
be_u32 unk_04
Definition thread.h:489
be_u32 points_to_prior
Definition thread.h:491
be_u32 unk_00
Definition thread.h:488
Definition memory.h:75
Integer types, byte order wrappers and size literals.