Shared Database services: Difference between revisions
No edit summary |
No edit summary |
||
(31 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
= pl:u = | = pl:u, pl:s = | ||
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 || [[# | | 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]] | ||
|} | |} | ||
== | == QueryAppletEvent == | ||
Takes an input | 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 | Takes an input u64 '''ApplicationId''' and returns an output [[#PlayStatistics]]. | ||
== QueryPlayStatisticsByApplicationIdAndUserAccountId == | == QueryPlayStatisticsByApplicationIdAndUserAccountId == | ||
Takes an input u64 | 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 | 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 | 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 | No input, returns 3 output s32s: total_entries, start_entry_index, and end_entry_index. | ||
== QueryAccountEvent == | == QueryAccountEvent == | ||
Takes an input | 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 | 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 | 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 | 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. | ||
== | == QueryRecentlyPlayedApplication == | ||
Takes an input u128 | 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. | ||
== | == 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. | ||
== | == QueryApplicationPlayStatisticsByUserAccountIdForSystem == | ||
Takes a u128 | 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 | 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 | ||
|} | |} | ||
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 [[# | | 0xC || 0x4 || First timestamp0. Same as the first [[#AppletEvent]] timestamp. | ||
|- | |- | ||
| 0x10 || 0x4 || First timestamp1. Same as the second [[# | | 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 [[# | | 0x18 || 0x4 || Last timestamp0. Same as the first [[#AppletEvent]] timestamp. | ||
|- | |- | ||
| 0x1C || 0x4 || Last timestamp1. Same as the second [[# | | 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 | = LastPlayTime = | ||
This is "nn::pdm::LastPlayTime". | |||
This is a 0x18-byte struct and contains data from the last time the title was played. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 416: | Line 503: | ||
| 0x0 || 0x8 || titleID | | 0x0 || 0x8 || titleID | ||
|- | |- | ||
| 0x8 || 0x4 || Same as the first [[# | | 0x8 || 0x4 || Same as the first [[#AppletEvent]] timestamp. | ||
|- | |- | ||
| 0xC || 0x4 || Same as the second [[# | | 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 | = 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. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Value | ||
! Description | ! Description | ||
|- | |- | ||
| | | 0 || "launch" | ||
|- | |- | ||
| | | 1 || "exit" | ||
|- | |- | ||
| | | 2 || "in_focus" | ||
|- | |- | ||
| | | 3 || "out_of_focus" | ||
|- | |- | ||
| | | 4 || "out_of_focus" | ||
|- | |- | ||
| | | 5 || "exit" | ||
|- | |- | ||
| | | 6 || "exit" | ||
|} | |||
= PlayLogPolicy = | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
! Value | |||
! Meaning | |||
! Description | |||
|- | |- | ||
| | | 0 || All || All pdm:qry cmds which require [[#PlayEventType]] = Applet and AppletId = Application will only return the entry when PlayLogPolicy matches this value. | ||
|- | |- | ||
| | | 1 || LogOnly || The above commands will filter out the entry with this. | ||
|- | |- | ||
| | | 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. | |||
{| 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: | ||
* [[# | * [[#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 | = 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]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 512: | Line 696: | ||
|} | |} | ||
This is | = ApplicationPlayStatistics = | ||
This is "nn::pdm::ApplicationPlayStatistics". | |||
This is | This is a 0x18-byte struct. | ||
{| 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. | ||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] |