Difference between revisions of "KProcess"

From 3dbrew
Jump to navigation Jump to search
(How a final handle is created)
Line 217: Line 217:
  
 
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.
 
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 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.

Revision as of 08:09, 25 January 2015

class KProcess extends KSynchronizationObject;

Size : 0x260 bytes

Offset Type Description
0x0 u32 Pointer to vtable
0x4 u32 Reference count
0x54 u32 Virtual address of the MMU table for this process
0x6C s32 Ideal processor
0x7C u32 Number of threads which belong to this process.
0x79 u8 Proc affinity mask
0x80 0x10-bytes SVC access control mask from the exheader kernel descriptors.
0xA0 u32 Kernel flags from the exheader kernel descriptors.
0xA4 u16 Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.
0xA6 u16 Kernel release version field, from the exheader kernel descriptors.
0xA8 u32 Pointer to KCodeSet instance
0xAC u32 Process id, this always begins at 0x0 for the first process.
0xB8 KThread* Pointer to the process's main (?) thread.
0xCC void* Pointer to the process's handle table.

Structure for 8.0.0-18 NATIVE_FIRM:

Size : 0x268 bytes

Offset Type Description
0x0 u32 Pointer to vtable
0x4 u32 Reference count
0x4C u32 End of userland virtual memory for the process
0x50 u32* LINEAR memory virtual address(userland) base for this process.
0x58 u32 Size of the MMU table
0x5C u32 Virtual address of the MMU table for this process
0x74 s32 Ideal processor for this process
0x7C u32 Pointer to resource limits for process.
0x84 u32 Number of threads which belong to this process.
0x88 0x10-bytes SVC access control mask from the exheader kernel descriptors.
0xA8 u32 Kernel flags from the exheader kernel descriptors.
0xAC u16 Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.
0xAE u16 Kernel release version field, from the exheader kernel descriptors.
0xB0 u32 Pointer to KCodeSet instance
0xB4 u32 Process id, this always begins at 0x0 for the first process.
0xC0 KThread* Pointer to the process's main (?) thread.
0xD4 KProcessHandleTable This is the data for tracking and using all of the KProcess's handles.


KProcessHandleTable info struct:

Offset Type Description
0x0 HandleData* Pointer to the process's handle table.
0x4 u16 The max number of handles that can be open at once - usually 0x200.
0x6 u16 Unknown
0x8 HandleData* Pointer to the next open HandleData entry in the handle table.
0xC u16 Total handles used by this KProcess.
0xE u16 The current number of handles in use.
0x10 u32 Unknown
0x14 u32 Unknown
0x16 u32 Unknown
0x18 HandleData[28] This small handle data table internal to the KProcess is only used in certain processes that don't have an external handle data table in FCRAM. it is all zeros in most processes.


HandleData struct:

Offset Type Description
0x0 u32 Handle info
0x4 u32 Pointer 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 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.