mirror of
				https://github.com/Atmosphere-NX/Atmosphere.git
				synced 2025-11-04 04:51:16 +01:00 
			
		
		
		
	erpt: add ids (and autogeneration tool)
This commit is contained in:
		
							parent
							
								
									065485b971
								
							
						
					
					
						commit
						5062329979
					
				@ -40,6 +40,7 @@
 | 
			
		||||
#include "stratosphere/boot2.hpp"
 | 
			
		||||
#include "stratosphere/cfg.hpp"
 | 
			
		||||
#include "stratosphere/dmnt.hpp"
 | 
			
		||||
#include "stratosphere/erpt.hpp"
 | 
			
		||||
#include "stratosphere/fatal.hpp"
 | 
			
		||||
#include "stratosphere/hid.hpp"
 | 
			
		||||
#include "stratosphere/hos.hpp"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								libraries/libstratosphere/include/stratosphere/erpt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								libraries/libstratosphere/include/stratosphere/erpt.hpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2018-2020 Atmosphère-NX
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
 * under the terms and conditions of the GNU General Public License,
 | 
			
		||||
 * version 2, as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope it will be useful, but WITHOUT
 | 
			
		||||
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
 * more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stratosphere/erpt/erpt_ids.autogen.hpp>
 | 
			
		||||
@ -0,0 +1,778 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2018-2020 Atmosphère-NX
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
 * under the terms and conditions of the GNU General Public License,
 | 
			
		||||
 * version 2, as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope it will be useful, but WITHOUT
 | 
			
		||||
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
 * more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <vapours.hpp>
 | 
			
		||||
 | 
			
		||||
/* NOTE: This file is auto-generated. */
 | 
			
		||||
/* Do not make edits to this file by hand. */
 | 
			
		||||
 | 
			
		||||
#define AMS_ERPT_FOREACH_FIELD_TYPE(HANDLER) \
 | 
			
		||||
    HANDLER(FieldType_NumericU64, 0 ) \
 | 
			
		||||
    HANDLER(FieldType_NumericU32, 1 ) \
 | 
			
		||||
    HANDLER(FieldType_NumericI64, 2 ) \
 | 
			
		||||
    HANDLER(FieldType_NumericI32, 3 ) \
 | 
			
		||||
    HANDLER(FieldType_String,     4 ) \
 | 
			
		||||
    HANDLER(FieldType_U8Array,    5 ) \
 | 
			
		||||
    HANDLER(FieldType_U32Array,   6 ) \
 | 
			
		||||
    HANDLER(FieldType_U64Array,   7 ) \
 | 
			
		||||
    HANDLER(FieldType_I32Array,   8 ) \
 | 
			
		||||
    HANDLER(FieldType_I64Array,   9 ) \
 | 
			
		||||
    HANDLER(FieldType_Bool,       10) \
 | 
			
		||||
    HANDLER(FieldType_NumericU16, 11) \
 | 
			
		||||
    HANDLER(FieldType_NumericU8,  12) \
 | 
			
		||||
    HANDLER(FieldType_NumericI16, 13) \
 | 
			
		||||
    HANDLER(FieldType_NumericI8,  14) \
 | 
			
		||||
    HANDLER(FieldType_I8Array,    15) \
 | 
			
		||||
 | 
			
		||||
#define AMS_ERPT_FOREACH_CATEGORY(HANDLER) \
 | 
			
		||||
    HANDLER(Test,                                0  ) \
 | 
			
		||||
    HANDLER(ErrorInfo,                           1  ) \
 | 
			
		||||
    HANDLER(ConnectionStatusInfo,                2  ) \
 | 
			
		||||
    HANDLER(NetworkInfo,                         3  ) \
 | 
			
		||||
    HANDLER(NXMacAddressInfo,                    4  ) \
 | 
			
		||||
    HANDLER(StealthNetworkInfo,                  5  ) \
 | 
			
		||||
    HANDLER(LimitHighCapacityInfo,               6  ) \
 | 
			
		||||
    HANDLER(NATTypeInfo,                         7  ) \
 | 
			
		||||
    HANDLER(WirelessAPMacAddressInfo,            8  ) \
 | 
			
		||||
    HANDLER(GlobalIPAddressInfo,                 9  ) \
 | 
			
		||||
    HANDLER(EnableWirelessInterfaceInfo,         10 ) \
 | 
			
		||||
    HANDLER(EnableWifiInfo,                      11 ) \
 | 
			
		||||
    HANDLER(EnableBluetoothInfo,                 12 ) \
 | 
			
		||||
    HANDLER(EnableNFCInfo,                       13 ) \
 | 
			
		||||
    HANDLER(NintendoZoneSSIDListVersionInfo,     14 ) \
 | 
			
		||||
    HANDLER(LANAdapterMacAddressInfo,            15 ) \
 | 
			
		||||
    HANDLER(ApplicationInfo,                     16 ) \
 | 
			
		||||
    HANDLER(OccurrenceInfo,                      17 ) \
 | 
			
		||||
    HANDLER(ProductModelInfo,                    18 ) \
 | 
			
		||||
    HANDLER(CurrentLanguageInfo,                 19 ) \
 | 
			
		||||
    HANDLER(UseNetworkTimeProtocolInfo,          20 ) \
 | 
			
		||||
    HANDLER(TimeZoneInfo,                        21 ) \
 | 
			
		||||
    HANDLER(ControllerFirmwareInfo,              22 ) \
 | 
			
		||||
    HANDLER(VideoOutputInfo,                     23 ) \
 | 
			
		||||
    HANDLER(NANDFreeSpaceInfo,                   24 ) \
 | 
			
		||||
    HANDLER(SDCardFreeSpaceInfo,                 25 ) \
 | 
			
		||||
    HANDLER(ScreenBrightnessInfo,                26 ) \
 | 
			
		||||
    HANDLER(AudioFormatInfo,                     27 ) \
 | 
			
		||||
    HANDLER(MuteOnHeadsetUnpluggedInfo,          28 ) \
 | 
			
		||||
    HANDLER(NumUserRegisteredInfo,               29 ) \
 | 
			
		||||
    HANDLER(DataDeletionInfo,                    30 ) \
 | 
			
		||||
    HANDLER(ControllerVibrationInfo,             31 ) \
 | 
			
		||||
    HANDLER(LockScreenInfo,                      32 ) \
 | 
			
		||||
    HANDLER(InternalBatteryLotNumberInfo,        33 ) \
 | 
			
		||||
    HANDLER(LeftControllerSerialNumberInfo,      34 ) \
 | 
			
		||||
    HANDLER(RightControllerSerialNumberInfo,     35 ) \
 | 
			
		||||
    HANDLER(NotificationInfo,                    36 ) \
 | 
			
		||||
    HANDLER(TVInfo,                              37 ) \
 | 
			
		||||
    HANDLER(SleepInfo,                           38 ) \
 | 
			
		||||
    HANDLER(ConnectionInfo,                      39 ) \
 | 
			
		||||
    HANDLER(NetworkErrorInfo,                    40 ) \
 | 
			
		||||
    HANDLER(FileAccessPathInfo,                  41 ) \
 | 
			
		||||
    HANDLER(GameCardCIDInfo,                     42 ) \
 | 
			
		||||
    HANDLER(NANDCIDInfo,                         43 ) \
 | 
			
		||||
    HANDLER(MicroSDCIDInfo,                      44 ) \
 | 
			
		||||
    HANDLER(NANDSpeedModeInfo,                   45 ) \
 | 
			
		||||
    HANDLER(MicroSDSpeedModeInfo,                46 ) \
 | 
			
		||||
    HANDLER(GameCardSpeedModeInfo,               47 ) \
 | 
			
		||||
    HANDLER(UserAccountInternalIDInfo,           48 ) \
 | 
			
		||||
    HANDLER(NetworkServiceAccountInternalIDInfo, 49 ) \
 | 
			
		||||
    HANDLER(NintendoAccountInternalIDInfo,       50 ) \
 | 
			
		||||
    HANDLER(USB3AvailableInfo,                   51 ) \
 | 
			
		||||
    HANDLER(CallStackInfo,                       52 ) \
 | 
			
		||||
    HANDLER(SystemStartupLogInfo,                53 ) \
 | 
			
		||||
    HANDLER(RegionSettingInfo,                   54 ) \
 | 
			
		||||
    HANDLER(NintendoZoneConnectedInfo,           55 ) \
 | 
			
		||||
    HANDLER(ForceSleepInfo,                      56 ) \
 | 
			
		||||
    HANDLER(ChargerInfo,                         57 ) \
 | 
			
		||||
    HANDLER(RadioStrengthInfo,                   58 ) \
 | 
			
		||||
    HANDLER(ErrorInfoAuto,                       59 ) \
 | 
			
		||||
    HANDLER(AccessPointInfo,                     60 ) \
 | 
			
		||||
    HANDLER(SystemPowerStateInfo,                62 ) \
 | 
			
		||||
    HANDLER(PerformanceInfo,                     63 ) \
 | 
			
		||||
    HANDLER(ThrottlingInfo,                      64 ) \
 | 
			
		||||
    HANDLER(GameCardErrorInfo,                   65 ) \
 | 
			
		||||
    HANDLER(EdidInfo,                            66 ) \
 | 
			
		||||
    HANDLER(ThermalInfo,                         67 ) \
 | 
			
		||||
    HANDLER(CradleFirmwareInfo,                  68 ) \
 | 
			
		||||
    HANDLER(RunningApplicationInfo,              69 ) \
 | 
			
		||||
    HANDLER(RunningAppletInfo,                   70 ) \
 | 
			
		||||
    HANDLER(FocusedAppletHistoryInfo,            71 ) \
 | 
			
		||||
    HANDLER(BatteryChargeInfo,                   73 ) \
 | 
			
		||||
    HANDLER(NANDExtendedCsd,                     74 ) \
 | 
			
		||||
    HANDLER(NANDPatrolInfo,                      75 ) \
 | 
			
		||||
    HANDLER(NANDErrorInfo,                       76 ) \
 | 
			
		||||
    HANDLER(NANDDriverLog,                       77 ) \
 | 
			
		||||
    HANDLER(SdCardSizeSpec,                      78 ) \
 | 
			
		||||
    HANDLER(SdCardErrorInfo,                     79 ) \
 | 
			
		||||
    HANDLER(SdCardDriverLog ,                    80 ) \
 | 
			
		||||
    HANDLER(FsProxyErrorInfo,                    81 ) \
 | 
			
		||||
    HANDLER(SystemAppletSceneInfo,               82 ) \
 | 
			
		||||
    HANDLER(VideoInfo,                           83 ) \
 | 
			
		||||
    HANDLER(GpuErrorInfo,                        84 ) \
 | 
			
		||||
    HANDLER(PowerClockInfo,                      85 ) \
 | 
			
		||||
    HANDLER(AdspErrorInfo,                       86 ) \
 | 
			
		||||
    HANDLER(NvDispDeviceInfo,                    87 ) \
 | 
			
		||||
    HANDLER(NvDispDcWindowInfo,                  88 ) \
 | 
			
		||||
    HANDLER(NvDispDpModeInfo,                    89 ) \
 | 
			
		||||
    HANDLER(NvDispDpLinkSpec,                    90 ) \
 | 
			
		||||
    HANDLER(NvDispDpLinkStatus,                  91 ) \
 | 
			
		||||
    HANDLER(NvDispDpHdcpInfo,                    92 ) \
 | 
			
		||||
    HANDLER(NvDispDpAuxCecInfo,                  93 ) \
 | 
			
		||||
    HANDLER(NvDispDcInfo,                        94 ) \
 | 
			
		||||
    HANDLER(NvDispDsiInfo,                       95 ) \
 | 
			
		||||
    HANDLER(NvDispErrIDInfo,                     96 ) \
 | 
			
		||||
    HANDLER(SdCardMountInfo,                     97 ) \
 | 
			
		||||
    HANDLER(RetailInteractiveDisplayInfo,        98 ) \
 | 
			
		||||
    HANDLER(CompositorStateInfo,                 99 ) \
 | 
			
		||||
    HANDLER(CompositorLayerInfo,                 100) \
 | 
			
		||||
    HANDLER(CompositorDisplayInfo,               101) \
 | 
			
		||||
    HANDLER(CompositorHWCInfo,                   102) \
 | 
			
		||||
    HANDLER(MonitorCapability,                   103) \
 | 
			
		||||
    HANDLER(ErrorReportSharePermissionInfo,      104) \
 | 
			
		||||
    HANDLER(MultimediaInfo,                      105) \
 | 
			
		||||
    HANDLER(ConnectedControllerInfo,             106) \
 | 
			
		||||
    HANDLER(FsMemoryInfo,                        107) \
 | 
			
		||||
    HANDLER(UserClockContextInfo,                108) \
 | 
			
		||||
    HANDLER(NetworkClockContextInfo,             109) \
 | 
			
		||||
    HANDLER(AcpGeneralSettingsInfo,              110) \
 | 
			
		||||
    HANDLER(AcpPlayLogSettingsInfo,              111) \
 | 
			
		||||
    HANDLER(AcpAocSettingsInfo,                  112) \
 | 
			
		||||
    HANDLER(AcpBcatSettingsInfo,                 113) \
 | 
			
		||||
    HANDLER(AcpStorageSettingsInfo,              114) \
 | 
			
		||||
    HANDLER(AcpRatingSettingsInfo,               115) \
 | 
			
		||||
    HANDLER(MonitorSettings,                     116) \
 | 
			
		||||
    HANDLER(RebootlessSystemUpdateVersionInfo,   117) \
 | 
			
		||||
    HANDLER(NifmConnectionTestInfo,              118) \
 | 
			
		||||
    HANDLER(PcieLoggedStateInfo,                 119) \
 | 
			
		||||
    HANDLER(NetworkSecurityCertificateInfo,      120) \
 | 
			
		||||
    HANDLER(AcpNeighborDetectionInfo,            121) \
 | 
			
		||||
    HANDLER(GpuCrashInfo,                        122) \
 | 
			
		||||
    HANDLER(UsbStateInfo,                        123) \
 | 
			
		||||
    HANDLER(NvHostErrInfo,                       124) \
 | 
			
		||||
    HANDLER(RunningUlaInfo,                      125) \
 | 
			
		||||
 | 
			
		||||
#define AMS_ERPT_FOREACH_FIELD(HANDLER) \
 | 
			
		||||
    HANDLER(TestU64,                                                  0,   0,   0 ) \
 | 
			
		||||
    HANDLER(TestU32,                                                  1,   0,   1 ) \
 | 
			
		||||
    HANDLER(TestI64,                                                  2,   0,   2 ) \
 | 
			
		||||
    HANDLER(TestI32,                                                  3,   0,   3 ) \
 | 
			
		||||
    HANDLER(TestString,                                               4,   0,   4 ) \
 | 
			
		||||
    HANDLER(TestU8Array,                                              5,   0,   5 ) \
 | 
			
		||||
    HANDLER(TestU32Array,                                             6,   0,   6 ) \
 | 
			
		||||
    HANDLER(TestU64Array,                                             7,   0,   7 ) \
 | 
			
		||||
    HANDLER(TestI32Array,                                             8,   0,   8 ) \
 | 
			
		||||
    HANDLER(TestI64Array,                                             9,   0,   9 ) \
 | 
			
		||||
    HANDLER(ErrorCode,                                                10,  1,   4 ) \
 | 
			
		||||
    HANDLER(ErrorDescription,                                         11,  1,   4 ) \
 | 
			
		||||
    HANDLER(OccurrenceTimestamp,                                      12,  59,  2 ) \
 | 
			
		||||
    HANDLER(ReportIdentifier,                                         13,  59,  4 ) \
 | 
			
		||||
    HANDLER(ConnectionStatus,                                         14,  2,   4 ) \
 | 
			
		||||
    HANDLER(AccessPointSSID,                                          15,  60,  4 ) \
 | 
			
		||||
    HANDLER(AccessPointSecurityType,                                  16,  60,  4 ) \
 | 
			
		||||
    HANDLER(RadioStrength,                                            17,  58,  1 ) \
 | 
			
		||||
    HANDLER(NXMacAddress,                                             18,  4,   4 ) \
 | 
			
		||||
    HANDLER(IPAddressAcquisitionMethod,                               19,  3,   1 ) \
 | 
			
		||||
    HANDLER(CurrentIPAddress,                                         20,  3,   4 ) \
 | 
			
		||||
    HANDLER(SubnetMask,                                               21,  3,   4 ) \
 | 
			
		||||
    HANDLER(GatewayIPAddress,                                         22,  3,   4 ) \
 | 
			
		||||
    HANDLER(DNSType,                                                  23,  3,   1 ) \
 | 
			
		||||
    HANDLER(PriorityDNSIPAddress,                                     24,  3,   4 ) \
 | 
			
		||||
    HANDLER(AlternateDNSIPAddress,                                    25,  3,   4 ) \
 | 
			
		||||
    HANDLER(UseProxyFlag,                                             26,  3,   10) \
 | 
			
		||||
    HANDLER(ProxyIPAddress,                                           27,  3,   4 ) \
 | 
			
		||||
    HANDLER(ProxyPort,                                                28,  3,   1 ) \
 | 
			
		||||
    HANDLER(ProxyAutoAuthenticateFlag,                                29,  3,   10) \
 | 
			
		||||
    HANDLER(MTU,                                                      30,  3,   1 ) \
 | 
			
		||||
    HANDLER(ConnectAutomaticallyFlag,                                 31,  3,   10) \
 | 
			
		||||
    HANDLER(UseStealthNetworkFlag,                                    32,  5,   10) \
 | 
			
		||||
    HANDLER(LimitHighCapacityFlag,                                    33,  6,   10) \
 | 
			
		||||
    HANDLER(NATType,                                                  34,  7,   4 ) \
 | 
			
		||||
    HANDLER(WirelessAPMacAddress,                                     35,  8,   4 ) \
 | 
			
		||||
    HANDLER(GlobalIPAddress,                                          36,  9,   4 ) \
 | 
			
		||||
    HANDLER(EnableWirelessInterfaceFlag,                              37,  10,  10) \
 | 
			
		||||
    HANDLER(EnableWifiFlag,                                           38,  11,  10) \
 | 
			
		||||
    HANDLER(EnableBluetoothFlag,                                      39,  12,  10) \
 | 
			
		||||
    HANDLER(EnableNFCFlag,                                            40,  13,  10) \
 | 
			
		||||
    HANDLER(NintendoZoneSSIDListVersion,                              41,  14,  4 ) \
 | 
			
		||||
    HANDLER(LANAdapterMacAddress,                                     42,  15,  4 ) \
 | 
			
		||||
    HANDLER(ApplicationID,                                            43,  16,  4 ) \
 | 
			
		||||
    HANDLER(ApplicationTitle,                                         44,  16,  4 ) \
 | 
			
		||||
    HANDLER(ApplicationVersion,                                       45,  16,  4 ) \
 | 
			
		||||
    HANDLER(ApplicationStorageLocation,                               46,  16,  4 ) \
 | 
			
		||||
    HANDLER(DownloadContentType,                                      47,  17,  4 ) \
 | 
			
		||||
    HANDLER(InstallContentType,                                       48,  17,  4 ) \
 | 
			
		||||
    HANDLER(ConsoleStartingUpFlag,                                    49,  17,  10) \
 | 
			
		||||
    HANDLER(SystemStartingUpFlag,                                     50,  17,  10) \
 | 
			
		||||
    HANDLER(ConsoleFirstInitFlag,                                     51,  17,  10) \
 | 
			
		||||
    HANDLER(HomeMenuScreenDisplayedFlag,                              52,  17,  10) \
 | 
			
		||||
    HANDLER(DataManagementScreenDisplayedFlag,                        53,  17,  10) \
 | 
			
		||||
    HANDLER(ConnectionTestingFlag,                                    54,  17,  10) \
 | 
			
		||||
    HANDLER(ApplicationRunningFlag,                                   55,  17,  10) \
 | 
			
		||||
    HANDLER(DataCorruptionDetectedFlag,                               56,  17,  10) \
 | 
			
		||||
    HANDLER(ProductModel,                                             57,  18,  4 ) \
 | 
			
		||||
    HANDLER(CurrentLanguage,                                          58,  19,  4 ) \
 | 
			
		||||
    HANDLER(UseNetworkTimeProtocolFlag,                               59,  20,  10) \
 | 
			
		||||
    HANDLER(TimeZone,                                                 60,  21,  4 ) \
 | 
			
		||||
    HANDLER(ControllerFirmware,                                       61,  22,  4 ) \
 | 
			
		||||
    HANDLER(VideoOutputSetting,                                       62,  23,  4 ) \
 | 
			
		||||
    HANDLER(NANDFreeSpace,                                            63,  24,  0 ) \
 | 
			
		||||
    HANDLER(SDCardFreeSpace,                                          64,  25,  0 ) \
 | 
			
		||||
    HANDLER(SerialNumber,                                             65,  59,  4 ) \
 | 
			
		||||
    HANDLER(OsVersion,                                                66,  59,  4 ) \
 | 
			
		||||
    HANDLER(ScreenBrightnessAutoAdjustFlag,                           67,  26,  10) \
 | 
			
		||||
    HANDLER(HdmiAudioOutputMode,                                      68,  27,  4 ) \
 | 
			
		||||
    HANDLER(SpeakerAudioOutputMode,                                   69,  27,  4 ) \
 | 
			
		||||
    HANDLER(HeadphoneAudioOutputMode,                                 70,  27,  4 ) \
 | 
			
		||||
    HANDLER(MuteOnHeadsetUnpluggedFlag,                               71,  28,  10) \
 | 
			
		||||
    HANDLER(NumUserRegistered,                                        72,  29,  3 ) \
 | 
			
		||||
    HANDLER(StorageAutoOrganizeFlag,                                  73,  30,  10) \
 | 
			
		||||
    HANDLER(ControllerVibrationVolume,                                74,  31,  4 ) \
 | 
			
		||||
    HANDLER(LockScreenFlag,                                           75,  32,  10) \
 | 
			
		||||
    HANDLER(InternalBatteryLotNumber,                                 76,  33,  4 ) \
 | 
			
		||||
    HANDLER(LeftControllerSerialNumber,                               77,  34,  4 ) \
 | 
			
		||||
    HANDLER(RightControllerSerialNumber,                              78,  35,  4 ) \
 | 
			
		||||
    HANDLER(NotifyInGameDownloadCompletionFlag,                       79,  36,  10) \
 | 
			
		||||
    HANDLER(NotificationSoundFlag,                                    80,  36,  10) \
 | 
			
		||||
    HANDLER(TVResolutionSetting,                                      81,  37,  4 ) \
 | 
			
		||||
    HANDLER(RGBRangeSetting,                                          82,  37,  4 ) \
 | 
			
		||||
    HANDLER(ReduceScreenBurnFlag,                                     83,  37,  10) \
 | 
			
		||||
    HANDLER(TVAllowsCecFlag,                                          84,  37,  10) \
 | 
			
		||||
    HANDLER(HandheldModeTimeToScreenSleep,                            85,  38,  4 ) \
 | 
			
		||||
    HANDLER(ConsoleModeTimeToScreenSleep,                             86,  38,  4 ) \
 | 
			
		||||
    HANDLER(StopAutoSleepDuringContentPlayFlag,                       87,  38,  10) \
 | 
			
		||||
    HANDLER(LastConnectionTestDownloadSpeed,                          88,  39,  1 ) \
 | 
			
		||||
    HANDLER(LastConnectionTestUploadSpeed,                            89,  39,  1 ) \
 | 
			
		||||
    HANDLER(DEPRECATED_ServerFQDN,                                    90,  40,  4 ) \
 | 
			
		||||
    HANDLER(HTTPRequestContents,                                      91,  40,  4 ) \
 | 
			
		||||
    HANDLER(HTTPRequestResponseContents,                              92,  40,  4 ) \
 | 
			
		||||
    HANDLER(EdgeServerIPAddress,                                      93,  40,  4 ) \
 | 
			
		||||
    HANDLER(CDNContentPath,                                           94,  40,  4 ) \
 | 
			
		||||
    HANDLER(FileAccessPath,                                           95,  41,  4 ) \
 | 
			
		||||
    HANDLER(GameCardCID,                                              96,  42,  5 ) \
 | 
			
		||||
    HANDLER(NANDCID,                                                  97,  43,  5 ) \
 | 
			
		||||
    HANDLER(MicroSDCID,                                               98,  44,  5 ) \
 | 
			
		||||
    HANDLER(NANDSpeedMode,                                            99,  45,  4 ) \
 | 
			
		||||
    HANDLER(MicroSDSpeedMode,                                         100, 46,  4 ) \
 | 
			
		||||
    HANDLER(GameCardSpeedMode,                                        101, 47,  4 ) \
 | 
			
		||||
    HANDLER(UserAccountInternalID,                                    102, 48,  4 ) \
 | 
			
		||||
    HANDLER(NetworkServiceAccountInternalID,                          103, 49,  4 ) \
 | 
			
		||||
    HANDLER(NintendoAccountInternalID,                                104, 50,  4 ) \
 | 
			
		||||
    HANDLER(USB3AvailableFlag,                                        105, 51,  10) \
 | 
			
		||||
    HANDLER(CallStack,                                                106, 52,  4 ) \
 | 
			
		||||
    HANDLER(SystemStartupLog,                                         107, 53,  4 ) \
 | 
			
		||||
    HANDLER(RegionSetting,                                            108, 54,  4 ) \
 | 
			
		||||
    HANDLER(NintendoZoneConnectedFlag,                                109, 55,  10) \
 | 
			
		||||
    HANDLER(ForcedSleepHighTemperatureReading,                        110, 56,  1 ) \
 | 
			
		||||
    HANDLER(ForcedSleepFanSpeedReading,                               111, 56,  1 ) \
 | 
			
		||||
    HANDLER(ForcedSleepHWInfo,                                        112, 56,  4 ) \
 | 
			
		||||
    HANDLER(AbnormalPowerStateInfo,                                   113, 57,  1 ) \
 | 
			
		||||
    HANDLER(ScreenBrightnessLevel,                                    114, 26,  4 ) \
 | 
			
		||||
    HANDLER(ProgramId,                                                115, 1,   4 ) \
 | 
			
		||||
    HANDLER(AbortFlag,                                                116, 1,   10) \
 | 
			
		||||
    HANDLER(ReportVisibilityFlag,                                     117, 59,  10) \
 | 
			
		||||
    HANDLER(FatalFlag,                                                118, 1,   10) \
 | 
			
		||||
    HANDLER(OccurrenceTimestampNet,                                   119, 59,  2 ) \
 | 
			
		||||
    HANDLER(ResultBacktrace,                                          120, 1,   6 ) \
 | 
			
		||||
    HANDLER(GeneralRegisterAarch32,                                   121, 1,   6 ) \
 | 
			
		||||
    HANDLER(StackBacktrace32,                                         122, 1,   6 ) \
 | 
			
		||||
    HANDLER(ExceptionInfoAarch32,                                     123, 1,   6 ) \
 | 
			
		||||
    HANDLER(GeneralRegisterAarch64,                                   124, 1,   7 ) \
 | 
			
		||||
    HANDLER(ExceptionInfoAarch64,                                     125, 1,   7 ) \
 | 
			
		||||
    HANDLER(StackBacktrace64,                                         126, 1,   7 ) \
 | 
			
		||||
    HANDLER(RegisterSetFlag32,                                        127, 1,   1 ) \
 | 
			
		||||
    HANDLER(RegisterSetFlag64,                                        128, 1,   0 ) \
 | 
			
		||||
    HANDLER(ProgramMappedAddr32,                                      129, 1,   1 ) \
 | 
			
		||||
    HANDLER(ProgramMappedAddr64,                                      130, 1,   0 ) \
 | 
			
		||||
    HANDLER(AbortType,                                                131, 1,   1 ) \
 | 
			
		||||
    HANDLER(PrivateOsVersion,                                         132, 59,  4 ) \
 | 
			
		||||
    HANDLER(CurrentSystemPowerState,                                  133, 62,  1 ) \
 | 
			
		||||
    HANDLER(PreviousSystemPowerState,                                 134, 62,  1 ) \
 | 
			
		||||
    HANDLER(DestinationSystemPowerState,                              135, 62,  1 ) \
 | 
			
		||||
    HANDLER(PscTransitionCurrentState,                                136, 1,   1 ) \
 | 
			
		||||
    HANDLER(PscTransitionPreviousState,                               137, 1,   1 ) \
 | 
			
		||||
    HANDLER(PscInitializedList,                                       138, 1,   5 ) \
 | 
			
		||||
    HANDLER(PscCurrentPmStateList,                                    139, 1,   6 ) \
 | 
			
		||||
    HANDLER(PscNextPmStateList,                                       140, 1,   6 ) \
 | 
			
		||||
    HANDLER(PerformanceMode,                                          141, 63,  3 ) \
 | 
			
		||||
    HANDLER(PerformanceConfiguration,                                 142, 63,  1 ) \
 | 
			
		||||
    HANDLER(Throttled,                                                143, 64,  10) \
 | 
			
		||||
    HANDLER(ThrottlingDuration,                                       144, 64,  2 ) \
 | 
			
		||||
    HANDLER(ThrottlingTimestamp,                                      145, 64,  2 ) \
 | 
			
		||||
    HANDLER(GameCardCrcErrorCount,                                    146, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardAsicCrcErrorCount,                                147, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardRefreshCount,                                     148, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardReadRetryCount,                                   149, 65,  1 ) \
 | 
			
		||||
    HANDLER(EdidBlock,                                                150, 66,  5 ) \
 | 
			
		||||
    HANDLER(EdidExtensionBlock,                                       151, 66,  5 ) \
 | 
			
		||||
    HANDLER(CreateProcessFailureFlag,                                 152, 1,   10) \
 | 
			
		||||
    HANDLER(TemperaturePcb,                                           153, 67,  3 ) \
 | 
			
		||||
    HANDLER(TemperatureSoc,                                           154, 67,  3 ) \
 | 
			
		||||
    HANDLER(CurrentFanDuty,                                           155, 67,  3 ) \
 | 
			
		||||
    HANDLER(LastDvfsThresholdTripped,                                 156, 67,  3 ) \
 | 
			
		||||
    HANDLER(CradlePdcHFwVersion,                                      157, 68,  1 ) \
 | 
			
		||||
    HANDLER(CradlePdcAFwVersion,                                      158, 68,  1 ) \
 | 
			
		||||
    HANDLER(CradleMcuFwVersion,                                       159, 68,  1 ) \
 | 
			
		||||
    HANDLER(CradleDp2HdmiFwVersion,                                   160, 68,  1 ) \
 | 
			
		||||
    HANDLER(RunningApplicationId,                                     161, 69,  4 ) \
 | 
			
		||||
    HANDLER(RunningApplicationTitle,                                  162, 69,  4 ) \
 | 
			
		||||
    HANDLER(RunningApplicationVersion,                                163, 69,  4 ) \
 | 
			
		||||
    HANDLER(RunningApplicationStorageLocation,                        164, 69,  4 ) \
 | 
			
		||||
    HANDLER(RunningAppletList,                                        165, 70,  7 ) \
 | 
			
		||||
    HANDLER(FocusedAppletHistory,                                     166, 71,  7 ) \
 | 
			
		||||
    HANDLER(CompositorState,                                          167, 99,  4 ) \
 | 
			
		||||
    HANDLER(CompositorLayerState,                                     168, 100, 4 ) \
 | 
			
		||||
    HANDLER(CompositorDisplayState,                                   169, 101, 4 ) \
 | 
			
		||||
    HANDLER(CompositorHWCState,                                       170, 102, 4 ) \
 | 
			
		||||
    HANDLER(InputCurrentLimit,                                        171, 73,  3 ) \
 | 
			
		||||
    HANDLER(BoostModeCurrentLimit,                                    172, 73,  3 ) \
 | 
			
		||||
    HANDLER(FastChargeCurrentLimit,                                   173, 73,  3 ) \
 | 
			
		||||
    HANDLER(ChargeVoltageLimit,                                       174, 73,  3 ) \
 | 
			
		||||
    HANDLER(ChargeConfiguration,                                      175, 73,  3 ) \
 | 
			
		||||
    HANDLER(HizMode,                                                  176, 73,  10) \
 | 
			
		||||
    HANDLER(ChargeEnabled,                                            177, 73,  10) \
 | 
			
		||||
    HANDLER(PowerSupplyPath,                                          178, 73,  3 ) \
 | 
			
		||||
    HANDLER(BatteryTemperature,                                       179, 73,  3 ) \
 | 
			
		||||
    HANDLER(BatteryChargePercent,                                     180, 73,  3 ) \
 | 
			
		||||
    HANDLER(BatteryChargeVoltage,                                     181, 73,  3 ) \
 | 
			
		||||
    HANDLER(BatteryAge,                                               182, 73,  3 ) \
 | 
			
		||||
    HANDLER(PowerRole,                                                183, 73,  3 ) \
 | 
			
		||||
    HANDLER(PowerSupplyType,                                          184, 73,  3 ) \
 | 
			
		||||
    HANDLER(PowerSupplyVoltage,                                       185, 73,  3 ) \
 | 
			
		||||
    HANDLER(PowerSupplyCurrent,                                       186, 73,  3 ) \
 | 
			
		||||
    HANDLER(FastBatteryChargingEnabled,                               187, 73,  10) \
 | 
			
		||||
    HANDLER(ControllerPowerSupplyAcquired,                            188, 73,  10) \
 | 
			
		||||
    HANDLER(OtgRequested,                                             189, 73,  10) \
 | 
			
		||||
    HANDLER(NANDPreEolInfo,                                           190, 74,  1 ) \
 | 
			
		||||
    HANDLER(NANDDeviceLifeTimeEstTypA,                                191, 74,  1 ) \
 | 
			
		||||
    HANDLER(NANDDeviceLifeTimeEstTypB,                                192, 74,  1 ) \
 | 
			
		||||
    HANDLER(NANDPatrolCount,                                          193, 75,  1 ) \
 | 
			
		||||
    HANDLER(NANDNumActivationFailures,                                194, 76,  1 ) \
 | 
			
		||||
    HANDLER(NANDNumActivationErrorCorrections,                        195, 76,  1 ) \
 | 
			
		||||
    HANDLER(NANDNumReadWriteFailures,                                 196, 76,  1 ) \
 | 
			
		||||
    HANDLER(NANDNumReadWriteErrorCorrections,                         197, 76,  1 ) \
 | 
			
		||||
    HANDLER(NANDErrorLog,                                             198, 77,  4 ) \
 | 
			
		||||
    HANDLER(SdCardUserAreaSize,                                       199, 78,  2 ) \
 | 
			
		||||
    HANDLER(SdCardProtectedAreaSize,                                  200, 78,  2 ) \
 | 
			
		||||
    HANDLER(SdCardNumActivationFailures,                              201, 79,  1 ) \
 | 
			
		||||
    HANDLER(SdCardNumActivationErrorCorrections,                      202, 79,  1 ) \
 | 
			
		||||
    HANDLER(SdCardNumReadWriteFailures,                               203, 79,  1 ) \
 | 
			
		||||
    HANDLER(SdCardNumReadWriteErrorCorrections,                       204, 79,  1 ) \
 | 
			
		||||
    HANDLER(SdCardErrorLog,                                           205, 80,  4 ) \
 | 
			
		||||
    HANDLER(EncryptionKey,                                            206, 1,   5 ) \
 | 
			
		||||
    HANDLER(EncryptedExceptionInfo,                                   207, 1,   5 ) \
 | 
			
		||||
    HANDLER(GameCardTimeoutRetryErrorCount,                           208, 65,  1 ) \
 | 
			
		||||
    HANDLER(FsRemountForDataCorruptCount,                             209, 81,  1 ) \
 | 
			
		||||
    HANDLER(FsRemountForDataCorruptRetryOutCount,                     210, 81,  1 ) \
 | 
			
		||||
    HANDLER(GameCardInsertionCount,                                   211, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardRemovalCount,                                     212, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardAsicInitializeCount,                              213, 65,  1 ) \
 | 
			
		||||
    HANDLER(TestU16,                                                  214, 0,   11) \
 | 
			
		||||
    HANDLER(TestU8,                                                   215, 0,   12) \
 | 
			
		||||
    HANDLER(TestI16,                                                  216, 0,   13) \
 | 
			
		||||
    HANDLER(TestI8,                                                   217, 0,   14) \
 | 
			
		||||
    HANDLER(SystemAppletScene,                                        218, 82,  12) \
 | 
			
		||||
    HANDLER(CodecType,                                                219, 83,  1 ) \
 | 
			
		||||
    HANDLER(DecodeBuffers,                                            220, 83,  1 ) \
 | 
			
		||||
    HANDLER(FrameWidth,                                               221, 83,  3 ) \
 | 
			
		||||
    HANDLER(FrameHeight,                                              222, 83,  3 ) \
 | 
			
		||||
    HANDLER(ColorPrimaries,                                           223, 83,  12) \
 | 
			
		||||
    HANDLER(TransferCharacteristics,                                  224, 83,  12) \
 | 
			
		||||
    HANDLER(MatrixCoefficients,                                       225, 83,  12) \
 | 
			
		||||
    HANDLER(DisplayWidth,                                             226, 83,  3 ) \
 | 
			
		||||
    HANDLER(DisplayHeight,                                            227, 83,  3 ) \
 | 
			
		||||
    HANDLER(DARWidth,                                                 228, 83,  3 ) \
 | 
			
		||||
    HANDLER(DARHeight,                                                229, 83,  3 ) \
 | 
			
		||||
    HANDLER(ColorFormat,                                              230, 83,  1 ) \
 | 
			
		||||
    HANDLER(ColorSpace,                                               231, 83,  4 ) \
 | 
			
		||||
    HANDLER(SurfaceLayout,                                            232, 83,  4 ) \
 | 
			
		||||
    HANDLER(BitStream,                                                233, 83,  5 ) \
 | 
			
		||||
    HANDLER(VideoDecState,                                            234, 83,  4 ) \
 | 
			
		||||
    HANDLER(GpuErrorChannelId,                                        235, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorAruId,                                            236, 84,  0 ) \
 | 
			
		||||
    HANDLER(GpuErrorType,                                             237, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorFaultInfo,                                        238, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorWriteAccess,                                      239, 84,  10) \
 | 
			
		||||
    HANDLER(GpuErrorFaultAddress,                                     240, 84,  0 ) \
 | 
			
		||||
    HANDLER(GpuErrorFaultUnit,                                        241, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorFaultType,                                        242, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorHwContextPointer,                                 243, 84,  0 ) \
 | 
			
		||||
    HANDLER(GpuErrorContextStatus,                                    244, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaIntr,                                        245, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaErrorType,                                   246, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaHeaderShadow,                                247, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaHeader,                                      248, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaGpShadow0,                                   249, 84,  1 ) \
 | 
			
		||||
    HANDLER(GpuErrorPbdmaGpShadow1,                                   250, 84,  1 ) \
 | 
			
		||||
    HANDLER(AccessPointChannel,                                       251, 60,  11) \
 | 
			
		||||
    HANDLER(ThreadName,                                               252, 1,   4 ) \
 | 
			
		||||
    HANDLER(AdspExceptionRegisters,                                   253, 86,  6 ) \
 | 
			
		||||
    HANDLER(AdspExceptionSpsr,                                        254, 86,  1 ) \
 | 
			
		||||
    HANDLER(AdspExceptionProgramCounter,                              255, 86,  1 ) \
 | 
			
		||||
    HANDLER(AdspExceptionLinkRegister,                                256, 86,  1 ) \
 | 
			
		||||
    HANDLER(AdspExceptionStackPointer,                                257, 86,  1 ) \
 | 
			
		||||
    HANDLER(AdspExceptionArmModeRegisters,                            258, 86,  6 ) \
 | 
			
		||||
    HANDLER(AdspExceptionStackAddress,                                259, 86,  1 ) \
 | 
			
		||||
    HANDLER(AdspExceptionStackDump,                                   260, 86,  6 ) \
 | 
			
		||||
    HANDLER(AdspExceptionReason,                                      261, 86,  1 ) \
 | 
			
		||||
    HANDLER(OscillatorClock,                                          262, 85,  1 ) \
 | 
			
		||||
    HANDLER(CpuDvfsTableClocks,                                       263, 85,  6 ) \
 | 
			
		||||
    HANDLER(CpuDvfsTableVoltages,                                     264, 85,  8 ) \
 | 
			
		||||
    HANDLER(GpuDvfsTableClocks,                                       265, 85,  6 ) \
 | 
			
		||||
    HANDLER(GpuDvfsTableVoltages,                                     266, 85,  8 ) \
 | 
			
		||||
    HANDLER(EmcDvfsTableClocks,                                       267, 85,  6 ) \
 | 
			
		||||
    HANDLER(EmcDvfsTableVoltages,                                     268, 85,  8 ) \
 | 
			
		||||
    HANDLER(ModuleClockFrequencies,                                   269, 85,  6 ) \
 | 
			
		||||
    HANDLER(ModuleClockEnableFlags,                                   270, 85,  5 ) \
 | 
			
		||||
    HANDLER(ModulePowerEnableFlags,                                   271, 85,  5 ) \
 | 
			
		||||
    HANDLER(ModuleResetAssertFlags,                                   272, 85,  5 ) \
 | 
			
		||||
    HANDLER(ModuleMinimumVoltageClockRates,                           273, 85,  6 ) \
 | 
			
		||||
    HANDLER(PowerDomainEnableFlags,                                   274, 85,  5 ) \
 | 
			
		||||
    HANDLER(PowerDomainVoltages,                                      275, 85,  8 ) \
 | 
			
		||||
    HANDLER(AccessPointRssi,                                          276, 58,  3 ) \
 | 
			
		||||
    HANDLER(FuseInfo,                                                 277, 85,  6 ) \
 | 
			
		||||
    HANDLER(VideoLog,                                                 278, 83,  4 ) \
 | 
			
		||||
    HANDLER(GameCardDeviceId,                                         279, 42,  5 ) \
 | 
			
		||||
    HANDLER(GameCardAsicReinitializeCount,                            280, 65,  11) \
 | 
			
		||||
    HANDLER(GameCardAsicReinitializeFailureCount,                     281, 65,  11) \
 | 
			
		||||
    HANDLER(GameCardAsicReinitializeFailureDetail,                    282, 65,  11) \
 | 
			
		||||
    HANDLER(GameCardRefreshSuccessCount,                              283, 65,  11) \
 | 
			
		||||
    HANDLER(GameCardAwakenCount,                                      284, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardAwakenFailureCount,                               285, 65,  11) \
 | 
			
		||||
    HANDLER(GameCardReadCountFromInsert,                              286, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardReadCountFromAwaken,                              287, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardLastReadErrorPageAddress,                         288, 65,  1 ) \
 | 
			
		||||
    HANDLER(GameCardLastReadErrorPageCount,                           289, 65,  1 ) \
 | 
			
		||||
    HANDLER(AppletManagerContextTrace,                                290, 1,   8 ) \
 | 
			
		||||
    HANDLER(NvDispIsRegistered,                                       291, 87,  10) \
 | 
			
		||||
    HANDLER(NvDispIsSuspend,                                          292, 87,  10) \
 | 
			
		||||
    HANDLER(NvDispDC0SurfaceNum,                                      293, 87,  8 ) \
 | 
			
		||||
    HANDLER(NvDispDC1SurfaceNum,                                      294, 87,  8 ) \
 | 
			
		||||
    HANDLER(NvDispWindowSrcRectX,                                     295, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowSrcRectY,                                     296, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowSrcRectWidth,                                 297, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowSrcRectHeight,                                298, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowDstRectX,                                     299, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowDstRectY,                                     300, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowDstRectWidth,                                 301, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowDstRectHeight,                                302, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowIndex,                                        303, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowBlendOperation,                               304, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowAlphaOperation,                               305, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowDepth,                                        306, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowAlpha,                                        307, 88,  12) \
 | 
			
		||||
    HANDLER(NvDispWindowHFilter,                                      308, 88,  10) \
 | 
			
		||||
    HANDLER(NvDispWindowVFilter,                                      309, 88,  10) \
 | 
			
		||||
    HANDLER(NvDispWindowOptions,                                      310, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispWindowSyncPointId,                                  311, 88,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPSorPower,                                         312, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPClkType,                                          313, 89,  12) \
 | 
			
		||||
    HANDLER(NvDispDPEnable,                                           314, 89,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPState,                                            315, 89,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPEdid,                                             316, 89,  5 ) \
 | 
			
		||||
    HANDLER(NvDispDPEdidSize,                                         317, 89,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPEdidExtSize,                                      318, 89,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPFakeMode,                                         319, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPModeNumber,                                       320, 89,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPPlugInOut,                                        321, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPAuxIntHandler,                                    322, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPForceMaxLinkBW,                                   323, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPIsConnected,                                      324, 89,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkValid,                                        325, 90,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkMaxBW,                                        326, 90,  12) \
 | 
			
		||||
    HANDLER(NvDispDPLinkMaxLaneCount,                                 327, 90,  12) \
 | 
			
		||||
    HANDLER(NvDispDPLinkDownSpread,                                   328, 90,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkSupportEnhancedFraming,                       329, 90,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkBpp,                                          330, 90,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkScaramberCap,                                 331, 90,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkBW,                                           332, 91,  12) \
 | 
			
		||||
    HANDLER(NvDispDPLinkLaneCount,                                    333, 91,  12) \
 | 
			
		||||
    HANDLER(NvDispDPLinkEnhancedFraming,                              334, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkScrambleEnable,                               335, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkActivePolarity,                               336, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkActiveCount,                                  337, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkTUSize,                                       338, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkActiveFrac,                                   339, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkWatermark,                                    340, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkHBlank,                                       341, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkVBlank,                                       342, 91,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDPLinkOnlyEnhancedFraming,                          343, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkOnlyEdpCap,                                   344, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkSupportFastLT,                                345, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkLTDataValid,                                  346, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkTsp3Support,                                  347, 91,  10) \
 | 
			
		||||
    HANDLER(NvDispDPLinkAuxInterval,                                  348, 91,  12) \
 | 
			
		||||
    HANDLER(NvDispHdcpCreated,                                        349, 92,  10) \
 | 
			
		||||
    HANDLER(NvDispHdcpUserRequest,                                    350, 92,  10) \
 | 
			
		||||
    HANDLER(NvDispHdcpPlugged,                                        351, 92,  10) \
 | 
			
		||||
    HANDLER(NvDispHdcpState,                                          352, 92,  1 ) \
 | 
			
		||||
    HANDLER(NvDispHdcpFailCount,                                      353, 92,  3 ) \
 | 
			
		||||
    HANDLER(NvDispHdcpHdcp22,                                         354, 92,  14) \
 | 
			
		||||
    HANDLER(NvDispHdcpMaxRetry,                                       355, 92,  12) \
 | 
			
		||||
    HANDLER(NvDispHdcpHpd,                                            356, 92,  12) \
 | 
			
		||||
    HANDLER(NvDispHdcpRepeater,                                       357, 92,  12) \
 | 
			
		||||
    HANDLER(NvDispCecRxBuf,                                           358, 93,  5 ) \
 | 
			
		||||
    HANDLER(NvDispCecRxLength,                                        359, 93,  3 ) \
 | 
			
		||||
    HANDLER(NvDispCecTxBuf,                                           360, 93,  5 ) \
 | 
			
		||||
    HANDLER(NvDispCecTxLength,                                        361, 93,  3 ) \
 | 
			
		||||
    HANDLER(NvDispCecTxRet,                                           362, 93,  3 ) \
 | 
			
		||||
    HANDLER(NvDispCecState,                                           363, 93,  1 ) \
 | 
			
		||||
    HANDLER(NvDispCecTxInfo,                                          364, 93,  12) \
 | 
			
		||||
    HANDLER(NvDispCecRxInfo,                                          365, 93,  12) \
 | 
			
		||||
    HANDLER(NvDispDCIndex,                                            366, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCInitialize,                                       367, 94,  10) \
 | 
			
		||||
    HANDLER(NvDispDCClock,                                            368, 94,  10) \
 | 
			
		||||
    HANDLER(NvDispDCFrequency,                                        369, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCFailed,                                           370, 94,  10) \
 | 
			
		||||
    HANDLER(NvDispDCModeWidth,                                        371, 94,  3 ) \
 | 
			
		||||
    HANDLER(NvDispDCModeHeight,                                       372, 94,  3 ) \
 | 
			
		||||
    HANDLER(NvDispDCModeBpp,                                          373, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCPanelFrequency,                                   374, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCWinDirty,                                         375, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCWinEnable,                                        376, 94,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDCVrr,                                              377, 94,  10) \
 | 
			
		||||
    HANDLER(NvDispDCPanelInitialize,                                  378, 94,  10) \
 | 
			
		||||
    HANDLER(NvDispDsiDataFormat,                                      379, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiVideoMode,                                       380, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiRefreshRate,                                     381, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiLpCmdModeFrequency,                              382, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiHsCmdModeFrequency,                              383, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiPanelResetTimeout,                               384, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiPhyFrequency,                                    385, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiFrequency,                                       386, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDsiInstance,                                        387, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDcDsiHostCtrlEnable,                                388, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiInit,                                          389, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiEnable,                                        390, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiHsMode,                                        391, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiVendorId,                                      392, 95,  5 ) \
 | 
			
		||||
    HANDLER(NvDispDcDsiLcdVendorNum,                                  393, 95,  12) \
 | 
			
		||||
    HANDLER(NvDispDcDsiHsClockControl,                                394, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDcDsiEnableHsClockInLpMode,                         395, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiTeFrameUpdate,                                 396, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispDcDsiGangedType,                                    397, 95,  1 ) \
 | 
			
		||||
    HANDLER(NvDispDcDsiHbpInPktSeq,                                   398, 95,  10) \
 | 
			
		||||
    HANDLER(NvDispErrID,                                              399, 96,  1 ) \
 | 
			
		||||
    HANDLER(NvDispErrData0,                                           400, 96,  1 ) \
 | 
			
		||||
    HANDLER(NvDispErrData1,                                           401, 96,  1 ) \
 | 
			
		||||
    HANDLER(SdCardMountStatus,                                        402, 97,  4 ) \
 | 
			
		||||
    HANDLER(SdCardMountUnexpectedResult,                              403, 97,  4 ) \
 | 
			
		||||
    HANDLER(NANDTotalSize,                                            404, 24,  0 ) \
 | 
			
		||||
    HANDLER(SdCardTotalSize,                                          405, 25,  0 ) \
 | 
			
		||||
    HANDLER(ElapsedTimeSinceInitialLaunch,                            406, 59,  2 ) \
 | 
			
		||||
    HANDLER(ElapsedTimeSincePowerOn,                                  407, 59,  2 ) \
 | 
			
		||||
    HANDLER(ElapsedTimeSinceLastAwake,                                408, 59,  2 ) \
 | 
			
		||||
    HANDLER(OccurrenceTick,                                           409, 59,  2 ) \
 | 
			
		||||
    HANDLER(RetailInteractiveDisplayFlag,                             410, 98,  10) \
 | 
			
		||||
    HANDLER(FatFsError,                                               411, 81,  3 ) \
 | 
			
		||||
    HANDLER(FatFsExtraError,                                          412, 81,  3 ) \
 | 
			
		||||
    HANDLER(FatFsErrorDrive,                                          413, 81,  3 ) \
 | 
			
		||||
    HANDLER(FatFsErrorName,                                           414, 81,  4 ) \
 | 
			
		||||
    HANDLER(MonitorManufactureCode,                                   415, 103, 4 ) \
 | 
			
		||||
    HANDLER(MonitorProductCode,                                       416, 103, 11) \
 | 
			
		||||
    HANDLER(MonitorSerialNumber,                                      417, 103, 1 ) \
 | 
			
		||||
    HANDLER(MonitorManufactureYear,                                   418, 103, 3 ) \
 | 
			
		||||
    HANDLER(PhysicalAddress,                                          419, 103, 11) \
 | 
			
		||||
    HANDLER(Is4k60Hz,                                                 420, 103, 10) \
 | 
			
		||||
    HANDLER(Is4k30Hz,                                                 421, 103, 10) \
 | 
			
		||||
    HANDLER(Is1080P60Hz,                                              422, 103, 10) \
 | 
			
		||||
    HANDLER(Is720P60Hz,                                               423, 103, 10) \
 | 
			
		||||
    HANDLER(PcmChannelMax,                                            424, 103, 3 ) \
 | 
			
		||||
    HANDLER(CrashReportHash,                                          425, 1,   5 ) \
 | 
			
		||||
    HANDLER(ErrorReportSharePermission,                               426, 104, 12) \
 | 
			
		||||
    HANDLER(VideoCodecTypeEnum,                                       427, 105, 3 ) \
 | 
			
		||||
    HANDLER(VideoBitRate,                                             428, 105, 3 ) \
 | 
			
		||||
    HANDLER(VideoFrameRate,                                           429, 105, 3 ) \
 | 
			
		||||
    HANDLER(VideoWidth,                                               430, 105, 3 ) \
 | 
			
		||||
    HANDLER(VideoHeight,                                              431, 105, 3 ) \
 | 
			
		||||
    HANDLER(AudioCodecTypeEnum,                                       432, 105, 3 ) \
 | 
			
		||||
    HANDLER(AudioSampleRate,                                          433, 105, 3 ) \
 | 
			
		||||
    HANDLER(AudioChannelCount,                                        434, 105, 3 ) \
 | 
			
		||||
    HANDLER(AudioBitRate,                                             435, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaContainerType,                                  436, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaProfileType,                                    437, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaLevelType,                                      438, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaCacheSizeEnum,                                  439, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaErrorStatusEnum,                                440, 105, 3 ) \
 | 
			
		||||
    HANDLER(MultimediaErrorLog,                                       441, 105, 5 ) \
 | 
			
		||||
    HANDLER(ServerFqdn,                                               442, 1,   4 ) \
 | 
			
		||||
    HANDLER(ServerIpAddress,                                          443, 1,   4 ) \
 | 
			
		||||
    HANDLER(TestStringEncrypt,                                        444, 0,   4 ) \
 | 
			
		||||
    HANDLER(TestU8ArrayEncrypt,                                       445, 0,   5 ) \
 | 
			
		||||
    HANDLER(TestU32ArrayEncrypt,                                      446, 0,   6 ) \
 | 
			
		||||
    HANDLER(TestU64ArrayEncrypt,                                      447, 0,   7 ) \
 | 
			
		||||
    HANDLER(TestI32ArrayEncrypt,                                      448, 0,   8 ) \
 | 
			
		||||
    HANDLER(TestI64ArrayEncrypt,                                      449, 0,   9 ) \
 | 
			
		||||
    HANDLER(CipherKey,                                                450, 59,  5 ) \
 | 
			
		||||
    HANDLER(FileSystemPath,                                           451, 1,   4 ) \
 | 
			
		||||
    HANDLER(WebMediaPlayerOpenUrl,                                    452, 1,   4 ) \
 | 
			
		||||
    HANDLER(WebMediaPlayerLastSocketErrors,                           453, 1,   8 ) \
 | 
			
		||||
    HANDLER(UnknownControllerCount,                                   454, 106, 12) \
 | 
			
		||||
    HANDLER(AttachedControllerCount,                                  455, 106, 12) \
 | 
			
		||||
    HANDLER(BluetoothControllerCount,                                 456, 106, 12) \
 | 
			
		||||
    HANDLER(UsbControllerCount,                                       457, 106, 12) \
 | 
			
		||||
    HANDLER(ControllerTypeList,                                       458, 106, 5 ) \
 | 
			
		||||
    HANDLER(ControllerInterfaceList,                                  459, 106, 5 ) \
 | 
			
		||||
    HANDLER(ControllerStyleList,                                      460, 106, 5 ) \
 | 
			
		||||
    HANDLER(FsPooledBufferPeakFreeSize,                               461, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsPooledBufferRetriedCount,                               462, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsPooledBufferReduceAllocationCount,                      463, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsBufferManagerPeakFreeSize,                              464, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsBufferManagerRetriedCount,                              465, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsExpHeapPeakFreeSize,                                    466, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsBufferPoolPeakFreeSize,                                 467, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsPatrolReadAllocateBufferSuccessCount,                   468, 107, 0 ) \
 | 
			
		||||
    HANDLER(FsPatrolReadAllocateBufferFailureCount,                   469, 107, 0 ) \
 | 
			
		||||
    HANDLER(SteadyClockInternalOffset,                                470, 59,  2 ) \
 | 
			
		||||
    HANDLER(SteadyClockCurrentTimePointValue,                         471, 59,  2 ) \
 | 
			
		||||
    HANDLER(UserClockContextOffset,                                   472, 108, 2 ) \
 | 
			
		||||
    HANDLER(UserClockContextTimeStampValue,                           473, 108, 2 ) \
 | 
			
		||||
    HANDLER(NetworkClockContextOffset,                                474, 109, 2 ) \
 | 
			
		||||
    HANDLER(NetworkClockContextTimeStampValue,                        475, 109, 2 ) \
 | 
			
		||||
    HANDLER(SystemAbortFlag,                                          476, 1,   10) \
 | 
			
		||||
    HANDLER(ApplicationAbortFlag,                                     477, 1,   10) \
 | 
			
		||||
    HANDLER(NifmErrorCode,                                            478, 2,   4 ) \
 | 
			
		||||
    HANDLER(LcsApplicationId,                                         479, 1,   4 ) \
 | 
			
		||||
    HANDLER(LcsContentMetaKeyIdList,                                  480, 1,   7 ) \
 | 
			
		||||
    HANDLER(LcsContentMetaKeyVersionList,                             481, 1,   6 ) \
 | 
			
		||||
    HANDLER(LcsContentMetaKeyTypeList,                                482, 1,   5 ) \
 | 
			
		||||
    HANDLER(LcsContentMetaKeyInstallTypeList,                         483, 1,   5 ) \
 | 
			
		||||
    HANDLER(LcsSenderFlag,                                            484, 1,   10) \
 | 
			
		||||
    HANDLER(LcsApplicationRequestFlag,                                485, 1,   10) \
 | 
			
		||||
    HANDLER(LcsHasExFatDriverFlag,                                    486, 1,   10) \
 | 
			
		||||
    HANDLER(LcsIpAddress,                                             487, 1,   1 ) \
 | 
			
		||||
    HANDLER(AcpStartupUserAccount,                                    488, 110, 12) \
 | 
			
		||||
    HANDLER(AcpAocRegistrationType,                                   489, 112, 12) \
 | 
			
		||||
    HANDLER(AcpAttributeFlag,                                         490, 110, 1 ) \
 | 
			
		||||
    HANDLER(AcpSupportedLanguageFlag,                                 491, 110, 1 ) \
 | 
			
		||||
    HANDLER(AcpParentalControlFlag,                                   492, 110, 1 ) \
 | 
			
		||||
    HANDLER(AcpScreenShot,                                            493, 110, 12) \
 | 
			
		||||
    HANDLER(AcpVideoCapture,                                          494, 110, 12) \
 | 
			
		||||
    HANDLER(AcpDataLossConfirmation,                                  495, 110, 12) \
 | 
			
		||||
    HANDLER(AcpPlayLogPolicy,                                         496, 111, 12) \
 | 
			
		||||
    HANDLER(AcpPresenceGroupId,                                       497, 110, 0 ) \
 | 
			
		||||
    HANDLER(AcpRatingAge,                                             498, 115, 15) \
 | 
			
		||||
    HANDLER(AcpAocBaseId,                                             499, 112, 0 ) \
 | 
			
		||||
    HANDLER(AcpSaveDataOwnerId,                                       500, 114, 0 ) \
 | 
			
		||||
    HANDLER(AcpUserAccountSaveDataSize,                               501, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpUserAccountSaveDataJournalSize,                        502, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpDeviceSaveDataSize,                                    503, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpDeviceSaveDataJournalSize,                             504, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpBcatDeliveryCacheStorageSize,                          505, 113, 2 ) \
 | 
			
		||||
    HANDLER(AcpApplicationErrorCodeCategory,                          506, 110, 4 ) \
 | 
			
		||||
    HANDLER(AcpLocalCommunicationId,                                  507, 110, 7 ) \
 | 
			
		||||
    HANDLER(AcpLogoType,                                              508, 110, 12) \
 | 
			
		||||
    HANDLER(AcpLogoHandling,                                          509, 110, 12) \
 | 
			
		||||
    HANDLER(AcpRuntimeAocInstall,                                     510, 112, 12) \
 | 
			
		||||
    HANDLER(AcpCrashReport,                                           511, 110, 12) \
 | 
			
		||||
    HANDLER(AcpHdcp,                                                  512, 110, 12) \
 | 
			
		||||
    HANDLER(AcpSeedForPseudoDeviceId,                                 513, 110, 0 ) \
 | 
			
		||||
    HANDLER(AcpBcatPassphrase,                                        514, 113, 4 ) \
 | 
			
		||||
    HANDLER(AcpUserAccountSaveDataSizeMax,                            515, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpUserAccountSaveDataJournalSizeMax,                     516, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpDeviceSaveDataSizeMax,                                 517, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpDeviceSaveDataJournalSizeMax,                          518, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpTemporaryStorageSize,                                  519, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpCacheStorageSize,                                      520, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpCacheStorageJournalSize,                               521, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpCacheStorageDataAndJournalSizeMax,                     522, 114, 2 ) \
 | 
			
		||||
    HANDLER(AcpCacheStorageIndexMax,                                  523, 114, 13) \
 | 
			
		||||
    HANDLER(AcpPlayLogQueryableApplicationId,                         524, 111, 7 ) \
 | 
			
		||||
    HANDLER(AcpPlayLogQueryCapability,                                525, 111, 12) \
 | 
			
		||||
    HANDLER(AcpRepairFlag,                                            526, 110, 12) \
 | 
			
		||||
    HANDLER(RunningApplicationPatchStorageLocation,                   527, 69,  4 ) \
 | 
			
		||||
    HANDLER(RunningApplicationVersionNumber,                          528, 69,  1 ) \
 | 
			
		||||
    HANDLER(FsRecoveredByInvalidateCacheCount,                        529, 81,  1 ) \
 | 
			
		||||
    HANDLER(FsSaveDataIndexCount,                                     530, 81,  1 ) \
 | 
			
		||||
    HANDLER(FsBufferManagerPeakTotalAllocatableSize,                  531, 107, 0 ) \
 | 
			
		||||
    HANDLER(MonitorCurrentWidth,                                      532, 116, 11) \
 | 
			
		||||
    HANDLER(MonitorCurrentHeight,                                     533, 116, 11) \
 | 
			
		||||
    HANDLER(MonitorCurrentRefreshRate,                                534, 116, 4 ) \
 | 
			
		||||
    HANDLER(RebootlessSystemUpdateVersion,                            535, 117, 4 ) \
 | 
			
		||||
    HANDLER(EncryptedExceptionInfo1,                                  536, 1,   5 ) \
 | 
			
		||||
    HANDLER(EncryptedExceptionInfo2,                                  537, 1,   5 ) \
 | 
			
		||||
    HANDLER(EncryptedExceptionInfo3,                                  538, 1,   5 ) \
 | 
			
		||||
    HANDLER(EncryptedDyingMessage,                                    539, 1,   5 ) \
 | 
			
		||||
    HANDLER(DramId,                                                   540, 85,  1 ) \
 | 
			
		||||
    HANDLER(NifmConnectionTestRedirectUrl,                            541, 118, 4 ) \
 | 
			
		||||
    HANDLER(AcpRequiredNetworkServiceLicenseOnLaunchFlag,             542, 110, 12) \
 | 
			
		||||
    HANDLER(PciePort0Flags,                                           543, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort0Speed,                                           544, 119, 12) \
 | 
			
		||||
    HANDLER(PciePort0ResetTimeInUs,                                   545, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort0IrqCount,                                        546, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort0Statistics,                                      547, 119, 6 ) \
 | 
			
		||||
    HANDLER(PciePort1Flags,                                           548, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort1Speed,                                           549, 119, 12) \
 | 
			
		||||
    HANDLER(PciePort1ResetTimeInUs,                                   550, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort1IrqCount,                                        551, 119, 1 ) \
 | 
			
		||||
    HANDLER(PciePort1Statistics,                                      552, 119, 6 ) \
 | 
			
		||||
    HANDLER(PcieFunction0VendorId,                                    553, 119, 11) \
 | 
			
		||||
    HANDLER(PcieFunction0DeviceId,                                    554, 119, 11) \
 | 
			
		||||
    HANDLER(PcieFunction0PmState,                                     555, 119, 12) \
 | 
			
		||||
    HANDLER(PcieFunction0IsAcquired,                                  556, 119, 10) \
 | 
			
		||||
    HANDLER(PcieFunction1VendorId,                                    557, 119, 11) \
 | 
			
		||||
    HANDLER(PcieFunction1DeviceId,                                    558, 119, 11) \
 | 
			
		||||
    HANDLER(PcieFunction1PmState,                                     559, 119, 12) \
 | 
			
		||||
    HANDLER(PcieFunction1IsAcquired,                                  560, 119, 10) \
 | 
			
		||||
    HANDLER(PcieGlobalRootComplexStatistics,                          561, 119, 6 ) \
 | 
			
		||||
    HANDLER(PciePllResistorCalibrationValue,                          562, 119, 12) \
 | 
			
		||||
    HANDLER(CertificateRequestedHostName,                             563, 120, 4 ) \
 | 
			
		||||
    HANDLER(CertificateCommonName,                                    564, 120, 4 ) \
 | 
			
		||||
    HANDLER(CertificateSANCount,                                      565, 120, 1 ) \
 | 
			
		||||
    HANDLER(CertificateSANs,                                          566, 120, 4 ) \
 | 
			
		||||
    HANDLER(FsBufferPoolMaxAllocateSize,                              567, 107, 0 ) \
 | 
			
		||||
    HANDLER(CertificateIssuerName,                                    568, 120, 4 ) \
 | 
			
		||||
    HANDLER(ApplicationAliveTime,                                     569, 59,  2 ) \
 | 
			
		||||
    HANDLER(ApplicationInFocusTime,                                   570, 59,  2 ) \
 | 
			
		||||
    HANDLER(ApplicationOutOfFocusTime,                                571, 59,  2 ) \
 | 
			
		||||
    HANDLER(ApplicationBackgroundFocusTime,                           572, 59,  2 ) \
 | 
			
		||||
    HANDLER(AcpUserAccountSwitchLock,                                 573, 110, 12) \
 | 
			
		||||
    HANDLER(USB3HostAvailableFlag,                                    574, 51,  10) \
 | 
			
		||||
    HANDLER(USB3DeviceAvailableFlag,                                  575, 51,  10) \
 | 
			
		||||
    HANDLER(AcpNeighborDetectionClientConfigurationSendDataId,        576, 121, 0 ) \
 | 
			
		||||
    HANDLER(AcpNeighborDetectionClientConfigurationReceivableDataIds, 577, 121, 7 ) \
 | 
			
		||||
    HANDLER(AcpStartupUserAccountOptionFlag,                          578, 110, 12) \
 | 
			
		||||
    HANDLER(ServerErrorCode,                                          579, 1,   4 ) \
 | 
			
		||||
    HANDLER(AppletManagerMetaLogTrace,                                580, 1,   7 ) \
 | 
			
		||||
    HANDLER(ServerCertificateSerialNumber,                            581, 120, 4 ) \
 | 
			
		||||
    HANDLER(ServerCertificatePublicKeyAlgorithm,                      582, 120, 4 ) \
 | 
			
		||||
    HANDLER(ServerCertificateSignatureAlgorithm,                      583, 120, 4 ) \
 | 
			
		||||
    HANDLER(ServerCertificateNotBefore,                               584, 120, 0 ) \
 | 
			
		||||
    HANDLER(ServerCertificateNotAfter,                                585, 120, 0 ) \
 | 
			
		||||
    HANDLER(CertificateAlgorithmInfoBits,                             586, 120, 0 ) \
 | 
			
		||||
    HANDLER(TlsConnectionPeerIpAddress,                               587, 120, 4 ) \
 | 
			
		||||
    HANDLER(TlsConnectionLastHandshakeState,                          588, 120, 1 ) \
 | 
			
		||||
    HANDLER(TlsConnectionInfoBits,                                    589, 120, 0 ) \
 | 
			
		||||
    HANDLER(SslStateBits,                                             590, 120, 0 ) \
 | 
			
		||||
    HANDLER(SslProcessInfoBits,                                       591, 120, 0 ) \
 | 
			
		||||
    HANDLER(SslProcessHeapSize,                                       592, 120, 1 ) \
 | 
			
		||||
    HANDLER(SslBaseErrorCode,                                         593, 120, 3 ) \
 | 
			
		||||
    HANDLER(GpuCrashDumpSize,                                         594, 122, 1 ) \
 | 
			
		||||
    HANDLER(GpuCrashDump,                                             595, 122, 5 ) \
 | 
			
		||||
    HANDLER(RunningApplicationProgramIndex,                           596, 69,  12) \
 | 
			
		||||
    HANDLER(UsbTopology,                                              597, 123, 5 ) \
 | 
			
		||||
    HANDLER(AkamaiReferenceId,                                        598, 1,   4 ) \
 | 
			
		||||
    HANDLER(NvHostErrID,                                              599, 124, 1 ) \
 | 
			
		||||
    HANDLER(NvHostErrDataArrayU32,                                    600, 124, 6 ) \
 | 
			
		||||
    HANDLER(HasSyslogFlag,                                            601, 1,   10) \
 | 
			
		||||
    HANDLER(AcpRuntimeParameterDelivery,                              602, 110, 12) \
 | 
			
		||||
    HANDLER(PlatformRegion,                                           603, 54,  4 ) \
 | 
			
		||||
    HANDLER(RunningUlaApplicationId,                                  604, 125, 4 ) \
 | 
			
		||||
    HANDLER(RunningUlaAppletId,                                       605, 125, 12) \
 | 
			
		||||
    HANDLER(RunningUlaVersion,                                        606, 125, 1 ) \
 | 
			
		||||
    HANDLER(RunningUlaApplicationStorageLocation,                     607, 125, 4 ) \
 | 
			
		||||
    HANDLER(RunningUlaPatchStorageLocation,                           608, 125, 4 ) \
 | 
			
		||||
    HANDLER(NANDTotalSizeOfSystem,                                    609, 24,  0 ) \
 | 
			
		||||
    HANDLER(NANDFreeSpaceOfSystem,                                    610, 24,  0 ) \
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										404
									
								
								utilities/erpt.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										404
									
								
								utilities/erpt.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,404 @@
 | 
			
		||||
#
 | 
			
		||||
# Copyright (c) 2018-2020 Atmosphère-NX
 | 
			
		||||
#
 | 
			
		||||
# This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
# under the terms and conditions of the GNU General Public License,
 | 
			
		||||
# version 2, as published by the Free Software Foundation.
 | 
			
		||||
#
 | 
			
		||||
# This program is distributed in the hope it will be useful, but WITHOUT
 | 
			
		||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
			
		||||
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
# more details.
 | 
			
		||||
#
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
# erpt.py: Autogeneration tool for <stratosphere/erpt/erpt_ids.autogen.hpp>
 | 
			
		||||
 | 
			
		||||
import nxo64
 | 
			
		||||
import sys, os, string
 | 
			
		||||
from struct import unpack as up, pack as pk
 | 
			
		||||
 | 
			
		||||
LOAD_BASE = 0x7100000000
 | 
			
		||||
 | 
			
		||||
HEADER = '''/*
 | 
			
		||||
 * Copyright (c) 2018-2020 Atmosphère-NX
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
 * under the terms and conditions of the GNU General Public License,
 | 
			
		||||
 * version 2, as published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope it will be useful, but WITHOUT
 | 
			
		||||
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 | 
			
		||||
 * more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <vapours.hpp>
 | 
			
		||||
 | 
			
		||||
/* NOTE: This file is auto-generated. */
 | 
			
		||||
/* Do not make edits to this file by hand. */
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
if sys.version_info[0] == 3:
 | 
			
		||||
    iter_range = range
 | 
			
		||||
    int_types = (int,)
 | 
			
		||||
    ascii_string = lambda b: b.decode('ascii')
 | 
			
		||||
    bytes_to_list = lambda b: list(b)
 | 
			
		||||
    list_to_bytes = lambda l: bytes(l)
 | 
			
		||||
else:
 | 
			
		||||
    iter_range = xrange
 | 
			
		||||
    int_types = (int, long)
 | 
			
		||||
    ascii_string = lambda b: str(b)
 | 
			
		||||
    bytes_to_list = lambda b: map(ord, b)
 | 
			
		||||
    list_to_bytes = lambda l: ''.join(map(chr, l))
 | 
			
		||||
 | 
			
		||||
(DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, DT_RELASZ,
 | 
			
		||||
 DT_RELAENT, DT_STRSZ, DT_SYMENT, DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, DT_SYMBOLIC, DT_REL,
 | 
			
		||||
 DT_RELSZ, DT_RELENT, DT_PLTREL, DT_DEBUG, DT_TEXTREL, DT_JMPREL, DT_BIND_NOW, DT_INIT_ARRAY,
 | 
			
		||||
 DT_FINI_ARRAY, DT_INIT_ARRAYSZ, DT_FINI_ARRAYSZ, DT_RUNPATH, DT_FLAGS) = iter_range(31)
 | 
			
		||||
DT_GNU_HASH = 0x6ffffef5
 | 
			
		||||
DT_VERSYM = 0x6ffffff0
 | 
			
		||||
DT_RELACOUNT = 0x6ffffff9
 | 
			
		||||
DT_RELCOUNT = 0x6ffffffa
 | 
			
		||||
DT_FLAGS_1 = 0x6ffffffb
 | 
			
		||||
DT_VERDEF = 0x6ffffffc
 | 
			
		||||
DT_VERDEFNUM = 0x6ffffffd
 | 
			
		||||
 | 
			
		||||
STT_NOTYPE = 0
 | 
			
		||||
STT_OBJECT = 1
 | 
			
		||||
STT_FUNC = 2
 | 
			
		||||
STT_SECTION = 3
 | 
			
		||||
 | 
			
		||||
STB_LOCAL = 0
 | 
			
		||||
STB_GLOBAL = 1
 | 
			
		||||
STB_WEAK = 2
 | 
			
		||||
 | 
			
		||||
R_ARM_ABS32 = 2
 | 
			
		||||
R_ARM_TLS_DESC = 13
 | 
			
		||||
R_ARM_GLOB_DAT = 21
 | 
			
		||||
R_ARM_JUMP_SLOT = 22
 | 
			
		||||
R_ARM_RELATIVE = 23
 | 
			
		||||
 | 
			
		||||
R_AARCH64_ABS64 = 257
 | 
			
		||||
R_AARCH64_GLOB_DAT = 1025
 | 
			
		||||
R_AARCH64_JUMP_SLOT = 1026
 | 
			
		||||
R_AARCH64_RELATIVE = 1027
 | 
			
		||||
R_AARCH64_TLSDESC = 1031
 | 
			
		||||
 | 
			
		||||
CATEGORIES = {
 | 
			
		||||
    0   : 'Test',
 | 
			
		||||
    1   : 'ErrorInfo',
 | 
			
		||||
    2   : 'ConnectionStatusInfo',
 | 
			
		||||
    3   : 'NetworkInfo',
 | 
			
		||||
    4   : 'NXMacAddressInfo',
 | 
			
		||||
    5   : 'StealthNetworkInfo',
 | 
			
		||||
    6   : 'LimitHighCapacityInfo',
 | 
			
		||||
    7   : 'NATTypeInfo',
 | 
			
		||||
    8   : 'WirelessAPMacAddressInfo',
 | 
			
		||||
    9   : 'GlobalIPAddressInfo',
 | 
			
		||||
    10  : 'EnableWirelessInterfaceInfo',
 | 
			
		||||
    11  : 'EnableWifiInfo',
 | 
			
		||||
    12  : 'EnableBluetoothInfo',
 | 
			
		||||
    13  : 'EnableNFCInfo',
 | 
			
		||||
    14  : 'NintendoZoneSSIDListVersionInfo',
 | 
			
		||||
    15  : 'LANAdapterMacAddressInfo',
 | 
			
		||||
    16  : 'ApplicationInfo',
 | 
			
		||||
    17  : 'OccurrenceInfo',
 | 
			
		||||
    18  : 'ProductModelInfo',
 | 
			
		||||
    19  : 'CurrentLanguageInfo',
 | 
			
		||||
    20  : 'UseNetworkTimeProtocolInfo',
 | 
			
		||||
    21  : 'TimeZoneInfo',
 | 
			
		||||
    22  : 'ControllerFirmwareInfo',
 | 
			
		||||
    23  : 'VideoOutputInfo',
 | 
			
		||||
    24  : 'NANDFreeSpaceInfo',
 | 
			
		||||
    25  : 'SDCardFreeSpaceInfo',
 | 
			
		||||
    26  : 'ScreenBrightnessInfo',
 | 
			
		||||
    27  : 'AudioFormatInfo',
 | 
			
		||||
    28  : 'MuteOnHeadsetUnpluggedInfo',
 | 
			
		||||
    29  : 'NumUserRegisteredInfo',
 | 
			
		||||
    30  : 'DataDeletionInfo',
 | 
			
		||||
    31  : 'ControllerVibrationInfo',
 | 
			
		||||
    32  : 'LockScreenInfo',
 | 
			
		||||
    33  : 'InternalBatteryLotNumberInfo',
 | 
			
		||||
    34  : 'LeftControllerSerialNumberInfo',
 | 
			
		||||
    35  : 'RightControllerSerialNumberInfo',
 | 
			
		||||
    36  : 'NotificationInfo',
 | 
			
		||||
    37  : 'TVInfo',
 | 
			
		||||
    38  : 'SleepInfo',
 | 
			
		||||
    39  : 'ConnectionInfo',
 | 
			
		||||
    40  : 'NetworkErrorInfo',
 | 
			
		||||
    41  : 'FileAccessPathInfo',
 | 
			
		||||
    42  : 'GameCardCIDInfo',
 | 
			
		||||
    43  : 'NANDCIDInfo',
 | 
			
		||||
    44  : 'MicroSDCIDInfo',
 | 
			
		||||
    45  : 'NANDSpeedModeInfo',
 | 
			
		||||
    46  : 'MicroSDSpeedModeInfo',
 | 
			
		||||
    47  : 'GameCardSpeedModeInfo',
 | 
			
		||||
    48  : 'UserAccountInternalIDInfo',
 | 
			
		||||
    49  : 'NetworkServiceAccountInternalIDInfo',
 | 
			
		||||
    50  : 'NintendoAccountInternalIDInfo',
 | 
			
		||||
    51  : 'USB3AvailableInfo',
 | 
			
		||||
    52  : 'CallStackInfo',
 | 
			
		||||
    53  : 'SystemStartupLogInfo',
 | 
			
		||||
    54  : 'RegionSettingInfo',
 | 
			
		||||
    55  : 'NintendoZoneConnectedInfo',
 | 
			
		||||
    56  : 'ForceSleepInfo',
 | 
			
		||||
    57  : 'ChargerInfo',
 | 
			
		||||
    58  : 'RadioStrengthInfo',
 | 
			
		||||
    59  : 'ErrorInfoAuto',
 | 
			
		||||
    60  : 'AccessPointInfo',
 | 
			
		||||
    61  : 'ErrorInfoDefaults',
 | 
			
		||||
    62  : 'SystemPowerStateInfo',
 | 
			
		||||
    63  : 'PerformanceInfo',
 | 
			
		||||
    64  : 'ThrottlingInfo',
 | 
			
		||||
    65  : 'GameCardErrorInfo',
 | 
			
		||||
    66  : 'EdidInfo',
 | 
			
		||||
    67  : 'ThermalInfo',
 | 
			
		||||
    68  : 'CradleFirmwareInfo',
 | 
			
		||||
    69  : 'RunningApplicationInfo',
 | 
			
		||||
    70  : 'RunningAppletInfo',
 | 
			
		||||
    71  : 'FocusedAppletHistoryInfo',
 | 
			
		||||
    72  : 'CompositorInfo',
 | 
			
		||||
    73  : 'BatteryChargeInfo',
 | 
			
		||||
    74  : 'NANDExtendedCsd',
 | 
			
		||||
    75  : 'NANDPatrolInfo',
 | 
			
		||||
    76  : 'NANDErrorInfo',
 | 
			
		||||
    77  : 'NANDDriverLog',
 | 
			
		||||
    78  : 'SdCardSizeSpec',
 | 
			
		||||
    79  : 'SdCardErrorInfo',
 | 
			
		||||
    80  : 'SdCardDriverLog ',
 | 
			
		||||
    81  : 'FsProxyErrorInfo',
 | 
			
		||||
    82  : 'SystemAppletSceneInfo',
 | 
			
		||||
    83  : 'VideoInfo',
 | 
			
		||||
    84  : 'GpuErrorInfo',
 | 
			
		||||
    85  : 'PowerClockInfo',
 | 
			
		||||
    86  : 'AdspErrorInfo',
 | 
			
		||||
    87  : 'NvDispDeviceInfo',
 | 
			
		||||
    88  : 'NvDispDcWindowInfo',
 | 
			
		||||
    89  : 'NvDispDpModeInfo',
 | 
			
		||||
    90  : 'NvDispDpLinkSpec',
 | 
			
		||||
    91  : 'NvDispDpLinkStatus',
 | 
			
		||||
    92  : 'NvDispDpHdcpInfo',
 | 
			
		||||
    93  : 'NvDispDpAuxCecInfo',
 | 
			
		||||
    94  : 'NvDispDcInfo',
 | 
			
		||||
    95  : 'NvDispDsiInfo',
 | 
			
		||||
    96  : 'NvDispErrIDInfo',
 | 
			
		||||
    97  : 'SdCardMountInfo',
 | 
			
		||||
    98  : 'RetailInteractiveDisplayInfo',
 | 
			
		||||
    99  : 'CompositorStateInfo',
 | 
			
		||||
    100 : 'CompositorLayerInfo',
 | 
			
		||||
    101 : 'CompositorDisplayInfo',
 | 
			
		||||
    102 : 'CompositorHWCInfo',
 | 
			
		||||
    103 : 'MonitorCapability',
 | 
			
		||||
    104 : 'ErrorReportSharePermissionInfo',
 | 
			
		||||
    105 : 'MultimediaInfo',
 | 
			
		||||
    106 : 'ConnectedControllerInfo',
 | 
			
		||||
    107 : 'FsMemoryInfo',
 | 
			
		||||
    108 : 'UserClockContextInfo',
 | 
			
		||||
    109 : 'NetworkClockContextInfo',
 | 
			
		||||
    110 : 'AcpGeneralSettingsInfo',
 | 
			
		||||
    111 : 'AcpPlayLogSettingsInfo',
 | 
			
		||||
    112 : 'AcpAocSettingsInfo',
 | 
			
		||||
    113 : 'AcpBcatSettingsInfo',
 | 
			
		||||
    114 : 'AcpStorageSettingsInfo',
 | 
			
		||||
    115 : 'AcpRatingSettingsInfo',
 | 
			
		||||
    116 : 'MonitorSettings',
 | 
			
		||||
    117 : 'RebootlessSystemUpdateVersionInfo',
 | 
			
		||||
    118 : 'NifmConnectionTestInfo',
 | 
			
		||||
    119 : 'PcieLoggedStateInfo',
 | 
			
		||||
    120 : 'NetworkSecurityCertificateInfo',
 | 
			
		||||
    121 : 'AcpNeighborDetectionInfo',
 | 
			
		||||
    122 : 'GpuCrashInfo',
 | 
			
		||||
    123 : 'UsbStateInfo',
 | 
			
		||||
    124 : 'NvHostErrInfo',
 | 
			
		||||
    125 : 'RunningUlaInfo',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FIELD_TYPES = {
 | 
			
		||||
    0  : 'FieldType_NumericU64',
 | 
			
		||||
    1  : 'FieldType_NumericU32',
 | 
			
		||||
    2  : 'FieldType_NumericI64',
 | 
			
		||||
    3  : 'FieldType_NumericI32',
 | 
			
		||||
    4  : 'FieldType_String',
 | 
			
		||||
    5  : 'FieldType_U8Array',
 | 
			
		||||
    6  : 'FieldType_U32Array',
 | 
			
		||||
    7  : 'FieldType_U64Array',
 | 
			
		||||
    8  : 'FieldType_I32Array',
 | 
			
		||||
    9  : 'FieldType_I64Array',
 | 
			
		||||
    10 : 'FieldType_Bool',
 | 
			
		||||
    11 : 'FieldType_NumericU16',
 | 
			
		||||
    12 : 'FieldType_NumericU8',
 | 
			
		||||
    13 : 'FieldType_NumericI16',
 | 
			
		||||
    14 : 'FieldType_NumericI8',
 | 
			
		||||
    15 : 'FieldType_I8Array',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
def get_full(nxo):
 | 
			
		||||
    full = nxo.text[0]
 | 
			
		||||
    if nxo.ro[2] >= len(full):
 | 
			
		||||
        full += b'\x00' * (nxo.ro[2] - len(full))
 | 
			
		||||
    else:
 | 
			
		||||
        full = full[:nxo.ro[2]]
 | 
			
		||||
    full += nxo.ro[0]
 | 
			
		||||
    if nxo.data[2] > len(full):
 | 
			
		||||
        full += b'\x00' * (nxo.data[2] - len(full))
 | 
			
		||||
    full += nxo.data[0]
 | 
			
		||||
 | 
			
		||||
    undef_count = 0
 | 
			
		||||
    for s in nxo.symbols:
 | 
			
		||||
        if not s.shndx and s.name:
 | 
			
		||||
            undef_count += 1
 | 
			
		||||
    last_ea = max(LOAD_BASE + end for start, end, name, kind in nxo.sections)
 | 
			
		||||
    undef_entry_size = 8
 | 
			
		||||
    undef_ea = ((last_ea + 0xFFF) & ~0xFFF) + undef_entry_size # plus 8 so we don't end up on the "end" symbol
 | 
			
		||||
 | 
			
		||||
    for i,s in enumerate(nxo.symbols):
 | 
			
		||||
        if not s.shndx and s.name:
 | 
			
		||||
            #idaapi.create_data(undef_ea, idc.FF_QWORD, 8, idaapi.BADADDR)
 | 
			
		||||
            #idaapi.force_name(undef_ea, s.name)
 | 
			
		||||
            s.resolved = undef_ea
 | 
			
		||||
            undef_ea += undef_entry_size
 | 
			
		||||
        elif i != 0:
 | 
			
		||||
            assert s.shndx
 | 
			
		||||
            s.resolved = LOAD_BASE + s.value
 | 
			
		||||
            if s.name:
 | 
			
		||||
                if s.type == STT_FUNC:
 | 
			
		||||
                    print(hex(s.resolved), s.name)
 | 
			
		||||
                    idaapi.add_entry(s.resolved, s.resolved, s.name, 0)
 | 
			
		||||
                else:
 | 
			
		||||
                    idaapi.force_name(s.resolved, s.name)
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            # NULL symbol
 | 
			
		||||
            s.resolved = 0
 | 
			
		||||
 | 
			
		||||
    def put_dword(z, target, val):
 | 
			
		||||
        return z[:target] + pk('<I', val) + z[target+4:]
 | 
			
		||||
    def put_qword(z, target, val):
 | 
			
		||||
        return z[:target] + pk('<Q', val) + z[target+8:]
 | 
			
		||||
    def get_dword(z, target):
 | 
			
		||||
        return up('<I', z[target:target+4])[0]
 | 
			
		||||
 | 
			
		||||
    for offset, r_type, sym, addend in nxo.relocations:
 | 
			
		||||
        #print offset, r_type, sym, addend
 | 
			
		||||
        target = offset + LOAD_BASE
 | 
			
		||||
        if r_type in (R_ARM_GLOB_DAT, R_ARM_JUMP_SLOT, R_ARM_ABS32):
 | 
			
		||||
            if not sym:
 | 
			
		||||
                print('error: relocation at %X failed' % target)
 | 
			
		||||
            else:
 | 
			
		||||
                full = put_dword(full, target, sym.resolved)
 | 
			
		||||
        elif r_type == R_ARM_RELATIVE:
 | 
			
		||||
            full = put_dword(full, target, get_dword(full, target) + LOAD_BASE)
 | 
			
		||||
        elif r_type in (R_AARCH64_GLOB_DAT, R_AARCH64_JUMP_SLOT, R_AARCH64_ABS64):
 | 
			
		||||
            full = put_qword(full, target, sym.resolved + addend)
 | 
			
		||||
        elif r_type == R_AARCH64_RELATIVE:
 | 
			
		||||
            full = put_qword(full, target, LOAD_BASE + addend)
 | 
			
		||||
        else:
 | 
			
		||||
            print('TODO r_type %d' % (r_type,))
 | 
			
		||||
    return full
 | 
			
		||||
 | 
			
		||||
def locate_fields(full):
 | 
			
		||||
    start = ['TestU64', 'TestU32', 'TestI64', 'TestI32']
 | 
			
		||||
    inds = [LOAD_BASE + full.index('%s\x00' % s) for s in start]
 | 
			
		||||
    target = pk('<QQQQ', inds[0], inds[1], inds[2], inds[3])
 | 
			
		||||
    return full.index(target)
 | 
			
		||||
 | 
			
		||||
def read_string(full, ofs):
 | 
			
		||||
    s = ''
 | 
			
		||||
    if ofs >= len(full):
 | 
			
		||||
        return ''
 | 
			
		||||
    while full[ofs] != '\x00':
 | 
			
		||||
        s += full[ofs]
 | 
			
		||||
        ofs += 1
 | 
			
		||||
        if ofs >= len(full):
 | 
			
		||||
            return ''
 | 
			
		||||
    return s
 | 
			
		||||
 | 
			
		||||
def is_valid_field_name(s):
 | 
			
		||||
    ALLOWED = string.lowercase + string.uppercase + string.digits + '_'
 | 
			
		||||
    if not s:
 | 
			
		||||
        return False
 | 
			
		||||
    for c in s:
 | 
			
		||||
        if not c in ALLOWED:
 | 
			
		||||
            return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def parse_fields(full, table):
 | 
			
		||||
    fields = []
 | 
			
		||||
    ofs = 0
 | 
			
		||||
    while True:
 | 
			
		||||
        val = up('<Q', full[table + ofs:table + ofs + 8])[0]
 | 
			
		||||
        if (val & 0xFFFFFFFF00000000) != LOAD_BASE:
 | 
			
		||||
            break
 | 
			
		||||
        s = read_string(full, val - LOAD_BASE)
 | 
			
		||||
        if not is_valid_field_name(s):
 | 
			
		||||
            break
 | 
			
		||||
        fields.append(s)
 | 
			
		||||
        ofs += 8
 | 
			
		||||
    return fields
 | 
			
		||||
 | 
			
		||||
def find_categories(full, num_fields):
 | 
			
		||||
    KNOWN = [0] * 10 + [1] * 2 + [0x3B] * 2
 | 
			
		||||
    ind = full.index(''.join(pk('<I', i) for i in KNOWN))
 | 
			
		||||
    return list(up('<'+'I'*num_fields, full[ind:ind+4*num_fields]))
 | 
			
		||||
 | 
			
		||||
def find_types(full, num_fields):
 | 
			
		||||
    KNOWN = range(10) + [4, 4, 2, 4]
 | 
			
		||||
    ind = full.index(''.join(pk('<I', i) for i in KNOWN))
 | 
			
		||||
    return list(up('<'+'I'*num_fields, full[ind:ind+4*num_fields]))
 | 
			
		||||
 | 
			
		||||
def cat_to_string(c):
 | 
			
		||||
    return CATEGORIES[c] if c in CATEGORIES else 'Category_Unknown%d' % c
 | 
			
		||||
 | 
			
		||||
def typ_to_string(t):
 | 
			
		||||
    return FIELD_TYPES[t] if t in FIELD_TYPES else 'FieldType_Unknown%d' % t
 | 
			
		||||
 | 
			
		||||
def main(argc, argv):
 | 
			
		||||
    if argc != 2:
 | 
			
		||||
        print 'Usage: %s erpt_nso' % argv[0]
 | 
			
		||||
        return 1
 | 
			
		||||
    f = open(argv[1], 'rb')
 | 
			
		||||
    nxo = nxo64.load_nxo(f)
 | 
			
		||||
    full = get_full(nxo)
 | 
			
		||||
    field_table = locate_fields(full)
 | 
			
		||||
    fields = parse_fields(full, field_table)
 | 
			
		||||
    NUM_FIELDS = len(fields)
 | 
			
		||||
    cats = find_categories(full, NUM_FIELDS)
 | 
			
		||||
    types = find_types(full, NUM_FIELDS)
 | 
			
		||||
    print 'Identified %d fields.' % NUM_FIELDS
 | 
			
		||||
    mf = max(len(s) for s in fields)
 | 
			
		||||
    mc = max(len(cat_to_string(c)) for c in cats)
 | 
			
		||||
    mt = max(len(typ_to_string(t)) for t in types)
 | 
			
		||||
    format_string = '- %%-%ds %%-%ds %%-%ds' % (mf+1, mc+1, mt)
 | 
			
		||||
    for i in xrange(NUM_FIELDS):
 | 
			
		||||
        f, c, t = fields[i], cat_to_string(cats[i]), typ_to_string(types[i])
 | 
			
		||||
        print format_string % (f+',', c+',', t)
 | 
			
		||||
    with open(argv[1]+'.hpp', 'w') as out:
 | 
			
		||||
        out.write(HEADER)
 | 
			
		||||
        out.write('#define AMS_ERPT_FOREACH_FIELD_TYPE(HANDLER) \\\n')
 | 
			
		||||
        for tp in sorted(list(set(types))):
 | 
			
		||||
            out.write(('    HANDLER(%%-%ds %%-2d) \\\n' % (mt+1)) % (typ_to_string(tp)+',', tp))
 | 
			
		||||
        out.write('\n')
 | 
			
		||||
        out.write('#define AMS_ERPT_FOREACH_CATEGORY(HANDLER) \\\n')
 | 
			
		||||
        for ct in sorted(list(set(cats))):
 | 
			
		||||
            out.write(('    HANDLER(%%-%ds %%-3d) \\\n' % (mc+1)) % (cat_to_string(ct)+',', ct))
 | 
			
		||||
        out.write('\n')
 | 
			
		||||
        out.write('#define AMS_ERPT_FOREACH_FIELD(HANDLER) \\\n')
 | 
			
		||||
        for i in xrange(NUM_FIELDS):
 | 
			
		||||
            f, c, t = fields[i], cats[i], types[i]
 | 
			
		||||
            out.write(('    HANDLER(%%-%ds %%-4s %%-4s %%-2s) \\\n' % (mf+1)) % (f+',', '%d,'%i, '%d,'%c, '%d'%t))
 | 
			
		||||
        out.write('\n')
 | 
			
		||||
    return 0
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    try:
 | 
			
		||||
        ret = main(len(sys.argv), sys.argv)
 | 
			
		||||
    except:
 | 
			
		||||
        ret = 1
 | 
			
		||||
        print 'exception'
 | 
			
		||||
    sys.exit(ret)
 | 
			
		||||
							
								
								
									
										717
									
								
								utilities/nxo64.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										717
									
								
								utilities/nxo64.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,717 @@
 | 
			
		||||
# Copyright 2017 Reswitched Team
 | 
			
		||||
#
 | 
			
		||||
# Permission to use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
# without fee is hereby granted, provided that the above copyright notice and this permission
 | 
			
		||||
# notice appear in all copies.
 | 
			
		||||
#
 | 
			
		||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
 | 
			
		||||
# SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
 | 
			
		||||
# THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
 | 
			
		||||
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
 | 
			
		||||
# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
 | 
			
		||||
# OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 | 
			
		||||
# nxo64.py: IDA loader (and library for reading nso/nro files)
 | 
			
		||||
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
 | 
			
		||||
import gzip, math, os, re, struct, sys
 | 
			
		||||
from struct import unpack as up, pack as pk
 | 
			
		||||
 | 
			
		||||
from io import BytesIO
 | 
			
		||||
 | 
			
		||||
import lz4.block
 | 
			
		||||
 | 
			
		||||
uncompress = lz4.block.decompress
 | 
			
		||||
 | 
			
		||||
if sys.version_info[0] == 3:
 | 
			
		||||
    iter_range = range
 | 
			
		||||
    int_types = (int,)
 | 
			
		||||
    ascii_string = lambda b: b.decode('ascii')
 | 
			
		||||
    bytes_to_list = lambda b: list(b)
 | 
			
		||||
    list_to_bytes = lambda l: bytes(l)
 | 
			
		||||
else:
 | 
			
		||||
    iter_range = xrange
 | 
			
		||||
    int_types = (int, long)
 | 
			
		||||
    ascii_string = lambda b: str(b)
 | 
			
		||||
    bytes_to_list = lambda b: map(ord, b)
 | 
			
		||||
    list_to_bytes = lambda l: ''.join(map(chr, l))
 | 
			
		||||
 | 
			
		||||
def kip1_blz_decompress(compressed):
 | 
			
		||||
    compressed_size, init_index, uncompressed_addl_size = struct.unpack('<III', compressed[-0xC:])
 | 
			
		||||
    decompressed = compressed[:] + b'\x00' * uncompressed_addl_size
 | 
			
		||||
    decompressed_size = len(decompressed)
 | 
			
		||||
    if len(compressed) != compressed_size:
 | 
			
		||||
        assert len(compressed) > compressed_size
 | 
			
		||||
        compressed = compressed[len(compressed) - compressed_size:]
 | 
			
		||||
    if not (compressed_size + uncompressed_addl_size):
 | 
			
		||||
        return b''
 | 
			
		||||
    compressed = bytes_to_list(compressed)
 | 
			
		||||
    decompressed = bytes_to_list(decompressed)
 | 
			
		||||
    index = compressed_size - init_index
 | 
			
		||||
    outindex = decompressed_size
 | 
			
		||||
    while outindex > 0:
 | 
			
		||||
        index -= 1
 | 
			
		||||
        control = compressed[index]
 | 
			
		||||
        for i in iter_range(8):
 | 
			
		||||
            if control & 0x80:
 | 
			
		||||
                if index < 2:
 | 
			
		||||
                    raise ValueError('Compression out of bounds!')
 | 
			
		||||
                index -= 2
 | 
			
		||||
                segmentoffset = compressed[index] | (compressed[index+1] << 8)
 | 
			
		||||
                segmentsize = ((segmentoffset >> 12) & 0xF) + 3
 | 
			
		||||
                segmentoffset &= 0x0FFF
 | 
			
		||||
                segmentoffset += 2
 | 
			
		||||
                if outindex < segmentsize:
 | 
			
		||||
                    raise ValueError('Compression out of bounds!')
 | 
			
		||||
                for j in iter_range(segmentsize):
 | 
			
		||||
                    if outindex + segmentoffset >= decompressed_size:
 | 
			
		||||
                        raise ValueError('Compression out of bounds!')
 | 
			
		||||
                    data = decompressed[outindex+segmentoffset]
 | 
			
		||||
                    outindex -= 1
 | 
			
		||||
                    decompressed[outindex] = data
 | 
			
		||||
            else:
 | 
			
		||||
                if outindex < 1:
 | 
			
		||||
                    raise ValueError('Compression out of bounds!')
 | 
			
		||||
                outindex -= 1
 | 
			
		||||
                index -= 1
 | 
			
		||||
                decompressed[outindex] = compressed[index]
 | 
			
		||||
            control <<= 1
 | 
			
		||||
            control &= 0xFF
 | 
			
		||||
            if not outindex:
 | 
			
		||||
                break
 | 
			
		||||
    return list_to_bytes(decompressed)
 | 
			
		||||
 | 
			
		||||
class BinFile(object):
 | 
			
		||||
    def __init__(self, li):
 | 
			
		||||
        self._f = li
 | 
			
		||||
 | 
			
		||||
    def read(self, arg):
 | 
			
		||||
        if isinstance(arg, str):
 | 
			
		||||
            fmt = '<' + arg
 | 
			
		||||
            size = struct.calcsize(fmt)
 | 
			
		||||
            raw = self._f.read(size)
 | 
			
		||||
            out = struct.unpack(fmt, raw)
 | 
			
		||||
            if len(out) == 1:
 | 
			
		||||
                return out[0]
 | 
			
		||||
            return out
 | 
			
		||||
        elif arg is None:
 | 
			
		||||
            return self._f.read()
 | 
			
		||||
        else:
 | 
			
		||||
            out = self._f.read(arg)
 | 
			
		||||
            return out
 | 
			
		||||
 | 
			
		||||
    def read_from(self, arg, offset):
 | 
			
		||||
        old = self.tell()
 | 
			
		||||
        try:
 | 
			
		||||
            self.seek(offset)
 | 
			
		||||
            out = self.read(arg)
 | 
			
		||||
        finally:
 | 
			
		||||
            self.seek(old)
 | 
			
		||||
        return out
 | 
			
		||||
 | 
			
		||||
    def seek(self, off):
 | 
			
		||||
        self._f.seek(off)
 | 
			
		||||
 | 
			
		||||
    def close(self):
 | 
			
		||||
        self._f.close()
 | 
			
		||||
 | 
			
		||||
    def tell(self):
 | 
			
		||||
        return self._f.tell()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, DT_RELASZ,
 | 
			
		||||
 DT_RELAENT, DT_STRSZ, DT_SYMENT, DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, DT_SYMBOLIC, DT_REL,
 | 
			
		||||
 DT_RELSZ, DT_RELENT, DT_PLTREL, DT_DEBUG, DT_TEXTREL, DT_JMPREL, DT_BIND_NOW, DT_INIT_ARRAY,
 | 
			
		||||
 DT_FINI_ARRAY, DT_INIT_ARRAYSZ, DT_FINI_ARRAYSZ, DT_RUNPATH, DT_FLAGS) = iter_range(31)
 | 
			
		||||
DT_GNU_HASH = 0x6ffffef5
 | 
			
		||||
DT_VERSYM = 0x6ffffff0
 | 
			
		||||
DT_RELACOUNT = 0x6ffffff9
 | 
			
		||||
DT_RELCOUNT = 0x6ffffffa
 | 
			
		||||
DT_FLAGS_1 = 0x6ffffffb
 | 
			
		||||
DT_VERDEF = 0x6ffffffc
 | 
			
		||||
DT_VERDEFNUM = 0x6ffffffd
 | 
			
		||||
 | 
			
		||||
STT_NOTYPE = 0
 | 
			
		||||
STT_OBJECT = 1
 | 
			
		||||
STT_FUNC = 2
 | 
			
		||||
STT_SECTION = 3
 | 
			
		||||
 | 
			
		||||
STB_LOCAL = 0
 | 
			
		||||
STB_GLOBAL = 1
 | 
			
		||||
STB_WEAK = 2
 | 
			
		||||
 | 
			
		||||
R_ARM_ABS32 = 2
 | 
			
		||||
R_ARM_TLS_DESC = 13
 | 
			
		||||
R_ARM_GLOB_DAT = 21
 | 
			
		||||
R_ARM_JUMP_SLOT = 22
 | 
			
		||||
R_ARM_RELATIVE = 23
 | 
			
		||||
 | 
			
		||||
R_AARCH64_ABS64 = 257
 | 
			
		||||
R_AARCH64_GLOB_DAT = 1025
 | 
			
		||||
R_AARCH64_JUMP_SLOT = 1026
 | 
			
		||||
R_AARCH64_RELATIVE = 1027
 | 
			
		||||
R_AARCH64_TLSDESC = 1031
 | 
			
		||||
 | 
			
		||||
MULTIPLE_DTS = set([DT_NEEDED])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Range(object):
 | 
			
		||||
    def __init__(self, start, size):
 | 
			
		||||
        self.start = start
 | 
			
		||||
        self.size = size
 | 
			
		||||
        self.end = start+size
 | 
			
		||||
        self._inclend = start+size-1
 | 
			
		||||
 | 
			
		||||
    def overlaps(self, other):
 | 
			
		||||
        return self.start <= other._inclend and other.start <= self._inclend
 | 
			
		||||
 | 
			
		||||
    def includes(self, other):
 | 
			
		||||
        return other.start >= self.start and other._inclend <= self._inclend
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return 'Range(0x%X -> 0x%X)' % (self.start, self.end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Segment(object):
 | 
			
		||||
    def __init__(self, r, name, kind):
 | 
			
		||||
        self.range = r
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.kind = kind
 | 
			
		||||
        self.sections = []
 | 
			
		||||
 | 
			
		||||
    def add_section(self, s):
 | 
			
		||||
        for i in self.sections:
 | 
			
		||||
            assert not i.range.overlaps(s.range), '%r overlaps %r' % (s, i)
 | 
			
		||||
        self.sections.append(s)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Section(object):
 | 
			
		||||
    def __init__(self, r, name):
 | 
			
		||||
        self.range = r
 | 
			
		||||
        self.name = name
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return 'Section(%r, %r)' % (self.range, self.name)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def suffixed_name(name, suffix):
 | 
			
		||||
    if suffix == 0:
 | 
			
		||||
        return name
 | 
			
		||||
    return '%s.%d' % (name, suffix)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SegmentBuilder(object):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        self.segments = []
 | 
			
		||||
 | 
			
		||||
    def add_segment(self, start, size, name, kind):
 | 
			
		||||
        r = Range(start, size)
 | 
			
		||||
        for i in self.segments:
 | 
			
		||||
            assert not r.overlaps(i.range)
 | 
			
		||||
        self.segments.append(Segment(r, name, kind))
 | 
			
		||||
 | 
			
		||||
    def add_section(self, name, start, end=None, size=None):
 | 
			
		||||
        assert end is None or size is None
 | 
			
		||||
        if size == 0:
 | 
			
		||||
            return
 | 
			
		||||
        if size is None:
 | 
			
		||||
            size = end-start
 | 
			
		||||
        assert size > 0
 | 
			
		||||
        r = Range(start, size)
 | 
			
		||||
        for i in self.segments:
 | 
			
		||||
            if i.range.includes(r):
 | 
			
		||||
                i.add_section(Section(r, name))
 | 
			
		||||
                return
 | 
			
		||||
        assert False, "no containing segment for %r" % (name,)
 | 
			
		||||
 | 
			
		||||
    def flatten(self):
 | 
			
		||||
        self.segments.sort(key=lambda s: s.range.start)
 | 
			
		||||
        parts = []
 | 
			
		||||
        for segment in self.segments:
 | 
			
		||||
            suffix = 0
 | 
			
		||||
            segment.sections.sort(key=lambda s: s.range.start)
 | 
			
		||||
            pos = segment.range.start
 | 
			
		||||
            for section in segment.sections:
 | 
			
		||||
                if pos < section.range.start:
 | 
			
		||||
                    parts.append((pos, section.range.start, suffixed_name(segment.name, suffix), segment.kind))
 | 
			
		||||
                    suffix += 1
 | 
			
		||||
                    pos = section.range.start
 | 
			
		||||
                parts.append((section.range.start, section.range.end, section.name, segment.kind))
 | 
			
		||||
                pos = section.range.end
 | 
			
		||||
            if pos < segment.range.end:
 | 
			
		||||
                parts.append((pos, segment.range.end, suffixed_name(segment.name, suffix), segment.kind))
 | 
			
		||||
                suffix += 1
 | 
			
		||||
                pos = segment.range.end
 | 
			
		||||
        return parts
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ElfSym(object):
 | 
			
		||||
    def __init__(self, name, info, other, shndx, value, size):
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.shndx = shndx
 | 
			
		||||
        self.value = value
 | 
			
		||||
        self.size = size
 | 
			
		||||
 | 
			
		||||
        self.vis = other & 3
 | 
			
		||||
        self.type = info & 0xF
 | 
			
		||||
        self.bind = info >> 4
 | 
			
		||||
 | 
			
		||||
    def __repr__(self):
 | 
			
		||||
        return 'Sym(name=%r, shndx=0x%X, value=0x%X, size=0x%X, vis=%r, type=%r, bind=%r)' % (
 | 
			
		||||
            self.name, self.shndx, self.value, self.size, self.vis, self.type, self.bind)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NxoFileBase(object):
 | 
			
		||||
    # segment = (content, file offset, vaddr, vsize)
 | 
			
		||||
    def __init__(self, text, ro, data, bsssize):
 | 
			
		||||
        self.text = text
 | 
			
		||||
        self.ro = ro
 | 
			
		||||
        self.data = data
 | 
			
		||||
        self.bsssize = bsssize
 | 
			
		||||
        self.textoff = text[2]
 | 
			
		||||
        self.textsize = text[3]
 | 
			
		||||
        self.rodataoff = ro[2]
 | 
			
		||||
        self.rodatasize = ro[3]
 | 
			
		||||
        self.dataoff = data[2]
 | 
			
		||||
        flatsize = data[2] + data[3]
 | 
			
		||||
 | 
			
		||||
        full = text[0]
 | 
			
		||||
        if ro[2] >= len(full):
 | 
			
		||||
            full += b'\x00' * (ro[2] - len(full))
 | 
			
		||||
        else:
 | 
			
		||||
            print('truncating .text?')
 | 
			
		||||
            full = full[:ro[2]]
 | 
			
		||||
        full += ro[0]
 | 
			
		||||
        if data[2] > len(full):
 | 
			
		||||
            full += b'\x00' * (data[2] - len(full))
 | 
			
		||||
        else:
 | 
			
		||||
            print('truncating .rodata?')
 | 
			
		||||
        full += data[0]
 | 
			
		||||
        f = BinFile(BytesIO(full))
 | 
			
		||||
 | 
			
		||||
        self.binfile = f
 | 
			
		||||
 | 
			
		||||
        # read MOD
 | 
			
		||||
        self.modoff = f.read_from('I', 4)
 | 
			
		||||
 | 
			
		||||
        f.seek(self.modoff)
 | 
			
		||||
        if f.read('4s') != b'MOD0':
 | 
			
		||||
            raise NxoException('invalid MOD0 magic')
 | 
			
		||||
 | 
			
		||||
        self.dynamicoff = self.modoff + f.read('i')
 | 
			
		||||
        self.bssoff     = self.modoff + f.read('i')
 | 
			
		||||
        self.bssend     = self.modoff + f.read('i')
 | 
			
		||||
        self.unwindoff  = self.modoff + f.read('i')
 | 
			
		||||
        self.unwindend  = self.modoff + f.read('i')
 | 
			
		||||
        self.moduleoff  = self.modoff + f.read('i')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        self.datasize = self.bssoff - self.dataoff
 | 
			
		||||
        self.bsssize = self.bssend - self.bssoff
 | 
			
		||||
 | 
			
		||||
        self.isLibnx = False
 | 
			
		||||
        if f.read('4s') == 'LNY0':
 | 
			
		||||
            self.isLibnx = True
 | 
			
		||||
            self.libnx_got_start    = self.modoff + f.read('i')
 | 
			
		||||
            self.libnx_got_end      = self.modoff + f.read('i')
 | 
			
		||||
 | 
			
		||||
        self.segment_builder = builder = SegmentBuilder()
 | 
			
		||||
        for off,sz,name,kind in [
 | 
			
		||||
            (self.textoff, self.textsize, ".text", "CODE"),
 | 
			
		||||
            (self.rodataoff, self.rodatasize, ".rodata", "CONST"),
 | 
			
		||||
            (self.dataoff, self.datasize, ".data", "DATA"),
 | 
			
		||||
            (self.bssoff, self.bsssize, ".bss", "BSS"),
 | 
			
		||||
        ]:
 | 
			
		||||
            builder.add_segment(off, sz, name, kind)
 | 
			
		||||
 | 
			
		||||
        # read dynamic
 | 
			
		||||
        self.armv7 = (f.read_from('Q', self.dynamicoff) > 0xFFFFFFFF or f.read_from('Q', self.dynamicoff+0x10) > 0xFFFFFFFF)
 | 
			
		||||
        self.offsize = 4 if self.armv7 else 8
 | 
			
		||||
 | 
			
		||||
        f.seek(self.dynamicoff)
 | 
			
		||||
        self.dynamic = dynamic = {}
 | 
			
		||||
        for i in MULTIPLE_DTS:
 | 
			
		||||
            dynamic[i] = []
 | 
			
		||||
        for i in iter_range((flatsize - self.dynamicoff) // 0x10):
 | 
			
		||||
            tag, val = f.read('II' if self.armv7 else 'QQ')
 | 
			
		||||
            if tag == DT_NULL:
 | 
			
		||||
                break
 | 
			
		||||
            if tag in MULTIPLE_DTS:
 | 
			
		||||
                dynamic[tag].append(val)
 | 
			
		||||
            else:
 | 
			
		||||
                dynamic[tag] = val
 | 
			
		||||
        builder.add_section('.dynamic', self.dynamicoff, end=f.tell())
 | 
			
		||||
 | 
			
		||||
        # read .dynstr
 | 
			
		||||
        if DT_STRTAB in dynamic and DT_STRSZ in dynamic:
 | 
			
		||||
            f.seek(dynamic[DT_STRTAB])
 | 
			
		||||
            self.dynstr = f.read(dynamic[DT_STRSZ])
 | 
			
		||||
        else:
 | 
			
		||||
            self.dynstr = b'\x00'
 | 
			
		||||
            print('warning: no dynstr')
 | 
			
		||||
 | 
			
		||||
        for startkey, szkey, name in [
 | 
			
		||||
            (DT_STRTAB, DT_STRSZ, '.dynstr'),
 | 
			
		||||
            (DT_INIT_ARRAY, DT_INIT_ARRAYSZ, '.init_array'),
 | 
			
		||||
            (DT_FINI_ARRAY, DT_FINI_ARRAYSZ, '.fini_array'),
 | 
			
		||||
            (DT_RELA, DT_RELASZ, '.rela.dyn'),
 | 
			
		||||
            (DT_REL, DT_RELSZ, '.rel.dyn'),
 | 
			
		||||
            (DT_JMPREL, DT_PLTRELSZ, ('.rel.plt' if self.armv7 else '.rela.plt')),
 | 
			
		||||
        ]:
 | 
			
		||||
            if startkey in dynamic and szkey in dynamic:
 | 
			
		||||
                builder.add_section(name, dynamic[startkey], size=dynamic[szkey])
 | 
			
		||||
 | 
			
		||||
        self.needed = [self.get_dynstr(i) for i in self.dynamic[DT_NEEDED]]
 | 
			
		||||
 | 
			
		||||
        # load .dynsym
 | 
			
		||||
        self.symbols = symbols = []
 | 
			
		||||
        if DT_SYMTAB in dynamic and DT_STRTAB in dynamic:
 | 
			
		||||
            f.seek(dynamic[DT_SYMTAB])
 | 
			
		||||
            while True:
 | 
			
		||||
                if dynamic[DT_SYMTAB] < dynamic[DT_STRTAB] and f.tell() >= dynamic[DT_STRTAB]:
 | 
			
		||||
                    break
 | 
			
		||||
                if self.armv7:
 | 
			
		||||
                    st_name, st_value, st_size, st_info, st_other, st_shndx = f.read('IIIBBH')
 | 
			
		||||
                else:
 | 
			
		||||
                    st_name, st_info, st_other, st_shndx, st_value, st_size = f.read('IBBHQQ')
 | 
			
		||||
                if st_name > len(self.dynstr):
 | 
			
		||||
                    break
 | 
			
		||||
                symbols.append(ElfSym(self.get_dynstr(st_name), st_info, st_other, st_shndx, st_value, st_size))
 | 
			
		||||
            builder.add_section('.dynsym', dynamic[DT_SYMTAB], end=f.tell())
 | 
			
		||||
 | 
			
		||||
        self.plt_entries = []
 | 
			
		||||
        self.relocations = []
 | 
			
		||||
        locations = set()
 | 
			
		||||
        plt_got_end = None
 | 
			
		||||
        if DT_REL in dynamic and DT_RELSZ in dynamic:
 | 
			
		||||
            locations |= self.process_relocations(f, symbols, dynamic[DT_REL], dynamic[DT_RELSZ])
 | 
			
		||||
 | 
			
		||||
        if DT_RELA in dynamic and DT_RELASZ in dynamic:
 | 
			
		||||
            locations |= self.process_relocations(f, symbols, dynamic[DT_RELA], dynamic[DT_RELASZ])
 | 
			
		||||
 | 
			
		||||
        if DT_JMPREL in dynamic and DT_PLTRELSZ in dynamic:
 | 
			
		||||
            pltlocations = self.process_relocations(f, symbols, dynamic[DT_JMPREL], dynamic[DT_PLTRELSZ])
 | 
			
		||||
            locations |= pltlocations
 | 
			
		||||
 | 
			
		||||
            plt_got_start = min(pltlocations)
 | 
			
		||||
            plt_got_end = max(pltlocations) + self.offsize
 | 
			
		||||
            if DT_PLTGOT in dynamic:
 | 
			
		||||
                builder.add_section('.got.plt', dynamic[DT_PLTGOT], end=plt_got_end)
 | 
			
		||||
 | 
			
		||||
            if not self.armv7:
 | 
			
		||||
                f.seek(0)
 | 
			
		||||
                text = f.read(self.textsize)
 | 
			
		||||
                last = 12
 | 
			
		||||
                while True:
 | 
			
		||||
                    pos = text.find(struct.pack('<I', 0xD61F0220), last)
 | 
			
		||||
                    if pos == -1: break
 | 
			
		||||
                    last = pos+1
 | 
			
		||||
                    if (pos % 4) != 0: continue
 | 
			
		||||
                    off = pos - 12
 | 
			
		||||
                    a, b, c, d = struct.unpack_from('<IIII', text, off)
 | 
			
		||||
                    if d == 0xD61F0220 and (a & 0x9f00001f) == 0x90000010 and (b & 0xffe003ff) == 0xf9400211:
 | 
			
		||||
                        base = off & ~0xFFF
 | 
			
		||||
                        immhi = (a >> 5) & 0x7ffff
 | 
			
		||||
                        immlo = (a >> 29) & 3
 | 
			
		||||
                        paddr = base + ((immlo << 12) | (immhi << 14))
 | 
			
		||||
                        poff = ((b >> 10) & 0xfff) << 3
 | 
			
		||||
                        target = paddr + poff
 | 
			
		||||
                        if plt_got_start <= target < plt_got_end:
 | 
			
		||||
                            self.plt_entries.append((off, target))
 | 
			
		||||
                builder.add_section('.plt', min(self.plt_entries)[0], end=max(self.plt_entries)[0] + 0x10)
 | 
			
		||||
 | 
			
		||||
            # try to find the ".got" which should follow the ".got.plt"
 | 
			
		||||
            if not self.isLibnx:
 | 
			
		||||
                if plt_got_end is not None:
 | 
			
		||||
                    good = False
 | 
			
		||||
                    got_end = plt_got_end + self.offsize
 | 
			
		||||
                    while got_end in locations and (DT_INIT_ARRAY not in dynamic or got_end < dynamic[DT_INIT_ARRAY]):
 | 
			
		||||
                        good = True
 | 
			
		||||
                        got_end += self.offsize
 | 
			
		||||
 | 
			
		||||
                    if good:
 | 
			
		||||
                        builder.add_section('.got', plt_got_end, end=got_end)
 | 
			
		||||
        if self.isLibnx:
 | 
			
		||||
            builder.add_section('.got', self.libnx_got_start, end=self.libnx_got_end)
 | 
			
		||||
 | 
			
		||||
        self.sections = []
 | 
			
		||||
        for start, end, name, kind in builder.flatten():
 | 
			
		||||
            self.sections.append((start, end, name, kind))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def process_relocations(self, f, symbols, offset, size):
 | 
			
		||||
        locations = set()
 | 
			
		||||
        f.seek(offset)
 | 
			
		||||
        relocsize = 8 if self.armv7 else 0x18
 | 
			
		||||
        for i in iter_range(size // relocsize):
 | 
			
		||||
            # NOTE: currently assumes all armv7 relocs have no addends,
 | 
			
		||||
            # and all 64-bit ones do.
 | 
			
		||||
            if self.armv7:
 | 
			
		||||
                offset, info = f.read('II')
 | 
			
		||||
                addend = None
 | 
			
		||||
                r_type = info & 0xff
 | 
			
		||||
                r_sym = info >> 8
 | 
			
		||||
            else:
 | 
			
		||||
                offset, info, addend = f.read('QQq')
 | 
			
		||||
                r_type = info & 0xffffffff
 | 
			
		||||
                r_sym = info >> 32
 | 
			
		||||
 | 
			
		||||
            sym = symbols[r_sym] if r_sym != 0 else None
 | 
			
		||||
 | 
			
		||||
            if r_type != R_AARCH64_TLSDESC and r_type != R_ARM_TLS_DESC:
 | 
			
		||||
                locations.add(offset)
 | 
			
		||||
            self.relocations.append((offset, r_type, sym, addend))
 | 
			
		||||
        return locations
 | 
			
		||||
 | 
			
		||||
    def get_dynstr(self, o):
 | 
			
		||||
        return ascii_string(self.dynstr[o:self.dynstr.index(b'\x00', o)])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NsoFile(NxoFileBase):
 | 
			
		||||
    def __init__(self, fileobj):
 | 
			
		||||
        f = BinFile(fileobj)
 | 
			
		||||
 | 
			
		||||
        if f.read_from('4s', 0) != b'NSO0':
 | 
			
		||||
            raise NxoException('Invalid NSO magic')
 | 
			
		||||
 | 
			
		||||
        flags = f.read_from('I', 0xC)
 | 
			
		||||
 | 
			
		||||
        toff, tloc, tsize = f.read_from('III', 0x10)
 | 
			
		||||
        roff, rloc, rsize = f.read_from('III', 0x20)
 | 
			
		||||
        doff, dloc, dsize = f.read_from('III', 0x30)
 | 
			
		||||
 | 
			
		||||
        tfilesize, rfilesize, dfilesize = f.read_from('III', 0x60)
 | 
			
		||||
        bsssize = f.read_from('I', 0x3C)
 | 
			
		||||
 | 
			
		||||
        #print('load text: ')
 | 
			
		||||
        text = (uncompress(f.read_from(tfilesize, toff), uncompressed_size=tsize), None, tloc, tsize) if flags & 1 else (f.read_from(tfilesize, toff), toff, tloc, tsize)
 | 
			
		||||
        ro   = (uncompress(f.read_from(rfilesize, roff), uncompressed_size=rsize), None, rloc, rsize) if flags & 2 else (f.read_from(rfilesize, roff), roff, rloc, rsize)
 | 
			
		||||
        data = (uncompress(f.read_from(dfilesize, doff), uncompressed_size=dsize), None, dloc, dsize) if flags & 4 else (f.read_from(dfilesize, doff), doff, dloc, dsize)
 | 
			
		||||
 | 
			
		||||
        super(NsoFile, self).__init__(text, ro, data, bsssize)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NroFile(NxoFileBase):
 | 
			
		||||
    def __init__(self, fileobj):
 | 
			
		||||
        f = BinFile(fileobj)
 | 
			
		||||
 | 
			
		||||
        if f.read_from('4s', 0x10) != b'NRO0':
 | 
			
		||||
            raise NxoException('Invalid NRO magic')
 | 
			
		||||
 | 
			
		||||
        f.seek(0x20)
 | 
			
		||||
 | 
			
		||||
        tloc, tsize = f.read('II')
 | 
			
		||||
        rloc, rsize = f.read('II')
 | 
			
		||||
        dloc, dsize = f.read('II')
 | 
			
		||||
        bsssize = f.read_from('I', 0x28)
 | 
			
		||||
 | 
			
		||||
        text = (f.read_from(tsize, tloc), tloc, tloc, tsize)
 | 
			
		||||
        ro   = (f.read_from(rsize, rloc), rloc, rloc, rsize)
 | 
			
		||||
        data = (f.read_from(dsize, dloc), dloc, dloc, dsize)
 | 
			
		||||
 | 
			
		||||
        super(NroFile, self).__init__(text, ro, data, bsssize)
 | 
			
		||||
 | 
			
		||||
class KipFile(NxoFileBase):
 | 
			
		||||
    def __init__(self, fileobj):
 | 
			
		||||
        f = BinFile(fileobj)
 | 
			
		||||
 | 
			
		||||
        if f.read_from('4s', 0) != b'KIP1':
 | 
			
		||||
            raise NxoException('Invalid KIP magic')
 | 
			
		||||
 | 
			
		||||
        flags = f.read_from('b', 0x1F)
 | 
			
		||||
 | 
			
		||||
        tloc, tsize, tfilesize = f.read_from('III', 0x20)
 | 
			
		||||
        rloc, rsize, rfilesize = f.read_from('III', 0x30)
 | 
			
		||||
        dloc, dsize, dfilesize = f.read_from('III', 0x40)
 | 
			
		||||
 | 
			
		||||
        toff = 0x100
 | 
			
		||||
        roff = toff + tfilesize
 | 
			
		||||
        doff = roff + rfilesize
 | 
			
		||||
 | 
			
		||||
        bsssize = f.read_from('I', 0x54)
 | 
			
		||||
        print('bss size 0x%x' % bsssize)
 | 
			
		||||
 | 
			
		||||
        print('load segments')
 | 
			
		||||
        text = (kip1_blz_decompress(f.read_from(tfilesize, toff)), None, tloc, tsize) if flags & 1 else (f.read_from(tfilesize, toff), toff, tloc, tsize)
 | 
			
		||||
        ro   = (kip1_blz_decompress(f.read_from(rfilesize, roff)), None, rloc, rsize) if flags & 2 else (f.read_from(rfilesize, roff), roff, rloc, rsize)
 | 
			
		||||
        data = (kip1_blz_decompress(f.read_from(dfilesize, doff)), None, dloc, dsize) if flags & 4 else (f.read_from(dfilesize, doff), doff, dloc, dsize)
 | 
			
		||||
 | 
			
		||||
        super(KipFile, self).__init__(text, ro, data, bsssize)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NxoException(Exception):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def load_nxo(fileobj):
 | 
			
		||||
    fileobj.seek(0)
 | 
			
		||||
    header = fileobj.read(0x14)
 | 
			
		||||
 | 
			
		||||
    if header[:4] == b'NSO0':
 | 
			
		||||
        return NsoFile(fileobj)
 | 
			
		||||
    elif header[0x10:0x14] == b'NRO0':
 | 
			
		||||
        return NroFile(fileobj)
 | 
			
		||||
    elif header[:4] == b'KIP1':
 | 
			
		||||
        return KipFile(fileobj)
 | 
			
		||||
    else:
 | 
			
		||||
        raise NxoException("not an NRO or NSO or KIP file")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    import idaapi
 | 
			
		||||
    import idc
 | 
			
		||||
except ImportError:
 | 
			
		||||
    pass
 | 
			
		||||
else:
 | 
			
		||||
    # IDA specific code
 | 
			
		||||
    def accept_file(li, n):
 | 
			
		||||
        print('accept_file')
 | 
			
		||||
        if not isinstance(n, int_types) or n == 0:
 | 
			
		||||
            li.seek(0)
 | 
			
		||||
            if li.read(4) == b'NSO0':
 | 
			
		||||
                return 'nxo.py: Switch binary (NSO)'
 | 
			
		||||
            li.seek(0)
 | 
			
		||||
            if li.read(4) == b'KIP1':
 | 
			
		||||
                return 'nxo.py: Switch binary (KIP)'
 | 
			
		||||
            li.seek(0x10)
 | 
			
		||||
            if li.read(4) == b'NRO0':
 | 
			
		||||
                return 'nxo.py: Switch binary (NRO)'
 | 
			
		||||
        return 0
 | 
			
		||||
 | 
			
		||||
    def ida_make_offset(f, ea):
 | 
			
		||||
        if f.armv7:
 | 
			
		||||
            idaapi.create_data(ea, idc.FF_DWORD, 4, idaapi.BADADDR)
 | 
			
		||||
        else:
 | 
			
		||||
            idaapi.create_data(ea, idc.FF_QWORD, 8, idaapi.BADADDR)
 | 
			
		||||
        idc.op_plain_offset(ea, 0, 0)
 | 
			
		||||
 | 
			
		||||
    def find_bl_targets(text_start, text_end):
 | 
			
		||||
        targets = set()
 | 
			
		||||
        for pc in range(text_start, text_end, 4):
 | 
			
		||||
            d = idc.get_wide_dword(pc)
 | 
			
		||||
            if (d & 0xfc000000) == 0x94000000:
 | 
			
		||||
                imm = d & 0x3ffffff
 | 
			
		||||
                if imm & 0x2000000:
 | 
			
		||||
                    imm |= ~0x1ffffff
 | 
			
		||||
                if 0 <= imm <= 2:
 | 
			
		||||
                    continue
 | 
			
		||||
                target = pc + imm * 4
 | 
			
		||||
                if target >= text_start and target < text_end:
 | 
			
		||||
                    targets.add(target)
 | 
			
		||||
        return targets
 | 
			
		||||
 | 
			
		||||
    def load_file(li, neflags, format):
 | 
			
		||||
        idaapi.set_processor_type("arm", idaapi.SETPROC_LOADER_NON_FATAL|idaapi.SETPROC_LOADER)
 | 
			
		||||
        f = load_nxo(li)
 | 
			
		||||
        if f.armv7:
 | 
			
		||||
            idc.set_inf_attr(idc.INF_LFLAGS, idc.get_inf_attr(idc.INF_LFLAGS) | idc.LFLG_PC_FLAT)
 | 
			
		||||
        else:
 | 
			
		||||
            idc.set_inf_attr(idc.INF_LFLAGS, idc.get_inf_attr(idc.INF_LFLAGS) | idc.LFLG_64BIT)
 | 
			
		||||
 | 
			
		||||
        idc.set_inf_attr(idc.INF_DEMNAMES, idaapi.DEMNAM_GCC3)
 | 
			
		||||
        idaapi.set_compiler_id(idaapi.COMP_GNU)
 | 
			
		||||
        idaapi.add_til('gnulnx_arm' if f.armv7 else 'gnulnx_arm64', 1)
 | 
			
		||||
 | 
			
		||||
        loadbase = 0x60000000 if f.armv7 else 0x7100000000
 | 
			
		||||
 | 
			
		||||
        f.binfile.seek(0)
 | 
			
		||||
        as_string = f.binfile.read(f.bssoff)
 | 
			
		||||
        idaapi.mem2base(as_string, loadbase)
 | 
			
		||||
        if f.text[1] != None:
 | 
			
		||||
            li.file2base(f.text[1], loadbase + f.text[2], loadbase + f.text[2] + f.text[3], True)
 | 
			
		||||
        if f.ro[1] != None:
 | 
			
		||||
            li.file2base(f.ro[1], loadbase + f.ro[2], loadbase + f.ro[2] + f.ro[3], True)
 | 
			
		||||
        if f.data[1] != None:
 | 
			
		||||
            li.file2base(f.data[1], loadbase + f.data[2], loadbase + f.data[2] + f.data[3], True)
 | 
			
		||||
 | 
			
		||||
        for start, end, name, kind in f.sections:
 | 
			
		||||
            if name.startswith('.got'):
 | 
			
		||||
                kind = 'CONST'
 | 
			
		||||
            idaapi.add_segm(0, loadbase+start, loadbase+end, name, kind)
 | 
			
		||||
            segm = idaapi.get_segm_by_name(name)
 | 
			
		||||
            if kind == 'CONST':
 | 
			
		||||
                segm.perm = idaapi.SEGPERM_READ
 | 
			
		||||
            elif kind == 'CODE':
 | 
			
		||||
                segm.perm = idaapi.SEGPERM_READ | idaapi.SEGPERM_EXEC
 | 
			
		||||
            elif kind == 'DATA':
 | 
			
		||||
                segm.perm = idaapi.SEGPERM_READ | idaapi.SEGPERM_WRITE
 | 
			
		||||
            elif kind == 'BSS':
 | 
			
		||||
                segm.perm = idaapi.SEGPERM_READ | idaapi.SEGPERM_WRITE
 | 
			
		||||
            idaapi.update_segm(segm)
 | 
			
		||||
            idaapi.set_segm_addressing(segm, 1 if f.armv7 else 2)
 | 
			
		||||
 | 
			
		||||
        # do imports
 | 
			
		||||
        # TODO: can we make imports show up in "Imports" window?
 | 
			
		||||
        undef_count = 0
 | 
			
		||||
        for s in f.symbols:
 | 
			
		||||
            if not s.shndx and s.name:
 | 
			
		||||
                undef_count += 1
 | 
			
		||||
        last_ea = max(loadbase + end for start, end, name, kind in f.sections)
 | 
			
		||||
        undef_entry_size = 8
 | 
			
		||||
        undef_ea = ((last_ea + 0xFFF) & ~0xFFF) + undef_entry_size # plus 8 so we don't end up on the "end" symbol
 | 
			
		||||
        idaapi.add_segm(0, undef_ea, undef_ea+undef_count*undef_entry_size, "UNDEF", "XTRN")
 | 
			
		||||
        segm = idaapi.get_segm_by_name("UNDEF")
 | 
			
		||||
        segm.type = idaapi.SEG_XTRN
 | 
			
		||||
        idaapi.update_segm(segm)
 | 
			
		||||
        for i,s in enumerate(f.symbols):
 | 
			
		||||
            if not s.shndx and s.name:
 | 
			
		||||
                idaapi.create_data(undef_ea, idc.FF_QWORD, 8, idaapi.BADADDR)
 | 
			
		||||
                idaapi.force_name(undef_ea, s.name)
 | 
			
		||||
                s.resolved = undef_ea
 | 
			
		||||
                undef_ea += undef_entry_size
 | 
			
		||||
            elif i != 0:
 | 
			
		||||
                assert s.shndx
 | 
			
		||||
                s.resolved = loadbase + s.value
 | 
			
		||||
                if s.name:
 | 
			
		||||
                    if s.type == STT_FUNC:
 | 
			
		||||
                        print(hex(s.resolved), s.name)
 | 
			
		||||
                        idaapi.add_entry(s.resolved, s.resolved, s.name, 0)
 | 
			
		||||
                    else:
 | 
			
		||||
                        idaapi.force_name(s.resolved, s.name)
 | 
			
		||||
 | 
			
		||||
            else:
 | 
			
		||||
                # NULL symbol
 | 
			
		||||
                s.resolved = 0
 | 
			
		||||
 | 
			
		||||
        funcs = set()
 | 
			
		||||
        for s in f.symbols:
 | 
			
		||||
            if s.name and s.shndx and s.value:
 | 
			
		||||
                if s.type == STT_FUNC:
 | 
			
		||||
                    funcs.add(loadbase+s.value)
 | 
			
		||||
 | 
			
		||||
        got_name_lookup = {}
 | 
			
		||||
        for offset, r_type, sym, addend in f.relocations:
 | 
			
		||||
            target = offset + loadbase
 | 
			
		||||
            if r_type in (R_ARM_GLOB_DAT, R_ARM_JUMP_SLOT, R_ARM_ABS32):
 | 
			
		||||
                if not sym:
 | 
			
		||||
                    print('error: relocation at %X failed' % target)
 | 
			
		||||
                else:
 | 
			
		||||
                    idaapi.put_dword(target, sym.resolved)
 | 
			
		||||
            elif r_type == R_ARM_RELATIVE:
 | 
			
		||||
                idaapi.put_dword(target, idaapi.get_dword(target) + loadbase)
 | 
			
		||||
            elif r_type in (R_AARCH64_GLOB_DAT, R_AARCH64_JUMP_SLOT, R_AARCH64_ABS64):
 | 
			
		||||
                idaapi.put_qword(target, sym.resolved + addend)
 | 
			
		||||
                if addend == 0:
 | 
			
		||||
                    got_name_lookup[offset] = sym.name
 | 
			
		||||
            elif r_type == R_AARCH64_RELATIVE:
 | 
			
		||||
                idaapi.put_qword(target, loadbase + addend)
 | 
			
		||||
                if addend < f.textsize:
 | 
			
		||||
                    funcs.add(loadbase + addend)
 | 
			
		||||
            else:
 | 
			
		||||
                print('TODO r_type %d' % (r_type,))
 | 
			
		||||
            ida_make_offset(f, target)
 | 
			
		||||
 | 
			
		||||
        for func, target in f.plt_entries:
 | 
			
		||||
            if target in got_name_lookup:
 | 
			
		||||
                addr = loadbase + func
 | 
			
		||||
                funcs.add(addr)
 | 
			
		||||
                idaapi.force_name(addr, got_name_lookup[target])
 | 
			
		||||
 | 
			
		||||
        funcs |= find_bl_targets(loadbase, loadbase+f.textsize)
 | 
			
		||||
 | 
			
		||||
        for addr in sorted(funcs, reverse=True):
 | 
			
		||||
            idc.AutoMark(addr, idc.AU_CODE)
 | 
			
		||||
            idc.AutoMark(addr, idc.AU_PROC)
 | 
			
		||||
 | 
			
		||||
        return 1
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user