国行Switch卡带报错2016-2101的问题
背景
2020年1月15日,国行版《新 超级马里奥兄弟U 豪华版》实体卡带发售。根据网友的测试,中国地区发售的卡带插入国行以外的Nintendo Switch主机中,会出现如下提示:
错误代码: 2016-2101
在此主机上无法游玩此卡带。
详情查看Nintendo Switch支持网站。
nintendoswitch.com.cn/support
看到网友上传的图片后,产生了一下两点疑惑:
- 该信息是出现在中国以外地区的主机上,而错误信息中的支持网站网址是中国版Nintendo switch的支持页面。该错误信息是存储于系统中还是游戏卡带中。
- 系统是如何识别游戏卡区域,并拒绝运行软件的。
信息来源
Nintendo Switch Brew是一个讨论研究Nintendo Switch破解、运行自制软件的网站。其包含了大量对于Nintendo Switch软件系统的分析。
系统分析
国行主机发售后,国行机器与其他地区主机同时推送了更新,软件版本号均为9.1.0。
游戏卡带
在卡带镜像文件中,Gamecard Flags字段新增两个字节’DifferentRegionCupToTerraDevice’和’DifferentRegionCupToGlobalDevice’,用以区分游戏卡的区域是中国大陆还是全球。
这里出现了一个新的单词Terra,其原意为“大陆”。在9.0系统中还出现了一个新的服务NGCT service,全称为“Not Good Content for Terra”,该服务模块负责针对中国地区敏感词的处理。由此可以得知在Nintendo Switch的系统中,Terra指代中国大陆。
Gamecard Info字段新增’Compatibility Type’一字节,其值为0时代表‘正常’,值为1时代表‘中国大陆’。
主机系统
与游戏卡带运行有关的系统服务主要有两个,FS(Filesystem Service)和NS(NS Service)。
在FS中,IDeviceOperator下有两个区分游戏卡区域的命令。GetGameCardAttribute会读取游戏卡中Gamecard Flags字段,返回变量GameCardAttribute,以此代表游戏卡属性,并标记是否为中国大陆地区发售。GetGameCardCompatibilityType会读取游戏卡中Gamecard Info字段,返回CompatibilityType变量,值为0时代表‘全球’,值为1时代表‘中国大陆’。
在NS中,IApplicationManagerInterface下有一个命令负责获取游戏卡区域。GetGameCardPlatformRegion命令获取CompatibilityType变量值,并返回到GameCardPlatformRegion变量,值为0表示‘全球’,值为1表示‘中国’。SystemDeliveryInfo字段有一字节值表示平台区域(PlatformRegion),值为0表示‘未知’,1表示‘全球’,2表示‘中国’。
错误代码分析
根据购买国行卡带的网友上传的图片,可以看到,国行卡带在其他区域主机无法运行时系统出现的错误代码为2016-2101。Switch系统错误代码由两个四位数字组成,前四个数字为2000+错误模块代码,后四个数字为描述。通过查阅,16指代的是NS模块,未找到2101对应描述。
根据推测,当用户使用其他地区主机尝试运行国行卡带时,主机系统会读取游戏卡中区域代码及兼容类型(CompatibilityType),并与机器区域进行比对。如果出现中国地区卡带尝试在全球主机上运行的情况,就会报错终止运行,并弹出错误提示。该过程是由NS Service进行。