KProcess

KProcess

class KProcess extends KSynchronizationObject and KSendableInterruptEvent;

Size : 0x270 (N3DS) / 0x268 bytes (O3DS post 8.x) / 0x260 bytes (O3DS pre 8.x). 0x4D8 bytes on ARM9. The only field that changed is the KProcessHwInfo member instance. The definition of KProcess remain identical in all cases.

The listed offsets are N3DS-only.

OffsetTypeDescription
0x0void**Pointer to vtable
0x4u32Reference count
0x8u32Count of KThreads that sync with this object - number of nodes in the linked list below
0xCKLinkedListNode*Pointer to first KLinkedListNode in node list of KThreads that sync with this object
0x10KLinkedListNode*Pointer to last KLinkedListNode in node list of KThreads that sync with this object
0x14KSendableInterruptEventInterrupt event (*this) sent to terminate the process
0x1CKProcessHwInfoProcess hardware/context info. Used to manage segmentation, etc.
0x68u32Total size of all Thread Context pages owned by threads that belong to this process
0x6Cu32Number of KThreadLocalPages used by this KProcess
0x70KLinkedListNode*Pointer to first KLinkedListNode in the list of KThreadLocalPages
0x74KLinkedListNode*Pointer to last KLinkedListNode in the list of KThreadLocalPages
0x78u32Unknown
0x7Cs32Ideal processor for this process
0x80KDebug*KDebug object created from svc 0x60 to debug the process
0x84KResourceLimit*Pointer to resource limits for process.
0x88u8Normally 1 to indicate process is open/available. Set to 2 to indicate process is exiting/closing and 3 to indicate exited/closed.
0x89u8Process affinity mask
0x8Au16Unused, alignment
0x8Cs16Number of threads which belong to this process.
0x8Es16Max number of threads which can belong to this process. This is always 0.
0x900x10-bytesSVC access control mask from the exheader kernel descriptors. This is copied to the Thread Context area when creating threads, which is the actual data the SVC-handler checks for SVC-access-control.
0xA0u32[4]Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words
0xB0u32Kernel flags from the exheader kernel descriptors.
0xB4u16Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.
0xB6u16Kernel release version field, from the exheader kernel descriptors.
0xB8KCodeSet*Pointer to KCodeSet instance
0xBCu32Process id, this always begins at 0x0 for the first process.
0xC0s64Process creation time as tick count
0xC8KThread*Pointer to the process’s main thread.
0xCCu32[4]Interrupt enabled flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words
0xDCKProcessHandleTableThis is the data for tracking and using all of the KProcess’s handles.
0x234u32Unused (From here up, everything is set to 0 on creation, has 0 written to it again during process creation, and is never used again.)
0x238u64Unused
0x240u64Unused
0x248u64Unused
0x250u64Unused
0x258u64Unused
0x260u64Unused
0x268u64Unused

KProcessHandleTable #

OffsetTypeDescription
0x0HandleDescriptor*Pointer to the process’s handle table.
0x4s16The max number of handles that can be open at once - usually 0x200.
0x6s16The highest count of handles that have been open at once
0x8HandleDescriptor*Pointer to the next open HandleDescriptor entry in the handle table.
0xCs16Total handles used by this KProcess.
0xEs16The current number of handles in use.
0x10KObjectMutexMutex
0x18HandleDescriptor[0x28]This small handle data table, internal to the KProcess, is only used in certain processes that don’t have an external handle descriptor table in FCRAM. It is all zeros in most processes.

HandleDescriptor #

OffsetTypeDescription
0x0u32Handle info
0x4u32Pointer to the kernel object that the handle references.

The handle info u32 works as such:

The high byte is a remainder from the pointer to the next entry that originally occupied the handle table entry. It is unused. Byte 2 is either the class type token starting with firmware version 9.0 or the lowest byte of the char* that points to the class type name in firmware versions below 9.0. The lower halfword is the handle number of the current handle taken from the total handle count for the KProcess that owns the table.

On table creation, each entry in the handle data table is populated with a pointer to the next entry in the table. When a new handle is created, that pointer is moved into offset 0x8 of the KProcessHandleTable info struct to use for generation of the next handle.

The final handle that gets returned when a handle is created is (handle_index | (handle_total << 15)), basically they take the index into the handle data table and OR that with the total handle count << 15. This returned value is the one that gets passed back to the running application and is used to look up the HandleDescriptor entry in the table.

Category:Kernel synchronization objects Category:Kernel interrupt events