Line 1: |
Line 1: |
− | = pl:u = | + | = pl:u, pl:s = |
− | This is "nn::pl::detail::IPlatformServiceManager".
| + | These are "nn::pl::detail::IPlatformServiceManager". |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 23: |
Line 23: |
| |- | | |- |
| | 101 || [8.0.0+] RequestApplicationFunctionAuthorizationForSystem | | | 101 || [8.0.0+] RequestApplicationFunctionAuthorizationForSystem |
| + | |- |
| + | | 1000 || [9.0.0+] LoadNgWordDataForPlatformRegionChina |
| + | |- |
| + | | 1001 || [9.0.0+] GetNgWordDataSizeForPlatformRegionChina |
| |} | | |} |
| | | |
Line 196: |
Line 200: |
| ! Cmd || Name | | ! Cmd || Name |
| |- | | |- |
− | | 0 || NotifyAppletEvent | + | | 0 || [[#NotifyAppletEvent]] |
| |- | | |- |
− | | 2 || NotifyOperationModeChangeEvent | + | | 2 || [[#NotifyOperationModeChangeEvent]] |
| |- | | |- |
− | | 3 || NotifyPowerStateChangeEvent | + | | 3 || [[#NotifyPowerStateChangeEvent]] |
| |- | | |- |
− | | 4 || NotifyClearAllEvent | + | | 4 || [[#NotifyClearAllEvent]] |
| |- | | |- |
| | 5 || [[#NotifyEventForDebug]] | | | 5 || [[#NotifyEventForDebug]] |
Line 214: |
Line 218: |
| | 9 || [8.0.0+] | | | 9 || [8.0.0+] |
| |} | | |} |
| + | |
| + | == NotifyAppletEvent == |
| + | Takes an input u8 [[#AppletEventType]], an u8 [[Applet_Manager_services#AppletId|AppletId]], an u8 [[Filesystem_services#StorageId|StorageId]], an u8 [[#PlayLogPolicy]], an u32 '''event_x8''', and an u64 '''titleID'''. Returns no output. |
| + | |
| + | When [[#PlayLogPolicy]] is 2 ("None") this will immediately return 0. |
| + | |
| + | Logs a new [[#PlayEvent]] with the following data: |
| + | * Clears the 0x10-bytes at +0x10. |
| + | * u8 +0xF = [[#AppletEventType]]. |
| + | * Sets the 3 timestamps. |
| + | * Converts '''titleID''' and writes it to +0x0. |
| + | * u32 +0x8 = '''event_x8'''. |
| + | * u8 +0xC = [[Applet_Manager_services#AppletId|AppletId]], u8 +0xD = [[Filesystem_services#StorageId|StorageId]], and u8 +0xE = [[#PlayLogPolicy]]. |
| + | |
| + | After the initial logging, additional code runs with some of the above input params. |
| + | |
| + | == NotifyOperationModeChangeEvent == |
| + | Takes an input u8 '''inval''', no output. |
| + | |
| + | Logs a new [[#PlayEvent]] with the following data: clears the 0x20-bytes at +0x0, u8 +0x1C = 0x3, u8 +0x0 = '''inval''', and sets the 3 timestamps. |
| + | |
| + | == NotifyPowerStateChangeEvent == |
| + | Takes an input u8 '''inval''', no output. |
| + | |
| + | Logs a new [[#PlayEvent]] with the following data: clears the 0x20-bytes at +0x0, u8 +0x1C = 0x2, u8 +0x0 = '''inval''', and sets the 3 timestamps. |
| + | |
| + | After the initial logging, additional code runs which uses '''inval'''. |
| + | |
| + | == NotifyClearAllEvent == |
| + | No input/output. |
| | | |
| == NotifyEventForDebug == | | == NotifyEventForDebug == |
Line 221: |
Line 255: |
| | | |
| Each [[#PlayEvent]] entry is validated, throwing an error on failure. After an entry is successfully validated, it is written to the log. | | Each [[#PlayEvent]] entry is validated, throwing an error on failure. After an entry is successfully validated, it is written to the log. |
| + | |
| + | == Cmd8 == |
| + | Takes an input u8 [[#AppletEventType]], an u8 [[Applet_Manager_services#LibraryAppletMode|LibraryAppletMode]], an u8 [[Applet_Manager_services#AppletId|AppletId]], an u8 [[Filesystem_services#StorageId|StorageId]], an u8 [[#PlayLogPolicy]], and an u64 '''titleID'''. Returns no output. |
| + | |
| + | This is similar to [[#NotifyAppletEvent]]. |
| + | |
| + | When [[#PlayLogPolicy]] is 2 ("None") this will immediately return 0. |
| + | |
| + | Logs a new [[#PlayEvent]] with the following data: |
| + | * Clears the 0x20-bytes at +0x0. |
| + | * u8 +0xF = [[#AppletEventType]]. |
| + | * Sets the 3 timestamps. |
| + | * Converts '''titleID''' and writes it to +0x0. |
| + | * u8 +0x9 = [[Applet_Manager_services#LibraryAppletMode|LibraryAppletMode]]. |
| + | * u8 +0x8 = 1. |
| + | * u8 +0xC = [[Applet_Manager_services#AppletId|AppletId]], u8 +0xD = [[Filesystem_services#StorageId|StorageId]], and u8 +0xE = [[#PlayLogPolicy]]. |
| + | |
| + | After the initial logging, additional code runs with some of the above input params. This is handled the same as [[#NotifyAppletEvent]], except that the value passed for '''event_x8''' is value 0 here. |
| + | |
| + | == Cmd9 == |
| + | Takes an input u8 [[#AppletEventType]], an u8 [[Applet_Manager_services#AppletId|AppletId]], an u8 [[Filesystem_services#StorageId|StorageId]], an 0x20-byte struct, an u8 bool flag, an u8 [[#PlayLogPolicy]], an u32 '''event_x8''', and an u64 '''titleID'''. Returns no output. |
| + | |
| + | This is identical to [[#NotifyAppletEvent]] except for the additional struct/flag params. |
| + | |
| + | After the initial logging, additional code runs with some of the above input params. This is handled the same as [[#NotifyAppletEvent]], except that when the u8 bool flag is set the input struct is used with this. |
| | | |
| = pdm:qry = | | = pdm:qry = |
Line 229: |
Line 288: |
| ! Cmd || Name | | ! Cmd || Name |
| |- | | |- |
− | | 0 || [[#QueryApplicationEvent]] | + | | 0 || [[#QueryAppletEvent]] ([1.0.0-7.0.1] QueryApplicationEvent) |
| |- | | |- |
− | | [1.0.0-6.2.0] 1 || QueryPlayStatistics | + | | [1.0.0-6.2.0] 1 || [[#QueryPlayStatistics]] |
| |- | | |- |
− | | [1.0.0-6.2.0] 2 || QueryPlayStatisticsByUserAccountId | + | | [1.0.0-6.2.0] 2 || [[#QueryPlayStatisticsByUserAccountId]] |
| |- | | |- |
− | | [1.0.0-6.2.0] 3 || QueryPlayStatisticsByNetworkServiceAccountId | + | | [1.0.0-6.2.0] 3 || [[#QueryPlayStatisticsByNetworkServiceAccountId]] |
| |- | | |- |
| | 4 || [[#QueryPlayStatisticsByApplicationId]] | | | 4 || [[#QueryPlayStatisticsByApplicationId]] |
Line 241: |
Line 300: |
| | 5 || [[#QueryPlayStatisticsByApplicationIdAndUserAccountId]] | | | 5 || [[#QueryPlayStatisticsByApplicationIdAndUserAccountId]] |
| |- | | |- |
− | | [1.0.0-6.2.0] 6 || QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId | + | | [1.0.0-6.2.0] 6 || [[#QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId]] |
| |- | | |- |
| | 7 || [[#QueryLastPlayTime]] | | | 7 || [[#QueryLastPlayTime]] |
Line 257: |
Line 316: |
| | 13 || [5.0.0+] [[#QueryApplicationPlayStatisticsForSystem]] | | | 13 || [5.0.0+] [[#QueryApplicationPlayStatisticsForSystem]] |
| |- | | |- |
− | | 14 || [6.0.0+] | + | | 14 || [6.0.0+] [[#QueryRecentlyPlayedApplication]] |
| |- | | |- |
− | | 15 || [6.0.0+] | + | | 15 || [6.0.0+] [[#GetRecentlyPlayedApplicationUpdateEvent]] |
| |- | | |- |
− | | 16 || [6.0.0+] | + | | 16 || [6.0.0+] [[#QueryApplicationPlayStatisticsByUserAccountIdForSystem]] |
| |} | | |} |
| | | |
− | == QueryApplicationEvent == | + | == QueryAppletEvent == |
− | Takes an input u32 entryindex, a type-0x6 output buffer containing an array of [[#ApplicationEvent]], and returns an output s32 for actual total output entries. | + | Takes an input s32 entry_index, a type-0x6 output buffer containing an array of [[#AppletEvent]], and returns an output s32 for actual total output entries. |
| + | |
| + | == QueryPlayStatistics == |
| + | Takes a type-0x6 output buffer containing an array of [[#PlayStatistics]] and returns an output s32 for actual total output entries. |
| + | |
| + | [6.2.0+] This command was removed. |
| + | |
| + | == QueryPlayStatisticsByUserAccountId == |
| + | Takes an input u128 '''Uid''', a type-0x6 output buffer containing an array of [[#PlayStatistics]] and returns an output s32 for actual total output entries. |
| + | |
| + | [6.2.0+] This command was removed. |
| + | |
| + | == QueryPlayStatisticsByNetworkServiceAccountId == |
| + | Takes an input u64 '''NetworkServiceAccountId''', a type-0x6 output buffer containing an array of [[#PlayStatistics]] and returns an output s32 for actual total output entries. |
| + | |
| + | [6.2.0+] This command was removed. |
| | | |
| == QueryPlayStatisticsByApplicationId == | | == QueryPlayStatisticsByApplicationId == |
− | Takes an input u64 titleID and returns an output [[#PlayStatistics]]. | + | Takes an input u64 '''ApplicationId''' and returns an output [[#PlayStatistics]]. |
| | | |
| == QueryPlayStatisticsByApplicationIdAndUserAccountId == | | == QueryPlayStatisticsByApplicationIdAndUserAccountId == |
− | Takes an input u64 titleID, an input u128 userID, and returns an output [[#PlayStatistics]]. | + | Takes an input u64 '''ApplicationId''', an input u128 '''Uid''' and returns an output [[#PlayStatistics]]. |
| + | |
| + | == QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId == |
| + | Takes an input u64 '''ApplicationId''', an input u64 '''NetworkServiceAccountId''' and returns an output [[#PlayStatistics]]. |
| + | |
| + | [6.2.0+] This command was removed. |
| | | |
| == QueryLastPlayTime == | | == QueryLastPlayTime == |
− | Takes a type-0x6 output buffer containing an array of [[#LastPlayTime]], and a type-0x5 input buffer containing an array of u64 titleIDs. Returns an output s32 for actual total output entries. | + | Takes a type-0x6 output buffer containing an array of [[#LastPlayTime]], and a type-0x5 input buffer containing an array of u64 '''ApplicationId'''. Returns an output s32 for actual total output entries. |
| | | |
| == QueryPlayEvent == | | == QueryPlayEvent == |
− | Takes an input u32 entryindex, a type-0x6 output buffer containing an array of [[#PlayEvent]], and returns an output u32 for actual total output entries. | + | Takes an input s32 entry_index, a type-0x6 output buffer containing an array of [[#PlayEvent]], and returns an output s32 for actual total output entries. |
| | | |
| == GetAvailablePlayEventRange == | | == GetAvailablePlayEventRange == |
− | No input, returns 3 output u32s: total_entries, start_entryindex, and end_entryindex. | + | No input, returns 3 output s32s: total_entries, start_entry_index, and end_entry_index. |
| | | |
| == QueryAccountEvent == | | == QueryAccountEvent == |
− | Takes an input u32 entryindex, a type-0x6 output buffer containing an array of [[#AccountEvent]], and returns an output s32 for actual total output entries. | + | Takes an input s32 entry_index, a type-0x6 output buffer containing an array of [[#AccountEvent]], and returns an output s32 for actual total output entries. |
| | | |
| == QueryAccountPlayEvent == | | == QueryAccountPlayEvent == |
− | Takes an input u32 entryoffset, an input u128 userID, a type-0x6 output buffer containing an array of [[#AccountPlayEvent]], and returns an output u32 for actual total output entries. | + | Takes an input s32 entry_offset, an input u128 '''Uid''', a type-0x6 output buffer containing an array of [[#AccountPlayEvent]], and returns an output s32 for actual total output entries. |
| | | |
| == GetAvailableAccountPlayEventRange == | | == GetAvailableAccountPlayEventRange == |
− | Takes an input u128 userID and returns 3 output u32s: total_entries, start_entryindex, and end_entryindex. | + | Takes an input u128 '''Uid''' and returns 3 output s32s: total_entries, start_entry_index, and end_entry_index. |
| | | |
| == QueryApplicationPlayStatisticsForSystem == | | == QueryApplicationPlayStatisticsForSystem == |
− | Takes a type-0x6 output buffer containing an array of [[#ApplicationPlayStatistics]] and a type-0x5 input buffer containing an array of u64 titleIDs. Returns an output s32 for actual total output entries. | + | Takes a type-0x6 output buffer containing an array of [[#ApplicationPlayStatistics]] and a type-0x5 input buffer containing an array of u64 '''ApplicationId'''. Returns an output s32 for actual total output entries. |
| | | |
| The number of entries in each array is the same. | | The number of entries in each array is the same. |
| | | |
− | == Cmd14 == | + | == QueryRecentlyPlayedApplication == |
− | Takes an input u128 userID, a type-0x6 output buffer containing an array of u64 titleIDs, and returns an output u32 for actual total output entries. | + | Takes an input u128 '''Uid''', a type-0x6 output buffer containing an array of u64 '''ApplicationId''', and returns an output s32 for actual total output entries. |
| | | |
| Returns a list of titles played by the specified user. | | Returns a list of titles played by the specified user. |
| | | |
− | == Cmd15 == | + | == GetRecentlyPlayedApplicationUpdateEvent == |
| No input, returns an output Event handle with autoclear=false. | | No input, returns an output Event handle with autoclear=false. |
| | | |
| This is signaled when logging a new [[#PlayEvent]] which would be available via [[#QueryAccountEvent]], where [[#PlayEvent]] +0x18 is 0. | | This is signaled when logging a new [[#PlayEvent]] which would be available via [[#QueryAccountEvent]], where [[#PlayEvent]] +0x18 is 0. |
| | | |
− | == Cmd16 == | + | == QueryApplicationPlayStatisticsByUserAccountIdForSystem == |
− | Takes a u128 userID, a type-0x6 output buffer containing an array of [[#ApplicationPlayStatistics]] and a type-0x5 input buffer containing an array of u64 titleIDs. Returns an output s32 for actual total output entries. | + | Takes a u128 '''Uid''', a type-0x6 output buffer containing an array of [[#ApplicationPlayStatistics]] and a type-0x5 input buffer containing an array of u64 '''ApplicationId'''. Returns an output s32 for actual total output entries. |
| | | |
− | Same as [[#QueryApplicationPlayStatisticsForSystem]] except this gets playstats specific to userIDs. | + | Same as [[#QueryApplicationPlayStatisticsForSystem]] except this gets playstats specific to '''Uid'''. |
| | | |
| = avm = | | = avm = |
Line 355: |
Line 434: |
| |} | | |} |
| | | |
− | = ApplicationEvent = | + | = AppletEvent = |
| + | This is "nn::pdm::AppletEvent" ([1.0.0-7.0.1] "nn::pdm::ApplicationEvent"). |
| + | |
| + | This is a 0x18-byte struct. |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 374: |
Line 457: |
| | 0x15 || 0x3 || Padding | | | 0x15 || 0x3 || Padding |
| |} | | |} |
− |
| |
− | This is a 0x18-byte struct.
| |
| | | |
| Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00. | | Timestamp format, converted from PosixTime: total minutes since epoch UTC 1999/12/31 00:00. |
| | | |
| = PlayStatistics = | | = PlayStatistics = |
| + | This is "nn::pdm::PlayStatistics". |
| + | |
| + | This is a 0x28-byte struct. |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 390: |
Line 475: |
| | 0x8 || 0x4 || First entryindex | | | 0x8 || 0x4 || First entryindex |
| |- | | |- |
− | | 0xC || 0x4 || First timestamp0. Same as the first [[#ApplicationEvent]] timestamp. | + | | 0xC || 0x4 || First timestamp0. Same as the first [[#AppletEvent]] timestamp. |
| |- | | |- |
− | | 0x10 || 0x4 || First timestamp1. Same as the second [[#ApplicationEvent]] timestamp. | + | | 0x10 || 0x4 || First timestamp1. Same as the second [[#AppletEvent]] timestamp. |
| |- | | |- |
| | 0x14 || 0x4 || Last entryindex | | | 0x14 || 0x4 || Last entryindex |
| |- | | |- |
− | | 0x18 || 0x4 || Last timestamp0. Same as the first [[#ApplicationEvent]] timestamp. | + | | 0x18 || 0x4 || Last timestamp0. Same as the first [[#AppletEvent]] timestamp. |
| |- | | |- |
− | | 0x1C || 0x4 || Last timestamp1. Same as the second [[#ApplicationEvent]] timestamp. | + | | 0x1C || 0x4 || Last timestamp1. Same as the second [[#AppletEvent]] timestamp. |
| |- | | |- |
| | 0x20 || 0x4 || Total play-time in minutes. | | | 0x20 || 0x4 || Total play-time in minutes. |
Line 405: |
Line 490: |
| |} | | |} |
| | | |
− | This is a 0x28-byte struct. | + | = LastPlayTime = |
| + | This is "nn::pdm::LastPlayTime". |
| + | |
| + | This is a 0x18-byte struct and contains data from the last time the title was played. |
| | | |
− | = LastPlayTime =
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 416: |
Line 503: |
| | 0x0 || 0x8 || titleID | | | 0x0 || 0x8 || titleID |
| |- | | |- |
− | | 0x8 || 0x4 || Same as the first [[#ApplicationEvent]] timestamp. | + | | 0x8 || 0x4 || Same as the first [[#AppletEvent]] timestamp. |
| |- | | |- |
− | | 0xC || 0x4 || Same as the second [[#ApplicationEvent]] timestamp. | + | | 0xC || 0x4 || Same as the second [[#AppletEvent]] timestamp. |
| |- | | |- |
| | 0x10 || 0x4 || Total minutes since the title was last played. | | | 0x10 || 0x4 || Total minutes since the title was last played. |
Line 427: |
Line 514: |
| |} | | |} |
| | | |
− | This is a 0x18-byte struct. This contains data from the last time the title was played. | + | = PlayEventType = |
| + | This is an enum for [[#PlayEvent]] +0x1C, which indicates the type of [[#PlayEvent]]. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value |
| + | ! Description |
| + | |- |
| + | | 0 || Applet |
| + | |- |
| + | | 1 || Account |
| + | |- |
| + | | 2 || PowerStateChange |
| + | |- |
| + | | 3 || OperationModeChange |
| + | |- |
| + | | 4 || Initialize. Used for the very first [[#PlayEvent]] entry in the log. |
| + | |} |
| + | |
| + | = AppletEventType = |
| + | This is an enum for [[#PlayEvent]] +0xF with [[#PlayEventType]] = Applet, this indicates the type of the Applet event. |
| | | |
− | = PlayEvent =
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Offset | + | ! Value |
− | ! Size
| |
| ! Description | | ! Description |
| |- | | |- |
− | | 0x0 || 0x0x10 || titleID or userID, with the u32 low/high words swapped in each u64. | + | | 0 || "launch" |
| |- | | |- |
− | | 0xC || 0x1 || ? | + | | 1 || "exit" |
| |- | | |- |
− | | 0xD || 0x1 || ? | + | | 2 || "in_focus" |
| |- | | |- |
− | | 0xE || 0x1 || ? | + | | 3 || "out_of_focus" |
| |- | | |- |
− | | 0xF || 0x1 || ? | + | | 4 || "out_of_focus" |
| |- | | |- |
− | | 0x18 || 0x1 || ? | + | | 5 || "exit" |
| |- | | |- |
− | | 0x1C || 0x1 || ? | + | | 6 || "exit" |
| + | |} |
| + | |
| + | = PlayLogPolicy = |
| + | {| class="wikitable" border="1" |
| |- | | |- |
− | | 0x1D || 0x3 || ?
| + | ! Value |
| + | ! Meaning |
| + | ! Description |
| |- | | |- |
− | | 0x20 || 0x8 || PosixTime timestamp0 | + | | 0 || All || All pdm:qry cmds which require [[#PlayEventType]] = Applet and AppletId = Application will only return the entry when PlayLogPolicy matches this value. |
| |- | | |- |
− | | 0x28 || 0x8 || PosixTime timestamp1 | + | | 1 || LogOnly || The above commands will filter out the entry with this. |
| |- | | |- |
− | | 0x30 || 0x8 || Timestamp in seconds derived from [[PCV_services|StandardSteadyClock]]. | + | | 2 || None || pdm:ntfy [[#NotifyAppletEvent]], [[#Cmd8]], and [[#Cmd9]] will immediately return 0 when the input param matches this value. |
| |} | | |} |
| | | |
− | This is a 0x38-byte struct. | + | This is an enum for [[#PlayEvent]] +0xE with [[#PlayEventType]] = Applet. This is set via the above commands, which uses this as an input param. |
| + | |
| + | = PlayEvent = |
| + | This is "nn::pdm::PlayEvent". |
| + | |
| + | This is a 0x38-byte struct and is the raw entry struct directly read from FS, without any entry filtering. The other structs are extracted+converted from this one, with filtering. |
| | | |
− | This is the raw entry struct directly read from FS, without any entry filtering. The other structs are extracted+converted from this one, with filtering.
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x1C || 0x1 || [[#PlayEventType]] |
| + | |- |
| + | | 0x1D || 0x3 || Padding |
| + | |- |
| + | | 0x20 || 0x8 || PosixTime timestamp from [[PCV_services|StandardUserSystemClock]]. |
| + | |- |
| + | | 0x28 || 0x8 || PosixTime timestamp from [[PCV_services|StandardNetworkSystemClock]]. |
| + | |- |
| + | | 0x30 || 0x8 || Timestamp in seconds derived from [[PCV_services|StandardSteadyClock]]. |
| + | |} |
| | | |
| Filtering: | | Filtering: |
− | * [[#QueryApplicationEvent]] and [[#QueryLastPlayTime]]: PlayEvent +0x1C must be 0, +0xC must be 1, and +0xE must be 0. | + | * [[#QueryAppletEvent]], [[#QueryLastPlayTime]], and [[#QueryApplicationPlayStatisticsForSystem]]: PlayEvent +0x1C must be 0, +0xC must be 1, and +0xE must be 0. |
| * [[#QueryPlayStatisticsByApplicationId]]: PlayEvent +0x1C must be 0, +0xC must be 1, and the titleID must match. | | * [[#QueryPlayStatisticsByApplicationId]]: PlayEvent +0x1C must be 0, +0xC must be 1, and the titleID must match. |
| * [[#QueryAccountEvent]]: PlayEvent +0x1C must be 1 and PlayEvent +0x18 must be <=1. | | * [[#QueryAccountEvent]]: PlayEvent +0x1C must be 1 and PlayEvent +0x18 must be <=1. |
| + | * [[#QueryApplicationPlayStatisticsForSystem]]: In addition to the above, this also handles [[#PlayEventType]] PowerStateChange, where PlayEvent +0x0 is value 0 or 1. |
| + | |
| + | The structure of the first 0x1C-bytes are determined by [[#PlayEventType]]. For titleIDs/userIDs, the low/high u32 in each u64 is swapped. |
| + | |
| + | Applet: |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 0x8 || titleID |
| + | |- |
| + | | 0x8 || 0x4 || Title version, set by pdm:ntfy [[#NotifyAppletEvent]] and [[#Cmd9]]. |
| + | |- |
| + | | 0x8 || 0x1 || When set to u8 0x1 by pdm:ntfy [[#Cmd8]], this indicates that +0x9 is set. Only used for non-applications. |
| + | |- |
| + | | 0x9 || 0x1 || See above. [[Applet_Manager_services#LibraryAppletMode|LibraryAppletMode]] |
| + | |- |
| + | | 0xC || 0x1 || [[Applet_Manager_services#AppletId|AppletId]] |
| + | |- |
| + | | 0xD || 0x1 || [[Filesystem_services#StorageId|StorageId]] |
| + | |- |
| + | | 0xE || 0x1 || [[#PlayLogPolicy]] |
| + | |- |
| + | | 0xF || 0x1 || [[#AppletEventType]] |
| + | |- |
| + | | 0x10 || 0xC || Unused |
| + | |} |
| + | |
| + | Account: |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 || 0x10 || userID |
| + | |- |
| + | | 0x10 || 0x8 || titleID, when u8 +0x18 = 2. |
| + | |- |
| + | | 0x18 || 0x1 || Type. 0-1 to be listed by [[#QueryAccountEvent]], or 2 to include the above titleID. |
| + | |- |
| + | | 0x19 || 0x3 || Padding |
| + | |} |
| + | |
| + | PlayEventType PowerStateChange/OperationModeChange: u8 +0x0 is the input value from [[#NotifyOperationModeChangeEvent]]/[[#NotifyPowerStateChangeEvent]], the rest is unused. |
| | | |
| = AccountEvent = | | = AccountEvent = |
| + | This is "nn::pdm::AccountEvent". |
| + | |
| + | This is a 0x38-byte struct. |
| + | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 492: |
Line 674: |
| |} | | |} |
| | | |
− | This is a 0x38-byte struct. | + | = AccountPlayEvent = |
| + | This is "nn::pdm::AccountPlayEvent". |
| + | |
| + | This is a 0x28-byte struct and is the raw entry struct directly read from FS, without any entry filtering. This is separate from [[#PlayEvent]]. |
| | | |
− | = AccountPlayEvent =
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 512: |
Line 696: |
| |} | | |} |
| | | |
− | This is a 0x28-byte struct. | + | = ApplicationPlayStatistics = |
| + | This is "nn::pdm::ApplicationPlayStatistics". |
| | | |
− | This is the raw entry struct directly read from FS, without any entry filtering. This is separate from [[#PlayEvent]]. | + | This is a 0x18-byte struct. |
| | | |
− | = ApplicationPlayStatistics =
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
Line 529: |
Line 713: |
| | 0x10 || 0x8 || Total times the application title was launched. | | | 0x10 || 0x8 || Total times the application title was launched. |
| |} | | |} |
− |
| |
− | This is "nn::pdm::ApplicationPlayStatistics".
| |
− |
| |
− | This is a 0x18-byte struct.
| |
| | | |
| [[Category:Services]] | | [[Category:Services]] |