Line 1:
Line 1:
= KAutoObject =
= KAutoObject =
Size: 0x10
Size: 0x10
+
+
[5.0.0] Size: 0x20
+
+
[6.0.0] Size: 0x30
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 8:
Line 12:
| 0 || * || Vtable
| 0 || * || Vtable
|-
|-
−
| 8 || u64 || ReferenceCount
+
| 8 || u32 || ReferenceCount
+
|}
+
+
[5.0.0]:
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || * || Vtable
+
|-
+
| 8 || u32 || ReferenceCount
+
|-
+
| 0x10 || KLinkedListNode || Intrusive list, links to other instances of the same class (managed by a KObjectAllocator).
+
|}
+
+
[6.0.0]:
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || * || Vtable
+
|-
+
| 8 || u32 || ReferenceCount
+
|-
+
| 0x10 || [[#KRedBlackTreeNode]] || Intrusive red-black tree node, replaces the Intrusive list node from previous versions.
|}
|}
= KSynchronizationObject =
= KSynchronizationObject =
Size: 0x28
Size: 0x28
+
+
[5.0.0] Size: 0x38
+
+
[6.0.0] Size: 0x48
Inherits from: [[#KAutoObject]]
Inherits from: [[#KAutoObject]]
Line 22:
Line 54:
| 0 || [[#KAutoObject]] || Inheritance
| 0 || [[#KAutoObject]] || Inheritance
|-
|-
−
| 0x10 || u64 || ThreadSyncNum
+
| 0x10 || [[#KLinkedList]] || ThreadSyncList
+
|}
+
+
= KMutex =
+
Size: 0x8
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
|-
|-
−
| 0x18 || [[#KLinkedListNode]] || ThreadSyncList
+
| 0 || u64 || OwnerTag
|}
|}
= KRecursiveLock =
= KRecursiveLock =
−
Size: 0x8
+
Size: 0x18
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 34:
Line 74:
! Offset || Type || Description
! Offset || Type || Description
|-
|-
−
| 0 || u64 || OwnerTag
+
| 0 || [[#KThread]] * || Owner
+
|-
+
| 8 || s32 || Count
|}
|}
+
= KLockedList =
= KLockedList =
Size: 0x28
Size: 0x28
+
+
[5.0.0]? Size: 0x20
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 48:
Line 93:
| 8 || [[#KLinkedListNode]] || List
| 8 || [[#KLinkedListNode]] || List
|-
|-
−
| 0x18 || [[#KRecursiveLock]] || Mutex
+
| 0x18 || [[#KMutex]] || Mutex
|-
|-
| 0x20 || u64 || MaxCount
| 0x20 || u64 || MaxCount
+
|}
+
+
[5.0.0]?:
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLinkedListNode]] || List
+
|-
+
| 0x10 || [[#KMutex]] || Mutex
+
|-
+
| 0x18 || u64 || MaxCount
|}
|}
Line 63:
Line 121:
|-
|-
| 8 || [[#KLinkedListNode]]* || Next
| 8 || [[#KLinkedListNode]]* || Next
+
|}
+
+
= KLinkedListEntry =
+
Size: 0x10 + <code>sizeof(T)</code>
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLinkedListNode]] || NodeFor__List
+
|-
+
| 0x10 || T || Data
+
|}
+
+
= KLinkedList =
+
Size: 0x18
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || u64 || Count
+
|-
+
| 8 || [[#KLinkedListNode]] || Bounds (first, last)
+
|}
+
+
= KRedBlackTreeNode =
+
Size: 0x20
+
+
Note: This is BSD sys/tree.h's RB_ENTRY(...).
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || KRedBlackTreeNode* || Left Child
+
|-
+
| 8 || KRedBlackTreeNode* || Right Child
+
|-
+
| 0x10 || KRedBlackTreeNode* || Parent
+
|-
+
| 0x18 || int || Color
+
|}
+
+
= KRedBlackTree =
+
Size: 0x8
+
+
Note: This is BSD sys/tree.h's RB_HEAD(..., KRedBlackTreeNode);
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || KRedBlackTreeNode* || Root
+
|-
+
|}
+
+
= KThread =
+
[1.0.0] Size: 0x620
+
[5.0.0]? Size: 0x6C0
+
+
Inherits from: [[#KSynchronizationObject]], [[#KSchedulerObject0]], [[#KSchedulerObject1]], [[#KSchedulerObject2]]
+
+
<div style="display: inline-block">
+
{| class="wikitable" border="1"
+
|-
+
! 1.0.0 Offset || Type || Description
+
|-
+
| 0 || [[#KSynchronizationObject]] || Inheritance
+
|-
+
| 0x28 || KSchedulerObject0 || Inheritance
+
|-
+
| 0x48 || KSchedulerObject1 || Inheritance
+
|-
+
| 0x58 || KSchedulerObject2 || Inheritance
+
|-
+
| 0x70 || KThreadContext || Context
+
|-
+
| 0x2F0 || u64 || CoreMask
+
|-
+
| 0x2F8 || u64 || CoreMaskOverride
+
|-
+
| 0x300 || u64 || ThreadId
+
|-
+
| 0x308 || u64 || TotalTimeRunning
+
|-
+
| 0x310 || [[#KSynchronizationObject]]* || SignalledObjectPtr
+
|-
+
| 0x318 || u64 ||
+
|-
+
| 0x320 || u64 || CondVar_CondVarUserAddr
+
|-
+
| 0x328 || u64 || Entrypoint
+
|-
+
| 0x330 || u64 || CondVar_MutexUserAddr
+
|-
+
| 0x338 || [[#KProcess]]* || ProcessPtr
+
|-
+
| 0x340 || void* || KernelThreadStack
+
|-
+
| 0x348 || u64 ||
+
|-
+
| 0x350 || void* || TlsKernelPtr
+
|-
+
| 0x358 || void* || TlsPhysicalPtr
+
|-
+
| 0x360 || [[#KSynchronizationObject]]*[0x40] || SyncObjects
+
|-
+
| 0x560 || [[#KThread]]* || CondVar_NextThreadPtr
+
|-
+
| 0x568 || [[#KThread]]* || CondVar_PrevThreadPtr
+
|-
+
| 0x570 || [[#KSynchronizationObject]]* || SignalledObjectPtr?
+
|-
+
| 0x578 || KLinkedListNode ||
+
|-
+
| 0x588 || KLinkedListNode ||
+
|-
+
| 0x598 || KLinkedListNode || NodeFor__ThreadList
+
|-
+
| 0x5A8 || KLinkedListNode || NodeFor__ThreadsOnSameCore
+
|-
+
| 0x5B8 || [[#KThread]]* ||
+
|-
+
| 0x5C0 || [[#KThread]]* || CondVar_SelfPtr
+
|-
+
| 0x5C8 || u64 ||
+
|-
+
| 0x5D0 || u64 ||
+
|-
+
| 0x5D8 || u64 ||
+
|-
+
| 0x5E0 || u32 || CondVar_WaitThreadHandle
+
|-
+
| 0x5E4 || u32 || SchedulingFlags_Default
+
|-
+
| 0x5E8 || u32 || WaitSync_RetVal
+
|-
+
| 0x5EC || u32 ||
+
|-
+
| 0x5F0 || u32 || ActualPriority
+
|-
+
| 0x5F4 || u32 ||
+
|-
+
| 0x5F8 || u32 ||
+
|-
+
| 0x5FC || u32 ||
+
|-
+
| 0x600 || u32 || WantedPriority
+
|-
+
| 0x604 || u32 || CpuCore
+
|-
+
| 0x608 || u8 || State
+
|-
+
| 0x609 || u8 || ShallBeTerminated
+
|-
+
| 0x60A || u8 ||
+
|-
+
| 0x60B || u8 ||
+
|-
+
| 0x60C || u8 ||
+
|-
+
| 0x60D || u8 ||
+
|-
+
| 0x60E || u8 || HasExited
+
|-
+
| 0x60F || u8 || HasCpuCoreOverride
+
|-
+
| ... || ... || ...
|}
|}
Line 69:
Line 296:
[2.0.0] Size: 0x2480
[2.0.0] Size: 0x2480
+
+
[3.0.0] Size: 0x2580
+
+
[5.0.0] Size: 0x4600
Inherits from: [[#KSynchronizationObject]]
Inherits from: [[#KSynchronizationObject]]
Line 79:
Line 310:
| 0 || [[#KSynchronizationObject]] || Inheritance
| 0 || [[#KSynchronizationObject]] || Inheritance
|-
|-
−
| 0x28 || ||
+
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.
|-
|-
| 0x38 || [[#KMemoryManager]] || MemoryManager
| 0x38 || [[#KMemoryManager]] || MemoryManager
Line 85:
Line 316:
| 0xF0 || u64 || TotalMemUsage
| 0xF0 || u64 || TotalMemUsage
|-
|-
−
| 0xF8 || u64 || TlsPagesListCount
+
| 0xF8 || [[#KLinkedList]]<[[#KTlsPageManager]]*>> || TlsPagesList
−
|-
−
| 0x100 || [[#KLinkedListNode]] || TlsPagesList
|-
|-
| 0x110 || s32 || DefaultCpuCore
| 0x110 || s32 || DefaultCpuCore
|-
|-
−
| 0x118 || KDebug* || Debug
+
| 0x118 || [[#KDebug]]* || Debug
|-
|-
| 0x120 || [[#KResourceLimit]]* || ResourceLimit
| 0x120 || [[#KResourceLimit]]* || ResourceLimit
Line 97:
Line 326:
| 0x128 || u32 || State
| 0x128 || u32 || State
|-
|-
−
| 0x130 || [[#KRecursiveLock]] || ProcessMutex
+
| 0x130 || [[#KMutex]] || ProcessMutex
|-
|-
−
| 0x138 || [[#KRecursiveLock]] || ThreadingMutex
+
| 0x138 || [[#KMutex]] || ThreadingMutex
|-
|-
−
| 0x140 || [[#KLinkedListNode]]<[[#KThread]]> || ThreadArbiterList
+
| 0x140 || [[#KLinkedListNode]]<[[#KThread]] *> || ThreadArbiterList
|-
|-
| 0x150 || KLinkedListNode ||
| 0x150 || KLinkedListNode ||
Line 113:
Line 342:
| 0x182 || u8 || IsSystem
| 0x182 || u8 || IsSystem
|-
|-
−
| 0x183 || u8[12] || From_CreateProcessInfo_0
+
| 0x183 || u8[12+1] || ProcessName
−
|-
−
| 0x18F || u8 || InitiallyZero
|-
|-
| 0x190 || u16 || NumberOfCreatedThreads
| 0x190 || u16 || NumberOfCreatedThreads
Line 139:
Line 366:
| 0x278 || u64 || MaxTotalMemUsage
| 0x278 || u64 || MaxTotalMemUsage
|-
|-
−
| 0x280 || u32 || From_CreateProcessInfo_0xC
+
| 0x280 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)
|-
|-
| 0x288 || [[#KProcessHandleTable]] || HandleTable
| 0x288 || [[#KProcessHandleTable]] || HandleTable
Line 145:
Line 372:
| 0x528 || void* || UsermodeExceptionTlsArea
| 0x528 || void* || UsermodeExceptionTlsArea
|-
|-
−
| 0x530 || [[#KLinkedListNode]]<[[#KThread]]> || ExceptionThreadList
+
| 0x530 || [[#KLinkedListNode]]<[[#KThread]] *> || ExceptionThreadList
|-
|-
| 0x540 || [[#KThread]]* || ExceptionThread
| 0x540 || [[#KThread]]* || ExceptionThread
|-
|-
−
| 0x548 || [[#KLinkedListNode]]<[[#KThread]]> || ThreadList
+
| 0x548 || [[#KLinkedListNode]]<[[#KThread]] *> || ThreadList
+
|-
+
| 0x558 || bool || HasStarted
+
|-
+
| 0x55C || u32 || UnusedZero
|-
|-
−
| 0x558 || u32 ||
+
| 0x560 || u64[2] || UnusedZeroes
|-
|-
−
| 0x55C || u32 || HasStarted
+
| 0x570 || u64 || TotalTimeRunning
|-
|-
−
| 0x560 || u64[8] ||
+
| 0x578 || u64[5] || UnusedZeroes
|-
|-
−
| 0x5A0 || u64 ||
+
| 0x5A0 || u64 || UnusedZero
|-
|-
−
| 0x5A8 || u64 ||
+
| 0x5A8 || u64 || UnusedZero
|}
|}
</div>
</div>
Line 170:
Line 401:
| 0 || [[#KSynchronizationObject]] || Inheritance
| 0 || [[#KSynchronizationObject]] || Inheritance
|-
|-
−
| 0x28 || ||
+
| 0x28 || KProcessTerminationMessage || Sent to mailbox 0 when self-terminating.
|-
|-
| 0x38 || [[#KMemoryManager]] || MemoryManager
| 0x38 || [[#KMemoryManager]] || MemoryManager
Line 176:
Line 407:
| 0x100 || u64 || TotalMemUsage
| 0x100 || u64 || TotalMemUsage
|-
|-
−
| 0x108 || u64 || TlsPagesListCount
+
| 0x108 || [[#KLinkedList]]<[[#KTlsPageManager]]*> || TlsPagesList
−
|-
−
| 0x110 || [[#KLinkedListNode]] || TlsPagesList
|-
|-
| 0x120 || s32 || DefaultCpuCore
| 0x120 || s32 || DefaultCpuCore
|-
|-
−
| 0x128 || KDebug* || Debug
+
| 0x128 || [[#KDebug]]* || Debug
|-
|-
| 0x130 || [[#KResourceLimit]]* || ResourceLimit
| 0x130 || [[#KResourceLimit]]* || ResourceLimit
Line 188:
Line 417:
| 0x138 || u32 || State
| 0x138 || u32 || State
|-
|-
−
| 0x140 || [[#KRecursiveLock]] || ProcessMutex
+
| 0x140 || [[#KMutex]] || ProcessMutex
|-
|-
−
| 0x148 || [[#KRecursiveLock]] || ThreadingMutex
+
| 0x148 || [[#KMutex]] || ThreadingMutex
|-
|-
−
| 0x150 || [[#KLinkedListNode]]<[[#KThread]]> || ThreadArbiterList
+
| 0x150 || [[#KLinkedListNode]]<[[#KThread]] *> || ThreadArbiterList
|-
|-
| 0x160 || KLinkedListNode ||
| 0x160 || KLinkedListNode ||
Line 204:
Line 433:
| 0x192 || u8 || IsSystem
| 0x192 || u8 || IsSystem
|-
|-
−
| 0x193 || u8[12] || From_CreateProcessInfo_0
+
| 0x193 || u8[12+1] || ProcessName
−
|-
−
| 0x19F || u8 || InitiallyZero
|-
|-
| 0x1A0 || u16 || NumberOfCreatedThreads
| 0x1A0 || u16 || NumberOfCreatedThreads
Line 230:
Line 457:
| 0x288 || u64 || MaxTotalMemUsage
| 0x288 || u64 || MaxTotalMemUsage
|-
|-
−
| 0x290 || u32 || From_CreateProcessInfo_0xC
+
| 0x290 || u32 || ProcessCategory (0: regular title, 1: kernel built-in)
|-
|-
−
|
+
| 0x298 || u64[5] || Unused [?]
|-
|-
| 0x2C0 || [[#KProcessHandleTable]] || HandleTable
| 0x2C0 || [[#KProcessHandleTable]] || HandleTable
Line 238:
Line 465:
| 0x2380 || void* || UsermodeExceptionTlsArea
| 0x2380 || void* || UsermodeExceptionTlsArea
|-
|-
−
| 0x2388 || [[#KLinkedListNode]]<[[#KThread]]> || ExceptionThreadList
+
| 0x2388 || [[#KLinkedListNode]]<[[#KThread]] *> || ExceptionThreadList
|-
|-
| 0x2398 || [[#KThread]]* || ExceptionThread
| 0x2398 || [[#KThread]]* || ExceptionThread
|-
|-
−
| 0x23A0 || [[#KLinkedListNode]]<[[#KThread]]> || ThreadList
+
| 0x23A0 || [[#KLinkedListNode]]<[[#KThread]] *> || ThreadList
+
|-
+
| 0x23B0 || [[#KLinkedListNode]]<[[#KSharedMemoryRef]] *> || MappedSharedMemoriesList
+
|-
+
| 0x23C0 || bool || HasStarted
+
|-
+
| 0x23C1 || bool || HasException
+
|-
+
| 0x23C4 || u32 || ExceptionEnum0
+
|-
+
| 0x23C8 || u64 || ExceptionEnum1
+
|-
+
| 0x23D0 || u64 || ExceptionThreadUnkInfo0
+
|-
+
| 0x23D8 || u64 || BreakArg0
+
|-
+
| 0x23E0 || u64 || BreakArg1
+
|-
+
| 0x23E8 || u64 || BreakArg2
+
|-
+
| 0x23F0 || u64 || ExceptionThreadUnkInfo1
+
|-
+
| 0x23F8 || u32 || UnusedZero
+
|-
+
| 0x2400 || u64[8] || UnusedZeroes
+
|-
+
| 0x2440 || u64 || UnusedZero
+
|-
+
| 0x2448 || u64 || UnusedZero
+
|-
+
| 0x2450 || u64[6] || Unused [?]
|}
|}
</div>
</div>
+
+
== KTlsPageManager ==
+
Size: 0x20
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset
+
! Type
+
! Description
+
|-
+
| 0 || void* || TlsPagePtr
+
|-
+
| 8 || [[#KProcess*]] || ProcessPtr
+
|-
+
| 0x10 || u32 || UsageCount
+
|-
+
| 0x14 || u8[8] || IsSlotFree
+
|}
== KProcessCapabilities ==
== KProcessCapabilities ==
Line 327:
Line 602:
[2.0.0] Size: 8
[2.0.0] Size: 8
+
+
[5.0.0] Size: 0x10
<div style="display: inline-block">
<div style="display: inline-block">
Line 351:
Line 628:
|-
|-
| 4 || u32 || ObjectCompressedPtr
| 4 || u32 || ObjectCompressedPtr
+
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 5.0.0 Offset || Type || Description
+
|-
+
| 0 || u16 || HandleId
+
|-
+
| 2 || u16 || ObjectType
+
|-
+
| 8 || [[#KAutoObject]]* || object
|}
|}
</div>
</div>
Line 378:
Line 668:
|}
|}
</div>
</div>
+
+
== KSharedMemoryRef ==
+
[2.0.0] Size: 0x40
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLinkedListNode]]<[[#KSharedMemoryRef]] *> || NodeFor__MappedSharedMemoriesList
+
|-
+
| 0x10 || [[#KSharedMemory*]] || SharedMem
+
|-
+
| 0x18 || u64 || InitiallyZero
+
|}
= KMemoryManager =
= KMemoryManager =
Line 383:
Line 687:
[2.0.0] Size: 0xC8
[2.0.0] Size: 0xC8
+
+
[5.0.0] Size: 0xF8?
<div style="display: inline-block">
<div style="display: inline-block">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! 1.0.0 Offset
! Type
! Type
! Description
! Description
Line 409:
Line 715:
| 0x40 || u64 || HeapMaxAllocation
| 0x40 || u64 || HeapMaxAllocation
|-
|-
−
| 0x48 || [[#KRecursiveLock]] || Mutex
+
| 0x48 || [[#KMutex]] || Mutex
|-
|-
| 0x50 || [[#KPageTable]] || PageTable
| 0x50 || [[#KPageTable]] || PageTable
Line 446:
Line 752:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! 2.0.0 Offset
! Type
! Type
! Description
! Description
Line 462:
Line 768:
| 0x28 || u64 || HeapCurAddr
| 0x28 || u64 || HeapCurAddr
|-
|-
−
| 0x30 || u64 || NewUnknownRegionBaseAddr
+
| 0x30 || u64 || MapRegionBaseAddr
|-
|-
−
| 0x38 || u64 || NewUnknownRegionEndAddr
+
| 0x38 || u64 || MapRegionEndAddr
|-
|-
−
| 0x40 || u64 || MapRegionBaseAddr
+
| 0x40 || u64 || NewMapRegionBaseAddr
|-
|-
−
| 0x48 || u64 || MapRegionEndAddr
+
| 0x48 || u64 || NewMapRegionEndAddr
|-
|-
−
| 0x50 || u64 ||
+
| 0x50 || u64 || TlsIoRegionBaseAddr
|-
|-
−
| 0x58 || u64 ||
+
| 0x58 || u64 || TlsIoRegionEndAddr
|-
|-
| 0x60 || u64 || HeapMaxAllocation
| 0x60 || u64 || HeapMaxAllocation
|-
|-
−
| 0x68 || [[#KRecursiveLock]] || Mutex
+
| 0x68 || [[#KMutex]] || Mutex
|-
|-
| 0x70 || [[#KPageTable]] || PageTable
| 0x70 || [[#KPageTable]] || PageTable
Line 490:
Line 796:
| 0x9E || bool || HasAslr
| 0x9E || bool || HasAslr
|-
|-
−
| 0xA0 || u32 ||
+
| 0xA0 || u32 || PoolPartition
|-
|-
| 0xA4 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero
| 0xA4 || u32 || Is_0x5A_If_Cfg12_Bit0_ElseZero
Line 503:
Line 809:
|-
|-
| 0xC0 || u32 || AsidTagValue
| 0xC0 || u32 || AsidTagValue
+
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 5.0.0 Offset
+
! Type
+
! Description
+
|-
+
| 0 || * || Vtable
+
|-
+
| 8 || u64 || AddrSpaceMinAddr
+
|-
+
| 0x10 || u64 || AddrSpaceMaxAddr
+
|-
+
| 0x18 || u64 || HeapRegionBaseAddr
+
|-
+
| 0x20 || u64 || HeapRegionEndAddr
+
|-
+
| 0x28 || u64 || HeapCurAddr
+
|-
+
| 0x30 || u64 || MapRegionBaseAddr
+
|-
+
| 0x38 || u64 || MapRegionEndAddr
+
|-
+
| 0x40 || u64 || NewMapRegionBaseAddr
+
|-
+
| 0x48 || u64 || NewMapRegionEndAddr
+
|-
+
| 0x50 || u64 || TlsIoRegionBaseAddr
+
|-
+
| 0x58 || u64 || TlsIoRegionEndAddr
+
|-
+
| 0x60 || u64 || HeapMaxAllocation
+
|-
+
| 0x68 || ||
+
|-
+
| 0x70 || ||
+
|-
+
| 0x78 || [[#KMutex]] || Mutex
+
|-
+
| 0x80 || [[#KPageTable]] || PageTable
+
|-
+
| 0x90 || [[#KMemoryBlockManager]] || MemoryBlockManager
+
|-
+
| 0xA8 || u32 || ?
+
|-
+
| 0xAC || u32 || AddressSpaceWidth (32/36/39)
+
|-
+
| 0xB0 || [[#KLinkedList]]? ||
+
|-
+
| 0xC8 || ||
+
|-
+
| 0xD0 || ||
+
|-
+
| 0xD8 || ptr ||
+
|-
+
| 0xE0 || u64 || TranslationTableBaseRegister0 val
+
|-
+
| 0xE8 || u64 || TranslationControlRegister val
+
|-
+
| 0xF0 || u32 || AsidTagValue
|}
|}
</div>
</div>
Line 547:
Line 916:
! Description
! Description
|-
|-
−
| 0 || [[#KLinkedListNode]]<[[#KMemoryBlock]]> || NodeFor__MemoryBlockList
+
| 0 || [[#KLinkedListNode]]<[[#KMemoryBlock]] *> || NodeFor__MemoryBlockList
|-
|-
| 0x10 || ||
| 0x10 || ||
Line 615:
Line 984:
| 0x30 || u64 || BaseAddress
| 0x30 || u64 || BaseAddress
|-
|-
−
| 0x38 || KRecursiveLock || Mutex
+
| 0x38 || KMutex || Mutex
|-
|-
| 0x40 || int || Permission
| 0x40 || int || Permission
Line 625:
Line 994:
= KSharedMemory =
= KSharedMemory =
−
Size: 0x40
+
[1.0.0] Size: 0x40
+
+
[2.0.0] Size: 0x48
Inherits from: [[#KAutoObject]]
Inherits from: [[#KAutoObject]]
+
<div style="display: inline-block;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! 1.0.0 Offset || Type || Description
−
! Type
−
! Description
|-
|-
| 0 || [[#KAutoObject]] || Inheritance
| 0 || [[#KAutoObject]] || Inheritance
Line 646:
Line 1,016:
|-
|-
| 0x38 || bool || HasInited
| 0x38 || bool || HasInited
+
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 2.0.0 Offset || Type || Description
+
|-
+
| 0 || [[#KAutoObject]] || Inheritance
+
|-
+
| 0x10 || KMemoryBlockList || Blocks
+
|-
+
| 0x28 || [[#KResourceLimit]]* || OwnerResourceLimit
+
|-
+
| 0x30 || u64 || OwnerProcessPid
+
|-
+
| 0x38 || int || LocalPermission
+
|-
+
| 0x3C || int || RemotePermission
+
|-
+
| 0x40 || bool || HasInited
+
|}
+
+
</div>
+
+
= KJitMemory =
+
[4.0.0+] Size: 0x58
+
+
Inherits from: [[#KAutoObject]]
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KAutoObject]] || Inheritance
+
|-
+
| 0x20 || KMemoryBlockList || Blocks
+
|-
+
| 0x38 || [[#KProcess]]* || SrcProcessPtr
+
|-
+
| 0x40 || u64 || SrcAddr
+
|-
+
| 0x48 || [[#KMutex]] || Mutex
+
|-
+
| 0x50 || u8 || HasInit
+
|-
+
| 0x51 || u8 || HasMappedSlave
+
|-
+
| 0x52 || u8 || HasMappedMaster
|}
|}
= KPort =
= KPort =
−
Size: 0xA8
+
[1.0.0] Size: 0xA8
+
+
[7.0.0] Size: 0x110
Inherits from: [[#KAutoObject]]
Inherits from: [[#KAutoObject]]
+
+
<div style="display: inline-block;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! 1.0.0 Offset
! Type
! Type
! Description
! Description
Line 671:
Line 1,094:
| 0xA1 || bool || IsLight
| 0xA1 || bool || IsLight
|}
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 7.0.0 Offset
+
! Type
+
! Description
+
|-
+
| 0 || [[#KAutoObject]] || Inheritance
+
|-
+
| 0x30 || [[#KServerPort]] || ServerSide
+
|-
+
| 0xA0 || [[#KClientPort]] || ClientSide
+
|-
+
| 0xF8 || u64 ||
+
|-
+
| 0x100 || char* || NamePtr
+
|-
+
| 0x108 || bool || HasInited
+
|-
+
| 0x109 || bool || IsLight
+
|}
+
</div>
== KServerPort ==
== KServerPort ==
Line 739:
Line 1,186:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! Offset || Type || Description
−
! Type
−
! Description
|-
|-
| 0 || [[#KSynchronizationObject]] || Inheritance
| 0 || [[#KSynchronizationObject]] || Inheritance
Line 747:
Line 1,192:
| 0x28 || KLinkedListNode || NodeFor__IncomingConnections
| 0x28 || KLinkedListNode || NodeFor__IncomingConnections
|-
|-
−
| 0x38 || ||
+
| 0x38 || [[#KSession*]] || Parent
|-
|-
−
| 0x40 || KLinkedListNode ||
+
| 0x40 || KLinkedListNode<[[#KSessionRequest]]*> || RequestList
|-
|-
−
| 0x50 || ||
+
| 0x50 || [[#KSessionRequest]]* || ActiveRequest
+
|-
+
| 0x58 || [[#KMutex]] || lock
+
|}
+
+
=== KSessionRequest ===
+
Size: 0x158
+
+
Inherits from: [[#KAutoObject]]
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KAutoObject]] || Inheritance
+
|-
+
| 0x10 || KLinkedListNode || NodeFor__RequestList
+
|-
+
| 0x20 || [[#KBufferDescriptor]][8] || BufferTable
+
|-
+
| 0x120 || [[#KBufferDescriptor]]* || ExternalBufferTable
+
|-
+
| 0x128 || u8 || NumSendBuffers
+
|-
+
| 0x129 || u8 || NumRecvBuffers
+
|-
+
| 0x12A || u8 || NumExchBuffers
+
|-
+
| 0x130 || [[#KThread]]* || SenderThread
+
|-
+
| 0x138 || u64 || InitiallyZero
+
|-
+
| 0x140 || [[#KWritableEvent]]* || ForAsyncEvent
+
|-
+
| 0x148 || u64 || CustomCmdbufAddr
+
|-
+
| 0x150 || u64 || CustomCmdbufSize
+
|}
+
+
=== KBufferDescriptor ===
+
Size: 0x20
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || u64 || UserVirtAddr
+
|-
+
| 8 || u64 || Size
+
|-
+
| 0x10 || u64 ||
+
|-
+
| 0x18 || u64 || BufferMemoryState
|-
|-
−
| 0x58 || ||
|}
|}
Line 901:
Line 1,397:
== KInterruptEvent ==
== KInterruptEvent ==
−
Size: 0x50
+
[1.0.0] Size: 0x50
+
+
[2.0.0] Size: 0x48
Inherits from: [[#KReadableEvent]]
Inherits from: [[#KReadableEvent]]
+
<div style="display: inline-block;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset
+
! 1.0.0 Offset || Type || Description
−
! Type
−
! Description
|-
|-
| 0 || [[#KReadableEvent]] || Inheritance
| 0 || [[#KReadableEvent]] || Inheritance
|-
|-
−
| 0x38 || ||
+
| 0x38 || [[#KInterruptReceiver]] || Receiver
|-
|-
| 0x48 || u32 || IrqId (or -1)
| 0x48 || u32 || IrqId (or -1)
|}
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 2.0.0 Offset || Type || Description
+
|-
+
| 0 || [[#KReadableEvent]] || Inheritance
+
|-
+
| 0x38 || [[#KInterruptReceiver]]* || Receiver
+
|-
+
| 0x40 || u32 || IrqId (or -1)
+
|-
+
| 0x44 || bool || IsIrqRegistered
+
|}
+
</div>
+
+
=== KInterruptReceiver ===
+
[1.0.0] Size: 0x10
+
[2.0.0] Size: 0x20
+
+
<div style="display: inline-block;">
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || * || Vtable
+
|-
+
| 8 || u64 ||
+
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || * || Vtable
+
|-
+
| 8 || u64 || InitiallyZero
+
|-
+
| 0x10 || [[#KInterruptEvent]]* || IrqEventPtr
+
|-
+
| 0x18 || s32 || IrqId
+
|}
+
</div>
= KDeviceAddressSpace =
= KDeviceAddressSpace =
Line 931:
Line 1,474:
| 0 || [[#KAutoObject]] || Inheritance
| 0 || [[#KAutoObject]] || Inheritance
|-
|-
−
| 0x10 || [[#KRecursiveLock]] || Mutex
+
| 0x10 || [[#KMutex]] || Mutex
|-
|-
| 0x18 || [[#KSmmuManager]] || Manager
| 0x18 || [[#KSmmuManager]] || Manager
Line 985:
Line 1,528:
| 0x38 || u64[5] || LimitValue
| 0x38 || u64[5] || LimitValue
|-
|-
−
| 0x60 || [[#KRecursiveLock]] || Mutex
+
| 0x60 || [[#KMutex]] || Mutex
|}
|}
= KPoolManager =
= KPoolManager =
−
Size: 0x380
+
[1.0.0] Size: 0x380
+
[2.0.0] Size: 0x450
+
+
<div style="display: inline-block;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset || Type || Description
+
! 1.0.0 Offset || Type || Description
|-
|-
| 0 || [[#KPoolAllocator]][3] || Allocator
| 0 || [[#KPoolAllocator]][3] || Allocator
Line 1,003:
Line 1,549:
| 0x370 || u64 ||
| 0x370 || u64 ||
|-
|-
−
| 0x378 || [[#KRecursiveLock]] || Mutex
+
| 0x378 || [[#KMutex]] || Mutex
+
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 2.0.0 Offset || Type || Description
+
|-
+
| 0 || [[#KPoolAllocator]] || Allocator0
+
|-
+
| 0x220 || [[#KPartitionInfo]]* || PartitionInfo0
+
|-
+
| 0x228 || [[#KPoolAllocator]] || Allocator1
+
|-
+
| 0x448 || [[#KPartitionInfo]]* || PartitionInfo1
|}
|}
+
</div>
== KPoolAllocator ==
== KPoolAllocator ==
−
Size: 0x118
+
[1.0.0] Size: 0x118
+
[2.0.0] Size: 0x220
+
+
<div style="display: inline-block;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset || Type || Description
+
! 1.0.0 Offset || Type || Description
|-
|-
| 0 || void* || MemoryBase
| 0 || void* || MemoryBase
Line 1,021:
Line 1,586:
| 0x18 || [[#KPool]][8] || Pools
| 0x18 || [[#KPool]][8] || Pools
|}
|}
+
</div>
+
+
<div style="display: inline-block; vertical-align:top;">
+
{| class="wikitable" border="1"
+
|-
+
! 2.0.0 Offset || Type || Description
+
|-
+
| 0 || void* || MemoryBase
+
|-
+
| 8 || u64 || MemorySize
+
|-
+
| 0x10 || [[#KPool]][8] || Pools
+
|-
+
| 0x210 || s32 || NumPools
+
|}
+
</div>
=== KPool ===
=== KPool ===
−
Size: 0x20
+
[1.0.0] Size: 0x20
+
+
[2.0.0] Size: 0x40
+
+
<div style="display: inline-block;">
+
{| class="wikitable" border="1"
+
|-
+
! 1.0.0 Offset || Type || Description
+
|-
+
| 0 || KPoolHeader* || FirstFreeChunk
+
|-
+
| 8 || u64 ||
+
|-
+
| 0x10 || u64 ||
+
|-
+
| 0x18 || void* || SingletonTableEntryPtr
+
|}
+
</div>
+
<div style="display: inline-block; vertical-align:top;">
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
−
! Offset || Type || Description
+
! 2.0.0 Offset || Type || Description
|-
|-
| 0 || KPoolHeader* || FirstFreeChunk
| 0 || KPoolHeader* || FirstFreeChunk
Line 1,036:
Line 1,635:
|-
|-
| 0x18 || void* || SingletonTableEntryPtr
| 0x18 || void* || SingletonTableEntryPtr
+
|-
+
| 0x20 || [[#KPool]]* || Parent
+
|-
+
| 0x30 || u64[2] || DmaProtectionKey
|}
|}
+
</div>
== KPoolRefManager ==
== KPoolRefManager ==
−
Size: 0x20
+
[1.0.0] Size: 0x20
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,052:
Line 1,656:
|-
|-
| 0x18 || u16* || RefCountTable
| 0x18 || u16* || RefCountTable
+
|}
+
+
= KObjectAllocator =
+
Size: 0x50
+
[5.0.0]? Size: 0x48
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLockedList]] || LockedList
+
|-
+
| 0x28 || [[#KSlabHeap]] || SlabHeap
+
|}
+
+
+
= KSlabHeap =
+
Size: 0x28
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || void* || FreeListHead
+
|-
+
| 0x8 || u64 ||
+
|-
+
| 0x10 || void* || HeapPtr
+
|-
+
| 0x18 || u64 || TotalHeapSize
+
|-
+
| 0x20 || u64 || SingleObjectSize
+
|}
+
+
5.0.0 (?):
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || void* || FreeListHead
+
|-
+
| 0x8 || u64 || SingleObjectSize
+
|-
+
| 0x10 || void* || HeapPtr
+
|-
+
| 0x18 || void* || Start (equal to HeapPtr on init)
+
|-
+
| 0x20 || void* || End
+
|}
+
+
= KPageTableAllocator =
+
Size: 0x30
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || u64 ||
+
|-
+
| 0x10 || u16* || RefCountTable
+
|-
+
| 0x10 || void* || BaseAddress
+
|-
+
| 0x18 || u64 || Size
+
|-
+
| 0x20 || u64 ||
+
|-
+
| 0x28 || u64 ||
+
|}
+
+
= KIrqManager =
+
[1.0.0] Size: 0x1608
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KIrqEntry]][32] || Core0Irq
+
|-
+
| 0x200 || [[#KIrqEntry]][32] || Core1Irq
+
|-
+
| 0x400 || [[#KIrqEntry]][32] || Core2Irq
+
|-
+
| 0x600 || [[#KIrqEntry]][32] || Core3Irq
+
|-
+
| 0x800 || [[#KIrqEntry]][224] || SharedIrqs
+
|-
+
| 0x1600 || [[#KMutex]] || Mutex
+
|}
+
+
== KIrqEntry ==
+
[1.0.0] Size: 0x10
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KInterruptReceiver]]* || Receiver
+
|-
+
| 8 || u8 || State0
+
|-
+
| 9 || u8 || State1
+
|}
+
+
= KDebug =
+
Size: 0x50
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KSynchronizationObject]] || Inheritance
+
|-
+
| 0x28 || [[#KLinkedListNode]]<[[#KDebugEvent]]> || EventList
+
|-
+
| 0x38 || u32 || Flags
+
|-
+
| 0x40 || [[#KProcess]]* || ProcessPtr
+
|-
+
| 0x48 || [[#KMutex]] || Mutex
+
|}
+
+
== KDebugEvent ==
+
Size: 0x60
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLinkedListNode]]<[[#KDebugEvent]] *> || NodeFor__EventList
+
|-
+
| 0x10 || u32 || EventType
+
|-
+
| 0x14 || u32 || ThreadId
+
|-
+
| 0x18 || u32 || Flags
+
|-
+
| 0x1C || u16 ||
+
|-
+
| 0x1E || bool ||
+
|-
+
| 0x20 || ... || ...
+
|}
+
+
= KManagedPort =
+
Size: 0x28
+
+
{| class="wikitable" border="1"
+
|-
+
! Offset || Type || Description
+
|-
+
| 0 || [[#KLinkedListNode]]<[[#KManagedPort]] *> || NodeFor__ManagedPortList
+
|-
+
| 0x10 || char[12] || PortName
+
|-
+
| 0x20 || [[#KClientPort]]* || ClientPort
+
|}
+
+
= Slab Information =
+
+
The Horizon/NX kernel keeps all objects in slab allocators, that can allocate a fixed amount of each. Attempting to allocate an object when the slab heap is full will result in an error 0xCE01 (Resource Exhaustion).
+
+
{| class="wikitable" border="1"
+
|-
+
! Object || Slab Count
+
|-
+
| KEvent || 600
+
|-
+
| KInterruptEvent || 100
+
|-
+
| KProcess || 80
+
|-
+
| KThread || 700
+
|-
+
| KPort || 200
+
|-
+
| KSharedMemory || 80
+
|-
+
| KTransferMemory || 200
+
|-
+
| KDeviceAddressSpace || 300
+
|-
+
| KDebug || 4
+
|-
+
| KSession || 800
+
|-
+
| KLightSession || 100
+
|-
+
| KLinkedListEntry<void*> || 17 231
+
|-
+
| KLinkedListNode || 4 000
+
|-
+
| KMemoryBlock (System) || 20 000
+
|-
+
| KMemoryBlock (Other) || 10 000
+
|-
+
| KTlsPageManager || 167
+
|-
+
| KManagedPort || 7
+
|-
+
| KDebugEvent || 704
+
|-
+
| KSessionRequest || 1 600
+
|-
+
| KResourceLimit || 5
|}
|}