Difference between revisions of "NPDM"

From Nintendo Switch Brew
Jump to navigation Jump to search
(Document FS Access Control)
m (Reverted edits by Jakcron (talk) to last revision by Qlutoo)
Line 132: Line 132:
  
 
= FS Access Control =
 
= FS Access Control =
{| class="wikitable" border="1"
 
|-
 
! Offset
 
! Size
 
! Description
 
|-
 
| 0x0
 
| 0x4
 
| Version (usually 1).
 
|-
 
| 0x4
 
| 0x8
 
| FS Access Rights
 
|-
 
| 0xC
 
| 0x4
 
| ContentOwnerIds start offset
 
|-
 
| 0x10
 
| 0x4
 
| ContentOwnerIds end offset
 
|-
 
| 0x14
 
| 0x4
 
| SaveDataOwnerIds start offset
 
|-
 
| 0x18
 
| 0x4
 
| SavaDataOwnerIds end offset
 
|}
 
  
=== FS Access Rights ===
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Bit and bitmask
+
! Word
 +
! Bit
 
! Description
 
! Description
 
|-
 
|-
| <code>0</code>, <code>0x1</code>
+
| 0
| ApplicationInfo (MountContent* is accessible when set)
+
|
|-
+
| Version? Always 1.
| <code>1</code>, <code>0x2</code>
 
| BootModeControl
 
|-
 
| <code>2</code>, <code>0x4</code>
 
| Calibration (Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28)
 
|-
 
| <code>3</code>, <code>0x8</code>
 
| SystemSaveData
 
|-
 
| <code>4</code>, <code>0x10</code>
 
| GameCard
 
|-
 
| <code>5</code>, <code>0x20</code>
 
| SaveDataBackup
 
|-
 
| <code>6</code>, <code>0x40</code>
 
| SaveDataManagement
 
|-
 
| <code>7</code>, <code>0x80</code>
 
| BisAllRaw
 
|-
 
| <code>8</code>, <code>0x100</code>
 
| GameCardRaw
 
|-
 
| <code>9</code>, <code>0x200</code>
 
| GameCardPrivate
 
|-
 
| <code>10</code>, <code>0x400</code>
 
| SetTime
 
|-
 
| <code>11</code>, <code>0x800</code>
 
| ContentManager
 
|-
 
| <code>12</code>, <code>0x1000</code>
 
| ImageManager
 
|-
 
| <code>13</code>, <code>0x2000</code>
 
| CreateSaveData
 
|-
 
| <code>14</code>, <code>0x4000</code>
 
| SystemSaveDataManagement
 
|-
 
| <code>15</code>, <code>0x8000</code>
 
| BisFileSystem
 
|-
 
| <code>16</code>, <code>0x10000</code>
 
| SystemUpdate
 
|-
 
| <code>17</code>, <code>0x20000</code>
 
| SaveDataMeta
 
|-
 
| <code>18</code>, <code>0x40000</code>
 
| DeviceSaveControl
 
|-
 
| <code>19</code>, <code>0x80000</code>
 
| SettingsControl
 
 
|-
 
|-
| <code>62</code>, <code>0x4000000000000000</code>
+
| 1
| Debug
+
| 0
 +
| MountContent* is accessible when set.
 
|-
 
|-
| <code>63</code>, <code>0x8000000000000000</code>
+
| 1
| FullPermission
+
| 2
 +
| Enables access to [[Filesystem_services|Bis]] partitionID 27 and 28?
 
|}
 
|}
  
 
Web-applets access control:
 
Web-applets access control:
* "LibAppletWeb" and "LibAppletOff" have same access control: word0 bit0 set, '''ApplicationInfo''' and '''SystemSaveData''' set, and '''Debug''' set.
+
* "LibAppletWeb" and "LibAppletOff" have same access control: word0 bit0 set, word1 bit0 and bit3 set, and word2 bit30 set.
* Rest of the web-applets: Same as above except '''ApplicationInfo'''  isn't set.
+
* Rest of the web-applets: Same as above except word1 bit0 isn't set.
  
 
= Service Access Control =
 
= Service Access Control =

Revision as of 05:32, 20 July 2017

This is the Switch equivalent of 3DS exheader. This is the file with extension ".npdm" in {Switch ExeFS}. The size of this file varies.

Offset Size Description
0x0 0x80 META
0x80 <Varies> ACID
<See META> <See META> ACI0

META

Offset Size Description
0x0 0x4 Magic "META".
0xE 1
0xF 1
0x1C 4
0x20 ? Title name
0x70 0x4 #ACI0 offset
0x74 0x4 #ACI0 size
0x78 0x4 #ACID offset
0x7C 0x4 #ACID size

ACID

Offset Size Description
0 0x100 RSA-2048 signature
0x100 0x100 RSA-2048 public key
0x200 0x4 Magic "ACID".
0x204 0x8 Zeroes
0x20C 0x4 Retail flag. Must be 1 on retail, on devunit 0 is also allowed.
0x210 0x8 Title id
0x218 0x8 Title id again
0x220 0x4 #FS Access Control offset
0x224 0x4 #FS Access Control size
0x228 0x4 #Service Access Control offset
0x22C 0x4 #Service Access Control size
0x230 4 #Kernel Access Control offset
0x234 4 #Kernel Access Control size
0x238 0x8 Padding

ACI0

Looks like an old crappy version of ACID. It has the guessed version field 0 instead of 1.

FS Access Control

Word Bit Description
0 Version? Always 1.
1 0 MountContent* is accessible when set.
1 2 Enables access to Bis partitionID 27 and 28?

Web-applets access control:

  • "LibAppletWeb" and "LibAppletOff" have same access control: word0 bit0 set, word1 bit0 and bit3 set, and word2 bit30 set.
  • Rest of the web-applets: Same as above except word1 bit0 isn't set.

Service Access Control

This is a list of service-name strings which the title has access to, with the following structure:

 +0: control_byte
 +1: {service-name without nul-terminator}

Bitmask 0x0F in control_byte is the {length of the service-name without nul-terminator} - 1.

Bitmask 0x80 in control_byte means service is allowed to be registered.

The service string can contain a wildcard * character.

Kernel Access Control

On Switch, descriptors are identified by pattern 01..11 in low bits.

Pattern of lower bits Type Fields
0bxxxxxxxxxxxx0111 Kernel flags Bit31-24: Highest allowed cpu id, bit23-16: Lowest allowed cpu id, bit15-10: Highest allowed thread prio, bit9-4: Lowest allowed thread prio
0bxxxxxxxxxxx01111 Syscall mask Bits 29-31: Syscall mask table index; Bits 5-28: Mask
0bxxxxxxxxx0111111 Map IO page (RW) Bits 7-31: Page
0bxxxxxxxx01111111 Map IO range Bits 7-30: Alternating start page and number of pages, bit31: Alternating read-only flag then MemoryAttribute 0x2001/0x42002 selector flag
0bxxxx011111111111 Interrupt pair Bits 12-21: Irq0, bits 20-31: Irq1, 0x3FF means empty.
0xxxx0111111111111
0xxx01111111111111
0xx011111111111111
0x0111111111111111
All ones Ignored