Difference between revisions of "NPDM"

From Nintendo Switch Brew
Jump to navigation Jump to search
Line 37: Line 37:
 
| 0x70
 
| 0x70
 
| 0x4
 
| 0x4
| Absolute offset for ACI0.
+
| [[#ACI0]] offset
 
|-
 
|-
 
| 0x74
 
| 0x74
 
| 0x4
 
| 0x4
| Size of ACI0.
+
| [[#ACI0]] size
 
|-
 
|-
 
| 0x78
 
| 0x78
 
| 0x4
 
| 0x4
| Absolute offset of the RSA signature.
+
| [[#ACID]] offset
 
|-
 
|-
 
| 0x7C
 
| 0x7C
 
| 0x4
 
| 0x4
| Size used with the above offset. Offset+size is normally ACI0_start-8.
+
| [[#ACID]] size
 
|}
 
|}
  
Line 91: Line 91:
 
| 0x220
 
| 0x220
 
| 0x4
 
| 0x4
| FS Access Control offset
+
| [[#FS Access Control]] offset
 
|-
 
|-
 
| 0x24
 
| 0x24
 
| 0x4
 
| 0x4
| FS Access Control size
+
| [[#FS Access Control]] size
 
|-
 
|-
 
| 0x28
 
| 0x28
 
| 0x4
 
| 0x4
| Service Access Control offset
+
| [[#Service Access Control]] offset
 
|-
 
|-
 
| 0x2C
 
| 0x2C
 
| 0x4
 
| 0x4
| Service Access Control size
+
| [[#Service Access Control]] size
 
|-
 
|-
 
| 0x30
 
| 0x30
 
| 4
 
| 4
| Kernel Access Control offset
+
| [[#Kernel Access Control]] offset
 
|-
 
|-
 
| 0x34
 
| 0x34
 
| 4
 
| 4
| Kernel Access Control size
+
| [[#Kernel Access Control]] size
 
|-
 
|-
 
| 0x38
 
| 0x38
Line 120: Line 120:
 
= ACI0 =
 
= ACI0 =
 
Looks like an old crappy version of ACID. It has the guessed version field 0 instead of 1.
 
Looks like an old crappy version of ACID. It has the guessed version field 0 instead of 1.
 +
 +
= FS Access Control =
 +
{| class="wikitable" border="1"
 +
|-
 +
! Bit
 +
! Description
 +
|-
 +
| 0
 +
| MountContent* is accessible when set.
 +
|-
 +
| 3
 +
| This is only bit set for ShopN in the permissions-u32.
 +
|}
  
 
= Service Access Control =
 
= Service Access Control =
Line 132: Line 145:
 
The service string can contain a wildcard <code>*</code> character.
 
The service string can contain a wildcard <code>*</code> character.
  
= Access Descriptors =
+
= Kernel Access Control =
 
Like the 3DS, the switch has a number of kernel capability descriptors. Unlike 3ds, where descriptors were identified by pattern 11..10 in high bits, on switch descriptors are identified by pattern 01..11 in low bits.
 
Like the 3DS, the switch has a number of kernel capability descriptors. Unlike 3ds, where descriptors were identified by pattern 11..10 in high bits, on switch descriptors are identified by pattern 01..11 in low bits.
  
Line 168: Line 181:
 
| Map memory page?
 
| Map memory page?
 
| ?
 
| ?
|}
 
 
 
=FS Permissions=
 
{| class="wikitable" border="1"
 
|-
 
! Bit
 
! Description
 
|-
 
| 0
 
| MountContent* is accessible when set.
 
|-
 
| 3
 
| This is only bit set for ShopN in the permissions-u32.
 
 
|}
 
|}

Revision as of 23:10, 28 June 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".
0x20 ? Title name
0x70 0x4 #ACI0 offset
0x74 0x4 #ACI0 size
0x78 0x4 #ACID offset
0x7C 0x4 #ACID size

Switch version of 3DS "System Control Info"?

ACID

Offset Size Description
0 0x100 RSA-2048 signature
0x100 0x100 RSA-2048 public key
0x200 0x4 Magic "ACID".
0x204 0x8 Zeroes
0x20C 0x4 Format version? (1)
0x210 0x8 Title id
0x218 0x8 Title id again
0x220 0x4 #FS Access Control offset
0x24 0x4 #FS Access Control size
0x28 0x4 #Service Access Control offset
0x2C 0x4 #Service Access Control size
0x30 4 #Kernel Access Control offset
0x34 4 #Kernel Access Control size
0x38 0x8 Padding

ACI0

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

FS Access Control

Bit Description
0 MountContent* is accessible when set.
3 This is only bit set for ShopN in the permissions-u32.

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

Like the 3DS, the switch has a number of kernel capability descriptors. Unlike 3ds, where descriptors were identified by pattern 11..10 in high bits, on switch descriptors are identified by pattern 01..11 in low bits.

Pattern of bits 20-31 Type Fields
0bxxxxxxxx0111? Interrupt info? ?
0bxxxxxxx01111 System call mask Bits 29-31: System call mask table index; Bits 5-28: mask
0bxxxxx0111111? Kernel release version? ?
0bxxxx01111111? Handle table size? ?
0bxxx011111111? Kernel flags? ?
0bx0111111111? Map address range? ?
0b011111111111? Map memory page? ?