IPC
Every RPC command sent to services starts with a u32 header code:
| Bits | Description |
|---|---|
| 0-5 | Number of translate parameters (=x) |
| 6-15 | Number of normal parameters (=y) |
| 16-23 | Command ID |
| 24-31 | Unknown |
The entire command has the following structure:
| Word | Size | Description |
|---|---|---|
| 0 | 1 | Header code |
| 1 | x | Normal parameters |
| x | y | Translate parameters |
Translate parameters are modified/translated transparently by the kernel. They are used to transfer handles/buffers between the different processes.
Translate parameters comes in pairs of two words, one descriptor and one value.
| Descriptor | Description |
|---|---|
| 0x00000000 | The corresponding value is a KHandle |
| 0x00000010 | The corresponding value is a KHandle, that should not be closed locally? |
| 0x00000020 | Let kernel set value to local ProcessID |
| 0x0000???2 | (size<<14) | The corresponding value contains a ptr to a buffer of said size. |
| 0x0000000A | (size<<4) | The corresponding value contains a ptr to a buffer of said size. |
| 0x0000000C | (size<<4) | The corresponding value contains a ptr to a buffer of said size. |