diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5af8099f66d8..4073b2ffd4a4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: name: Verify SlippiRustExtensions Commit is in Main runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Main Branch Check shell: bash run: | @@ -59,7 +59,7 @@ jobs: runs-on: windows-2022 steps: - name: "Checkout" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive - id: rust_ver @@ -72,7 +72,7 @@ jobs: toolchain: ${{ steps.rust_ver.outputs.rust_ver }} # Pin to our specific Rust version. rustflags: "" # Disable default injection of warnings = errors. - name: Cache Utils - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ./CodeSignTool/ @@ -117,9 +117,9 @@ jobs: echo "not release, skipping code signing" exit 0; } - mkdir CodeSignTool - cd .\CodeSignTool - if (!(Test-Path ".\CodeSignTool\CodeSignTool.bat" -PathType Leaf)) { + if (!(Test-Path ".\CodeSignTool\CodeSignTool.bat" -PathType Leaf)) { + mkdir CodeSignTool + cd .\CodeSignTool Invoke-WebRequest -Uri https://www.ssl.com/download/codesigntool-for-windows/ -UseBasicParsing -OutFile ".\CodeSignTool.zip" 7z x CodeSignTool.zip Remove-Item CodeSignTool.zip @@ -136,7 +136,7 @@ jobs: 7z a $FILE_NAME .\* move $FILE_NAME ..\..\artifact\ - name: "Publish" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact_name }} path: "./artifact/" @@ -158,7 +158,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: "Checkout" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive - id: rust_ver @@ -216,6 +216,7 @@ jobs: libegl1-mesa-dev \ libpng-dev \ qt6-base-private-dev \ + libqt6svg6-dev \ libxxf86vm-dev \ x11proto-xinerama-dev \ libfuse2 @@ -240,7 +241,7 @@ jobs: popd mv "${FILE_NAME}" ./artifact/ - name: "Publish" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact_name }} path: "./artifact/" @@ -262,7 +263,7 @@ jobs: runs-on: macos-12 steps: - name: "Checkout" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: recursive - id: rust_ver @@ -349,7 +350,7 @@ jobs: /usr/bin/codesign -f -s "${{ secrets.APPLE_IDENTITY_HASH }}" --deep --options runtime ./artifact/${{ env.FILE_NAME }}.dmg chmod +x Tools/notarize_netplay.sh && ./Tools/notarize_netplay.sh ./artifact/${{ env.FILE_NAME }}.dmg - name: "Publish" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact_name }} path: "./artifact/" diff --git a/.gitmodules b/.gitmodules index cb6ac9a1b4ac..750097659da8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -57,3 +57,27 @@ [submodule "Externals/SlippiRustExtensions"] path = Externals/SlippiRustExtensions url = https://github.com/project-slippi/slippi-rust-extensions.git +[submodule "Externals/rcheevos/rcheevos"] + path = Externals/rcheevos/rcheevos + url = https://github.com/RetroAchievements/rcheevos.git +[submodule "Externals/libadrenotools"] + path = Externals/libadrenotools + url = https://github.com/bylaws/libadrenotools.git +[submodule "Externals/curl/curl"] + path = Externals/curl/curl + url = https://github.com/curl/curl.git +[submodule "Externals/fmt/fmt"] + path = Externals/fmt/fmt + url = https://github.com/fmtlib/fmt.git +[submodule "Externals/lz4/lz4"] + path = Externals/lz4/lz4 + url = https://github.com/lz4/lz4 +[submodule "Externals/xxhash/xxHash"] + path = Externals/xxhash/xxHash + url = https://github.com/Cyan4973/xxHash.git +[submodule "Externals/enet/enet"] + path = Externals/enet/enet + url = https://github.com/lsalzman/enet.git +[submodule "hidapi-src"] + path = Externals/hidapi/hidapi-src + url = https://github.com/libusb/hidapi diff --git a/BuildMacOSUniversalBinary.py b/BuildMacOSUniversalBinary.py index 6ac9ae9e550b..442fb83fe7c1 100755 --- a/BuildMacOSUniversalBinary.py +++ b/BuildMacOSUniversalBinary.py @@ -76,7 +76,10 @@ "steam": False, # Whether our autoupdate functionality is enabled or not. - "autoupdate": True + "autoupdate": True, + + # The distributor for this build. + "distributor": "None" } # Architectures to build for. This is explicity left out of the command line @@ -136,6 +139,11 @@ def parse_args(conf=DEFAULT_CONFIG): action=argparse.BooleanOptionalAction, default=conf["autoupdate"]) + parser.add_argument( + "--distributor", + help="Sets the distributor for this build", + default=conf["distributor"]) + parser.add_argument( "--codesign", help="Code signing identity to use to sign the applications", @@ -316,6 +324,7 @@ def build(config): + python_to_cmake_bool(config["steam"]), "-DENABLE_AUTOUPDATE=" + python_to_cmake_bool(config["autoupdate"]), + '-DDISTRIBUTOR=' + config['distributor'] ], env=env, cwd=arch) diff --git a/CMake/CheckAndAddFlag.cmake b/CMake/CheckAndAddFlag.cmake index 226e57083341..4fe7d5be183a 100644 --- a/CMake/CheckAndAddFlag.cmake +++ b/CMake/CheckAndAddFlag.cmake @@ -21,6 +21,8 @@ function(check_and_add_flag var flag) set(genexp_config_test "1") if(ARGV2 STREQUAL "DEBUG_ONLY") set(genexp_config_test "$") + elseif(ARGV2 STREQUAL "NO_DEBINFO_ONLY") + set(genexp_config_test "$,$>>") elseif(ARGV2 STREQUAL "RELEASE_ONLY") set(genexp_config_test "$>") elseif(ARGV2) diff --git a/CMake/CheckVendoringApproved.cmake b/CMake/CheckVendoringApproved.cmake deleted file mode 100644 index 84e21201131a..000000000000 --- a/CMake/CheckVendoringApproved.cmake +++ /dev/null @@ -1,29 +0,0 @@ -# When packaging Dolphin for an OS distribution, distro vendors usually prefer -# to limit vendored ("Externals") dependencies as much as possible, in favor of -# using system provided libraries. This modules provides an option to allow -# only specific vendored dependencies and error-out at configuration time for -# non-approved ones. -# -# Usage: -# $ cmake -D APPROVED_VENDORED_DEPENDENCIES="a;b;c;..." -# -# Unless the option is explicitly used, vendored dependencies control is -# disabled. -# -# If you want to disallow all vendored dependencies, put "none" in the approved -# dependencies list. - -set(APPROVED_VENDORED_DEPENDENCIES "" CACHE STRING "\ -Semicolon separated list of approved vendored dependencies. See docstring in \ -CMake/CheckVendoringApproved.cmake.") - -function(check_vendoring_approved dep) - if(APPROVED_VENDORED_DEPENDENCIES) - if(NOT dep IN_LIST APPROVED_VENDORED_DEPENDENCIES) - message(SEND_ERROR "\ -Library ${dep} was not found systemwide and was not approved for vendoring. \ -Vendored dependencies control is enabled. Add \"${dep}\" to the \ -APPROVED_VENDORED_DEPENDENCIES list to bypass this error.") - endif() - endif() -endfunction() diff --git a/CMake/DolphinLibraryTools.cmake b/CMake/DolphinLibraryTools.cmake index f1681306cb6e..37f439de545a 100644 --- a/CMake/DolphinLibraryTools.cmake +++ b/CMake/DolphinLibraryTools.cmake @@ -18,3 +18,78 @@ function(dolphin_make_imported_target_if_missing target lib) add_library(${target} ALIAS _${lib}) endif() endfunction() + +function(dolphin_optional_system_library library) + string(TOUPPER ${library} upperlib) + set(USE_SYSTEM_${upperlib} "" CACHE STRING "Use system ${library} instead of bundled. ON - Always use system and fail if unavailable, OFF - Always use bundled, AUTO - Use system if available, otherwise use bundled, blank - Delegate to USE_SYSTEM_LIBS. Default is blank.") + if("${USE_SYSTEM_${upperlib}}" STREQUAL "") + if(APPROVED_VENDORED_DEPENDENCIES) + string(TOLOWER ${library} lowerlib) + if(lowerlib IN_LIST APPROVED_VENDORED_DEPENDENCIES) + set(RESOLVED_USE_SYSTEM_${upperlib} AUTO PARENT_SCOPE) + else() + set(RESOLVED_USE_SYSTEM_${upperlib} ON PARENT_SCOPE) + endif() + else() + set(RESOLVED_USE_SYSTEM_${upperlib} ${USE_SYSTEM_LIBS} PARENT_SCOPE) + endif() + else() + set(RESOLVED_USE_SYSTEM_${upperlib} ${USE_SYSTEM_${upperlib}} PARENT_SCOPE) + endif() +endfunction() + +function(dolphin_add_bundled_library library bundled_path) + string(TOUPPER ${library} upperlib) + if (${RESOLVED_USE_SYSTEM_${upperlib}} STREQUAL "AUTO") + message(STATUS "No system ${library} was found. Using static ${library} from Externals.") + else() + message(STATUS "Using static ${library} from Externals") + endif() + if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${bundled_path}/CMakeLists.txt") + message(FATAL_ERROR "No bundled ${library} was found. Did you forget to checkout submodules?") + endif() + add_subdirectory(${bundled_path} EXCLUDE_FROM_ALL) +endfunction() + +function(dolphin_find_optional_system_library library bundled_path) + dolphin_optional_system_library(${library}) + string(TOUPPER ${library} upperlib) + if(RESOLVED_USE_SYSTEM_${upperlib}) + find_package(${library} ${ARGN}) + # Yay for cmake packages being inconsistent + if(DEFINED ${library}_FOUND) + set(prefix ${library}) + else() + set(prefix ${upperlib}) + endif() + if((NOT ${found}) AND (NOT ${RESOLVED_USE_SYSTEM_${upperlib}} STREQUAL "AUTO")) + message(FATAL_ERROR "No system ${library} was found. Please install it or set USE_SYSTEM_${upperlib} to AUTO or OFF.") + endif() + endif() + if(${prefix}_FOUND) + message(STATUS "Using system ${library}") + set(${prefix}_TYPE "System" PARENT_SCOPE) + else() + dolphin_add_bundled_library(${library} ${bundled_path}) + set(${prefix}_TYPE "Bundled" PARENT_SCOPE) + endif() +endfunction() + +function(dolphin_find_optional_system_library_pkgconfig library search alias bundled_path) + dolphin_optional_system_library(${library}) + string(TOUPPER ${library} upperlib) + if(RESOLVED_USE_SYSTEM_${upperlib}) + pkg_check_modules(${library} ${search} ${ARGN} IMPORTED_TARGET) + if((NOT ${library}_FOUND) AND (NOT ${RESOLVED_USE_SYSTEM_${upperlib}} STREQUAL "AUTO")) + message(FATAL_ERROR "No system ${library} was found. Please install it or set USE_SYSTEM_${upperlib} to AUTO or OFF.") + endif() + endif() + if(${library}_FOUND) + message(STATUS "Using system ${library}") + dolphin_alias_library(${alias} PkgConfig::${library}) + set(${library}_TYPE "System" PARENT_SCOPE) + else() + dolphin_add_bundled_library(${library} ${bundled_path}) + set(${library}_TYPE "Bundled" PARENT_SCOPE) + endif() +endfunction() diff --git a/CMake/FindCUBEB.cmake b/CMake/FindCUBEB.cmake index c0a730c7ab7e..94ed431a9bb2 100644 --- a/CMake/FindCUBEB.cmake +++ b/CMake/FindCUBEB.cmake @@ -6,7 +6,7 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CUBEB DEFAULT_MSG CUBEB_INCLUDE_DIR CUBEB_LIBRARY) -if(CUBEB_FOUND AND NOT TARGET CUBEB) +if(CUBEB_FOUND AND NOT TARGET cubeb::cubeb) add_library(cubeb::cubeb UNKNOWN IMPORTED) set_target_properties(cubeb::cubeb PROPERTIES IMPORTED_LOCATION "${CUBEB_LIBRARY}" diff --git a/CMake/FindIconv.cmake b/CMake/FindIconv.cmake new file mode 100644 index 000000000000..d0b86fc7cbd2 --- /dev/null +++ b/CMake/FindIconv.cmake @@ -0,0 +1,101 @@ +# Based on CMake's FindIconv.cmake +# Modified to prefer non-built-in iconv over the built-in one +# See https://gitlab.kitware.com/cmake/cmake/-/issues/24695 for details +# This file can be deleted once that issue has been closed and the fix has +# made it into a satisfactory number of cmake versions. FreeBSD is the only +# system known to hit this so far, so "satisfactory" can probably be defined +# as "enough that most FreeBSD users have a fixed cmake". + +find_path(Iconv_INCLUDE_DIR + NAMES "iconv.h" + DOC "iconv include directory") +mark_as_advanced(Iconv_INCLUDE_DIR) + +find_library(Iconv_LIBRARY + NAMES iconv libiconv + NAMES_PER_DIR + DOC "iconv library (if not in the C library)") +mark_as_advanced(Iconv_LIBRARY) + +# iconv can only be provided in libc on a POSIX system. +if(UNIX AND (NOT Iconv_INCLUDE_DIR OR NOT Iconv_LIBRARY)) + include(CMakePushCheckState) + include(CheckCXXSourceCompiles) + cmake_push_check_state(RESET) + # We always suppress the message here: Otherwise on supported systems + # not having iconv in their C library (e.g. those using libiconv) + # would always display a confusing "Looking for iconv - not found" message + set(CMAKE_FIND_QUIETLY TRUE) + # The following code will not work, but it's sufficient to see if it compiles. + # Note: libiconv will define the iconv functions as macros, so CheckSymbolExists + # will not yield correct results. + set(Iconv_IMPLICIT_TEST_CODE + " + #include + #include + int main() { + char *a, *b; + size_t i, j; + iconv_t ic; + ic = iconv_open(\"to\", \"from\"); + iconv(ic, &a, &i, &b, &j); + iconv_close(ic); + } + " + ) + check_cxx_source_compiles("${Iconv_IMPLICIT_TEST_CODE}" Iconv_IS_BUILT_IN) + cmake_pop_check_state() + if(Iconv_IS_BUILT_IN) + unset(Iconv_INCLUDE_DIR) + unset(Iconv_LIBRARY) + endif() +else() + set(Iconv_IS_BUILT_IN FALSE) +endif() + +set(_Iconv_REQUIRED_VARS) +if(Iconv_IS_BUILT_IN) + set(_Iconv_REQUIRED_VARS _Iconv_IS_BUILT_IN_MSG) + set(_Iconv_IS_BUILT_IN_MSG "built in to C library") +else() + set(_Iconv_REQUIRED_VARS Iconv_LIBRARY Iconv_INCLUDE_DIR) +endif() + +# NOTE: glibc's iconv.h does not define _LIBICONV_VERSION +if(Iconv_INCLUDE_DIR AND EXISTS "${Iconv_INCLUDE_DIR}/iconv.h") + file(STRINGS ${Iconv_INCLUDE_DIR}/iconv.h Iconv_VERSION_DEFINE REGEX "_LIBICONV_VERSION (.*)") + + if(Iconv_VERSION_DEFINE MATCHES "(0x[A-Fa-f0-9]+)") + set(Iconv_VERSION_NUMBER "${CMAKE_MATCH_1}") + # encoding -> version number: (major<<8) + minor + math(EXPR Iconv_VERSION_MAJOR "${Iconv_VERSION_NUMBER} >> 8" OUTPUT_FORMAT HEXADECIMAL) + math(EXPR Iconv_VERSION_MINOR "${Iconv_VERSION_NUMBER} - (${Iconv_VERSION_MAJOR} << 8)" OUTPUT_FORMAT HEXADECIMAL) + + math(EXPR Iconv_VERSION_MAJOR "${Iconv_VERSION_MAJOR}" OUTPUT_FORMAT DECIMAL) + math(EXPR Iconv_VERSION_MINOR "${Iconv_VERSION_MINOR}" OUTPUT_FORMAT DECIMAL) + set(Iconv_VERSION "${Iconv_VERSION_MAJOR}.${Iconv_VERSION_MINOR}") + endif() + + unset(Iconv_VERSION_DEFINE) + unset(Iconv_VERSION_NUMBER) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Iconv + REQUIRED_VARS ${_Iconv_REQUIRED_VARS} + VERSION_VAR Iconv_VERSION) + +if(Iconv_FOUND) + if(Iconv_IS_BUILT_IN) + set(Iconv_INCLUDE_DIRS "") + set(Iconv_LIBRARIES "") + else() + set(Iconv_INCLUDE_DIRS "${Iconv_INCLUDE_DIR}") + set(Iconv_LIBRARIES "${Iconv_LIBRARY}") + endif() + if(NOT TARGET Iconv::Iconv) + add_library(Iconv::Iconv INTERFACE IMPORTED) + set_property(TARGET Iconv::Iconv PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${Iconv_INCLUDE_DIRS}") + set_property(TARGET Iconv::Iconv PROPERTY INTERFACE_LINK_LIBRARIES "${Iconv_LIBRARIES}") + endif() +endif() diff --git a/CMake/FindLZO.cmake b/CMake/FindLZO.cmake new file mode 100644 index 000000000000..2a146b37c8c4 --- /dev/null +++ b/CMake/FindLZO.cmake @@ -0,0 +1,15 @@ +find_path(LZO_INCLUDE_DIR lzo/lzo1x.h) +find_library(LZO_LIBRARY lzo2) +mark_as_advanced(LZO_INCLUDE_DIR LZO_LIBRARY) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LZO DEFAULT_MSG + LZO_INCLUDE_DIR LZO_LIBRARY) + +if(LZO_FOUND AND NOT TARGET LZO::LZO) + add_library(LZO::LZO UNKNOWN IMPORTED) + set_target_properties(LZO::LZO PROPERTIES + IMPORTED_LOCATION "${LZO_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${LZO_INCLUDE_DIR}" + ) +endif() diff --git a/CMake/FindLibUSB.cmake b/CMake/FindLibUSB.cmake index dec0b98b0781..c087edfcb85a 100644 --- a/CMake/FindLibUSB.cmake +++ b/CMake/FindLibUSB.cmake @@ -40,4 +40,11 @@ elseif (NOT LIBUSB_FOUND) mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) endif () +if(LIBUSB_FOUND AND NOT TARGET LibUSB::LibUSB) + add_library(LibUSB::LibUSB UNKNOWN IMPORTED) + set_target_properties(LibUSB::LibUSB PROPERTIES + IMPORTED_LOCATION "${LIBUSB_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBUSB_INCLUDE_DIR}" + ) +endif() diff --git a/CMake/FindMBEDTLS.cmake b/CMake/FindMBEDTLS.cmake index 687994806f66..6512cc92f6ea 100644 --- a/CMake/FindMBEDTLS.cmake +++ b/CMake/FindMBEDTLS.cmake @@ -1,23 +1,59 @@ -find_path(MBEDTLS_INCLUDE_DIR mbedtls/ssl.h) +find_path(MBEDTLS_INCLUDE_DIR mbedtls/ssl.h PATH_SUFFIXES mbedtls2) -find_library(MBEDTLS_LIBRARY mbedtls) -find_library(MBEDX509_LIBRARY mbedx509) -find_library(MBEDCRYPTO_LIBRARY mbedcrypto) +find_library(MBEDTLS_LIBRARY mbedtls PATH_SUFFIXES mbedtls2) +find_library(MBEDX509_LIBRARY mbedx509 PATH_SUFFIXES mbedtls2) +find_library(MBEDCRYPTO_LIBRARY mbedcrypto PATH_SUFFIXES mbedtls2) set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) set(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRARY}) -set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS}) -check_cxx_source_compiles(" - #include - #if MBEDTLS_VERSION_NUMBER < 0x021C0000 - #error \"Your mbed TLS version is too old.\" - #endif - int main() {}" - MBEDTLS_VERSION_OK) +if(NOT MBEDTLS_INCLUDE_DIR STREQUAL "MBEDTLS_INCLUDE_DIR-NOTFOUND") + if(EXISTS ${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h) + file(STRINGS ${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h MBEDTLS_VERSION_STR REGEX "^#define[ \t]+MBEDTLS_VERSION_STRING[\t ].*") + else() + file(STRINGS ${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h MBEDTLS_VERSION_STR REGEX "^#define[ \t]+MBEDTLS_VERSION_STRING[\t ].*") + endif() + string(REGEX REPLACE "^#define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"([.0-9]+)\".*" "\\1" MBEDTLS_VERSION ${MBEDTLS_VERSION_STR}) +endif() -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MBEDTLS DEFAULT_MSG - MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY MBEDTLS_VERSION_OK) +if(NOT MBEDTLS_INCLUDE_DIR STREQUAL "MBEDTLS_INCLUDE_DIR-NOTFOUND" AND MBEDTLS_VERSION VERSION_GREATER_EQUAL 3) + # Once CMake 3.19 is required, we can enable HANDLE_VERSION_RANGE and use that + if(MBEDTLS_FIND_REQUIRED) + set(type FATAL_ERROR) + else() + set(type STATUS) + endif() + if(MBEDTLS_FIND_REQUIRED OR NOT MBEDTLS_FIND_QUIETLY) + message(${type} "Could NOT find MBEDTLS: Found unsuitable version \"${MBEDTLS_VERSION}\", but a 2.x version is required (found ${MBEDTLS_INCLUDE_DIR})") + endif() + set(MBEDTLS_FOUND FALSE) +else() + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(MBEDTLS + REQUIRED_VARS MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY + VERSION_VAR MBEDTLS_VERSION) +endif() mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY) + +if(MBEDTLS_FOUND) + add_library(MbedTLS::mbedcrypto UNKNOWN IMPORTED) + set_target_properties(MbedTLS::mbedcrypto PROPERTIES + IMPORTED_LOCATION "${MBEDCRYPTO_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}" + ) + + add_library(MbedTLS::mbedx509 UNKNOWN IMPORTED) + set_target_properties(MbedTLS::mbedx509 PROPERTIES + IMPORTED_LOCATION "${MBEDX509_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES MbedTLS::mbedcrypto + ) + + add_library(MbedTLS::mbedtls UNKNOWN IMPORTED) + set_target_properties(MbedTLS::mbedtls PROPERTIES + IMPORTED_LOCATION "${MBEDTLS_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES MbedTLS::mbedx509 + ) +endif() diff --git a/CMake/FindMINIUPNPC.cmake b/CMake/FindMINIUPNPC.cmake index f9a14e2a89eb..edfc5b2b9daf 100644 --- a/CMake/FindMINIUPNPC.cmake +++ b/CMake/FindMINIUPNPC.cmake @@ -5,14 +5,17 @@ find_path(MINIUPNPC_INCLUDE_DIR miniupnpc.h PATH_SUFFIXES miniupnpc) find_library(MINIUPNPC_LIBRARY miniupnpc) if(MINIUPNPC_INCLUDE_DIR) - file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc.h" MINIUPNPC_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") - if(MINIUPNPC_API_VERSION_STR) - string(REGEX REPLACE "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)" "\\1" MINIUPNPC_API_VERSION ${MINIUPNPC_API_VERSION_STR}) + file(STRINGS "${MINIUPNPC_INCLUDE_DIR}/miniupnpc.h" MINIUPNPC_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_VERSION[\t ]+.*") + if(MINIUPNPC_VERSION_STR) + string(REGEX REPLACE "^#define[\t ]+MINIUPNPC_VERSION[\t ]+\"([.0-9]+)\"" "\\1" MINIUPNPC_VERSION ${MINIUPNPC_VERSION_STR}) endif() endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MINIUPNPC DEFAULT_MSG MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY MINIUPNPC_API_VERSION) +find_package_handle_standard_args(MINIUPNPC + REQUIRED_VARS MINIUPNPC_INCLUDE_DIR MINIUPNPC_LIBRARY + VERSION_VAR MINIUPNPC_VERSION +) set(MINIUPNPC_LIBRARIES ${MINIUPNPC_LIBRARY}) set(MINIUPNPC_INCLUDE_DIRS ${MINIUPNPC_INCLUDE_DIR}) diff --git a/CMake/FindSDL2.cmake b/CMake/FindSDL2.cmake deleted file mode 100644 index 08d8dc60807f..000000000000 --- a/CMake/FindSDL2.cmake +++ /dev/null @@ -1,250 +0,0 @@ -# - Find SDL2 -# Find the SDL2 headers and libraries -# -# SDL2::SDL2 - Imported target to use for building a library -# SDL2::SDL2main - Imported interface target to use if you want SDL and SDLmain. -# SDL2_FOUND - True if SDL2 was found. -# SDL2_DYNAMIC - If we found a DLL version of SDL (meaning you might want to copy a DLL from SDL2::SDL2) -# -# Original Author: -# 2015 Ryan Pavlik -# -# Copyright Sensics, Inc. 2015. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -# Set up architectures (for windows) and prefixes (for mingw builds) -if(WIN32) - if(MINGW) - include(MinGWSearchPathExtras OPTIONAL) - if(MINGWSEARCH_TARGET_TRIPLE) - set(SDL2_PREFIX ${MINGWSEARCH_TARGET_TRIPLE}) - endif() - endif() - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(SDL2_LIB_PATH_SUFFIX lib/x64) - if(NOT MSVC AND NOT SDL2_PREFIX) - set(SDL2_PREFIX x86_64-w64-mingw32) - endif() - else() - set(SDL2_LIB_PATH_SUFFIX lib/x86) - if(NOT MSVC AND NOT SDL2_PREFIX) - set(SDL2_PREFIX i686-w64-mingw32) - endif() - endif() -endif() - -if(SDL2_PREFIX) - set(SDL2_ORIGPREFIXPATH ${CMAKE_PREFIX_PATH}) - if(SDL2_ROOT_DIR) - list(APPEND CMAKE_PREFIX_PATH "${SDL2_ROOT_DIR}") - endif() - if(CMAKE_PREFIX_PATH) - foreach(_prefix ${CMAKE_PREFIX_PATH}) - list(APPEND CMAKE_PREFIX_PATH "${_prefix}/${SDL2_PREFIX}") - endforeach() - endif() - if(MINGWSEARCH_PREFIXES) - list(APPEND CMAKE_PREFIX_PATH ${MINGWSEARCH_PREFIXES}) - endif() -endif() - -# Invoke pkgconfig for hints -find_package(PkgConfig QUIET) -set(SDL2_INCLUDE_HINTS) -set(SDL2_LIB_HINTS) -if(PKG_CONFIG_FOUND) - pkg_search_module(SDL2PC QUIET sdl2) - if(SDL2PC_INCLUDE_DIRS) - set(SDL2_INCLUDE_HINTS ${SDL2PC_INCLUDE_DIRS}) - endif() - if(SDL2PC_LIBRARY_DIRS) - set(SDL2_LIB_HINTS ${SDL2PC_LIBRARY_DIRS}) - endif() -endif() - -include(FindPackageHandleStandardArgs) - -find_library(SDL2_LIBRARY - NAMES - SDL2 - HINTS - ${SDL2_LIB_HINTS} - PATHS - ${SDL2_ROOT_DIR} - ENV SDL2DIR - PATH_SUFFIXES lib SDL2 ${SDL2_LIB_PATH_SUFFIX}) - -set(_sdl2_framework FALSE) -# Some special-casing if we've found/been given a framework. -# Handles whether we're given the library inside the framework or the framework itself. -if(APPLE AND "${SDL2_LIBRARY}" MATCHES "(/[^/]+)*.framework(/.*)?$") - set(_sdl2_framework TRUE) - set(SDL2_FRAMEWORK "${SDL2_LIBRARY}") - # Move up in the directory tree as required to get the framework directory. - while("${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework(/.*)$" AND NOT "${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework$") - get_filename_component(SDL2_FRAMEWORK "${SDL2_FRAMEWORK}" DIRECTORY) - endwhile() - if("${SDL2_FRAMEWORK}" MATCHES "(/[^/]+)*.framework$") - set(SDL2_FRAMEWORK_NAME ${CMAKE_MATCH_1}) - # If we found a framework, do a search for the header ahead of time that will be more likely to get the framework header. - find_path(SDL2_INCLUDE_DIR - NAMES - SDL_haptic.h # this file was introduced with SDL2 - HINTS - "${SDL2_FRAMEWORK}/Headers/") - else() - # For some reason we couldn't get the framework directory itself. - # Shouldn't happen, but might if something is weird. - unset(SDL2_FRAMEWORK) - endif() -endif() - -find_path(SDL2_INCLUDE_DIR - NAMES - SDL_haptic.h # this file was introduced with SDL2 - HINTS - ${SDL2_INCLUDE_HINTS} - PATHS - ${SDL2_ROOT_DIR} - ENV SDL2DIR - PATH_SUFFIXES include include/sdl2 include/SDL2 SDL2) - -if(WIN32 AND SDL2_LIBRARY) - find_file(SDL2_RUNTIME_LIBRARY - NAMES - SDL2.dll - libSDL2.dll - HINTS - ${SDL2_LIB_HINTS} - PATHS - ${SDL2_ROOT_DIR} - ENV SDL2DIR - PATH_SUFFIXES bin lib ${SDL2_LIB_PATH_SUFFIX}) -endif() - - -if(WIN32 OR ANDROID OR IOS OR (APPLE AND NOT _sdl2_framework)) - set(SDL2_EXTRA_REQUIRED SDL2_SDLMAIN_LIBRARY) - find_library(SDL2_SDLMAIN_LIBRARY - NAMES - SDL2main - PATHS - ${SDL2_ROOT_DIR} - ENV SDL2DIR - PATH_SUFFIXES lib ${SDL2_LIB_PATH_SUFFIX}) -endif() - -if(MINGW AND NOT SDL2PC_FOUND) - find_library(SDL2_MINGW_LIBRARY mingw32) - find_library(SDL2_MWINDOWS_LIBRARY mwindows) -endif() - -if(SDL2_PREFIX) - # Restore things the way they used to be. - set(CMAKE_PREFIX_PATH ${SDL2_ORIGPREFIXPATH}) -endif() - -# handle the QUIETLY and REQUIRED arguments and set QUATLIB_FOUND to TRUE if -# all listed variables are TRUE -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(SDL2 - DEFAULT_MSG - SDL2_LIBRARY - SDL2_INCLUDE_DIR - ${SDL2_EXTRA_REQUIRED}) - -if(SDL2_FOUND) - if(NOT TARGET SDL2::SDL2) - # Create SDL2::SDL2 - if(WIN32 AND SDL2_RUNTIME_LIBRARY) - set(SDL2_DYNAMIC TRUE) - add_library(SDL2::SDL2 SHARED IMPORTED) - set_target_properties(SDL2::SDL2 - PROPERTIES - IMPORTED_IMPLIB "${SDL2_LIBRARY}" - IMPORTED_LOCATION "${SDL2_RUNTIME_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" - ) - else() - add_library(SDL2::SDL2 UNKNOWN IMPORTED) - if(SDL2_FRAMEWORK AND SDL2_FRAMEWORK_NAME) - # Handle the case that SDL2 is a framework and we were able to decompose it above. - set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LOCATION "${SDL2_FRAMEWORK}/${SDL2_FRAMEWORK_NAME}") - elseif(_sdl2_framework AND SDL2_LIBRARY MATCHES "(/[^/]+)*.framework$") - # Handle the case that SDL2 is a framework and SDL_LIBRARY is just the framework itself. - - # This takes the basename of the framework, without the extension, - # and sets it (as a child of the framework) as the imported location for the target. - # This is the library symlink inside of the framework. - set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LOCATION "${SDL2_LIBRARY}/${CMAKE_MATCH_1}") - else() - # Handle non-frameworks (including non-Mac), as well as the case that we're given the library inside of the framework - set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LOCATION "${SDL2_LIBRARY}") - endif() - set_target_properties(SDL2::SDL2 - PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}" - ) - endif() - - if(APPLE) - # Need Cocoa here, is always a framework - find_library(SDL2_COCOA_LIBRARY Cocoa) - list(APPEND SDL2_EXTRA_REQUIRED SDL2_COCOA_LIBRARY) - if(SDL2_COCOA_LIBRARY) - set_target_properties(SDL2::SDL2 PROPERTIES - IMPORTED_LINK_INTERFACE_LIBRARIES ${SDL2_COCOA_LIBRARY}) - endif() - endif() - - - # Compute what to do with SDL2main - set(SDL2MAIN_LIBRARIES SDL2::SDL2) - add_library(SDL2::SDL2main INTERFACE IMPORTED) - if(SDL2_SDLMAIN_LIBRARY) - add_library(SDL2::SDL2main_real STATIC IMPORTED) - set_target_properties(SDL2::SDL2main_real - PROPERTIES - IMPORTED_LOCATION "${SDL2_SDLMAIN_LIBRARY}") - set(SDL2MAIN_LIBRARIES SDL2::SDL2main_real ${SDL2MAIN_LIBRARIES}) - endif() - if(MINGW) - # MinGW requires some additional libraries to appear earlier in the link line. - if(SDL2PC_LIBRARIES) - # Use pkgconfig-suggested extra libraries if available. - list(REMOVE_ITEM SDL2PC_LIBRARIES SDL2main SDL2) - set(SDL2MAIN_LIBRARIES ${SDL2PC_LIBRARIES} ${SDL2MAIN_LIBRARIES}) - else() - # fall back to extra libraries specified in pkg-config in - # an official binary distro of SDL2 for MinGW I downloaded - if(SDL2_MINGW_LIBRARY) - set(SDL2MAIN_LIBRARIES ${SDL2_MINGW_LIBRARY} ${SDL2MAIN_LIBRARIES}) - endif() - if(SDL2_MWINDOWS_LIBRARY) - set(SDL2MAIN_LIBRARIES ${SDL2_MWINDOWS_LIBRARY} ${SDL2MAIN_LIBRARIES}) - endif() - endif() - set_target_properties(SDL2::SDL2main - PROPERTIES - INTERFACE_COMPILE_DEFINITIONS "main=SDL_main") - endif() - set_target_properties(SDL2::SDL2main - PROPERTIES - INTERFACE_LINK_LIBRARIES "${SDL2MAIN_LIBRARIES}") - endif() - mark_as_advanced(SDL2_ROOT_DIR) -endif() - -mark_as_advanced(SDL2_LIBRARY - SDL2_RUNTIME_LIBRARY - SDL2_INCLUDE_DIR - SDL2_SDLMAIN_LIBRARY - SDL2_COCOA_LIBRARY - SDL2_MINGW_LIBRARY - SDL2_MWINDOWS_LIBRARY) - diff --git a/CMake/FindSFML.cmake b/CMake/FindSFML.cmake index d6acdfb6d6e6..b5b26a5f000e 100644 --- a/CMake/FindSFML.cmake +++ b/CMake/FindSFML.cmake @@ -206,4 +206,20 @@ endif() # handle success if(SFML_FOUND) message(STATUS "Found SFML ${SFML_VERSION_MAJOR}.${SFML_VERSION_MINOR} in ${SFML_INCLUDE_DIR}") + foreach(FIND_SFML_COMPONENT ${SFML_FIND_COMPONENTS}) + string(TOLOWER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_LOWER) + string(TOUPPER ${FIND_SFML_COMPONENT} FIND_SFML_COMPONENT_UPPER) + if(NOT TARGET sfml-${FIND_SFML_COMPONENT_LOWER}) + add_library(sfml-${FIND_SFML_COMPONENT_LOWER} UNKNOWN IMPORTED) + set_target_properties(sfml-${FIND_SFML_COMPONENT_LOWER} PROPERTIES + IMPORTED_LOCATION "${SFML_${FIND_SFML_COMPONENT_UPPER}_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SFML_INCLUDE_DIR}" + ) + if(NOT ${FIND_SFML_COMPONENT_LOWER} STREQUAL system) + set_target_properties(sfml-${FIND_SFML_COMPONENT_LOWER} PROPERTIES + INTERFACE_LINK_LIBRARIES sfml-system + ) + endif() + endif() + endforeach() endif() diff --git a/CMake/ScmRevGen.cmake b/CMake/ScmRevGen.cmake new file mode 100644 index 000000000000..aacf7491ce7e --- /dev/null +++ b/CMake/ScmRevGen.cmake @@ -0,0 +1,53 @@ +cmake_minimum_required(VERSION 3.13) + +# for revision info +if(GIT_FOUND) + # defines DOLPHIN_WC_REVISION + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE DOLPHIN_WC_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE) + # defines DOLPHIN_WC_DESCRIBE + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty + OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # remove hash (and trailing "-0" if needed) from description + string(REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}") + + # defines DOLPHIN_WC_BRANCH + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE DOLPHIN_WC_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +# version number +set(DOLPHIN_VERSION_MAJOR "5") +set(DOLPHIN_VERSION_MINOR "0") +if(DOLPHIN_WC_BRANCH STREQUAL "stable") + set(DOLPHIN_VERSION_PATCH "0") +else() + set(DOLPHIN_VERSION_PATCH ${DOLPHIN_WC_REVISION}) +endif() + +# If Dolphin is not built from a Git repository, default the version info to +# reasonable values. +if(NOT DOLPHIN_WC_REVISION) + set(DOLPHIN_WC_DESCRIBE "${DOLPHIN_VERSION_MAJOR}.${DOLPHIN_VERSION_MINOR}") + set(DOLPHIN_WC_REVISION "${DOLPHIN_WC_DESCRIBE} (no further info)") + set(DOLPHIN_WC_BRANCH "master") +endif() + +if(DOLPHIN_WC_BRANCH STREQUAL "master" OR DOLPHIN_WC_BRANCH STREQUAL "stable") + set(DOLPHIN_WC_IS_STABLE "1") +else() + set(DOLPHIN_WC_IS_STABLE "0") +endif() + +configure_file( + "${PROJECT_SOURCE_DIR}/Source/Core/Common/scmrev.h.in" + "${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h.tmp" +) + +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h.tmp" "${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h") + +file(REMOVE "${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h.tmp") diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c8f3502a457..0d4fcb131491 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,10 @@ cmake_minimum_required(VERSION 3.13) cmake_policy(SET CMP0079 NEW) # let target_link_libraries() link to a target defined in a different directory cmake_policy(SET CMP0080 OLD) # allow using BundleUtilities at configure time +if (POLICY CMP0099) + cmake_policy(SET CMP0099 NEW) # Propagate INTERFACE_LINK_OPTIONS from private dependencies, used by MacOS framework builds of SDL +endif() + # Weird chicken-and-egg problem: We can't check the compiler before the project() call, but we have to set the policies before it. # So we do this in two steps: Set the policies if they exist, then error out afterwards if we end up being MSVC and they don't exist. if (POLICY CMP0117) @@ -38,6 +42,31 @@ if (MSVC) set(CMAKE_CXX_STANDARD_REQUIRED ON) endif() +set(COMPILER ${CMAKE_CXX_COMPILER_ID}) +if (COMPILER STREQUAL "GNU") + set(COMPILER "GCC") # perfer printing GCC instead of GNU +endif() + +# Enforce minimium compiler versions that support the c++20 features we use +set (GCC_min_version 10) +set (Clang_min_version 12) +set (AppleClang_min_version 13.0.0) +set (min_xcode_version "13.0") # corrosponding xcode version for AppleClang_min_version +set (MSVC_min_version 14.32) +set (min_vs_version "2022 17.2.3") # corrosponding Visual Studio version for MSVC_min_version + +message(STATUS "Using ${COMPILER} ${CMAKE_CXX_COMPILER_VERSION}") + +if ("-" STREQUAL "${${COMPILER}_min_version}-") + message(WARNING "Unknown compiler ${COMPILER}, assuming it is new enough") +else() + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${${COMPILER}_min_version}) + message(FATAL_ERROR "Requires GCC ${GCC_min_version}, Clang ${Clang_min_version}," + " AppleClang ${AppleClang_min_version} (Xcode ${min_xcode_version})," + " or MSVC ${MSVC_min_version} (Visual Studio ${min_vs_version}) or higher") + endif() +endif() + # Name of the Dolphin distributor. If you redistribute Dolphin builds (forks, # unofficial builds) please consider identifying your distribution with a # unique name here. @@ -56,7 +85,11 @@ if(NOT ANDROID) option(ENABLE_CLI_TOOL "Enable dolphin-tool, a CLI-based utility for functions such as managing disc images" OFF) endif() -option(USE_SHARED_ENET "Use shared libenet if found rather than Dolphin's soon-to-compatibly-diverge version" OFF) + +set(USE_SYSTEM_LIBS "AUTO" CACHE STRING "Use system libraries instead of bundled libraries. ON - Always use system and fail if unavailable, OFF - Always use bundled, AUTO - Use system if available, otherwise use bundled. Default is AUTO") +if(APPROVED_VENDORED_DEPENDENCIES) + message(WARNING "APPROVED_VENDORED_DEPENDENCIES is deprecated. Please migrate to setting USE_SYSTEM_LIBS to ON and setting USE_SYSTEM_ to either AUTO or OFF to allow bundled libs.") +endif() option(USE_UPNP "Enables UPnP port mapping support" ON) option(ENABLE_NOGUI "Enable NoGUI frontend" ON) option(ENABLE_QT "Enable Qt (Default)" ON) @@ -72,6 +105,7 @@ option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence, show the current gam option(USE_MGBA "Enables GBA controllers emulation using libmgba" OFF) option(ENABLE_AUTOUPDATE "Enables support for automatic updates" OFF) option(STEAM "Creates a build for Steam" OFF) +option(USE_RETRO_ACHIEVEMENTS "Enables integration with retroachievements.org" ON) # Maintainers: if you consider blanket disabling this for your users, please # consider the following points: @@ -94,8 +128,8 @@ option(OPROFILING "Enable profiling" OFF) # TODO: Add DSPSpy option(DSPTOOL "Build dsptool" OFF) -# Enable SDL for default on operating systems that aren't Android or Linux. -if(NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") +# Enable SDL by default on operating systems that aren't Android. +if(NOT ANDROID) option(ENABLE_SDL "Enables SDL as a generic controller backend" ON) else() option(ENABLE_SDL "Enables SDL as a generic controller backend" OFF) @@ -132,7 +166,6 @@ list(APPEND CMAKE_MODULE_PATH # Support functions include(CheckAndAddFlag) include(CheckCCompilerFlag) -include(CheckVendoringApproved) include(DolphinCompileDefinitions) include(DolphinDisableWarningsMSVC) include(DolphinLibraryTools) @@ -170,59 +203,6 @@ endif() # setup CCache include(CCache) -# for revision info -find_package(Git) -if(GIT_FOUND) - # make sure version information gets re-run when the current Git HEAD changes - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD - OUTPUT_VARIABLE dolphin_git_head_filename - OUTPUT_STRIP_TRAILING_WHITESPACE) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dolphin_git_head_filename}") - - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --symbolic-full-name HEAD - OUTPUT_VARIABLE dolphin_git_head_symbolic - OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} - COMMAND ${GIT_EXECUTABLE} rev-parse --git-path ${dolphin_git_head_symbolic} - OUTPUT_VARIABLE dolphin_git_head_symbolic_filename - OUTPUT_STRIP_TRAILING_WHITESPACE) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${dolphin_git_head_symbolic_filename}") - - # defines DOLPHIN_WC_REVISION - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - OUTPUT_VARIABLE DOLPHIN_WC_REVISION - OUTPUT_STRIP_TRAILING_WHITESPACE) - # defines DOLPHIN_WC_DESCRIBE - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty - OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE - OUTPUT_STRIP_TRAILING_WHITESPACE) - - # remove hash (and trailing "-0" if needed) from description - string(REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}") - - # defines DOLPHIN_WC_BRANCH - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE DOLPHIN_WC_BRANCH - OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() - -# version number -set(DOLPHIN_VERSION_MAJOR "5") -set(DOLPHIN_VERSION_MINOR "0") -if(DOLPHIN_WC_BRANCH STREQUAL "stable") - set(DOLPHIN_VERSION_PATCH "0") -else() - set(DOLPHIN_VERSION_PATCH ${DOLPHIN_WC_REVISION}) -endif() - -# If Dolphin is not built from a Git repository, default the version info to -# reasonable values. -if(NOT DOLPHIN_WC_REVISION) - set(DOLPHIN_WC_DESCRIBE "${DOLPHIN_VERSION_MAJOR}.${DOLPHIN_VERSION_MINOR}") - set(DOLPHIN_WC_REVISION "${DOLPHIN_WC_DESCRIBE} (no further info)") - set(DOLPHIN_WC_BRANCH "master") -endif() - # Architecture detection and arch specific settings message(STATUS "Detected architecture: ${CMAKE_SYSTEM_PROCESSOR}") @@ -243,9 +223,7 @@ if(ENABLE_GENERIC) set(_M_GENERIC 1) add_definitions(-D_M_GENERIC=1) elseif(_ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64") - set(_M_X86 1) set(_M_X86_64 1) - add_definitions(-D_M_X86=1) add_definitions(-D_M_X86_64=1) check_and_add_flag(HAVE_SSE2 -msse2) elseif(_ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64") @@ -259,12 +237,6 @@ else() " Enable generic build if you really want a JIT-less binary.") endif() - -# Enforce minimum GCC version -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) - message(FATAL_ERROR "Dolphin requires at least GCC 7.0 (found ${CMAKE_CXX_COMPILER_VERSION})") -endif() - if(CMAKE_GENERATOR MATCHES "Ninja") check_and_add_flag(DIAGNOSTICS_COLOR -fdiagnostics-color) elseif(CMAKE_GENERATOR MATCHES "Visual Studio") @@ -330,7 +302,7 @@ if(MSVC) # Note: In msbuild build, this gets set by msbuild by default add_compile_options(/Zc:inline) # Fix various other non-conformant behaviors - add_compile_options(/Zc:__cplusplus,enumTypes,externConstexpr,preprocessor,throwingNew) + add_compile_options(/Zc:__cplusplus,enumTypes,externConstexpr,preprocessor,templateScope,throwingNew) # Enforce strict volatile semantics as per ISO C++ add_compile_options(/volatile:iso) @@ -352,7 +324,7 @@ else() check_and_add_flag(VISIBILITY_INLINES_HIDDEN -fvisibility-inlines-hidden) check_and_add_flag(VISIBILITY_HIDDEN -fvisibility=hidden) - check_and_add_flag(FOMIT_FRAME_POINTER -fomit-frame-pointer RELEASE_ONLY) + check_and_add_flag(FOMIT_FRAME_POINTER -fomit-frame-pointer NO_DEBINFO_ONLY) dolphin_compile_definitions(_DEBUG DEBUG_ONLY) check_and_add_flag(GGDB -ggdb DEBUG_ONLY) @@ -621,32 +593,7 @@ if(UNIX) endif() if(ENABLE_SDL) - find_package(SDL2) - - if(SDL2_FOUND) - message(STATUS "Using system SDL2") - else() - message(STATUS "Using static SDL2 from Externals") - option(SDL2_DISABLE_SDL2MAIN "" ON) - option(SDL2_DISABLE_INSTALL "" ON) - option(SDL2_DISABLE_UNINSTALL "" ON) - set(SDL_SHARED OFF) - set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) - set(SDL_STATIC ON) - set(SDL_STATIC_ENABLED_BY_DEFAULT ON) - set(SDL_TEST OFF) - set(SDL_TEST_ENABLED_BY_DEFAULT OFF) - set(OPT_DEF_LIBC ON) - add_subdirectory(Externals/SDL/SDL) - if (TARGET SDL2) - dolphin_disable_warnings_msvc(SDL2) - endif() - if (TARGET SDL2-static) - dolphin_disable_warnings_msvc(SDL2-static) - endif() - set(SDL2_FOUND TRUE) - endif() - add_definitions(-DHAVE_SDL2=1) + dolphin_find_optional_system_library(SDL2 Externals/SDL 2.26.0) endif() if(ENABLE_ANALYTICS) @@ -687,28 +634,26 @@ endif() # - place the CMakeLists.txt in the first-level subdirectory, e.g. # Externals/zlib/CMakeLists.txt (that is: NOT in some Src/ subdirectory) # -if (_M_X86) +if (_M_X86_64) add_subdirectory(Externals/Bochs_disasm) endif() add_subdirectory(Externals/cpp-optparse) -find_package(fmt 8) -if(fmt_FOUND) - message(STATUS "Using shared fmt ${fmt_VERSION}") -else() - check_vendoring_approved(fmt) - message(STATUS "Using static fmt from Externals") - add_subdirectory(Externals/fmt EXCLUDE_FROM_ALL) - include_directories(Externals/fmt/include) -endif() +dolphin_find_optional_system_library(fmt Externals/fmt 10.1) + add_subdirectory(Externals/imgui) add_subdirectory(Externals/implot) add_subdirectory(Externals/glslang) +# SPIRV-Cross is used on Windows for GLSL to HLSL conversion for the Direct3D 11 and Direct3D 12 +# video backends, and on Apple devices for the Metal video backend. +if(WIN32 OR APPLE) + add_subdirectory(Externals/spirv_cross) +endif() +# slippi includes include_directories(Externals/nlohmann) add_subdirectory(Externals/semver) include_directories(Externals/semver/include) add_subdirectory(Externals/open-vcdiff) -add_subdirectory(Externals/spirv_cross) include_directories(Externals) if(ENABLE_VULKAN) @@ -717,6 +662,11 @@ if(ENABLE_VULKAN) if(APPLE AND USE_BUNDLED_MOLTENVK) add_subdirectory(Externals/MoltenVK) endif() + + + if (ANDROID AND _M_ARM_64) + add_subdirectory(Externals/libadrenotools) + endif() endif() if(NOT WIN32 OR (NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"))) @@ -724,114 +674,29 @@ if(NOT WIN32 OR (NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"))) add_definitions(-DHAS_OPENGL) endif() -find_package(pugixml) -if(NOT pugixml_FOUND) - check_vendoring_approved(pugixml) - message(STATUS "Using static pugixml from Externals") - add_subdirectory(Externals/pugixml) -endif() - -if(USE_SHARED_ENET) - check_lib(ENET libenet enet enet/enet.h QUIET) - include(CheckSymbolExists) - if (ENET_FOUND) - set(CMAKE_REQUIRED_INCLUDES ${ENET_INCLUDE_DIRS}) - # hack: LDFLAGS already contains -lenet but all flags but the first are - # dropped; ugh, cmake - set(CMAKE_REQUIRED_FLAGS ${ENET_LDFLAGS}) - set(CMAKE_REQUIRED_LIBRARIES ${ENET_LIBRARIES}) - check_symbol_exists(enet_socket_get_address enet/enet.h ENET_HAVE_SGA) - set(CMAKE_REQUIRED_INCLUDES) - set(CMAKE_REQUIRED_FLAGS) - set(CMAKE_REQUIRED_LIBRARIES) - if (NOT ENET_HAVE_SGA) - # enet is too old - set(ENET_FOUND FALSE) - endif() - endif() -endif() -if (ENET_FOUND) - message(STATUS "Using shared enet") -else() - check_vendoring_approved(enet) - message(STATUS "Using static enet from Externals") - include_directories(Externals/enet/include) - add_subdirectory(Externals/enet) -endif() +dolphin_find_optional_system_library(pugixml Externals/pugixml) -if(NOT XXHASH_FOUND) - message(STATUS "Using static xxhash from Externals") - add_subdirectory(Externals/xxhash) -endif() +dolphin_find_optional_system_library_pkgconfig(ENET libenet>=1.3.18 enet::enet Externals/enet) -find_package(BZip2) -if(BZIP2_FOUND) - message(STATUS "Using shared bzip2") -else() - check_vendoring_approved(bzip2) - message(STATUS "Shared bzip2 not found, falling back to the static library") - add_subdirectory(Externals/bzip2) -endif() +dolphin_find_optional_system_library_pkgconfig(xxhash libxxhash>=0.8.2 xxhash::xxhash Externals/xxhash) -# macOS ships with liblzma.dylib but no headers, so check for the headers too -find_package(LibLZMA) -if(LIBLZMA_FOUND) - # Imported target added in CMake 3.14 - dolphin_make_imported_target_if_missing(LibLZMA::LibLZMA LIBLZMA) - message(STATUS "Using shared lzma") -else() - check_vendoring_approved(lzma) - message(STATUS "Shared lzma not found, falling back to the static library") - add_subdirectory(Externals/liblzma) -endif() +dolphin_find_optional_system_library(BZip2 Externals/bzip2) -pkg_check_modules(ZSTD QUIET libzstd>=1.4.0 IMPORTED_TARGET) -# if(ZSTD_FOUND AND NOT APPLE) -if(ZSTD_FOUND) - message(STATUS "Using shared zstd version: " ${ZSTD_VERSION}) - dolphin_alias_library(zstd::zstd PkgConfig::ZSTD) -else() - check_vendoring_approved(zstd) - message(STATUS "Shared zstd not found, falling back to the static library") - add_subdirectory(Externals/zstd) -endif() +dolphin_find_optional_system_library(LibLZMA Externals/liblzma) +# Imported target added in CMake 3.14 +dolphin_make_imported_target_if_missing(LibLZMA::LibLZMA LIBLZMA) -add_subdirectory(Externals/zlib-ng) +dolphin_find_optional_system_library_pkgconfig(ZSTD libzstd>=1.4.0 zstd::zstd Externals/zstd) -find_package(ZLIB REQUIRED) +dolphin_find_optional_system_library_pkgconfig(ZLIB zlib-ng ZLIB::ZLIB Externals/zlib-ng) -pkg_check_modules(MINIZIP minizip>=3.0.0) -if(MINIZIP_FOUND) - message(STATUS "Using shared minizip") - include_directories(${MINIZIP_INCLUDE_DIRS}) -else() - check_vendoring_approved(minizip) - message(STATUS "Shared minizip not found, falling back to the static library") - add_subdirectory(Externals/minizip) - include_directories(External/minizip) -endif() +dolphin_find_optional_system_library_pkgconfig(MINIZIP minizip>=3.0.0 minizip::minizip Externals/minizip) -if(NOT APPLE) - check_lib(LZO "(no .pc for lzo2)" lzo2 lzo/lzo1x.h QUIET) -endif() -if(LZO_FOUND) - message(STATUS "Using shared lzo") -else() - check_vendoring_approved(lzo) - message(STATUS "Using static lzo from Externals") - add_subdirectory(Externals/LZO) - set(LZO lzo2) -endif() +dolphin_find_optional_system_library(LZO Externals/LZO) -pkg_check_modules(pc_spng IMPORTED_TARGET spng) -if (pc_spng_FOUND AND TARGET PkgConfig::pc_spng) - message(STATUS "Using the system libspng") - set(spng_target PkgConfig::pc_spng) -else() - message(STATUS "Using static libspng from Externals") - add_subdirectory(Externals/libspng) - set(spng_target spng) -endif() +dolphin_find_optional_system_library_pkgconfig(lz4 liblz4>=1.8 LZ4::LZ4 Externals/lz4) + +dolphin_find_optional_system_library_pkgconfig(SPNG spng spng::spng Externals/libspng) # Using static FreeSurround from Externals # There is no system FreeSurround library. @@ -849,108 +714,33 @@ endif() add_subdirectory(Externals/soundtouch) include_directories(Externals/soundtouch) -find_package(CUBEB) -if(CUBEB_FOUND) - message(STATUS "Using the system cubeb") -else() - check_vendoring_approved(cubeb) - message(STATUS "Using static cubeb from Externals") - add_subdirectory(Externals/cubeb EXCLUDE_FROM_ALL) -endif() +dolphin_find_optional_system_library(CUBEB Externals/cubeb) if(NOT ANDROID) + dolphin_find_optional_system_library(LibUSB Externals/libusb) add_definitions(-D__LIBUSB__) - if(NOT APPLE) - find_package(LibUSB) - endif() - if(LIBUSB_FOUND AND NOT APPLE) - message(STATUS "Using shared LibUSB") - include_directories(${LIBUSB_INCLUDE_DIR}) - else() - check_vendoring_approved(libusb) - message(STATUS "Using static LibUSB from Externals") - add_subdirectory(Externals/libusb) - set(LIBUSB_LIBRARIES usb) - endif() - set(LIBUSB_FOUND true) endif() -set(SFML_REQD_VERSION 2.1) -if(NOT APPLE) - find_package(SFML ${SFML_REQD_VERSION} COMPONENTS network system) -endif() -if(SFML_FOUND) - message(STATUS "Using shared SFML") -else() - check_vendoring_approved(sfml) - message(STATUS "Using static SFML ${SFML_REQD_VERSION} from Externals") - add_definitions(-DSFML_STATIC) - add_subdirectory(Externals/SFML) - include_directories(BEFORE Externals/SFML/include) -endif() +dolphin_find_optional_system_library(SFML Externals/SFML 2.1 COMPONENTS network system) if(USE_UPNP) - if(NOT APPLE) - find_package(MINIUPNPC) - endif() - if(MINIUPNPC_FOUND AND MINIUPNPC_API_VERSION GREATER 8) - message(STATUS "Using shared miniupnpc") - else() - check_vendoring_approved(miniupnpc) - message(STATUS "Using static miniupnpc from Externals") - add_subdirectory(Externals/miniupnpc) - endif() + dolphin_find_optional_system_library(MINIUPNPC Externals/miniupnpc 1.6) add_definitions(-DUSE_UPNP) endif() -if(NOT APPLE) - find_package(MBEDTLS) -endif() -if(MBEDTLS_FOUND) - message(STATUS "Using shared mbed TLS") - include_directories(${MBEDTLS_INCLUDE_DIRS}) -else() - check_vendoring_approved(mbedtls) - message(STATUS "Using static mbed TLS from Externals") - set(MBEDTLS_LIBRARIES mbedtls mbedcrypto mbedx509) - add_subdirectory(Externals/mbedtls/ EXCLUDE_FROM_ALL) - include_directories(Externals/mbedtls/include) -endif() +dolphin_find_optional_system_library(MBEDTLS Externals/mbedtls 2.28) -find_package(CURL) -if(CURL_FOUND) - message(STATUS "Using shared libcurl") - include_directories(${CURL_INCLUDE_DIRS}) -else() - check_vendoring_approved(curl) - message(STATUS "Using static libcurl from Externals") - add_subdirectory(Externals/curl) - set(CURL_LIBRARIES curl) - include_directories(BEFORE Externals/curl/include) -endif() +dolphin_find_optional_system_library(CURL Externals/curl) -if (NOT ANDROID) - find_library(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c) - find_path(ICONV_INCLUDE_DIR NAMES iconv.h) -endif() - -if (NOT ANDROID AND ICONV_LIBRARIES AND ICONV_INCLUDE_DIR) - mark_as_advanced(ICONV_INCLUDE_DIR ICONV_LIBRARIES) +if(NOT ANDROID) + dolphin_find_optional_system_library(Iconv Externals/libiconv-1.14) else() - check_vendoring_approved(iconv) message(STATUS "Using static iconv from Externals") - include_directories(Externals/libiconv-1.14/include) - add_subdirectory(Externals/libiconv-1.14) - set(ICONV_LIBRARIES iconv) + add_subdirectory(Externals/libiconv-1.14 EXCLUDE_FROM_ALL) endif() if(NOT ANDROID) - find_package(HIDAPI) - if(NOT HIDAPI_FOUND) - check_vendoring_approved(hidapi) - message(STATUS "Using static HIDAPI from Externals") - add_subdirectory(Externals/hidapi EXCLUDE_FROM_ALL) - endif() + dolphin_find_optional_system_library(HIDAPI Externals/hidapi) endif() if(USE_DISCORD_PRESENCE) @@ -963,11 +753,7 @@ if(NOT ENABLE_QT) set(USE_MGBA 0) endif() if(USE_MGBA) - find_package(LIBMGBA) - if(NOT LIBMGBA_FOUND) - message(STATUS "Using static libmgba from Externals") - add_subdirectory(Externals/mGBA) - endif() + dolphin_find_optional_system_library(LIBMGBA Externals/mGBA) endif() find_package(SYSTEMD) @@ -995,33 +781,51 @@ add_subdirectory(Externals/rangeset) add_subdirectory(Externals/FatFs) +if (USE_RETRO_ACHIEVEMENTS) + add_subdirectory(Externals/rcheevos) +endif() + ######################################## # Pre-build events: Define configuration variables and write SCM info header # -if(DOLPHIN_WC_BRANCH STREQUAL "master" OR DOLPHIN_WC_BRANCH STREQUAL "stable") - set(DOLPHIN_WC_IS_STABLE "1") -else() - set(DOLPHIN_WC_IS_STABLE "0") -endif() # Remove in-tree revision information generated by Visual Studio # This is because the compiler will check in-tree first and use this, even if it is outdated file(REMOVE "${PROJECT_SOURCE_DIR}/Source/Core/Common/scmrev.h") -configure_file( - "${PROJECT_SOURCE_DIR}/Source/Core/Common/scmrev.h.in" - "${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h" +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Source/Core/Common) +if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/Source/Core/Common/scmrev.h) + file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/Source/Core/Common/scmrev.h) +endif() + +find_package(Git) +if(NOT GIT_FOUND) + set(GIT_EXECUTABLE "") +endif() +add_custom_target( + dolphin_scmrev + ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR} -DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR} -DDISTRIBUTOR=${DISTRIBUTOR} -DDOLPHIN_DEFAULT_UPDATE_TRACK=${DOLPHIN_DEFAULT_UPDATE_TRACK} -DGIT_FOUND=${GIT_FOUND} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DDOLPHIN_WC_REVISION=${DOLPHIN_WC_REVISION} -DDOLPHIN_WC_DESCRIBE=${DOLPHIN_WC_DESCRIBE} -DDOLPHIN_WC_BRANCH=${DOLPHIN_WC_BRANCH} -P ${CMAKE_SOURCE_DIR}/CMake/ScmRevGen.cmake + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/Source/Core/Common/scmrev.h + VERBATIM ) + +# This is here so #include "Common/scmrev.h" finds the generated header. include_directories("${PROJECT_BINARY_DIR}/Source/Core") ######################################## # Unit testing. # if(ENABLE_TESTS) - message(STATUS "Using static gtest from Externals") + find_package(GTest) + if (GTEST_FOUND) + message(STATUS "Using the system gtest") + include_directories(${GTEST_INCLUDE_DIRS}) + else() + message(STATUS "Using static gtest from Externals") + add_subdirectory(Externals/gtest EXCLUDE_FROM_ALL) + endif() # Force gtest to link the C runtime dynamically on Windows in order to avoid runtime mismatches. set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - add_subdirectory(Externals/gtest EXCLUDE_FROM_ALL) else() message(STATUS "Unit tests are disabled") endif() diff --git a/Contributing.md b/Contributing.md index a78436d5df66..341e719b72e5 100644 --- a/Contributing.md +++ b/Contributing.md @@ -1,17 +1,32 @@ -# Dolphin Coding Style & Licensing +# Dolphin Coding Style & Legal Requirements -If you make any contributions to Dolphin after December 1st, 2014, you are agreeing that any code you have contributed will be licensed under the GNU GPL version 2 (or any later version). - -# Main sections - -- [Introduction](#introduction) +- [Legal](#legal) +- [Coding style introduction](#introduction) - [C++ coding style and formatting](#cpp-coding-style-and-formatting) - [C++ code-specific guidelines](#cpp-code-specific-guidelines) - [Android](#android) - [Help](#help) +# Legal + +Summary: + +- [Trade secrets](#trade-secrets) +- [Code licensing](#code-licensing) + +## Trade secrets + +Following all relevant laws is of utmost importance for an emulation project like Dolphin. + +If you know any confidential information related to the GameCube, Wii, or Triforce, either because you signed a non-disclosure agreement or because you looked at leaked materials, we ask that you don't contribute code to Dolphin **at all**. While accepting code from contributors who know confidential information is legal if the code is unrelated to the confidential information, we refuse to accept code from such contributors because it greatly increases our review burden and increases the legal risk we take. + +Also, this probably goes without saying, but piracy is strictly forbidden both on GitHub and in all other Dolphin channels. + +## Code licensing + +If you make any contributions to Dolphin after December 1st, 2014, you are agreeing that any code you have contributed will be licensed under the GNU GPL version 2 (or any later version). -# Introduction +# Coding style introduction Summary: @@ -173,7 +188,8 @@ Summary: - [Classes and Structs](#cpp-code-classes-and-structs) ## General -- The codebase currently uses C++17. +- The codebase currently uses C++20, though not all compilers support all C++20 features. + - See CMakeLists.txt "Enforce minimium compiler versions" for the currently supported compilers. - Use the [nullptr](https://en.cppreference.com/w/cpp/language/nullptr) type over the macro `NULL`. - If a [range-based for loop](https://en.cppreference.com/w/cpp/language/range-for) can be used instead of container iterators, use it. - Obviously, try not to use `goto` unless you have a *really* good reason for it. diff --git a/Externals/enet/m4/.keep b/Data/Sys/Load/GraphicMods/All Games DOF Removal/all.txt similarity index 100% rename from Externals/enet/m4/.keep rename to Data/Sys/Load/GraphicMods/All Games DOF Removal/all.txt diff --git a/Data/Sys/Load/GraphicMods/All Games DOF Removal/metadata.json b/Data/Sys/Load/GraphicMods/All Games DOF Removal/metadata.json new file mode 100644 index 000000000000..5758d41b276b --- /dev/null +++ b/Data/Sys/Load/GraphicMods/All Games DOF Removal/metadata.json @@ -0,0 +1,15 @@ +{ + "meta": + { + "title": "DOF Removal", + "author": "Dolphin Team", + "description": "Skips drawing DOF effects. May be preferable when using a DOF solution from Dolphin's post processing shaders or a third party tool." + }, + "features": + [ + { + "group": "DOF", + "action": "skip" + } + ] +} diff --git a/Data/Sys/Load/GraphicMods/All Games Native Resolution DOF/all.txt b/Data/Sys/Load/GraphicMods/All Games Native Resolution DOF/all.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Data/Sys/Load/GraphicMods/All Games Native Resolution DOF/metadata.json b/Data/Sys/Load/GraphicMods/All Games Native Resolution DOF/metadata.json new file mode 100644 index 000000000000..4aeea2e7c031 --- /dev/null +++ b/Data/Sys/Load/GraphicMods/All Games Native Resolution DOF/metadata.json @@ -0,0 +1,20 @@ +{ + "meta": + { + "title": "Native Resolution DOF", + "author": "Dolphin Team", + "description": "Scales DOF effects to draw at their native resolution, regardless of internal resolution. Results in DOF looking much more natural at higher resolutions but may cause shimmering." + }, + "features": + [ + { + "group": "DOF", + "action": "scale", + "action_data": { + "X": 1.0, + "Y": 1.0, + "Z": 1.0 + } + } + ] +} diff --git a/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/RDS.txt b/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/RDS.txt new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/RDS.txt @@ -0,0 +1 @@ + diff --git a/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/metadata.json b/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/metadata.json new file mode 100644 index 000000000000..17f4410fbd3c --- /dev/null +++ b/Data/Sys/Load/GraphicMods/Dragon Ball Z Budokai Tenkaichi 3/metadata.json @@ -0,0 +1,307 @@ +{ + "meta": + { + "title": "Dragon Ball Z: Budokai Tenkaichi 3 Definitions", + "author": "Seedonator" + }, + "groups": + [ + { + "name": "Bloom", + "targets": [ + { + "type": "efb", + "texture_filename": "efb1_n000014_128x128_4" + } + ] + }, + { + "name": "HUD", + "targets": [ + { + "type": "draw_started", + "prettyname": "HUD Backdrop", + "texture_filename": "tex1_256x64_50e9493ab5ecd6e9_5efd0133152917bc_9" + }, + { + "type": "draw_started", + "prettyname": "Max Power Lightning", + "texture_filename": "tex1_256x128_76ee22f289405f4f_0a3363fc16e5200b_9" + }, + { + "type": "draw_started", + "prettyname": "Timer Backdrop", + "texture_filename": "tex1_64x64_1b0bd43920520089_894789000b300d35_9" + }, + { + "type": "draw_started", + "prettyname": "Teammate Backdrop", + "texture_filename": "tex1_64x64_76189a0850bac928_d5586441a9651de1_9" + }, + { + "type": "draw_started", + "prettyname": "HUD Backdrop 2", + "texture_filename": "tex1_256x64_4751a5dd9b515483_6ef5db463bf9b5fe_9" + }, + + + + { + "type": "draw_started", + "prettyname": "Meters Colored", + "texture_filename": "tex1_256x64_974aae7fb39dd3fe_dc826162c7781cf3_9" + }, + { + "type": "draw_started", + "prettyname": "Meters Colored 2", + "texture_filename": "tex1_256x64_974aae7fb39dd3fe_c0adc9c4480c91c1_9" + }, + { + "type": "draw_started", + "prettyname": "Meters Red", + "texture_filename": "tex1_256x64_974aae7fb39dd3fe_65f3d25263258092_9" + }, + { + "type": "draw_started", + "prettyname": "Meters Overlay", + "texture_filename": "tex1_256x64_974aae7fb39dd3fe_37c76c0d16ef044d_9" + }, + { + "type": "draw_started", + "prettyname": "Meter Glow", + "texture_filename": "tex1_64x64_1c31b3c28a7aef47_1c42ae23afd2f40f_9" + }, + { + "type": "draw_started", + "prettyname": "Meter Teammate", + "texture_filename": "tex1_128x32_277ce02a6f60e609_30b338ab0d636ab2_9" + }, + + + + { + "type": "draw_started", + "prettyname": "Stat Bonus Ki Damage", + "texture_filename": "tex1_32x32_20bc4452577d1f49_85422f750ab42532_8" + }, + { + "type": "draw_started", + "prettyname": "Stat Bonus Charge Speed", + "texture_filename": "tex1_32x32_af9478cb6ebc0b7a_5ba8f3ea380bfdcf_8" + }, + { + "type": "draw_started", + "prettyname": "Stat Bonus Defense", + "texture_filename": "tex1_32x32_c7cf9020318a2959_5d41872b1fcd6199_8" + }, + { + "type": "draw_started", + "prettyname": "Stat Bonus Melee Damage", + "texture_filename": "tex1_32x32_e4c8e81a7318fa25_6e21f60b0c990c98_8" + }, + + + + { + "type": "draw_started", + "prettyname": "Blast Stock Number", + "texture_filename": "tex1_128x64_00ba91db7d176946_0ecdf6905c577ddb_9" + }, + { + "type": "draw_started", + "prettyname": "Blast Stock Number Glow", + "texture_filename": "tex1_128x64_53d69bea13e150ab_24a4df43c24b0515_9" + }, + { + "type": "draw_started", + "prettyname": "Timer Value", + "texture_filename": "tex1_128x128_6976151439efad50_501b3bc09a6958d7_8" + }, + { + "type": "draw_started", + "prettyname": "Hit Text", + "texture_filename": "tex1_128x64_9366938c3344b862_83be965a88f28a40_9" + }, + { + "type": "draw_started", + "prettyname": "Hit Counter", + "texture_filename": "tex1_128x128_273f16293f4d7a40_8a29b5887317abf8_8" + }, + { + "type": "draw_started", + "prettyname": "Damage Counter", + "texture_filename": "tex1_128x128_1588ef89e137fc24_1cce6b863d92c9a0_8" + }, + + + + { + "type": "draw_started", + "prettyname": "Announcer Max Power", + "texture_filename": "tex1_128x64_482f78c5dfc14eab_0e7513b77d82c9ae_9" + }, + { + "type": "draw_started", + "prettyname": "Announcer First Attack", + "texture_filename": "tex1_128x64_b92d24567ae12b3a_14d61fafa74e6334_9" + }, + { + "type": "draw_started", + "prettyname": "Announcer Counter", + "texture_filename": "tex1_128x64_bbdfacdc36d171ec_85047913fd8df9aa_9" + }, + { + "type": "draw_started", + "prettyname": "Announcer Lock On", + "texture_filename": "tex1_128x64_3ba4b1f803afd256_93ba5384bd764946_9" + }, + { + "type": "draw_started", + "prettyname": "Announcer Boost", + "texture_filename": "tex1_128x64_09d5b89f7dbf0590_2abc7134cbb2138b_9" + }, + + + + { + "type": "draw_started", + "prettyname": "Buttom Prompt Y", + "texture_filename": "tex1_32x32_15f350b2b7f46481_66860824280a89bf_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt Y Hold", + "texture_filename": "tex1_32x32_00d2fb316a25d017_a889bebad6535a02_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt Y Mash", + "texture_filename": "tex1_64x64_8934f812b54f87c4_66860824280a89bf_8" + }, + { + "type": "draw_started", + "prettyname": "Buttom Prompt B", + "texture_filename": "tex1_32x32_ce62786fc1170192_70b585e07941e91c_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt B Hold", + "texture_filename": "tex1_32x32_2841b917a7c23834_bdbd0425eb2f4b52_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt B Mash", + "texture_filename": "tex1_64x64_23b176984035b44c_8204be59ecb7c469_8" + }, + { + "type": "draw_started", + "prettyname": "Buttom Prompt X", + "texture_filename": "tex1_32x32_b52817e68be0e2d7_d1b283ce04ce1c7c_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt X Mash", + "texture_filename": "tex1_64x64_cb8aa5843b3cc31c_ccbcbdf9c811ed5d_8" + }, + { + "type": "draw_started", + "prettyname": "Buttom Prompt A", + "texture_filename": "tex1_32x32_630cfa888a9d005a_d95570935377e345_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt A Mash", + "texture_filename": "tex1_64x64_eef97dc696b0edd6_758bf7c8a0397add_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt Hold Hand", + "texture_filename": "tex1_32x32_80eec4ab54c12b14_2fbe88721f145bc3_8" + }, + + + + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Up", + "texture_filename": "tex1_32x32_56eb18736158692a_831cb2dcaee7d9c7_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Down", + "texture_filename": "tex1_32x32_4f6911885cbfd6b7_b01602f981cf7194_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Left", + "texture_filename": "tex1_32x32_de66fb7b17f39fb2_723568783ce8af39_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Right", + "texture_filename": "tex1_32x32_4a3ce686c4d7d216_d9a6c961c9883e00_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash N", + "texture_filename": "tex1_64x64_0e45133195ab2db7_8061698fc3e81ec4_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash NE", + "texture_filename": "tex1_64x64_23a7ebdcad6f294c_961413a3996f1955_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash E", + "texture_filename": "tex1_64x64_fc736187474b6d87_5db58dd7fedde1e4_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash SE", + "texture_filename": "tex1_64x64_847d2a027ba61a6d_da6f9db59fa7a52b_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash S", + "texture_filename": "tex1_64x64_2fd46476d6eeb2a5_8cf71f59f3f4f61d_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt LStick Clash Neutral", + "texture_filename": "tex1_64x64_e63e59943072d5ba_13e4b338982e9dbc_8" + }, + + + + { + "type": "draw_started", + "prettyname": "Button Prompt Plus", + "texture_filename": "tex1_32x32_214dbb89f41af76c_ee10bcb01a356553_8" + }, + { + "type": "draw_started", + "prettyname": "Button Prompt Mash Backdrop", + "texture_filename": "tex1_64x64_c7be948af15370ea_104c0c86a865a442_9" + }, + + + + { + "type": "draw_started", + "prettyname": "Text Font Main", + "texture_filename": "tex1_512x128_b38c0db36dfc6ac3_71a440118950d6cd_8" + }, + { + "type": "draw_started", + "prettyname": "Text Font Special", + "texture_filename": "tex1_512x128_b38c0db36dfc6ac3_561056e6b4e21980_8" + } + + + + + ] + } + ] +} diff --git a/Data/Sys/Load/GraphicMods/Pandora's Tower/SX3.txt b/Data/Sys/Load/GraphicMods/Pandora's Tower/SX3.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Data/Sys/Load/GraphicMods/Pandora's Tower/metadata.json b/Data/Sys/Load/GraphicMods/Pandora's Tower/metadata.json new file mode 100644 index 000000000000..dcbdadd49a21 --- /dev/null +++ b/Data/Sys/Load/GraphicMods/Pandora's Tower/metadata.json @@ -0,0 +1,36 @@ +{ + "meta": + { + "title": "Bloom and DOF Texture Definitions", + "author": "linckandrea" + }, + "groups": + [ + { + "name": "Bloom", + "targets": [ + { + "type": "efb", + "texture_filename": "efb1_n09_20x15_1" + }, + { + "type": "efb", + "texture_filename": "efb1_n21_20x15_1" + } + ] + }, + { + "name": "DOF", + "targets": [ + { + "type": "efb", + "texture_filename": "efb1_n10_320x240_4" + }, + { + "type": "efb", + "texture_filename": "efb1_n11_320x240_1" + } + ] + } + ] +} diff --git a/Data/Sys/Load/GraphicMods/Skylanders Spyro's Adventure/SSP.txt b/Data/Sys/Load/GraphicMods/Skylanders Spyro's Adventure/SSP.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Data/Sys/Load/GraphicMods/Skylanders Spyro's Adventure/metadata.json b/Data/Sys/Load/GraphicMods/Skylanders Spyro's Adventure/metadata.json new file mode 100644 index 000000000000..4f954e708caf --- /dev/null +++ b/Data/Sys/Load/GraphicMods/Skylanders Spyro's Adventure/metadata.json @@ -0,0 +1,19 @@ +{ + "meta": + { + "title": "Bloom Texture Definitions", + "author": "SuperSamus" + }, + "groups": + [ + { + "name": "Bloom", + "targets": [ + { + "type": "efb", + "texture_filename": "efb1_n000008_80x57_6" + } + ] + } + ] +} diff --git a/Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json b/Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json index 931602a3735a..805f3fac911d 100644 --- a/Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json +++ b/Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json @@ -49,6 +49,10 @@ { "type": "efb", "texture_filename": "efb1_n000000_256x256_1" + }, + { + "type": "efb", + "texture_filename": "efb1_n000000_512x512_1" } ] } diff --git a/Data/Sys/Load/GraphicMods/The Last Story/metadata.json b/Data/Sys/Load/GraphicMods/The Last Story/metadata.json index a7e5a44b4753..8180ff2efda5 100644 --- a/Data/Sys/Load/GraphicMods/The Last Story/metadata.json +++ b/Data/Sys/Load/GraphicMods/The Last Story/metadata.json @@ -1,7 +1,7 @@ { "meta": { - "title": "Bloom and HUD Texture Definitions", + "title": "Bloom, DOF and HUD Texture Definitions", "author": "iwubcode" }, "groups": @@ -20,6 +20,61 @@ "pretty_name": "faces", "texture_filename": "tex1_512x256_ff742945bb1f5cd6_14" }, + { + "type": "draw_started", + "pretty_name": "faces2", + "texture_filename": "tex1_512x256_bf69f6bcc9fa1c84_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "faces2", + "texture_filename": "tex1_512x256_bf69f6bcc9fa1c84_14" + }, + { + "type": "draw_started", + "pretty_name": "faces3", + "texture_filename": "tex1_512x256_6a7db9462722f3f2_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "faces3", + "texture_filename": "tex1_512x256_6a7db9462722f3f2_14" + }, + { + "type": "draw_started", + "pretty_name": "faces4", + "texture_filename": "tex1_512x256_9c3091b878ecc5d5_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "faces4", + "texture_filename": "tex1_512x256_9c3091b878ecc5d5_14" + }, + { + "type": "draw_started", + "pretty_name": "faces5", + "texture_filename": "tex1_512x256_8787a867fd0d1f6c_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "faces5", + "texture_filename": "tex1_512x256_8787a867fd0d1f6c_14" + }, + { + "type": "draw_started", + "pretty_name": "faces5", + "texture_filename": "tex1_512x256_a47bcf54cfeeaafd_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "faces5", + "texture_filename": "tex1_512x256_a47bcf54cfeeaafd_14" + }, { "type": "draw_started", "pretty_name": "text", @@ -97,6 +152,17 @@ "pretty_name": "text7", "texture_filename": "tex1_128x128_73d3f8a2f0347b4a_0" }, + { + "type": "draw_started", + "pretty_name": "text8", + "texture_filename": "tex1_32x32_8261c7f3bc24e3a7_0" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "text8", + "texture_filename": "tex1_32x32_8261c7f3bc24e3a7_0" + }, { "type": "draw_started", "pretty_name": "large numbers", @@ -129,6 +195,39 @@ "value": "2d", "pretty_name": "life outline", "texture_filename": "tex1_128x64_deeeaa33ca3dc0f1_14" + }, + { + "type": "draw_started", + "pretty_name": "ability bar", + "texture_filename": "tex1_64x64_59345b5687ee93e6_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "ability bar", + "texture_filename": "tex1_64x64_59345b5687ee93e6_14" + }, + { + "type": "draw_started", + "pretty_name": "ability bar2", + "texture_filename": "tex1_128x128_84ede5f362602f6b_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "ability bar2", + "texture_filename": "tex1_128x128_84ede5f362602f6b_14" + }, + { + "type": "draw_started", + "pretty_name": "ability bar2", + "texture_filename": "tex1_256x512_4cac4a78235f5e94_14" + }, + { + "type": "projection", + "value": "2d", + "pretty_name": "ability bar2", + "texture_filename": "tex1_256x512_4cac4a78235f5e94_14" } ] }, @@ -146,7 +245,12 @@ { "type": "efb", "texture_filename": "efb1_n359_160x112_1" - }, + } + ] + }, + { + "name": "DOF", + "targets": [ { "type": "efb", "texture_filename": "efb1_n432_320x224_6" diff --git a/Data/Sys/Resources/Dolphin.png b/Data/Sys/Resources/Dolphin.png deleted file mode 100644 index f98582c4eac9..000000000000 Binary files a/Data/Sys/Resources/Dolphin.png and /dev/null differ diff --git a/Data/Sys/Shaders/AutoHDR.glsl b/Data/Sys/Shaders/AutoHDR.glsl new file mode 100644 index 000000000000..b806d658385d --- /dev/null +++ b/Data/Sys/Shaders/AutoHDR.glsl @@ -0,0 +1,69 @@ +// Based on https://github.com/Filoppi/PumboAutoHDR + +/* +[configuration] + +[OptionRangeFloat] +GUIName = HDR Display Max Nits +OptionName = HDR_DISPLAY_MAX_NITS +MinValue = 80 +MaxValue = 2000 +StepAmount = 1 +DefaultValue = 400 + +[OptionRangeFloat] +GUIName = Shoulder Start Alpha +OptionName = AUTO_HDR_SHOULDER_START_ALPHA +MinValue = 0 +MaxValue = 1 +StepAmount = 0.01 +DefaultValue = 0 + +[OptionRangeFloat] +GUIName = Shoulder Pow +OptionName = AUTO_HDR_SHOULDER_POW +MinValue = 1 +MaxValue = 10 +StepAmount = 0.05 +DefaultValue = 2.5 + +[/configuration] +*/ + +float luminance(float3 color) +{ + return dot(color, float3(0.2126f, 0.7152f, 0.0722f)); +} + +void main() +{ + float4 color = Sample(); + + // Nothing to do here, we are in SDR + if (!OptionEnabled(hdr_output) || !OptionEnabled(linear_space_output)) + { + SetOutput(color); + return; + } + + const float hdr_paper_white = hdr_paper_white_nits / hdr_sdr_white_nits; + + // Restore the original SDR (0-1) brightness (we might or might not restore it later) + color.rgb /= hdr_paper_white; + + // Find the color luminance (it works better than average) + float sdr_ratio = luminance(color.rgb); + + const float auto_hdr_max_white = max(HDR_DISPLAY_MAX_NITS / (hdr_paper_white_nits / hdr_sdr_white_nits), hdr_sdr_white_nits) / hdr_sdr_white_nits; + if (sdr_ratio > AUTO_HDR_SHOULDER_START_ALPHA && AUTO_HDR_SHOULDER_START_ALPHA < 1.0) + { + const float auto_hdr_shoulder_ratio = 1.0 - (max(1.0 - sdr_ratio, 0.0) / (1.0 - AUTO_HDR_SHOULDER_START_ALPHA)); + const float auto_hdr_extra_ratio = pow(auto_hdr_shoulder_ratio, AUTO_HDR_SHOULDER_POW) * (auto_hdr_max_white - 1.0); + const float auto_hdr_total_ratio = sdr_ratio + auto_hdr_extra_ratio; + color.rgb *= auto_hdr_total_ratio / sdr_ratio; + } + + color.rgb *= hdr_paper_white; + + SetOutput(color); +} diff --git a/Data/Sys/Shaders/asciiart.glsl b/Data/Sys/Shaders/asciiart.glsl new file mode 100644 index 000000000000..1b5cfa947cfa --- /dev/null +++ b/Data/Sys/Shaders/asciiart.glsl @@ -0,0 +1,485 @@ +/* +[configuration] + +[OptionBool] +GUIName = Use target window resolution +OptionName = USE_WINDOW_RES +DefaultValue = true + +[OptionBool] +GUIName = Debug: Calculate only one character per subgroup +OptionName = DEBUG_ONLY_ONE_CHAR +DefaultValue = false + +[/configuration] +*/ + +const uint MAX_CHARS = 96u; // max 96, must be a multiple of 32 +const bool HAVE_FULL_FEATURE_FALLBACK = false; // terrible slow, can easily softlock the GPU +const uint UNROLL_FALLBACK = 4; +const uint UNROLL_SIMD = 3; // max MAX_CHARS / 32 + +// #undef SUPPORTS_SUBGROUP_REDUCTION + +#ifdef API_VULKAN +// By default, subgroupBroadcast only supports compile time constants as index. +// However we need an uniform instead. This is always supported in OpenGL, +// but in Vulkan only in SPIR-V >= 1.5. +// So fall back to subgroupShuffle on Vulkan instead. +#define subgroupBroadcast subgroupShuffle +#endif + +/* +The header-only font +We have 96 (ASCII) characters, each of them is 12 pixels high and 8 pixels wide. +To store the boolean value per pixel, 96 bits per character is needed. +So three 32 bit integers are used per character. +This takes in total roughly 1 kB of constant buffer. +The first character must be all-one for the optimized implementation below. +*/ +const uint char_width = 8; +const uint char_height = 12; +const uint char_count = 96; +const uint char_pixels = char_width * char_height; +const float2 char_dim = float2(char_width, char_height); + +const uint rasters[char_count][(char_pixels + 31) / 32] = { + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, {0x18181818, 0x00181818, 0x00181800}, + {0x6c6c6c6c, 0x00000000, 0x00000000}, {0x66660000, 0xff6666ff, 0x00006666}, + {0x1bff7e18, 0xd8f87e1f, 0x00187eff}, {0x6edb1b0e, 0x760c1830, 0x0070d8db}, + {0x3333361c, 0x1b0e0e1b, 0x00fe63f3}, {0x18383070, 0x00000000, 0x00000000}, + {0x0c0c1830, 0x0c0c0c0c, 0x0030180c}, {0x3030180c, 0x30303030, 0x000c1830}, + {0x5a990000, 0x5a3cff3c, 0x00000099}, {0x18180000, 0x18ffff18, 0x00001818}, + {0x00000000, 0x38000000, 0x000c1838}, {0x00000000, 0x00ffff00, 0x00000000}, + {0x00000000, 0x00000000, 0x00001c1c}, {0x6060c0c0, 0x18183030, 0x06060c0c}, + {0xe3c3663c, 0xc7cfdbf3, 0x003c66c3}, {0x181e1c18, 0x18181818, 0x007e1818}, + {0x60c0e77e, 0x060c1830, 0x00ff0303}, {0xc0c0e77e, 0xc0e07ee0, 0x007ee7c0}, + {0x363c3830, 0x3030ff33, 0x00303030}, {0x030303ff, 0xc0e07f03, 0x007ee7c0}, + {0x0303e77e, 0xc3e37f03, 0x007ee7c3}, {0xc0c0c0ff, 0x0c183060, 0x000c0c0c}, + {0xc3c3e77e, 0xc3e77ee7, 0x007ee7c3}, {0xc3c3e77e, 0xc0c0fee7, 0x007ee7c0}, + {0x00000000, 0x00001c1c, 0x00001c1c}, {0x38000000, 0x38000038, 0x000c1838}, + {0x0c183060, 0x0c060306, 0x00603018}, {0x00000000, 0xff00ffff, 0x000000ff}, + {0x30180c06, 0x3060c060, 0x00060c18}, {0xc0c3c37e, 0x18183060, 0x00180000}, + {0x7e000000, 0xdbcbbbc3, 0x00fc06f3}, {0xc3663c18, 0xc3ffc3c3, 0x00c3c3c3}, + {0xc3c3e37f, 0xc3e37fe3, 0x007fe3c3}, {0x0303e77e, 0x03030303, 0x007ee703}, + {0xc3e3733f, 0xc3c3c3c3, 0x003f73e3}, {0x030303ff, 0x03033f03, 0x00ff0303}, + {0x030303ff, 0x0303033f, 0x00030303}, {0x0303e77e, 0xc3f30303, 0x007ee7c3}, + {0xc3c3c3c3, 0xc3c3ffc3, 0x00c3c3c3}, {0x1818187e, 0x18181818, 0x007e1818}, + {0x60606060, 0x60606060, 0x003e7763}, {0x1b3363c3, 0x1b0f070f, 0x00c36333}, + {0x03030303, 0x03030303, 0x00ff0303}, {0xffffe7c3, 0xc3c3c3db, 0x00c3c3c3}, + {0xcfcfc7c7, 0xf3fbdbdf, 0x00e3e3f3}, {0xc3c3e77e, 0xc3c3c3c3, 0x007ee7c3}, + {0xc3c3e37f, 0x03037fe3, 0x00030303}, {0xc3c3663c, 0xdbc3c3c3, 0x00fc76fb}, + {0xc3c3e37f, 0x1b0f7fe3, 0x00c36333}, {0x0303e77e, 0xc0e07e07, 0x007ee7c0}, + {0x181818ff, 0x18181818, 0x00181818}, {0xc3c3c3c3, 0xc3c3c3c3, 0x007ee7c3}, + {0xc3c3c3c3, 0x6666c3c3, 0x00183c3c}, {0xc3c3c3c3, 0xffdbdbc3, 0x00c3e7ff}, + {0x3c6666c3, 0x3c3c183c, 0x00c36666}, {0x3c6666c3, 0x1818183c, 0x00181818}, + {0x60c0c0ff, 0x060c7e30, 0x00ff0303}, {0x0c0c0c3c, 0x0c0c0c0c, 0x003c0c0c}, + {0x0c0c0606, 0x30301818, 0xc0c06060}, {0x3030303c, 0x30303030, 0x003c3030}, + {0xc3663c18, 0x00000000, 0x00000000}, {0x00000000, 0x00000000, 0xff000000}, + {0x181c0c0e, 0x00000000, 0x00000000}, {0x00000000, 0xfec0c37e, 0x00fec3c3}, + {0x03030303, 0xc3c37f03, 0x007fc3c3}, {0x00000000, 0x0303c37e, 0x007ec303}, + {0xc0c0c0c0, 0xc3c3fec0, 0x00fec3c3}, {0x00000000, 0x7fc3c37e, 0x00fe0303}, + {0x0c0ccc78, 0x0c0c3f0c, 0x000c0c0c}, {0x00000000, 0xc3c3c37e, 0xc3c0c0fe}, + {0x03030303, 0xc3c3c37f, 0x00c3c3c3}, {0x00001800, 0x18181818, 0x00181818}, + {0x00003000, 0x30303030, 0x36303030}, {0x03030303, 0x0f1b3363, 0x0063331f}, + {0x1818181e, 0x18181818, 0x007e1818}, {0x00000000, 0xdbdbdb7f, 0x00dbdbdb}, + {0x00000000, 0x6363633f, 0x00636363}, {0x00000000, 0x6363633e, 0x003e6363}, + {0x00000000, 0xc3c3c37f, 0x03037fc3}, {0x00000000, 0xc3c3c3fe, 0xc0c0fec3}, + {0x00000000, 0x0303077f, 0x00030303}, {0x00000000, 0x7e0303fe, 0x007fc0c0}, + {0x0c0c0c00, 0x0c0c0c3f, 0x00386c0c}, {0x00000000, 0x63636363, 0x007e6363}, + {0x00000000, 0x6666c3c3, 0x00183c3c}, {0x00000000, 0xdbc3c3c3, 0x00c3e7ff}, + {0x00000000, 0x183c66c3, 0x00c3663c}, {0x00000000, 0x3c6666c3, 0x06060c18}, + {0x00000000, 0x183060ff, 0x00ff060c}, {0x181818f0, 0x181c0f1c, 0x00f01818}, + {0x18181818, 0x18181818, 0x18181818}, {0x1818180f, 0x1838f038, 0x000f1818}, + {0x06000000, 0x0060f18f, 0x00000000}, {0x00000000, 0x00000000, 0x00000000}}; + +// Precalculated sum of all pixels per character +const uint raster_active_pixels[char_count] = { + 96, 18, 16, 40, 56, 42, 46, 10, 22, 22, 32, 28, 10, 16, 6, 24, 52, 29, 36, 44, 35, 42, 50, 28, + 58, 51, 12, 16, 22, 32, 22, 26, 41, 46, 57, 38, 52, 38, 32, 46, 48, 30, 31, 43, 28, 56, 64, 52, + 42, 52, 52, 44, 28, 48, 42, 58, 42, 32, 38, 26, 24, 26, 14, 8, 10, 34, 40, 26, 40, 32, 30, 33, + 39, 16, 20, 37, 28, 43, 30, 30, 34, 34, 20, 28, 27, 30, 26, 36, 26, 24, 26, 30, 24, 30, 14, 0}; + +// Get one sample of the font: (pixel index, character index) +float SampleFont(uint2 pos) +{ + return (rasters[pos.y][pos.x / 32] >> (pos.x % 32)) & uint(1); +} + +// Get one sample of the framebuffer: (character position in screen space, pixel index) +float3 SampleTex(uint2 char_pos, uint pixel) +{ + float2 inv_resoltion = + OptionEnabled(USE_WINDOW_RES) ? GetInvWindowResolution() : GetInvResolution(); + float2 tex_pos = char_pos * char_dim + float2(pixel % char_width, pixel / char_width) + 0.5; + return SampleLocation(tex_pos * inv_resoltion).xyz; +} + +struct CharResults +{ + float3 fg; // font color + float3 bg; // background color + float err; // MSE of this configuration + uint c; // character index +}; + +// Calculate the font and background color and the MSE for a given character +CharResults CalcCharRes(uint c, float3 t, float3 ft) +{ + CharResults o; + o.c = c; + + // Inputs: + // tt: sum of all texture samples squared + // t: sum of all texture samples + // ff: sum of all font samples squared + // f: sum of all font samples + // ft: sum of all font samples * texture samples + + // The font is either 1.0 or 0.0, so ff == f + // As the font is constant, this is pre-calculated + float f = raster_active_pixels[c]; + float ff = f; + + // The calculation isn't stable if the font is all-one. Return max err + // instead. + if (f == char_pixels) + { + o.err = char_pixels * char_pixels; + return o; + } + + // tt is only used as constant offset for the error, define it as zero + float3 tt = float3(0.0, 0.0, 0.0); + + // The next lines are a bit harder, hf :-) + + // The idea is to find the perfect char with the perfect background color + // and the perfect font color. As this is an equation with three unknowns, + // we can't just try all chars and color combinations. + + // As criterion how "perfect" the selection is, we compare the "mean + // squared error" of the resulted colors of all chars. So, now the big + // issue: how to calculate the MSE without knowing the two colors ... + + // In the next steps, "a" is the font color, "b" is the background color, + // "f" is the font value at this pixel, "t" is the texture value + + // So the square error of one pixel is: + // e = ( t - a⋅f - b⋅(1-f) ) ^ 2 + + // In longer: + // e = a^2⋅f^2 - 2⋅a⋅b⋅f^2 + 2⋅a⋅b⋅f - 2⋅a⋅f⋅t + b^2⋅f^2 - 2⋅b^2⋅f + b^2 + + // 2⋅b⋅f⋅t - 2⋅b⋅t + t^2 + + // The sum of all errors is: (as shortcut, ff,f,ft,t,tt are now the sums + // like declared above, sum(1) is the count of pixels) sum(e) = a^2⋅ff - + // 2⋅a^2⋅ff + 2⋅a⋅b⋅f - 2⋅a⋅ft + b^2⋅ff - 2⋅b^2⋅f + b^2⋅sum(1) + 2⋅b⋅ft - + // 2⋅b⋅t + tt + + // tt is only used as a constant offset, so its value has no effect on a,b or + // on the relative error. So it can be completely dropped. + + // To find the minimum, we have to derive this by "a" and "b": + // d/da sum(e) = 2⋅a⋅ff + 2⋅b⋅f - 2⋅b⋅ff - 2⋅ft + // d/db sum(e) = 2⋅a⋅f - 2⋅a⋅ff - 4⋅b⋅f + 2⋅b⋅ff + 2⋅b⋅sum(1) + 2⋅ft - 2⋅t + + // So, both equations must be zero at minimum and there is only one + // solution. + + float3 a = (ft * (f - float(char_pixels)) + t * (f - ff)) / (f * f - ff * float(char_pixels)); + float3 b = (ft * f - t * ff) / (f * f - ff * float(char_pixels)); + + float3 e = a * a * ff + 2.0 * a * b * (f - ff) - 2.0 * a * ft + + b * b * (-2.0 * f + ff + float(char_pixels)) + 2.0 * b * ft - 2.0 * b * t + tt; + o.err = dot(e, float3(1.0, 1.0, 1.0)); + + o.fg = a; + o.bg = b; + o.c = c; + + return o; +} + +// Get the color of the pixel of this invocation based on the character details +float3 GetFinalPixel(CharResults char_out) +{ + float2 resolution = OptionEnabled(USE_WINDOW_RES) ? GetWindowResolution() : GetResolution(); + uint2 char_pos = uint2(floor(GetCoordinates() * resolution / char_dim)); + uint2 pixel_offset = uint2(floor(GetCoordinates() * resolution) - char_pos * char_dim); + float font = SampleFont(int2(pixel_offset.x + char_width * pixel_offset.y, char_out.c)); + return char_out.fg * font + char_out.bg * (1.0 - font); +} + +/* + This shader performs some kind of brute force evaluation, which character fits best. + + for c in characters: + for p in pixels: + ft += font(c,p) * texture(p) + res = CalcCharRes(ft) + min(res.err) + + Terrible in performance, only for reference. + */ +CharResults CalcCharTrivial(uint2 char_pos) +{ + float3 t; + CharResults char_out; + char_out.err = char_pixels * char_pixels; + for (uint c = 0; c < MAX_CHARS; c += 1) + { + float3 ft = float3(0.0, 0.0, 0.0); + for (uint pixel = 0; pixel < char_pixels; pixel += 1) + { + float3 tex = SampleTex(char_pos, pixel); + float font = SampleFont(uint2(pixel, c)); + ft += font * tex; + } + if (c == 0) + t = ft; + CharResults res = CalcCharRes(c, t, ft); + if (res.err < char_out.err) + char_out = res; + } + return char_out; +} + +/* + However for better performance, some characters are tested at once. This saves some expensive + texture() calls. Also split the loop over the pixels in groups of 32 for only fetching the uint32 + of the font once. +*/ +CharResults CalcCharFallback(uint2 char_pos) +{ + float3 t; + CharResults char_out; + char_out.err = char_pixels * char_pixels; + for (uint c = 0; c < MAX_CHARS; c += UNROLL_FALLBACK) + { + // Declare ft + float3 ft[UNROLL_FALLBACK]; + for (uint i = 0; i < UNROLL_FALLBACK; i++) + ft[i] = float3(0.0, 0.0, 0.0); + + // Split `for p : pixels` in groups of 32. This makes accessing the texture (bit in uint32) + // easier. + for (uint pixel = 0; pixel < char_pixels; pixel += 32) + { + uint font_i[UNROLL_FALLBACK]; + for (uint i = 0; i < UNROLL_FALLBACK; i++) + font_i[i] = rasters[c + i][pixel / 32]; + + for (uint pixel_offset = 0; pixel_offset < 32; pixel_offset += 1) + { + float3 tex = SampleTex(char_pos, pixel + pixel_offset); + + // Inner kernel of `ft += font * tex`. Most time is spend in here. + for (uint i = 0; i < UNROLL_FALLBACK; i++) + { + float font = (font_i[i] >> pixel_offset) & uint(1); + + ft[i] += font * tex; + } + } + } + if (c == 0) + { + // First char has font := 1, so t = ft. Cache this value for the next iterations. + t = ft[0]; + } + + // Check if this character fits better than the last one. + for (uint i = 0; i < UNROLL_FALLBACK; i++) + { + CharResults res = CalcCharRes(c + i, t, ft[i]); + if (res.err < char_out.err) + char_out = res; + } + } + + return char_out; +} + +/* + SIMD optimized version with subgroup intrinsics + - distribute all characters over the lanes and check for them in parallel + - distribute the uniform texture access and broadcast each back to each lane +*/ +CharResults CalcCharSIMD(uint2 char_pos, uint simd_width) +{ + // Font color, bg color, character, error -- of character with minimum error + CharResults char_out; + char_out.err = char_pixels * char_pixels; + float3 t; +#ifdef SUPPORTS_SUBGROUP_REDUCTION + + // Hack: Work in hard-codeded fixed SIMD mode + if (gl_SubgroupInvocationID < simd_width) + { + // Loop over all characters + for (uint c = 0; c < MAX_CHARS; c += UNROLL_SIMD * simd_width) + { + // registers for "sum of font * texture" + float3 ft[UNROLL_SIMD]; + for (uint i = 0; i < UNROLL_SIMD; i++) + ft[i] = float3(0.0, 0.0, 0.0); + + for (uint pixel = 0; pixel < char_pixels; pixel += 32) + { + // Preload the font uint32 for the next 32 pixels + uint font_i[UNROLL_SIMD]; + for (uint i = 0; i < UNROLL_SIMD; i++) + font_i[i] = rasters[c + UNROLL_SIMD * gl_SubgroupInvocationID + i][pixel / 32]; + + for (uint pixel_offset = 0; pixel_offset < 32; pixel_offset += simd_width) + { + // Copy one full WRAP of textures into registers and shuffle them around for later usage. + // This avoids one memory transaction per tested pixel & character. + float3 tex_simd = SampleTex(char_pos, pixel + pixel_offset + gl_SubgroupInvocationID); + + for (uint k = 0; k < simd_width; k += 1) + { + float3 tex = subgroupBroadcast(tex_simd, k); + + // Note: As pixel iterates based on power-of-two gl_SubgroupSize, + // the const memory access to rasters is CSE'd and the inner loop + // after unrolling only contains: testing one bit + shuffle + + // conditional add + for (uint i = 0; i < UNROLL_SIMD; i++) + { + float font = (font_i[i] >> (k + pixel_offset % 32)) & uint(1); + ft[i] += font * tex; + } + } + } + } + if (c == 0) + { + // font[0] is a hardcoded 1 font, so t = ft + t = subgroupBroadcast(ft[0], 0); + } + + for (uint i = 0; i < UNROLL_SIMD; i++) + { + CharResults res = CalcCharRes(c + UNROLL_SIMD * gl_SubgroupInvocationID + i, t, ft[i]); + if (res.err < char_out.err) + char_out = res; + } + } + } + + // Broadcast to get the best character of all threads + float err_min = subgroupMin(char_out.err); + uint smallest = subgroupBallotFindLSB(subgroupBallot(err_min == char_out.err)); + char_out.fg = subgroupBroadcast(char_out.fg, smallest); + char_out.bg = subgroupBroadcast(char_out.bg, smallest); + char_out.c = subgroupBroadcast(char_out.c, smallest); + char_out.err = err_min; + +#endif + return char_out; +} + +bool supportsSIMD(uint simd_width) +{ +#ifdef SUPPORTS_SUBGROUP_REDUCTION + const uint mask = simd_width == 32u ? 0xFFFFFFFFu : (1u << simd_width) - 1; + return (subgroupBallot(true)[0] & mask) == mask; +#else + return false; +#endif +} + +// "Error: The AsciiArt shader requires the missing GPU extention KHR_shader_subgroup." +const uint missing_subgroup_warning_len = 82; +const uint missing_subgroup_warning[missing_subgroup_warning_len] = { + 37, 82, 82, 79, 82, 26, 95, 52, 72, 69, 95, 33, 83, 67, 73, 73, 33, 82, 84, 95, 83, + 72, 65, 68, 69, 82, 95, 82, 69, 81, 85, 73, 82, 69, 83, 95, 84, 72, 69, 95, 77, 73, + 83, 83, 73, 78, 71, 95, 39, 48, 53, 95, 69, 88, 84, 69, 78, 84, 73, 79, 78, 95, 43, + 40, 50, 63, 83, 72, 65, 68, 69, 82, 63, 83, 85, 66, 71, 82, 79, 85, 80, 14}; + +float3 ShowWarning(uint2 char_pos) +{ + CharResults char_out; + char_out.fg = float3(1.0, 1.0, 1.0); + char_out.bg = float3(0.0, 0.0, 0.0); + char_out.c = 95u; // just background + + if (char_pos.y == 0u && char_pos.x < missing_subgroup_warning_len) + { + char_out.c = missing_subgroup_warning[char_pos.x]; + } + + return GetFinalPixel(char_out); +} + +void main() +{ + // Calculate the character position of this pixel + float2 resolution = OptionEnabled(USE_WINDOW_RES) ? GetWindowResolution() : GetResolution(); + uint2 char_pos_self = uint2(floor(GetCoordinates() * resolution / char_dim)); + + float3 color_out; + +#ifdef SUPPORTS_SUBGROUP_REDUCTION + if (supportsSIMD(8)) + { + // Loop over all character positions covered by this wave + bool pixel_active = !gl_HelperInvocation; + CharResults char_out; + while (true) + { + // Fetch the next active character position + uint4 active_lanes = subgroupBallot(pixel_active); + if (active_lanes == uint4(0, 0, 0, 0)) + { + break; + } + uint2 char_pos = subgroupBroadcast(char_pos_self, subgroupBallotFindLSB(active_lanes)); + + // And calculate everything for this character position + if (supportsSIMD(32)) + { + char_out = CalcCharSIMD(char_pos, 32); + } + else if (supportsSIMD(16)) + { + char_out = CalcCharSIMD(char_pos, 16); + } + else if (supportsSIMD(8)) + { + char_out = CalcCharSIMD(char_pos, 8); + } + + // Draw the character on screen + if (char_pos == char_pos_self) + { + color_out = GetFinalPixel(char_out); + pixel_active = false; + } + if (OptionEnabled(DEBUG_ONLY_ONE_CHAR)) + { + break; + } + } + } + else +#else + if (char_pos_self.y <= 1u) + { + color_out = ShowWarning(char_pos_self); + } + else +#endif + if (HAVE_FULL_FEATURE_FALLBACK) + { + color_out = GetFinalPixel(CalcCharFallback(char_pos_self)); + } + else + { + color_out = Sample().xyz; + } + + SetOutput(float4(color_out, 1.0)); +} diff --git a/Data/Sys/Shaders/default_pre_post_process.glsl b/Data/Sys/Shaders/default_pre_post_process.glsl new file mode 100644 index 000000000000..5df2de99869b --- /dev/null +++ b/Data/Sys/Shaders/default_pre_post_process.glsl @@ -0,0 +1,408 @@ +/***** COLOR CORRECTION *****/ + +// Color Space references: +// https://www.unravel.com.au/understanding-color-spaces + +// SMPTE 170M - BT.601 (NTSC-M) -> BT.709 +mat3 from_NTSCM = transpose(mat3( + 0.939497225737661, 0.0502268452914346, 0.0102759289709032, + 0.0177558637510127, 0.965824605885027, 0.0164195303639603, + -0.00162163209967010, -0.00437400622653655, 1.00599563832621)); + +// ARIB TR-B9 (9300K+27MPCD with chromatic adaptation) (NTSC-J) -> BT.709 +mat3 from_NTSCJ = transpose(mat3( + 0.823613036967492, -0.0943227111084757, 0.00799341532931119, + 0.0289258355537324, 1.02310733489462, 0.00243547111576797, + -0.00569501554980891, 0.0161828357559315, 1.22328453915712)); + +// EBU - BT.470BG/BT.601 (PAL) -> BT.709 +mat3 from_PAL = transpose(mat3( + 1.04408168421813, -0.0440816842181253, 0.000000000000000, + 0.000000000000000, 1.00000000000000, 0.000000000000000, + 0.000000000000000, 0.0118044782106489, 0.988195521789351)); + +float3 LinearTosRGBGamma(float3 color) +{ + const float a = 0.055; + + for (int i = 0; i < 3; ++i) + { + float x = color[i]; + if (x <= 0.0031308) + x = x * 12.92; + else + x = (1.0 + a) * pow(x, 1.0 / 2.4) - a; + color[i] = x; + } + + return color; +} + +/***** COLOR SAMPLING *****/ + +// Non filtered gamma corrected sample (nearest neighbor) +float4 QuickSample(float3 uvw, float gamma) +{ +#if 0 // Test sampling range + const float threshold = 0.00000001; + float2 xy = uvw.xy * GetResolution(); + // Sampling outside the valid range, draw in yellow + if (xy.x < (0.0 - threshold) || xy.x > (GetResolution().x + threshold) || xy.y < (0.0 - threshold) || xy.y > (GetResolution().y + threshold)) + return float4(1.0, 1.0, 0.0, 1); + // Sampling at the edges, draw in purple + if (xy.x < 1.0 || xy.x > (GetResolution().x - 1.0) || xy.y < 1.0 || xy.y > (GetResolution().y - 1.0)) + return float4(0.5, 0, 0.5, 1); +#endif + + float4 color = texture(samp1, uvw); + color.rgb = pow(color.rgb, float3(gamma)); + return color; +} +float4 QuickSample(float2 uv, float w, float gamma) +{ + return QuickSample(float3(uv, w), gamma); +} +float4 QuickSampleByPixel(float2 xy, float w, float gamma) +{ + float3 uvw = float3(xy * GetInvResolution(), w); + return QuickSample(uvw, gamma); +} + +/***** Bilinear Interpolation *****/ + +float4 BilinearSample(float3 uvw, float gamma) +{ + // This emulates the (bi)linear filtering done directly from GPUs HW. + // Note that GPUs might natively filter red green and blue differently, but we don't do it. + // They might also use different filtering between upscaling and downscaling. + float2 source_size = GetResolution(); + float2 pixel = (uvw.xy * source_size) - 0.5; // Try to find the matching pixel top left corner + + // Find the integer and floating point parts + float2 int_pixel = floor(pixel); + float2 frac_pixel = fract(pixel); + + // Take 4 samples around the original uvw + float4 c11 = QuickSampleByPixel(int_pixel + float2(0.5, 0.5), uvw.z, gamma); + float4 c21 = QuickSampleByPixel(int_pixel + float2(1.5, 0.5), uvw.z, gamma); + float4 c12 = QuickSampleByPixel(int_pixel + float2(0.5, 1.5), uvw.z, gamma); + float4 c22 = QuickSampleByPixel(int_pixel + float2(1.5, 1.5), uvw.z, gamma); + + // Blend the 4 samples by their weight + return lerp(lerp(c11, c21, frac_pixel.x), lerp(c12, c22, frac_pixel.x), frac_pixel.y); +} + +/***** Bicubic Interpolation *****/ + +// Formula derived from: +// https://en.wikipedia.org/wiki/Mitchell%E2%80%93Netravali_filters#Definition +// Values from: +// https://guideencodemoe-mkdocs.readthedocs.io/encoding/resampling/#mitchell-netravali-bicubic +// Other references: +// https://www.codeproject.com/Articles/236394/Bi-Cubic-and-Bi-Linear-Interpolation-with-GLSL +// https://github.com/ValveSoftware/gamescope/pull/740 +// https://stackoverflow.com/questions/13501081/efficient-bicubic-filtering-code-in-glsl +#define CUBIC_COEFF_GEN(B, C) \ + (mat4(/* t^0 */ ((B) / 6.0), (-(B) / 3.0 + 1.0), ((B) / 6.0), (0.0), \ + /* t^1 */ (-(B) / 2.0 - (C)), (0.0), ((B) / 2.0 + (C)), (0.0), \ + /* t^2 */ ((B) / 2.0 + 2.0 * (C)), (2.0 * (B) + (C)-3.0), \ + (-5.0 * (B) / 2.0 - 2.0 * (C) + 3.0), (-(C)), \ + /* t^3 */ (-(B) / 6.0 - (C)), (-3.0 * (B) / 2.0 - (C) + 2.0), \ + (3.0 * (B) / 2.0 + (C)-2.0), ((B) / 6.0 + (C)))) + +float4 CubicCoeffs(float t, mat4 coeffs) +{ + return coeffs * float4(1.0, t, t * t, t * t * t); +} + +float4 CubicMix(float4 c0, float4 c1, float4 c2, float4 c3, float4 coeffs) +{ + return c0 * coeffs[0] + c1 * coeffs[1] + c2 * coeffs[2] + c3 * coeffs[3]; +} + +// By Sam Belliveau. Public Domain license. +// Simple 16 tap, gamma correct, implementation of bicubic filtering. +float4 BicubicSample(float3 uvw, float gamma, mat4 coeffs) +{ + float2 pixel = (uvw.xy * GetResolution()) - 0.5; + float2 int_pixel = floor(pixel); + float2 frac_pixel = fract(pixel); + + float4 c00 = QuickSampleByPixel(int_pixel + float2(-0.5, -0.5), uvw.z, gamma); + float4 c10 = QuickSampleByPixel(int_pixel + float2(+0.5, -0.5), uvw.z, gamma); + float4 c20 = QuickSampleByPixel(int_pixel + float2(+1.5, -0.5), uvw.z, gamma); + float4 c30 = QuickSampleByPixel(int_pixel + float2(+2.5, -0.5), uvw.z, gamma); + + float4 c01 = QuickSampleByPixel(int_pixel + float2(-0.5, +0.5), uvw.z, gamma); + float4 c11 = QuickSampleByPixel(int_pixel + float2(+0.5, +0.5), uvw.z, gamma); + float4 c21 = QuickSampleByPixel(int_pixel + float2(+1.5, +0.5), uvw.z, gamma); + float4 c31 = QuickSampleByPixel(int_pixel + float2(+2.5, +0.5), uvw.z, gamma); + + float4 c02 = QuickSampleByPixel(int_pixel + float2(-0.5, +1.5), uvw.z, gamma); + float4 c12 = QuickSampleByPixel(int_pixel + float2(+0.5, +1.5), uvw.z, gamma); + float4 c22 = QuickSampleByPixel(int_pixel + float2(+1.5, +1.5), uvw.z, gamma); + float4 c32 = QuickSampleByPixel(int_pixel + float2(+2.5, +1.5), uvw.z, gamma); + + float4 c03 = QuickSampleByPixel(int_pixel + float2(-0.5, +2.5), uvw.z, gamma); + float4 c13 = QuickSampleByPixel(int_pixel + float2(+0.5, +2.5), uvw.z, gamma); + float4 c23 = QuickSampleByPixel(int_pixel + float2(+1.5, +2.5), uvw.z, gamma); + float4 c33 = QuickSampleByPixel(int_pixel + float2(+2.5, +2.5), uvw.z, gamma); + + float4 cx = CubicCoeffs(frac_pixel.x, coeffs); + float4 cy = CubicCoeffs(frac_pixel.y, coeffs); + + float4 x0 = CubicMix(c00, c10, c20, c30, cx); + float4 x1 = CubicMix(c01, c11, c21, c31, cx); + float4 x2 = CubicMix(c02, c12, c22, c32, cx); + float4 x3 = CubicMix(c03, c13, c23, c33, cx); + + return CubicMix(x0, x1, x2, x3, cy); +} + +/***** Sharp Bilinear Filtering *****/ + +// Based on https://github.com/libretro/slang-shaders/blob/master/interpolation/shaders/sharp-bilinear.slang +// by Themaister, Public Domain license +// Does a bilinear stretch, with a preapplied Nx nearest-neighbor scale, +// giving a sharper image than plain bilinear. +float4 SharpBilinearSample(float3 uvw, float gamma) +{ + float2 source_size = GetResolution(); + float2 inverted_source_size = GetInvResolution(); + float2 target_size = GetWindowResolution(); + float2 texel = uvw.xy * source_size; + float2 texel_floored = floor(texel); + float2 s = fract(texel); + float scale = max(floor(max(target_size.x * inverted_source_size.x, target_size.y * inverted_source_size.y)), 1.f); + float region_range = 0.5 - (0.5 / scale); + + // Figure out where in the texel to sample to get correct pre-scaled bilinear. + + float2 center_dist = s - 0.5; + float2 f = ((center_dist - clamp(center_dist, -region_range, region_range)) * scale) + 0.5; + + float2 mod_texel = texel_floored + f; + + uvw.xy = mod_texel * inverted_source_size; + return BilinearSample(uvw, gamma); +} + +/***** Area Sampling *****/ + +// By Sam Belliveau and Filippo Tarpini. Public Domain license. +// Effectively a more accurate sharp bilinear filter when upscaling, +// that also works as a mathematically perfect downscale filter. +// https://entropymine.com/imageworsener/pixelmixing/ +// https://github.com/obsproject/obs-studio/pull/1715 +// https://legacy.imagemagick.org/Usage/filter/ +float4 AreaSampling(float3 uvw, float gamma) +{ + // Determine the sizes of the source and target images. + float2 source_size = GetResolution(); + float2 target_size = GetWindowResolution(); + float2 inverted_target_size = GetInvWindowResolution(); + + // Compute the top-left and bottom-right corners of the target pixel box. + float2 t_beg = floor(uvw.xy * target_size); + float2 t_end = t_beg + float2(1.0, 1.0); + + // Convert the target pixel box to source pixel box. + float2 beg = t_beg * inverted_target_size * source_size; + float2 end = t_end * inverted_target_size * source_size; + + // Compute the top-left and bottom-right corners of the pixel box. + float2 f_beg = floor(beg); + float2 f_end = floor(end); + + // Compute how much of the start and end pixels are covered horizontally & vertically. + float area_w = 1.0 - fract(beg.x); + float area_n = 1.0 - fract(beg.y); + float area_e = fract(end.x); + float area_s = fract(end.y); + + // Compute the areas of the corner pixels in the pixel box. + float area_nw = area_n * area_w; + float area_ne = area_n * area_e; + float area_sw = area_s * area_w; + float area_se = area_s * area_e; + + // Initialize the color accumulator. + float4 avg_color = float4(0.0, 0.0, 0.0, 0.0); + + // Prevents rounding errors due to the coordinates flooring above + const float2 offset = float2(0.5, 0.5); + + // Accumulate corner pixels. + avg_color += area_nw * QuickSampleByPixel(float2(f_beg.x, f_beg.y) + offset, uvw.z, gamma); + avg_color += area_ne * QuickSampleByPixel(float2(f_end.x, f_beg.y) + offset, uvw.z, gamma); + avg_color += area_sw * QuickSampleByPixel(float2(f_beg.x, f_end.y) + offset, uvw.z, gamma); + avg_color += area_se * QuickSampleByPixel(float2(f_end.x, f_end.y) + offset, uvw.z, gamma); + + // Determine the size of the pixel box. + int x_range = int(f_end.x - f_beg.x - 0.5); + int y_range = int(f_end.y - f_beg.y - 0.5); + + // Workaround to compile the shader with DX11/12. + // If this isn't done, it will complain that the loop could have too many iterations. + // This number should be enough to guarantee downscaling from very high to very small resolutions. + // Note that this number might be referenced in the UI. + const int max_iterations = 16; + + // Fix up the average calculations in case we reached the upper limit + x_range = min(x_range, max_iterations); + y_range = min(y_range, max_iterations); + + // Accumulate top and bottom edge pixels. + for (int ix = 0; ix < max_iterations; ++ix) + { + if (ix < x_range) + { + float x = f_beg.x + 1.0 + float(ix); + avg_color += area_n * QuickSampleByPixel(float2(x, f_beg.y) + offset, uvw.z, gamma); + avg_color += area_s * QuickSampleByPixel(float2(x, f_end.y) + offset, uvw.z, gamma); + } + } + + // Accumulate left and right edge pixels and all the pixels in between. + for (int iy = 0; iy < max_iterations; ++iy) + { + if (iy < y_range) + { + float y = f_beg.y + 1.0 + float(iy); + + avg_color += area_w * QuickSampleByPixel(float2(f_beg.x, y) + offset, uvw.z, gamma); + avg_color += area_e * QuickSampleByPixel(float2(f_end.x, y) + offset, uvw.z, gamma); + + for (int ix = 0; ix < max_iterations; ++ix) + { + if (ix < x_range) + { + float x = f_beg.x + 1.0 + float(ix); + avg_color += QuickSampleByPixel(float2(x, y) + offset, uvw.z, gamma); + } + } + } + } + + // Compute the area of the pixel box that was sampled. + float area_corners = area_nw + area_ne + area_sw + area_se; + float area_edges = float(x_range) * (area_n + area_s) + float(y_range) * (area_w + area_e); + float area_center = float(x_range) * float(y_range); + + // Return the normalized average color. + return avg_color / (area_corners + area_edges + area_center); +} + +/***** Main Functions *****/ + +// Returns an accurate (gamma corrected) sample of a gamma space space texture. +// Outputs in linear space for simplicity. +float4 LinearGammaCorrectedSample(float gamma) +{ + float3 uvw = v_tex0; + float4 color = float4(0, 0, 0, 1); + + if (resampling_method <= 1) // Bilinear + { + color = BilinearSample(uvw, gamma); + } + else if (resampling_method == 2) // Bicubic: B-Spline + { + color = BicubicSample(uvw, gamma, CUBIC_COEFF_GEN(1.0, 0.0)); + } + else if (resampling_method == 3) // Bicubic: Mitchell-Netravali + { + color = BicubicSample(uvw, gamma, CUBIC_COEFF_GEN(1.0 / 3.0, 1.0 / 3.0)); + } + else if (resampling_method == 4) // Bicubic: Catmull-Rom + { + color = BicubicSample(uvw, gamma, CUBIC_COEFF_GEN(0.0, 0.5)); + } + else if (resampling_method == 5) // Sharp Bilinear + { + color = SharpBilinearSample(uvw, gamma); + } + else if (resampling_method == 6) // Area Sampling + { + color = AreaSampling(uvw, gamma); + } + else if (resampling_method == 7) // Nearest Neighbor + { + color = QuickSample(uvw, gamma); + } + else if (resampling_method == 8) // Bicubic: Hermite + { + color = BicubicSample(uvw, gamma, CUBIC_COEFF_GEN(0.0, 0.0)); + } + + return color; +} + +void main() +{ + // This tries to fall back on GPU HW sampling if it can (it won't be gamma corrected). + bool raw_resampling = resampling_method <= 0; + bool needs_rescaling = GetResolution() != GetWindowResolution(); + + bool needs_resampling = needs_rescaling && (OptionEnabled(hdr_output) || OptionEnabled(correct_gamma) || !raw_resampling); + + float4 color; + + if (needs_resampling) + { + // Doing linear sampling in "gamma space" on linear texture formats isn't correct. + // If the source and target resolutions don't match, the GPU will return a color + // that is the average of 4 gamma space colors, but gamma space colors can't be blended together, + // gamma neeeds to be de-applied first. This makes a big difference if colors change + // drastically between two pixels. + + color = LinearGammaCorrectedSample(game_gamma); + } + else + { + // Default GPU HW sampling. Bilinear is identical to Nearest Neighbor if the input and output resolutions match. + if (needs_rescaling) + color = texture(samp0, v_tex0); + else + color = texture(samp1, v_tex0); + + // Convert to linear before doing any other of follow up operations. + color.rgb = pow(color.rgb, float3(game_gamma)); + } + + if (OptionEnabled(correct_color_space)) + { + if (game_color_space == 0) + color.rgb = color.rgb * from_NTSCM; + else if (game_color_space == 1) + color.rgb = color.rgb * from_NTSCJ; + else if (game_color_space == 2) + color.rgb = color.rgb * from_PAL; + } + + if (OptionEnabled(hdr_output)) + { + float hdr_paper_white = hdr_paper_white_nits / hdr_sdr_white_nits; + color.rgb *= hdr_paper_white; + } + + if (OptionEnabled(linear_space_output)) + { + // Nothing to do here + } + // Correct the SDR gamma for sRGB (PC/Monitor) or ~2.2 (Common TV gamma) + else if (OptionEnabled(correct_gamma)) + { + if (OptionEnabled(sdr_display_gamma_sRGB)) + color.rgb = LinearTosRGBGamma(color.rgb); + else + color.rgb = pow(color.rgb, float3(1.0 / sdr_display_custom_gamma)); + } + // Restore the original gamma without changes + else + { + color.rgb = pow(color.rgb, float3(1.0 / game_gamma)); + } + + SetOutput(color); +} diff --git a/Data/Sys/Shaders/lens_distortion.glsl b/Data/Sys/Shaders/lens_distortion.glsl index f36f2325244c..b0c872c45e4d 100644 --- a/Data/Sys/Shaders/lens_distortion.glsl +++ b/Data/Sys/Shaders/lens_distortion.glsl @@ -81,7 +81,7 @@ void main() float2 uv = (widenedRadial/2.0f) + float2(0.5f, 0.5f) + float2(offsetAdd, 0.0f); // Sample the texture at the source location - if(any(clamp(uv, 0.0, 1.0) != uv)) + if (clamp(uv, 0.0, 1.0) != uv) { // black if beyond bounds SetOutput(float4(0.0, 0.0, 0.0, 0.0)); diff --git a/Data/Sys/Shaders/sharp_bilinear.glsl b/Data/Sys/Shaders/sharp_bilinear.glsl deleted file mode 100644 index e94748b9591e..000000000000 --- a/Data/Sys/Shaders/sharp_bilinear.glsl +++ /dev/null @@ -1,47 +0,0 @@ -// Based on https://github.com/libretro/slang-shaders/blob/master/interpolation/shaders/sharp-bilinear.slang -// by Themaister, Public Domain license -// Does a bilinear stretch, with a preapplied Nx nearest-neighbor scale, -// giving a sharper image than plain bilinear. - -/* -[configuration] -[OptionRangeFloat] -GUIName = Prescale Factor (set to 0 for automatic) -OptionName = PRESCALE_FACTOR -MinValue = 0.0 -MaxValue = 16.0 -StepAmount = 1.0 -DefaultValue = 0.0 -[/configuration] -*/ - -float CalculatePrescale(float config_scale) { - if (config_scale == 0.0) { - float2 source_size = GetResolution(); - float2 window_size = GetWindowResolution(); - return ceil(max(window_size.x / source_size.x, window_size.y / source_size.y)); - } else { - return config_scale; - } -} - -void main() -{ - float2 source_size = GetResolution(); - float2 texel = GetCoordinates() * source_size; - float2 texel_floored = floor(texel); - float2 s = fract(texel); - float config_scale = GetOption(PRESCALE_FACTOR); - float scale = CalculatePrescale(config_scale); - float region_range = 0.5 - 0.5 / scale; - - // Figure out where in the texel to sample to get correct pre-scaled bilinear. - // Uses the hardware bilinear interpolator to avoid having to sample 4 times manually. - - float2 center_dist = s - 0.5; - float2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale + 0.5; - - float2 mod_texel = texel_floored + f; - - SetOutput(SampleLocation(mod_texel / source_size)); -} diff --git a/Data/Sys/Themes/Clean Blue/assembler_assemble.png b/Data/Sys/Themes/Clean Blue/assembler_assemble.png new file mode 100644 index 000000000000..0a32341e4e74 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_assemble.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_assemble@2x.png b/Data/Sys/Themes/Clean Blue/assembler_assemble@2x.png new file mode 100644 index 000000000000..55d3e5e173ed Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_assemble@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_assemble@4x.png b/Data/Sys/Themes/Clean Blue/assembler_assemble@4x.png new file mode 100644 index 000000000000..2db94c3ec661 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_assemble@4x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_clipboard.png b/Data/Sys/Themes/Clean Blue/assembler_clipboard.png new file mode 100644 index 000000000000..fd4efa41ff62 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_clipboard.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_inject.png b/Data/Sys/Themes/Clean Blue/assembler_inject.png new file mode 100644 index 000000000000..b5230746358f Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_inject.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_inject@2x.png b/Data/Sys/Themes/Clean Blue/assembler_inject@2x.png new file mode 100644 index 000000000000..5daea84753eb Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_inject@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_inject@4x.png b/Data/Sys/Themes/Clean Blue/assembler_inject@4x.png new file mode 100644 index 000000000000..85d7d60fded7 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_inject@4x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_new.png b/Data/Sys/Themes/Clean Blue/assembler_new.png new file mode 100644 index 000000000000..93ccac7810ee Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_new.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_new@2x.png b/Data/Sys/Themes/Clean Blue/assembler_new@2x.png new file mode 100644 index 000000000000..e0df86de3c64 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_new@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_new@4x.png b/Data/Sys/Themes/Clean Blue/assembler_new@4x.png new file mode 100644 index 000000000000..eb3ee00dbbfa Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_new@4x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_openasm.png b/Data/Sys/Themes/Clean Blue/assembler_openasm.png new file mode 100644 index 000000000000..48afdc2e2baa Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_openasm.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_openasm@2x.png b/Data/Sys/Themes/Clean Blue/assembler_openasm@2x.png new file mode 100644 index 000000000000..5dc43ba275b0 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_openasm@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_openasm@4x.png b/Data/Sys/Themes/Clean Blue/assembler_openasm@4x.png new file mode 100644 index 000000000000..f932ecda3906 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_openasm@4x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_save.png b/Data/Sys/Themes/Clean Blue/assembler_save.png new file mode 100644 index 000000000000..2e38c7198fc9 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_save.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_save@2x.png b/Data/Sys/Themes/Clean Blue/assembler_save@2x.png new file mode 100644 index 000000000000..0559a90bc006 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_save@2x.png differ diff --git a/Data/Sys/Themes/Clean Blue/assembler_save@4x.png b/Data/Sys/Themes/Clean Blue/assembler_save@4x.png new file mode 100644 index 000000000000..811ffa570f18 Binary files /dev/null and b/Data/Sys/Themes/Clean Blue/assembler_save@4x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_assemble.png b/Data/Sys/Themes/Clean Emerald/assembler_assemble.png new file mode 100644 index 000000000000..47d7a8999e3e Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_assemble.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_assemble@2x.png b/Data/Sys/Themes/Clean Emerald/assembler_assemble@2x.png new file mode 100644 index 000000000000..154a15642b9e Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_assemble@2x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_assemble@4x.png b/Data/Sys/Themes/Clean Emerald/assembler_assemble@4x.png new file mode 100644 index 000000000000..e89df7594e8f Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_assemble@4x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_clipboard.png b/Data/Sys/Themes/Clean Emerald/assembler_clipboard.png new file mode 100644 index 000000000000..32abfee22633 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_clipboard.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_inject.png b/Data/Sys/Themes/Clean Emerald/assembler_inject.png new file mode 100644 index 000000000000..1d0eff050725 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_inject.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_inject@2x.png b/Data/Sys/Themes/Clean Emerald/assembler_inject@2x.png new file mode 100644 index 000000000000..836b3a6f2349 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_inject@2x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_inject@4x.png b/Data/Sys/Themes/Clean Emerald/assembler_inject@4x.png new file mode 100644 index 000000000000..8d299173c86c Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_inject@4x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_new.png b/Data/Sys/Themes/Clean Emerald/assembler_new.png new file mode 100644 index 000000000000..b90004c7aae7 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_new.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_new@2x.png b/Data/Sys/Themes/Clean Emerald/assembler_new@2x.png new file mode 100644 index 000000000000..6c0cd0ae17ff Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_new@2x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_new@4x.png b/Data/Sys/Themes/Clean Emerald/assembler_new@4x.png new file mode 100644 index 000000000000..a694b724f138 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_new@4x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_openasm.png b/Data/Sys/Themes/Clean Emerald/assembler_openasm.png new file mode 100644 index 000000000000..959dceed4b76 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_openasm.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_openasm@2x.png b/Data/Sys/Themes/Clean Emerald/assembler_openasm@2x.png new file mode 100644 index 000000000000..5e664d50b805 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_openasm@2x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_openasm@4x.png b/Data/Sys/Themes/Clean Emerald/assembler_openasm@4x.png new file mode 100644 index 000000000000..5a4cfeb819cb Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_openasm@4x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_save.png b/Data/Sys/Themes/Clean Emerald/assembler_save.png new file mode 100644 index 000000000000..5fb5a976d809 Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_save.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_save@2x.png b/Data/Sys/Themes/Clean Emerald/assembler_save@2x.png new file mode 100644 index 000000000000..afa054c6078b Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_save@2x.png differ diff --git a/Data/Sys/Themes/Clean Emerald/assembler_save@4x.png b/Data/Sys/Themes/Clean Emerald/assembler_save@4x.png new file mode 100644 index 000000000000..e7d8ec92e0fd Binary files /dev/null and b/Data/Sys/Themes/Clean Emerald/assembler_save@4x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_assemble.png b/Data/Sys/Themes/Clean Lite/assembler_assemble.png new file mode 100644 index 000000000000..d92f75c7b0e6 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_assemble.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_assemble@2x.png b/Data/Sys/Themes/Clean Lite/assembler_assemble@2x.png new file mode 100644 index 000000000000..212e98162c01 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_assemble@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_assemble@4x.png b/Data/Sys/Themes/Clean Lite/assembler_assemble@4x.png new file mode 100644 index 000000000000..d3b177250f48 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_assemble@4x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_clipboard.png b/Data/Sys/Themes/Clean Lite/assembler_clipboard.png new file mode 100644 index 000000000000..bd081dec5ffe Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_clipboard.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_inject.png b/Data/Sys/Themes/Clean Lite/assembler_inject.png new file mode 100644 index 000000000000..454a8fe83a53 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_inject.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_inject@2x.png b/Data/Sys/Themes/Clean Lite/assembler_inject@2x.png new file mode 100644 index 000000000000..36c8d0ce3474 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_inject@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_inject@4x.png b/Data/Sys/Themes/Clean Lite/assembler_inject@4x.png new file mode 100644 index 000000000000..192532b34c33 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_inject@4x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_new.png b/Data/Sys/Themes/Clean Lite/assembler_new.png new file mode 100644 index 000000000000..2839a210182b Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_new.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_new@2x.png b/Data/Sys/Themes/Clean Lite/assembler_new@2x.png new file mode 100644 index 000000000000..9a17ced62b00 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_new@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_new@4x.png b/Data/Sys/Themes/Clean Lite/assembler_new@4x.png new file mode 100644 index 000000000000..98e6ef294c7d Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_new@4x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_openasm.png b/Data/Sys/Themes/Clean Lite/assembler_openasm.png new file mode 100644 index 000000000000..def45f852336 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_openasm.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_openasm@2x.png b/Data/Sys/Themes/Clean Lite/assembler_openasm@2x.png new file mode 100644 index 000000000000..abf0d2847302 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_openasm@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_openasm@4x.png b/Data/Sys/Themes/Clean Lite/assembler_openasm@4x.png new file mode 100644 index 000000000000..a7f0810bfe80 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_openasm@4x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_save.png b/Data/Sys/Themes/Clean Lite/assembler_save.png new file mode 100644 index 000000000000..842b8287e462 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_save.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_save@2x.png b/Data/Sys/Themes/Clean Lite/assembler_save@2x.png new file mode 100644 index 000000000000..785f8ecd275b Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_save@2x.png differ diff --git a/Data/Sys/Themes/Clean Lite/assembler_save@4x.png b/Data/Sys/Themes/Clean Lite/assembler_save@4x.png new file mode 100644 index 000000000000..7414bce7c2c1 Binary files /dev/null and b/Data/Sys/Themes/Clean Lite/assembler_save@4x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_assemble.png b/Data/Sys/Themes/Clean Pink/assembler_assemble.png new file mode 100644 index 000000000000..846dca33c3d4 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_assemble.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_assemble@2x.png b/Data/Sys/Themes/Clean Pink/assembler_assemble@2x.png new file mode 100644 index 000000000000..4fc4735b89c4 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_assemble@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_assemble@4x.png b/Data/Sys/Themes/Clean Pink/assembler_assemble@4x.png new file mode 100644 index 000000000000..6afc2d4d813b Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_assemble@4x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_clipboard.png b/Data/Sys/Themes/Clean Pink/assembler_clipboard.png new file mode 100644 index 000000000000..3d0f4fc6e422 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_clipboard.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_inject.png b/Data/Sys/Themes/Clean Pink/assembler_inject.png new file mode 100644 index 000000000000..bf5d0dcae975 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_inject.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_inject@2x.png b/Data/Sys/Themes/Clean Pink/assembler_inject@2x.png new file mode 100644 index 000000000000..794a0642dad3 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_inject@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_inject@4x.png b/Data/Sys/Themes/Clean Pink/assembler_inject@4x.png new file mode 100644 index 000000000000..0a92f52b082f Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_inject@4x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_new.png b/Data/Sys/Themes/Clean Pink/assembler_new.png new file mode 100644 index 000000000000..1e6756e07e0c Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_new.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_new@2x.png b/Data/Sys/Themes/Clean Pink/assembler_new@2x.png new file mode 100644 index 000000000000..c3235d846fcd Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_new@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_new@4x.png b/Data/Sys/Themes/Clean Pink/assembler_new@4x.png new file mode 100644 index 000000000000..c26c9bba14bb Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_new@4x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_openasm.png b/Data/Sys/Themes/Clean Pink/assembler_openasm.png new file mode 100644 index 000000000000..89e13c8f3592 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_openasm.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_openasm@2x.png b/Data/Sys/Themes/Clean Pink/assembler_openasm@2x.png new file mode 100644 index 000000000000..1c8d6d3ee4bf Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_openasm@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_openasm@4x.png b/Data/Sys/Themes/Clean Pink/assembler_openasm@4x.png new file mode 100644 index 000000000000..4308c8f02f01 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_openasm@4x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_save.png b/Data/Sys/Themes/Clean Pink/assembler_save.png new file mode 100644 index 000000000000..ea340280fbf3 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_save.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_save@2x.png b/Data/Sys/Themes/Clean Pink/assembler_save@2x.png new file mode 100644 index 000000000000..91ef30bf889b Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_save@2x.png differ diff --git a/Data/Sys/Themes/Clean Pink/assembler_save@4x.png b/Data/Sys/Themes/Clean Pink/assembler_save@4x.png new file mode 100644 index 000000000000..8abe37c30506 Binary files /dev/null and b/Data/Sys/Themes/Clean Pink/assembler_save@4x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_assemble.png b/Data/Sys/Themes/Clean/assembler_assemble.png new file mode 100644 index 000000000000..4c12ec5b25e6 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_assemble.png differ diff --git a/Data/Sys/Themes/Clean/assembler_assemble@2x.png b/Data/Sys/Themes/Clean/assembler_assemble@2x.png new file mode 100644 index 000000000000..f6ad9309379a Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_assemble@2x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_assemble@4x.png b/Data/Sys/Themes/Clean/assembler_assemble@4x.png new file mode 100644 index 000000000000..d640fb41a4c8 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_assemble@4x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_clipboard.png b/Data/Sys/Themes/Clean/assembler_clipboard.png new file mode 100644 index 000000000000..31870d10e77b Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_clipboard.png differ diff --git a/Data/Sys/Themes/Clean/assembler_inject.png b/Data/Sys/Themes/Clean/assembler_inject.png new file mode 100644 index 000000000000..f3d4a8306192 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_inject.png differ diff --git a/Data/Sys/Themes/Clean/assembler_inject@2x.png b/Data/Sys/Themes/Clean/assembler_inject@2x.png new file mode 100644 index 000000000000..edbc05e88a30 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_inject@2x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_inject@4x.png b/Data/Sys/Themes/Clean/assembler_inject@4x.png new file mode 100644 index 000000000000..0f6c7a9f7d92 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_inject@4x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_new.png b/Data/Sys/Themes/Clean/assembler_new.png new file mode 100644 index 000000000000..275822538d77 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_new.png differ diff --git a/Data/Sys/Themes/Clean/assembler_new@2x.png b/Data/Sys/Themes/Clean/assembler_new@2x.png new file mode 100644 index 000000000000..e81537a2973d Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_new@2x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_new@4x.png b/Data/Sys/Themes/Clean/assembler_new@4x.png new file mode 100644 index 000000000000..48f868355c46 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_new@4x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_openasm.png b/Data/Sys/Themes/Clean/assembler_openasm.png new file mode 100644 index 000000000000..7b8ee320c5ec Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_openasm.png differ diff --git a/Data/Sys/Themes/Clean/assembler_openasm@2x.png b/Data/Sys/Themes/Clean/assembler_openasm@2x.png new file mode 100644 index 000000000000..75002087ff8c Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_openasm@2x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_openasm@4x.png b/Data/Sys/Themes/Clean/assembler_openasm@4x.png new file mode 100644 index 000000000000..de674aebc5c8 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_openasm@4x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_save.png b/Data/Sys/Themes/Clean/assembler_save.png new file mode 100644 index 000000000000..5a5528b71fab Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_save.png differ diff --git a/Data/Sys/Themes/Clean/assembler_save@2x.png b/Data/Sys/Themes/Clean/assembler_save@2x.png new file mode 100644 index 000000000000..e932cb0e19e2 Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_save@2x.png differ diff --git a/Data/Sys/Themes/Clean/assembler_save@4x.png b/Data/Sys/Themes/Clean/assembler_save@4x.png new file mode 100644 index 000000000000..fdc7c725bcae Binary files /dev/null and b/Data/Sys/Themes/Clean/assembler_save@4x.png differ diff --git a/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl b/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl index a4880f368a10..64c26b57ccd0 100644 Binary files a/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl and b/Data/Sys/Wii/shared2/wc24/mbox/wc24recv.ctl differ diff --git a/Data/Sys/wiitdb-de.txt b/Data/Sys/wiitdb-de.txt index 2fa716b3e3ab..c8e8cdc8b777 100644 --- a/Data/Sys/wiitdb-de.txt +++ b/Data/Sys/wiitdb-de.txt @@ -1,12 +1,11 @@ -TITLES = https://www.gametdb.com (type: Wii language: DE_unique version: 20191106234221) +TITLES = https://www.gametdb.com (type: Wii language: DE_unique version: 20230727194133) R22J01 = FlingSmash R23P52 = Barbie und Die Drei Musketiere R25PWR = LEGO Harry Potter: Die Jahre 1-4 R29P52 = Millennium Championship Paintball 2009 R2AP7D = Ice Age 2 - Jetzt taut's -R2AX7D = Ice Age 2 - Jetzt taut's +R2AX7D = Ice Age 2: Jetzt taut's R2FP70 = Fritzi Fisch und der verschwundene Schatz -R2GP99 = Fragile Dreams - Farewell Ruins of the Moon R2YP54 = Alles gute zum Geburtstag! R3YP70 = Sam & Max: Season Two: All-Zeit Bereit R42P69 = Die Sims 2: Gestrandet @@ -19,6 +18,7 @@ R4LXUG = Schweine Party R4PP69 = Die Sims 2: Haustiere R4ZJ01 = Fatal Frame 4: Mask of the Lunar Eclipse R55P41 = Wer wird Millionär +R59D4Q = Club Penguin: Game Day! R5AP8P = Der Goldene Kompass R5AX8P = Der Goldene Kompass R5FP41 = Academy of Champions: Fussball @@ -30,10 +30,11 @@ R5QPGT = Zirkus R5UP41 = CSI: Tödliche Absichten R5VP41 = James Cameron's Avatar: Das Spiel R5VX41 = James Cameron's Avatar: Das Spiel +R5XJ13 = MySims Agents R6APPU = Mein Baby und ich R6MPML = America´s Next Top Model R6WP68 = AMF Bowling: World Lanes -R6XP69 = Hasbro - Spiel Mal Wieder! +R6XP69 = Hasbro: Spiel mal wieder! R7AP69 = SimAnimals Afrika R7BP7J = Jelly Belly - Ballistic Beans R7SP5G = Escape the Museum @@ -55,7 +56,7 @@ R9EPNP = Brico Party: Werde Heimwerker-König R9GPWR = Die Legende der Wächter R9LP41 = Girls Life: Pyjama-Party R9RPNG = Dance Party - Pop Hits -RB2PGT = Balloon Pop! +RAAE01 = Disco de Startup Wii RB7P54 = Bully: Die Ehrenrunde RBEP52 = Bee Movie: Das Game RBEX52 = Bee Movie: Das Game @@ -73,7 +74,7 @@ RC3X41 = Petz: Katzenfreunde RC8P7D = Crash: Herrscher Der Mutanten RC9PGN = CID : The Dummy RCCPGT = Cooking Mama 1 -RCGP54 = Carnival - Die Jahrmarkt-Party +RCGP54 = Carnival: Die Jahrmarkt-Party RCIP41 = CSI: Eindeutige Beweise RCKPGN = Klaus Gronewalds Sports Challenge RCLP4Q = Himmel und Huhn: Ace in Action @@ -102,19 +103,18 @@ RG5PWR = Guinness World Records: Das Videospiel RG6P69 = Boogie Superstar RG8P41 = Petz Sports: Wilder Hunde-Spaß RGAP8P = Planet 51: Das Spiel -RGFP69 = Der Pate: Blackhand Edition -RGHP52 = Guitar Hero III: Legends Of Rock RGJP7U = George Der aus dem Dschungel kam RGQE70 = Ghostbusters: Das Videospiel RGQP70 = Ghostbusters: Das Videospiel +RGZP70 = Godzilla Unle고질라 봉인 해제ashed RH5PKM = Horse Life: Freunde für immer RH6P69 = Harry Potter und der Halbblutprinz RHKP18 = Job Island -RHNP70 = My Horse & Me - Mein Pferd und Ich +RHNP70 = My Horse & Me: Mein Pferd und ich RHQP4Q = Hannah Montana: Welttournee im Rampenlicht RHQX4Q = Hannah Montana: Welttournee im Rampenlicht RHQY4Q = Hannah Montana: Welttournee im Rampenlicht -RHVPFR = Moorhuhn - Das verbotene Schloss +RHVPFR = Moorhuhn: Das verbotene Schloss RHZP41 = Abenteuer auf dem Reiterhof: Die Pferdeflüsterin RI2P4Q = High School Musical: Sing It! RI3P5D = Lucas der Ameisenschreck @@ -123,9 +123,8 @@ RIBPKM = Igor: Das Spiel RIHP8P = Der unglaubliche Hulk RIJP69 = G.I. Joe: Geheimauftrag Cobra RIOPSU = Schauderhafte Geschichten: Skrupellose Römer -RIPPAF = One Piece Unlimited Cruise 1 - Der Schatz unter den Wellen RIRP8P = Iron Man: The Video Game -RIUPAF = One Piece Unlimited Cruise 2: Das Erwachen eines Helden +RIUPAF = One Piece: Unlimited Cruise 2: Das Erwachen eines Helden RJ2P52 = 007: Ein Quantum Trost RJ8P64 = Indiana Jones und der Stab der Könige RJ9PFR = Think Logic Trainer - Training für Körper und Geist @@ -144,21 +143,20 @@ RLADMR = Deal Or No Deal: Der Banker Schlägt Zurück RLAPMR = Deal Or No Deal: Der Banker Schlägt Zurück RLBPWR = LEGO Batman: Das Videospiel RLFP64 = Star Wars The Clone Wars: Lichtschwertduelle -RLGP64 = LEGO Star Wars: Die Komplette Saga +RLGP64 = LEGO Star Wars: Die komplette Saga RLIP64 = LEGO Indiana Jones: Die legendären Abenteuer -RLLP70 = Go West!: Ein Abenteuer mit Lucky Luke +RLLP70 = Go West! Ein Abenteuer mit Lucky Luke RLUX4Q = Bolt: Ein Hund für alle Fälle! RLVP78 = Avatar - Der Herr der Elemente RM5P7D = Die Mumie: Das Grabmal des Drachenkaisers RM9PGM = Mushroom Men: Der Sporenkrieg RMNDFR = Meine Tierpension RMNPFR = Meine Tierpension -RMXP78 = MX vs ATV: Untamed RN3P78 = SpongeBob und seine Freunde: Angriff der Spielzeugroboter RN3X78 = SpongeBob und seine Freunde: Angriff der Spielzeugroboter RN4P41 = ANNO: Erschaffe eine neue Welt RNIPGT = Mind.Body.Soul: Ernährung ist Wichtig -RNNP4Q = Die Chroniken Von Narnia: Prinz Kaspian Von Narnia +RNNP4Q = Die Chroniken von Narnia: Prinz Kaspian von Narnia RNNX4Q = Die Chroniken von Narnia: Prinz Kaspian RNNY4Q = Die Chroniken von Narnia: Prinz Kaspian RNNZ4Q = Die Chroniken von Narnia: Prinz Kaspian @@ -169,11 +167,11 @@ ROJP52 = Rapala: Angel-Spaß ROLP8P = Mario & Sonic bei den Olympischen Winterspielen ROPP41 = Jagdfieber ROTP7J = Twin Strike: Operation Thunderstorm -ROUPAF = One Piece Unlimited Cruise 1: Der Schatz unter den Wellen +ROUPAF = One Piece: Unlimited Cruise 1: Der Schatz unter den Wellen ROVPHM = Playmobil Circus: Manege frei! ROYP41 = Wolkig Mit Aussicht Auf Fleischbällchen: Das Videospiel ROYX41 = Wolkig mit Aussicht auf Fleischbällchen -RP2P69 = Smarty Pants - Das Besserwisserspiel +RP2P69 = Smarty Pants: Das Besserwisserspiel RP6P41 = Petz: Die Affen sind los RP7P52 = Piraten: Die Jagd nach Blackbeards Schatz RP9PRS = Space Chimps: Affen Im All @@ -182,7 +180,7 @@ RPFP52 = Pitfall: Das große Abenteuer RPSP4Q = Disney Prinzessinnen: Märchenhafte Reise RPTD52 = Tierbabys - Mein kleiner Welpe RPVPKM = Mein erstes Katzenbaby -RPWX41 = Prince of Persia: Die Vergessene Zeit +RPWX41 = Prince of Persia: Die vergessene Zeit RPYP9B = Pangya! Golf with Style RQ4P78 = SpongeBob Schwammkopf: Die Kreatur aus der Krossen Krabbe RQ8P08 = Moto GP @@ -192,7 +190,6 @@ RQKP41 = Kirmes Party RQNPWR = Scooby-Doo! Geheimnisvolle Abenteuer RQOP69 = Spore Helden RQTP6V = Agatha Christie: Und dann gabs keines mehr -RQWPG9 = Puzzle Quest - Challenge of the Warlords RQXP70 = Asterix bei den Olympischen Spielen RRCP52 = Barbie Pferdeabenteuer: Im Reitercamp RRGP52 = Madagascar 2 @@ -214,7 +211,7 @@ RSND69 = Die Simpsons: Das Spiel RSNP69 = Die Simpsons: Das Spiel RSNX69 = Die Simpsons: Das Spiel RSRP8P = Sonic und die Geheimen Ringe -RT3P54 = Rockstar Games präsentiert Tischtennis +RT3P54 = Rockstar Games präsentiert: Tischtennis RT6PKM = Das Zauberkarussell RTEHMR = Tierliebe Groß Geschrieben RTEPFR = Meine Tierarztpraxis @@ -230,7 +227,7 @@ RU5X4Q = Küss den Frosch RU7X5G = Nachts im Museum 2: Das Spiel RUBP7N = Die ultimative Brettspiele-Sammlung RUCXRT = RTL Winter Sports 2008 -RUEP4Q = G-Force - Agenten mit Biss +RUEP4Q = G-Force: Agenten mit Biss RUEX4Q = G-Force: Agenten mit Biss RUEY4Q = G-Force: Agenten mit Biss RUFP99 = Rune Factory Frontier @@ -262,7 +259,7 @@ RWAZ78 = WALL•E: Der Letzte räumt die Erde auf RWFH41 = Mein Wortschatz-Coach: Verbessere dein Ausdrucksvermögen RWMP78 = Worms: Odyssee im Wurmraum RWSP8P = Mario & Sonic bei den Olympischen Spielen -RX2P70 = My Horse & Me 2: Mein Pferd und Ich +RX2P70 = My Horse & Me 2: Mein Pferd und ich RX4PMT = Casper's Schreckensschule: Der gruselige Sporttag RXDD4Q = Disney Th!nk - Das Schnelldenker-Quiz RXDX4Q = Disney Th!nk: Schnelldenkerquiz @@ -292,7 +289,7 @@ S2ZP52 = Zhu Zhu Pets: Lustige Waldtiere S3EP78 = Barbie: Fashionista Inc. S3MP69 = Die Sims 3 S3PP4Q = Disney Princess: Mein Märchenhaftes Abenteuer -S5BPKM = Zurück in die Zukunft - Das Spiel +S5BPKM = Zurück in die Zukunft: Das Spiel S5MPVZ = Monster High: Aller Anfang ist schwer S6BP4Q = Merida - Legende der Highlands S6IP78 = Disney Prinzessin: Bezaubernde Geschichten @@ -301,7 +298,8 @@ S7BP69 = Trivial Pursuit: Wetten & Gewinnen S7FPGT = Zumba Kids: Die ultimate Zumba tanz-party S7SP41 = Die Schlümpfe Party Pack SA3P5G = Alvin und Die Chipmunks 3: Chip Brunch -SALP4Q = Alice Im Wunderland +SA3XGT = Alvin und Die Chipmunks 3: Chip Brunch +SALP4Q = Alice im Wunderland SAOP78 = Monster High: Monsterkrasse Highschool-Klasse! SAOXVZ = Monster High: Monsterkrasse Highschool-Klasse! SAVX5G = Alvin und die Chipmunks 2: Ohren zu und durch @@ -317,7 +315,7 @@ SBVP78 = SpongeBob Schwammkopf: Volle Kanne Vollgas SCIP41 = CSI: Tödliche Verschwörung SCJP4Q = LEGO Pirates of the Caribbean: Das Videospiel SCRPJH = Chicken Riot: Die wilde Hühnerjagd -SCUPFR = Moorhuhn - Jahrmarkt-Party +SCUPFR = Moorhuhn: Jahrmarkt-Party SCWP41 = Mein Fitness-Coach: Dance Workout SCYP4Q = Cars 2: Das Videospiel SCYY4Q = Cars 2: Das Videospiel @@ -327,7 +325,7 @@ SDFP4Q = Disney Sing It: Filmhits SDGP4Q = Disney Channel: All Star Party Games SDIP4Q = Disney Sing It: Pop Party SDLP78 = Doods großes Abenteuer -SDMPAF = Ich - Einfach Unverbesserlich +SDMPAF = Ich - Einfach unverbesserlich SDPP54 = Dora - Das große Geburtstagsabenteuer SDUP41 = Die Schlümpfe: Dance Party SDWP18 = Der Schattenläufer und die Rätsel des dunklen Turms @@ -342,6 +340,7 @@ SFIP01 = Mystery Case Files: Der Fall Malgrave SFPPFR = Fussball Fan Party SFRDRV = Fit for Fun SFRPXT = Fit for Fun +SFWP69 = FIFA Fußball-Weltmeisterschaft Südafrika 2010 SFWX69 = FIFA Fussball-Weltmeisterschaft Südafrika 2010 SFXPKM = X Factor SFYPAF = Family Party 90 @@ -360,7 +359,7 @@ SHDP52 = Drachenzähmen leicht gemacht SHHP69 = Harry Potter und die Heiligtümer des Todes - Teil 1 SHMPLR = Henry der Schreckliche SHOXKR = Hugo - Zauberei im Trollwald -SIAP52 = Ice Age 4: Voll Verschoben - Die Arktischen Spiele +SIAP52 = Ice Age 4: Voll verschoben - Die arktischen Spiele SIIP8P = Mario & Sonic bei den Olympischen Spielen London 2012 SIJP52 = iCarly 2: Ab in die Klicke! SJ2PWR = Scooby-Doo! und der Spuk im Sumpf @@ -376,7 +375,7 @@ SMFP4Q = Phineas und Ferb: Quer durch die 2. Dimension SMGP78 = Megamind: Das Bündnis von Team Mega SMJP52 = Monster Jam: Pfad der Zerstörung SNYPVZ = Monster High: 13 Wünsche -SOBD7K = Bibi Blocksberg - Das große Hexenbesen-Rennen 2 +SOBD7K = Bibi Blocksberg: Das große Hexenbesen-Rennen 2 SONDMR = Meine ersten Mitsing-Lieder SONFMR = Meine ersten Mitsing-Lieder SOSPAF = Turbo: Die Super-Stunt-Gang @@ -385,9 +384,11 @@ SP8P78 = Die Pinguine aus Madagaskar: Dr. Seltsam kehrt zurück SPBPGT = Richtig Buchstabieren Party SPDP52 = Spider-Man: Dimensions SPXP41 = Prince of Persia: Die Vergessene Zeit +SQFPGT = Phineas und Ferb: Suche nach Super-Sachen SQQPVZ = Disney Planes 2: Immer im Einsatz SQTPML = Das Duell - Männer vs. Frauen: Partyspaß Total! SR4P41 = Raving Rabbids: Die verrückte Zeitreise +SR5P41 = Raving Rabbids: Party Collection SRPP4Q = Disney Rapunzel: Neu verföhnt SRXP52 = Generator Rex: Providence Agent SS8P78 = SpongeBob Schwammkopf: verflixt und zugemalt @@ -397,7 +398,6 @@ SSCFWR = Scene It? Ganz großes Kino! SSCIWR = Scene It? Ganz großes Kino! SSCPWR = Scene It? Ganz großes Kino! SSCSWR = Scene It? Ganz großes Kino! -SSEDNG = We Sing Vol. 2 SSEPNG = We Sing Vol. 2 SSHPHH = Sherlock Holmes: Das Geheimnis des silbernen Ohrrings ST5P52 = Transformers: Mission auf Cybertron @@ -412,43 +412,159 @@ SU5PVZ = Monster High: Labyrinth-Skaten SU7PAF = Die Hüter des Lichts SV3PAF = Madagascar 3: Flucht durch Europa SV7PVZ = Die Pinguine aus Madagascar -SVDP52 = Spongebob Schwammkopf: Planktons Fiese Robo-Rache +SVDP52 = SpongeBob Schwammkopf: Planktons Fiese Robo-Rache SVMP01 = Super Mario All-Stars: 25 Jahre Jubiläumsedition +SVQEVZ = Barbie und ihre Schwestern: Die Rettung der Welpen SVQPVZ = Barbie und ihre Schwestern: Die Rettung der Welpen SVVPAF = Die Croods: Steinzeit Party! SW3PKM = Eurosport Winter Stars CS4P00 = SingItStar NRJ Music Tour +RMCPCA = Mario Kart Wii (Katalanische Übersetzung) SDNP01 = New SUPER DODO BROS wii SIS1OH = SingItStar Custom: Volume 1 SISACD = SingItStar AC/DC SISPOH = SingItStar Custom: Party W2CP = Gehirntraining +W2FP = Physiofun - Balance Training +W2GD = Phoenix Wright Ace Attorney: Justice for All (Deutsche Version) +W2GP = Phoenix Wright Ace Attorney: Justice for All +W2MP = Blaster Master: Overdrive W2PP = Physiofun - Beckenboden Training +W3GD = Phoenix Wright Ace Attorney 3: Trials And Tribulations +W3KP = ThruSpace: High Velocity 3D Puzzle W3MP = Die Drei Musketiere Einer für alle! +W4AP = Arcade Sports: Air Hockey, Bowling, Pool, Snooker +W6BP = Eco-Shooter: Plant 530 +W72P = Successfully Learning German Year 3 W73P = Lernerfolg Grundschule Deutsch Klasse 4 W74P = Lernerfolg Grundschule Deutsch Klasse 5 W7IP = Lernerfolg Grundschule Deutsch Klasse 2 +W8CP = Bit.Trip Core W8WP = Happy Holidays Halloween +W9BP = Big Town Shoot W9RP = Happy Holidays Christmas +WA4P = WarioWare: Do It Yourself - Showcase +WA7P = Toribash Violence Perfected +WA8P = Art Style: Penta Tentacles +WAEP = Around the world +WAFP = Airport Mania: First Flight +WAHP = Trenches: Generals +WALP = Art Style: light trax +WAOP = The Very Hungry Caterpillar´s ABC +WB2P = Strong Bad Episode 4: Dangeresque 3 +WB3P = Strong Bad Episode 5: 8-bit is Enough +WBEP = Beer Pong: Frat Party Games +WBFP = Bit.Trip Fate +WBGP = Bang Attack +WBPP = PLÄTTCHEN - twist 'n' paint +WBRP = Pirates: The Key of Dreams +WBXP = Strong Bad Episode 1: Homestar Ruiner +WBYP = Strong Bad Episode 2: Strong Badia - The Free +WBZP = Strong Bad Episode 3: Baddest of the Bands +WCHP = Chess Challenge +WCJP = Cocoto: Platform Jumper +WCKP = chick chick BOOM +WCSP = CueSports: Snooker vs Billiards +WD9P = Castlevania: The Adventure ReBirth +WDEP = Magic Destiny Astrological Games +WDFP = Defend your Castle +WDHP = Art Style: ROTOHEX WDMP = Dr. Mario & Bazillenjagd +WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) +WEMP = Aha! I Got It! Escape Game WETP = Bilderbuch-Spiele: Ein Abenteuer zum Aufklappen WF2P = FFCC: My Life as a Darklord +WF4P = Final Fantasy IV: The After Years WFCP = FFCC: My Life as a King +WFQP = Frogger: Hyper Arcade Edition +WFTP = Fish'em All! +WFVP = Football Up +WFWP = Flowerworks: Follie's Adventure +WFYP = Family Games Pen & Paper Edition +WGDP = Gradius Rebirth WGFP = Girlfriends Forever Magic Skate +WGGP = Gabrielle's Ghostly Groove: Monster Mix WGPP = Zenquaria Virtuelles Aquarium +WGSD = Phoenix Wright: Ace Attorney (Deutsche Version) +WGSF = Phoenix Wright: Ace Attorney (French Version) +WGSP = Phoenix Wright: Ace Attorney +WHEE = Heracles: Chariot Racing +WHEP = Heracles: Chariot Racing +WHFP = Heavy Fire: Special Operations +WHRP = Heron: Steam Machine WHUP = Geisterhaus-Partyschreck +WHWP = HoopWorld: BasketBrawl +WICP = NyxQuest: Kindred Spirits +WIDP = Dracula: Undead Awakening +WIEP = Tales of Monkey Island Chapter 3: Lair of the Leviathan +WILP = Tales of Monkey Island Chapter 1: Launch of the Screaming Narwhal WINP = Das Verrückte Labyrinth +WIRP = Tales of Monkey Island Chapter 5: Rise Of The Pirate God +WISP = Tales of Monkey Island Chapter 2: The Siege of Spinner Cay +WITP = Aha! I Found It! Hidden Object Game +WIYP = Tales of Monkey Island Chapter 4: The Trial and Execution of Guybrush Threepwood +WJKP = Jewel Keepers: Easter Island +WKBP = You, Me and the Cubes WKFP = Kung Fu Funk - Everybody Is Kung Fu Fighting +WKKP = Pop-Up Pirates! +WKRP = Karate Phants: Gloves of Glory +WKWP = Adventure on LOST ISLAND: Hidden Object Game WLEE = Lernen mit den PooYoos: Teil 1 WLEP = Lernen mit den PooYoos: Teil 1 WLNE = Lernen mit den PooYoos: Teil 2 WLNP = Lernen mit den PooYoos: Teil 2 +WLOP = LostWinds: Winter of the Melodias +WLZP = lilt line +WM7P = Anima Ark of Sinners WMBP = MaBoShi: Drei-Formen-Action WMCP = Monsteca Corral - Monsters Vs. Robots -WMJP = Dive - The Medes Islands Secret +WMSP = Enjoy your massage! +WN9E = Military Madness: Nectaris +WN9P = Military Madness: Nectaris +WNEE = Penguins & Friends Hey! That's My Fish! +WNEP = Penguins & Friends Hey! That’s my Fish! +WNVP = Neves Plus: Phantheon of Tangrams +WOBP = Art Style: ORBIENT +WOTP = Overturn: Mecha Wars +WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising +WP4P = Learning with the PooYoos: Episode 3 WPJP = Pucca – Mission: Küsse -WPVP = The Tales of Bearsworth Manor - Chaotic Conflicts -WZZP = The Tales of Bearsworth Manor - Puzzling Pages +WPKP = Texas Hold'Em Poker +WPQP = Protöthea +WPRP = Art Style: CUBELLO +WPVE = The Tales of Bearsworth Manor: Chaotic Conflicts +WREP = Racers Islands Crazy Arenas +WRIP = Rainbow Islands: Towering Adventure! +WRJP = Racers Islands - Crazy Racers +WRLP = FAST Racing League +WRRP = Robin Hood: The Return Of Richard +WRUP = Bit.Trip Runner +WSGP = Pop Them, Drop Them SAMEGAME +WSNP = Sonic The Hedgehog 4 Episode I +WSUP = Shootanto: Evolutionary Mayhem +WTEP = Tales of Elastic Boy Mission 1 +WTFP = Bit.Trip Flux +WTMP = Adventure Island: The Beginning +WTRP = Bit.Trip Beat +WTWP = Fenimore Fillmore: The Westerner +WTXP = Texas Hold’em Tournament +WU2P = Successfully Learning Mathematics Year 3 +WU3P = Successfully Learning Mathematics Year 4 +WU4P = Successfully Learning Mathematics Year 5 +WUIP = Successfully Learning Mathematics Year 2 +WVBP = Bit.Trip Void +WVOP = Rock'n Roll Climber +WVSP = Gods Vs Humans +WVUP = Mr Bumblebee Racing Champion +WW2P = Where's Wally? Fantastic Journey 2 +WW3P = Where's Wally? Fantastic Journey 3 +WWIP = Where's Wally? Fantastic Journey 1 +WWRP = Excitebike: World Challenge +WWXP = Paper Wars Cannon Fodder +WXBP = Ben 10: Alien Force - The Rise of Hex +WYIP = escapeVektor: Chapter 1 +WYSP = Yard Sale Hidden Treasures Sunnyville +WZIP = Rubik's Puzzle Galaxy: RUSH XIBP = Fish em All Demo XICP = Gods vs Humans Demo XIDP = Racers Islands Crazy Racers Demo @@ -464,8 +580,121 @@ XIUP = Soccer Bashi Demo XIVP = Mix Superstar Demo XIZP = 3D Pixel Racing Demo XJEP = Aya and the Cubes of Light Demo +FA9P = Zelda II: The Adventure of Link +FB2L = Super Mario Bros.: The Lost Levels +FBKP = Teenage Mutant Ninja Turles +FC8P = Castlevania II: Simon's Quest +FCSP = Probotector II: Return of the Evil Forces +FDGP = Ghosts'n Goblins +FDRP = Skate or Die +FEML = Bio Miracle Bokutte UPA +FEQP = Castlevania III Dracula's Curse +FERM = Startropics II: Zoda's Revenge +FF5P = Double Dragon II: The Revenge +FFEP = A Boy and His Blob: Trouble on Blobolonia +FFPP = Ufouria: THE SAGA +FFUP = Adventure Island 2 +FFVM = S.C.A.T.: Special Cybernetic Attack Team +JA4P = Super Ghouls'n Ghosts +JABL = Mario’s Super Picross +JADD = The Legend of Zelda: A Link to the Past +JADE = The Legend of Zelda: A Link to the Past +JADF = The Legend of Zelda: A Link to the Past +JAFD = SimCity +JAHP = R-TYPE III: The Third Lightning +JAJP = Street Fighter II: The World Warrior +JALP = Super Probotector: Alien Rebels +JAZD = The Legend of the Mystical Ninja +JBBP = Super Street Fighter II: The New Challengers +JBDD = Donkey Kong Country 2: Diddy's Kong-Quest +JBDE = Donkey Kong Country 2: Diddy's Kong Quest +JBIP = Street Fighter II Turbo: Hyper Fighting +JBPP = Donkey Kong Country 3: Dixie Kong’s Double Trouble +JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure +JCBM = Super Mario RPG: Legend of the Seven Stars +JCCP = Kirby’s Fun Pak +JCDM = Kirby’s Dream Land 3 +JCJP = Super Punch Out!! +JCKP = Space Invaders -The Original Game- +JCTM = Ogre Battle: The March of the Black Queen +JD3P = SUPER E.D.F.: Earth Defense Force +JD8E = Super Adventure Island II +JDJP = Super Star Wars: The Empire Strikes Back +JDLP = Super Star Wars: Return of the Jedi +JDWP = Aero The Acrobat +JDZD = Mystic Quest Legend​ +NACE = The Legend of Zelda: Ocarina of Time +NACP = The Legend of Zelda: Ocarina of Time NADE = Lylat wars +NAJN = Sin and Punishment +NAKS = Pokémon Snap +NAME = Kirby 64: The Crystal Shards +NAMP = Kirby 64: The Crystal Shards +NAND = Pokémon Puzzle League +NAOE = 1080° Snowboarding +NAOP = 1080°: TenEighty Snowboarding +NARE = The Legend of Zelda: Majora's Mask +NARP = The Legend of Zelda: Majora's Mask +NAYE = Ogre Battle 64: Person of Lordly Caliber +NAYM = Ogre Battle 64: Person of Lordly Caliber +LALP = Fantasy Zone II +LANP = Alex Kidd: The Lost Stars +LAPP = Wonder Boy III: The Dragon's Trap +MA8P = Ecco: The Tides of Time +MAHP = Sonic the Hedgehog +MALP = Bonanza Bros. +MAOP = Bio-Hazard Battle +MAVP = Wonder Boy In Monster World +MAXP = Alex Kidd In The Enchanted Castle +MB6P = Shining Force II +MBBP = Sonic the Hedgehog 2 +MBFP = Shinobi III: Return of the Ninja master MBIP = Landstalker: Die Schätze von König Nolo +MBJP = Ghouls'n Ghosts +MBLP = ESWAT City Under Siege +MBMP = Sonic the Hedgehog 3 +MBUP = Sonic 3D: Flickies' Island +MBWM = Columns III: Revenge of Columns +MC3P = Super Street Fighter II: The New Challengers +MCCP = Phantasy Star III: Generations of Doom +MCHM = MUSHA +MCLP = Street Fighter II’: Special Champion Edition +MCQP = Boogerman - A Pick and Flick Adventure +MCRP = Wolf of the Battlefield: MERCS +MCSP = Wonder Boy III: Monster Lair +MCVP = Pitfall: The Mayan Adventure +MCZP = Shanghai II Dragon's Eye +PAAP = Bomberman'93 +PAGL = Bomberman'94 +PARL = Detana Twin Bee +PAWP = Galaga'90 +PBEP = Motoroader +PBIP = Bonk III: Bonk's Big Adventure +PBSP = Chew Man Fu +PBWP = Air 'Zonk' +PCSL = Digital Champ: Battle Boxing +PDJL = Street Fighter II': Champion Edition +QA3P = SimEarth: The Living Planet +QAAP = Super Air Zonk +QABP = Ys Book I & II +QADL = Gradius II: Gofer no Yabou +QAPL = Castlevania: Rondo of Blood +EA5P = Fatal Fury 3: Road To The Final Victory +EA7P = Samurai Shodown IV: Amakusa's Revenge +EA8M = Iron Clad +EAIP = Top Hunter +EBDP = Magical Drop 3 +EBFP = Spin master +EBSP = The Path of the Warrior: Art of Fighting 3 +ECAP = Real Bout Fatal Fury 2: The Newcomers +ECGP = Shock Troopers: 2nd Squad +E54P = GHOSTS'N GOBLINS +E55P = Commando +E57P = SonSon +E6PP = NINJA GAIDEN +C93P = The Last Ninja 2 +C96P = Summer Games 2 +C9IP = Cybernoid HAAA = Fotokanal HABA = Wii-Shop-Kanal HACA = Mii-Kanal @@ -473,10 +702,25 @@ HACK = Mii-Kanal HADE = Internet Kanal HADP = Internet-Kanal HAFP = Wetterkanal +HAGA = Nachrichtenkanal HAGE = Nachrichtenkanal +HAGJ = Nachrichtenkanal HAGP = Nachrichtenkanal +HAJP = Meinungskanal HAPP = Mii-Wettbewerbskanal +HATP = Nintendo-Kanal +HAVP = Glückstagskanal +HAWP = Metroid Prime 3 Preview HAYA = Fotokanal +HCAP = Jam with the Band Live +HCFE = Wii Speak-Kanal +HCFP = Wii Speak-Kanal +HCMP = Kirby TV-Kanal +HCRE = The Legend of Zelda: Skyward Sword - Speicherdaten-Update-Kanal für +HCRP = The Legend of Zelda: Skyward Sword - Speicherdaten-Update-Kanal für +RMCP = Mario Kart-Kanal +OHBC = Homebrew-Kanal +G2FD78 = Tak 2: Der Stab der Träume G3AD69 = Der Herr der Ringe: Das dritte Zeitalter G3DX6L = Carmen Sandiego: Das Geheimnis der gestohlenen Trommeln G3MP41 = Der Anschlag @@ -484,34 +728,35 @@ G4CP54 = Charlie und die Schokoladen-fabrik G4MP69 = Die Sims: Brechen Aus G4OP69 = Die Sims 2: Haustiere G4ZP69 = Die Sims 2 -G6FD69 = FIFA Fussball-Weltmeisterschaft 2006 -G8MP01 = Paper Mario: Die Legende Vom Äonentor +G6FD69 = FIFA Fußball-Weltmeisterschaft Deutschland 2006 +G8MP01 = Paper Mario: Die Legende vom Äonentor G9TD52 = Grosse Haie: Kleine Fische GAZD69 = Harry Potter und der Gefangene von Askaban -GC3D78 = Scooby-Doo!: Fluch der Folianten -GCBP7D = Crash Bandicoot: Der Zorn Des Cortex +GC3D78 = Scooby-Doo! Fluch der Folianten +GCBP7D = Crash Bandicoot: Der Zorn des Cortex GCGP41 = 3 Engel Für Charlie: Volle Power GCIP69 = Die Sims GCQD7D = Buffy im Bann der Dämonen: Chaos Bleeds -GDKPA4 = Disney´s Sports Fußball -GDOP41 = Disney's Donald Duck Phantomias: Platyrhynchos Kineticus -GEND69 = James Bond 007: Alles Oder Nichts +GDIX7D = Die Hard - Stirb Langsam: Vendetta +GDKPA4 = Disney Sports: Fußball +GDOP41 = Disneys Donald Duck: Phantomias - Platyrhynchos Kineticus +GEND69 = James Bond 007: Alles oder Nichts GENP69 = 007: Alles Oder Nichts GF4D52 = Die Fantastischen Vier -GFAD69 = FIFA Football 2003 -GFSD69 = FIFA Fussball Weltmeisterschaft 2002 -GGVD78 = Der SpongBob Schwammkopf Film +GFHP6V = Böse Nachbarn +GFSD69 = FIFA Fußball-Weltmeisterschaft 2002 +GGVD78 = SpongBob Schwammkopf: Der Film GH4D69 = Harry Potter und der Feuerkelch GH5D52 = Ab Durch Die Hecke GHBP7D = Der Hobbit GHCD4Q = Himmel und Huhn GHLY69 = Harry Potter und der Stein der Weisen -GHSY69 = Harry Potter Und Die Kammer Des Schreckens +GHSY69 = Harry Potter und die Kammer des Schreckens GHVP08 = Disney's Tricky Micky -GIAP7D = Ice Age 2 : Jetzt Taut's +GIAP7D = Ice Age 2: Jetzt Taut's GICD78 = Die Unglaublichen GIHD78 = Scooby-Doo! Nacht der 100 Schrecken -GIQY78 = Die Unglaublichen: Der Angriff Des Tunnelgräbers +GIQY78 = Die Unglaublichen: Der Angriff des Tunnelgräbers GJND78 = Jimmy Neutron: Der mutige Erfinder GJUD78 = Tak und die Macht des Juju GKBPAF = Baten Kaitos: Die Schwingen der Ewigkeit und der verlorene Ozean @@ -521,8 +766,9 @@ GL5X4F = Lego Star Wars : Das Videospiel GL7P64 = LEGO Star Wars II: Die klassische Trilogie GLCD52 = Lemony Snicket: Rätselhafte Ereignisse GLHPG9 = Flutsch und weg -GLOD69 = Der Herr Der Ringe: Die Zwei Türme +GLOD69 = Der Herr der Ringe: Die zwei Türme GLVD4Q = Die Chroniken von Narnia: Der König von Narnia +GLVP4Q = Die Chroniken von Narnia: Der König von Narnia GLZD69 = 007: Liebesgrüsse aus Moskau GMNP78 = Die Monster AG : Monster Ball GNED78 = Findet Nemo @@ -533,8 +779,12 @@ GPHD52 = Pitfall: Die verlorene Expedition GPLD9G = Disney's Ferkels Grosses Abenteuer - Spiel GPQP6L = The Powerpuff Girls: Kampf den Gurkenschurken GPXP01 = Pokémon Box: Rubin & Saphir -GQ4D78 = SpongeBob Schwammkopf: Die Kreatur aus der krossen Krabbe -GQQD78 = Nickelodeon SpongeBob Schwammkopf: Film ab! +GQ4D78 = SpongeBob Schwammkopf: Die Kreatur aus der Krossen Krabbe +GQQD78 = SpongeBob Schwammkopf: Film ab! +GQQE78 = SpongeBob Schwammkopf: Film ab! +GQQF78 = SpongeBob Schwammkopf: Film ab! +GQQH78 = SpongeBob Schwammkopf: Film ab! +GQQP78 = SpongeBob Schwammkopf: Film ab! GQWX69 = Harry Potter: Quidditch - Weltmeisterschaft GR9P6L = Die Herrschaft Des Feuers GSKP7D = The Scorpion King : Aufstieg des Akkadiers diff --git a/Data/Sys/wiitdb-en.txt b/Data/Sys/wiitdb-en.txt index f59abb22af70..219c924bb8c2 100644 --- a/Data/Sys/wiitdb-en.txt +++ b/Data/Sys/wiitdb-en.txt @@ -1,6 +1,8 @@ -TITLES = https://www.gametdb.com (type: Wii language: EN version: 20191106224837) +TITLES = https://www.gametdb.com (type: Wii language: EN version: 20230727193249) +007E01 = Wii Auto Erase Disc 091E00 = Movie-Ch Install Disc Ver. A 410E01 = Wii Backup Disc v1.31 +413E01 = DiscUpdate Disc D2AJAF = Minna de Bouken! Family Trainer (Demo) D2SE18 = Deca Sports 2 (Demo) D3DE18 = Deca Sports 3 (Demo) @@ -14,7 +16,7 @@ DBKE69 = Boom Blox (Demo) DBKP69 = Boom Blox (Demo) DCAE18 = Calling (Demo) DCHEAF = We Cheer (Demo) -DCHJAF = We Cheer: Ohasta Produce ! Gentei Collabo Game Disc +DCHJAF = We Cheer: O wa Star Produce! Gentei Collabo Game Disc DD2P41 = Just Dance 2 (Demo) DDWE18 = Lost in Shadow - Press Disc (Demo) DDWX18 = Lost In Shadow - Best Buy (Demo) @@ -70,20 +72,20 @@ R2IP69 = Madden NFL 10 R2JJAF = Taiko no Tatsujin Wii R2KE54 = Don King Boxing R2KP54 = Don King Boxing -R2LJMS = Hula Wii: Hura de Hajimeru Bi to Kenkou!! +R2LJMS = Hula Wii: Hula de Hajimeru: Bi to Kenkou! R2ME20 = M&M's Adventure R2NE69 = NASCAR Kart Racing R2OE68 = Medieval Games R2OP68 = Medieval Games R2PE9B = Super Swing Golf Season 2 -R2PJ9B = Super Swing Golf Season 2 -R2PKZ4 = Super Swing Golf Season 2 +R2PJ9B = Swing Golf Pangya 2nd Shot! +R2PKZ4 = Swing Golf Pangya 2nd Shot! R2PP99 = Super Swing Golf -R2QJC0 = Cooking Mama 2 Taihen Mama wa Ooisogashi +R2QJC0 = Cooking Mama 2: Taihen!! Mama wa Ooisogashi! R2RE4F = Pony Friends 2 R2RP4F = Pony Friends 2 R2SE18 = Deca Sports 2 -R2SJ18 = Deca Sporta 2 +R2SJ18 = Deca Sporta 2: Wii de Sports 10 Shumoku! R2SP18 = Sports Island 2 R2TE41 = Teenage Mutant Ninja Turtles: Smash-Up R2TP41 = Teenage Mutant Ninja Turtles: Smash-Up @@ -91,7 +93,7 @@ R2UE8P = Let's Tap R2UJ8P = Let's Tap R2UP8P = Let's Tap R2VE01 = Sin & Punishment: Star Successor -R2VJ01 = Sin and Punishment: Successor to the Sky +R2VJ01 = Tsumi to Batsu: Sora no Koukeisha R2VP01 = Sin and Punishment: Successor of the Skies R2WEA4 = Pro Evolution Soccer 2009 R2WJA4 = Winning Eleven PLAY MAKER 2009 @@ -99,7 +101,7 @@ R2WPA4 = Pro Evolution Soccer 2009 R2WXA4 = Pro Evolution Soccer 2009 R2YE54 = Birthday Party Bash R2YP54 = It's my Birthday! -R32J01 = Metroid Prime 2 +R32J01 = Metroid Prime 2: Dark Echoes R33E69 = AC/DC Live: Rock Band Track Pack R33P69 = AC/DC Live: Rock Band Song Pack R34E69 = Rock Band: Country Track Pack @@ -109,7 +111,7 @@ R36P69 = Green Day: Rock Band R37E69 = Rock Band: Metal Track Pack R38E78 = Marvel Super Hero Squad R38P78 = Marvel Super Hero Squad -R38X78 = Marvel Super Hero Squad: Walmart Edition +R38X78 = Marvel Super Hero Squad - Walmart Edition R38Y78 = Marvel Super Hero Squad R39EFP = Shimano Xtreme Fishing R39PNK = Shimano Extreme Fishing @@ -150,7 +152,7 @@ R3SP52 = Spider-Man: Web of Shadows R3TE54 = Top Spin 3 R3TJG9 = Top Spin 3 R3TP54 = Top Spin 3 -R3UJGD = Oyako de Asobo: Miffy no Omocha Bako +R3UJGD = Oyako de Asobo: Miffy no Omochabako R3VEFP = Deer Drive R3VPNK = Deer Drive R3XE6U = Sam & Max: Season One @@ -161,7 +163,7 @@ R3ZE69 = Rock Band Track Pack: Classic Rock R42E69 = The Sims 2: Castaway R42P69 = The Sims 2: Castaway R43E69 = EA Sports Active: Personal Trainer -R43J13 = EA Sports Active Personal Trainer Wii 30-Hi Seikatsu Kaizen Program +R43J13 = EA Sports Active: Personal Trainer Wii: 30 Nichi Seikatsu Kaizen Program R43P69 = EA Sports Active: Personal Trainer R44J8P = Suzumiya Haruhi no Heiretsu R46ENS = Phantom Brave: We Meet Again @@ -170,7 +172,7 @@ R47E20 = ATV Quad Kings R47P20 = ATV Quad Kings R48E7D = The Spiderwick Chronicles R48P7D = The Spiderwick Chronicles -R49E01 = Donkey Kong Jungle Beat +R49E01 = Donkey Kong: Jungle Beat R49J01 = Donkey Kong: Jungle Beat R49P01 = Donkey Kong: Jungle Beat R4AE69 = SimAnimals @@ -180,9 +182,9 @@ R4BEJZ = Championship Foosball R4BPGT = Table Football R4CE69 = SimCity Creator R4CJ13 = SimCity Creator -R4CK69 = SimCity Creator +R4CK69 = SimCity Namanui Dosi R4CP69 = SimCity Creator -R4DDUS = Die drei Fragezeichen - Das verfluchte Schloss +R4DDUS = Die drei ???: Das verfluchte Schloss R4EE01 = Endless Ocean: Blue World R4EJ01 = Forever Blue: Umi no Yobigoe R4EP01 = Endless Ocean 2: Adventures of the Deep @@ -191,7 +193,7 @@ R4FP7J = Story Hour: Fairy Tales R4IPNK = Mad Tracks R4LPUG = Athletic Piggy Party R4LXUG = Athletic Piggy Party -R4MJ0Q = Shikakui Atama wo Marukusuru Wii +R4MJ0Q = Shikakui Atama o Maruku Suru. Wii R4NE5G = Major Minor's Majestic March R4NP5G = Major Minor's Majestic March R4NX5G = Major Minor's Majestic March @@ -211,15 +213,14 @@ R4RY69 = FIFA 10 R4RZ69 = FIFA Soccer 10 R4SE54 = MLB Superstars R4VEA4 = Storybook Workshop -R4VJA4 = Teleshibai Wii +R4VJA4 = Tele Shibai Wii R4WJA4 = Jikkyou Powerful Major League 2009 -R4YJ2M = Sukeban Shachou Rena Wii -R4ZJ01 = Fatal Frame IV: Mask of the Lunar Eclipse +R4YJ2M = Sukeban Shachou Rena Wii: Neko Shachou, Tsukaeru Shain Daiboshuu. +R4ZJ01 = Zero: Tsukihami no Kamen R52E08 = Neopets Puzzle Adventure R52P08 = Neopets Puzzle Adventure R53PFH = In The Mix Featuring Armin van Buuren R54FMR = Countdown: The Game -R55F41 = Qui Veut Gagner Des Millions: 1ère Edition R55P41 = Who Wants To Be A Millionaire: 1st Edition R56EG9 = Astro Boy: The Video Game R56PG9 = Astro Boy: The Video Game @@ -229,7 +230,7 @@ R58FMR = U-Sing R58IMR = U-Sing R58PMR = U-Sing R58SMR = U-Sing -R59D4Q = Club Penguin: Game Day! +R59D4Q = Disney Club Penguin: Game Day! R59E4Q = Club Penguin: Game Day! R59P4Q = Club Penguin: Game Day! R5AE8P = The Golden Compass @@ -251,7 +252,7 @@ R5NJN9 = Doala de Wii R5OENR = Party Pigs: Farmyard Games R5OXUG = Farmyard Party: Featuring the Olympigs R5PE69 = Harry Potter and the Order of the Phoenix -R5PJ13 = Harry Potter and the Order of the Phoenix +R5PJ13 = Harry Potter to Fushichou no Kishidan R5PP69 = Harry Potter and the Order of the Phoenix R5PX69 = Harry Potter and the Order of the Phoenix R5QPGT = Circus @@ -266,7 +267,7 @@ R5VP41 = James Cameron's Avatar: The Game R5VX41 = James Cameron's Avatar: The Game R5WEA4 = Silent Hill: Shattered Memories R5WJA4 = Silent Hill: Shattered Memories -R5XJ13 = MySims Agents +R5XJ13 = Boku to Sim no Machi Agent: Gokuaku Shachou kara Sekai o Sukue Daisakusen! R5XP69 = MySims Agents R5YD78 = All Star Cheerleader 2 R5YE78 = All Star Cheer Squad 2 @@ -288,7 +289,7 @@ R69P36 = Colin McRae: DiRT 2 R6APPU = Baby and Me R6BE78 = de Blob R6BJ78 = Blob Colorful na Kibou -R6BK78 = de Blob +R6BK78 = de Blob - Color Revolution R6BP78 = de Blob R6BX78 = de Blob R6CEAF = We Cheer 2 @@ -302,7 +303,7 @@ R6GPMR = Golden Balls R6HE54 = Ni Hao, Kai-lan: Super Game Day R6HP54 = Ni Hao, Kai-lan: Super Game Day R6IE54 = Baseball Blast! -R6JJGD = Fullmetal Alchemist: Prince of the Dawn +R6JJGD = Hagane no Renkinjutsushi: Fullmetal Alchemist: Akatsuki no Ouji R6KP36 = Ashes Cricket 2009 R6KU36 = Ashes Cricket 2009 R6LEWR = LEGO Rock Band @@ -335,8 +336,8 @@ R74E20 = Arcade Shooting Gallery R75E20 = Dream Salon R76E54 = NBA 2K10 R76P54 = NBA 2K10 -R77JAF = SD Gundam: G Generation Wars -R79JAF = Mobile Suit Gundam: MS Sensen 0079 +R77JAF = SD Gundam: GGeneration Wars +R79JAF = Kidou Senshi Gundam: MS Sensen 0079 R7AE69 = SimAnimals Africa R7AJ13 = SimAnimals Africa R7AP69 = SimAnimals Africa @@ -344,10 +345,10 @@ R7BE20 = Jelly Belly Ballistic Beans R7BP7J = Jelly Belly Ballistic Beans R7CJ01 = Captain Rainbow R7EE8P = NiGHTS: Journey of Dreams -R7EJ8P = NiGHTS: Journey of Dreams +R7EJ8P = NiGHTS: Hoshi Furu Yoru no Monogatari R7EP8P = NiGHTS: Journey of Dreams R7FEGD = Final Fantasy Fables: Chocobo's Dungeon -R7FJGD = Final Fantasy Fables: Chocobo's Dungeon +R7FJGD = Chocobo no Fushigi na Dungeon: Toki-wasure no Meikyuu R7FPGD = Final Fantasy Fables: Chocobo's Dungeon R7GEAF = Dragon Ball: Revenge of King Piccolo R7GJAF = Dragon Ball: Tenkaichi Daibouken @@ -387,14 +388,14 @@ R83EA4 = Pop'n Music R83JA4 = Pop'n Music R83PA4 = Pop'n Rhythm R84EE9 = Harvest Moon: Tree of Tranquility -R84J99 = Bokujo for Wii +R84J99 = Bokujou Monogatari: Yasuragi no Ki R84P99 = Harvest Moon: Tree of Tranquility R85EG9 = The Secret Saturdays: Beasts of the 5th Sun R85PG9 = The Secret Saturdays: Beasts of the 5th Sun R86E20 = Dream Dance & Cheer R87EVN = Ski-Doo: Snowmobile Challenge R88J2L = Anpanman Niko Niko Party -R89JEL = Tokyo Friend Park 2 Wii +R89JEL = Tokyo Friend Park II: Ketteiban: Minna de Chousen! Taikan Attraction! R8AE01 = PokéPark Wii: Pikachu's Adventure R8AJ01 = PokéPark Wii: Pikachu no Daibouken R8AP01 = PokéPark Wii: Pikachu's Adventure @@ -405,9 +406,9 @@ R8DJA4 = Yu-Gi-Oh! 5D's: Duel Transer R8DPA4 = Yu-Gi-Oh! 5D's: Master of the Cards R8EJQC = Earth Seeker R8FES5 = Fast Food Panic -R8FJHA = Takumi Restaurant ha Daihanjou! +R8FJHA = Takumi Restaurant wa Daihanjou! R8FPNP = Fast Food Panic -R8GJC8 = G1 Jockey Wii 2008 +R8GJC8 = GI Jockey Wii 2008 R8GPC8 = G1 Jockey Wii 2008 R8HE4Q = Hannah Montana: The Movie R8HP4Q = Hannah Montana: The Movie @@ -423,7 +424,7 @@ R8KPKM = Street Football 2 R8LE20 = Chicken Blaster R8LP7J = Chicken Blaster R8NEA4 = The Cages: Pro Style Batting Practice -R8NJG0 = Batting Revolution +R8NJG0 = Nihon Yakyuu Kikou Shounin - Batting Revolution R8OE54 = Ringling Bros. and Barnum & Bailey Circus R8OX54 = It's My Circus R8PE01 = Super Paper Mario @@ -451,7 +452,7 @@ R94PMR = The Ultimate Red Ball Challenge R94XMR = The Ultimate Red Ball Challenge R96EAF = Klonoa R96JAF = Kaze no Klonoa Door to Phantomile -R96KAF = Klonoa - Door to Phantomile +R96KAF = Baramui Klonoa - Door to Phantomile R96PAF = Klonoa R97E9B = Family Fun Football R9AE52 = Activision Demo Action Pack (Demo) @@ -486,7 +487,7 @@ R9RPNG = Dance Party Pop Hits R9SPPL = Sudoku Ball: Detective R9TE69 = Tiger Woods PGA Tour 09 All-Play R9TJ13 = Tiger Woods PGA Tour 09 All-Play -R9TK69 = Tiger Woods PGA Tour 09 All-Play +R9TK69 = Tiger Woods PGA Tour 09 - All-Play R9TP69 = Tiger Woods PGA Tour 09 All-Play R9UE52 = Build-A-Bear Workshop: Friendship Valley R9UPGY = Build-A-Bear Workshop: Friendship Valley @@ -496,6 +497,7 @@ R9XE52 = Arcade Zone R9XP52 = Arcade Zone R9YES5 = Sled Shred R9ZE54 = Major League Baseball 2K9 +RAAE01 = Wii Startup Disc RB2E6K = Balloon Pop RB2J2K = Rainbow Pop RB2PGT = Pop! @@ -504,7 +506,7 @@ RB4J08 = Biohazard 4 Wii Edition RB4P08 = Resident Evil 4: Wii Edition RB4X08 = Resident Evil 4: Wii Edition RB5E41 = Brothers In Arms: Earned In Blood -RB5P41 = Brothers In Arms: Earned In Blood +RB5P41 = Brothers in Arms: Earned in Blood RB6J18 = Bomberman RB7E54 = Bully: Scholarship Edition RB7P54 = Bully: Scholarship Edition @@ -528,7 +530,7 @@ RBFP7J = Balls of Fury RBGE54 = The BIGS RBGP54 = The Bigs RBHE08 = Resident Evil Archives: Resident Evil Zero -RBHJ08 = Biohazard 0 +RBHJ08 = Biohazard Zero RBHP08 = Resident Evil Archives: Resident Evil Zero RBIEE9 = Harvest Moon: Animal Parade RBIJ99 = Bokujou Monogatari Waku Waku Animal March @@ -538,7 +540,7 @@ RBKJ13 = Boom Blox RBKK69 = Boom Blox RBKP69 = Boom Blox RBLE8P = Bleach: Shattered Blade -RBLJ8P = Bleach: Shattered Blade +RBLJ8P = Bleach Wii: Hakujin Kirameku Rondo RBLP8P = Bleach: Shattered Blade RBME5G = Bust-a-Move Bash! RBMPGT = Bust-A-Move @@ -554,22 +556,22 @@ RBQPUG = Classic British Motor Racing RBRE5G = Blast Works: Build, Trade, Destroy RBRP5G = Blast Works: Build, Trade, Destroy RBRX5G = Blast Works: Build, Trade, Destroy -RBSJ08 = Sengoku Basara 2 Heroes (Double Pack) +RBSJ08 = Sengoku Basara 2: Heroes: Double Pack RBTE8P = Sega Bass Fishing -RBTJ8P = Sega Bass Fishing +RBTJ8P = Uchi Tsuri! Sega Bass Fishing RBTP8P = Sega Bass Fishing RBUE08 = Resident Evil: The Umbrella Chronicles -RBUJ08 = Biohazard: The Umbrella Chronicles +RBUJ08 = Biohazard: Umbrella Chronicles RBUK08 = Biohazard: The Umbrella Chronicles RBUP08 = Resident Evil: The Umbrella Chronicles RBVE52 = Barbie as The Island Princess RBVP52 = Barbie as The Island Princess RBWE01 = Battalion Wars 2 -RBWJ01 = Totsugeki Famicom Wars vs. +RBWJ01 = Totsugeki!! Famicom Wars VS RBWP01 = Battalion Wars 2 RBXJ8P = Bleach: Versus Crusade RBYE78 = Barnyard -RBYJ78 = Barnyard +RBYJ78 = Barnyard: Shuyaku wa Ore, Ushi RBYP78 = Barnyard RBZE5Z = Billy the Wizard: Rocket Broomstick Racing RBZPUG = Billy the Wizard: Rocket Broomstick Racing @@ -592,14 +594,14 @@ RC8P7D = Crash: Mind Over Mutant RC8X7D = Crash: Mind Over Mutant RC9PGN = CID: The Dummy RCAE78 = Cars -RCAJ78 = Cars +RCAJ78 = Disney-Pixar Cars RCAP78 = Cars RCAX78 = Cars RCAY78 = Cars RCBE52 = Cabela's Big Game Hunter RCBP52 = Cabela's Big Game Hunter RCCE5G = Cooking Mama: Cook Off -RCCJC0 = Cooking Mama +RCCJC0 = Cooking Mama: Minna to Issho ni Oryouri Taikai! RCCPGT = Cooking Mama RCDD52 = Call of Duty 3 RCDE52 = Call of Duty 3 @@ -623,14 +625,14 @@ RCKPGN = Alan Hansen's Sports Challenge RCLE4Q = Disney's Chicken Little: Ace in Action RCLP4Q = Chicken Little: Ace In Action RCOJ99 = Meitantei Conan: Tsuioku no Mirage -RCOK99 = Detective Conan: Case Closed: The Mirapolis Investigation +RCOK99 = Myeongtamjeong Conan - Chueogui Hwansang RCOKZF = Case Closed: The Mirapolis Investigation RCOPNP = Case Closed: The Mirapolis Investigation RCPE18 = Kororinpa: Marble Mania RCPJ18 = Kororinpa RCPP18 = Kororinpa RCQEDA = Penny Racers Party: Turbo-Q Speedway -RCQJDA = Choro Q +RCQJDA = Choro Q Wii RCRE5D = Cruis'n RCRP5D = Cruis'n RCSE20 = Chicken Shoot @@ -638,7 +640,6 @@ RCSP7J = Chicken Shoot RCTE5Z = Counter Force RCTPGT = Counter Force RCUE52 = Cabela's Legendary Adventures -RCUP52 = Cabela's Legendary Adventures RCVE41 = Far Cry: Vengeance RCVP41 = Far Cry: Vengeance RCXE78 = All Star Cheer Squad @@ -654,10 +655,10 @@ RD4EA4 = Dance Dance Revolution: Hottest Party 2 RD4JA4 = Dance Dance Revolution: Furu Furu Party RD4PA4 = Dance Dance Revolution: Hottest Party 2 RD6EE9 = Animal Kingdom: Wildlife Expedition -RD6J8N = Doubutu Kisoutengai +RD6J8N = Doubutsu Kisoutengai! Nazo no Rakuen de Scoop Shashin o Gekisha Seyo! RD6PNP = SAFAR'Wii RD8E52 = Dancing with the Stars -RD9J18 = Sudoku +RD9J18 = Puzzle Series Vol. 1: Sudoku RDAE52 = Dancing with the Stars: We Dance! RDBE70 = Dragon Ball Z: Budokai Tenkaichi 2 RDBJAF = Dragon Ball Z: Sparking! NEO @@ -666,7 +667,6 @@ RDCE78 = Deadly Creatures RDCP78 = Deadly Creatures RDDEA4 = Dance Dance Revolution: Hottest Party RDDJA4 = Dance Dance Revolution: Hottest Party -RDDPA4 = Dance Dance Revolution Hottest Party RDEJ0A = Zenkoku Dekotora Matsuri RDFE41 = Shaun White Snowboarding: Road Trip RDFP41 = Shaun White Snowboarding: Road Trip @@ -676,7 +676,7 @@ RDGPA4 = Castlevania Judgment RDHE78 = Destroy All Humans! Big Willy Unleashed RDHP78 = Destroy All Humans! Big Willy Unleashed RDIE41 = The Dog Island -RDIJG2 = The Dog Island +RDIJG2 = Artlist Collection: The Dog Island ~Hitotsu no Hana no Monogatari~ RDIP41 = The Dog Island RDJE4F = Death Jr.: Root of Evil RDJP4F = Death Jr.: Root of Evil @@ -690,7 +690,7 @@ RDMJ8N = Go! Go! Minon RDMPHZ = Minon: Everyday Hero RDNEA4 = Dance Dance Revolution: Disney Grooves RDOE41 = Petz Dogz 2 -RDOJ41 = Dog to Mahou no Boushi +RDOJ41 = Wanko to Mahou no Boushi RDOP41 = Dogz RDOX41 = Dogz RDPE54 = Dora Saves the Snow Princess @@ -700,23 +700,23 @@ RDQEGD = Dragon Quest Swords: The Masked Queen and The Tower of Mirrors RDQJGD = Dragon Quest Swords: Kamen no Joou to Kagami no Tou RDQPGD = Dragon Quest Swords: The Masked Queen and the Tower of Mirrors RDREA4 = Dewy's Adventure -RDRJA4 = Dewy's Adventure +RDRJA4 = Dewy's Adventure: Suishou Dewy no Daibouken!! RDRPA4 = Dewy's Adventure RDSE70 = Dragon Ball Z: Budokai Tenkaichi 3 RDSJAF = Dragon Ball Z: Sparking! METEOR RDSPAF = Dragon Ball Z: Budokai Tenkaichi 3 RDTEAF = Tamagotchi: Party On! -RDTJAF = Tamagotchi Pikadai +RDTJAF = Tamagotchi no Pika Pika Daitouryou! RDTPAF = Tamagotchi: Party On! RDUJDQ = Sugoro Chronicle: Migite ni Ken o Hidarite ni Saikoro o RDVE41 = Driver: Parallel Lines RDVP41 = Driver: Parallel Lines RDWEG9 = Dragon Blade: Wrath of Fire -RDWJG9 = Dragon Blade: Wrath of Fire +RDWJG9 = Dragon Blade RDWPG9 = Dragon Blade: Wrath of Fire RDXE18 = Deca Sports -RDXJ18 = Deca Sporta -RDXKA4 = Deca Sporta +RDXJ18 = Deca Sporta: Wii de Sports 10 Shumoku! +RDXKA4 = Deca Sporta - Wiiro Jeulgineun Sports 10 Jongmok! RDXP18 = Sports Island RDYEGN = CID: The Dummy RDZJ01 = Disaster: Day of Crisis @@ -728,14 +728,13 @@ RE4P08 = Resident Evil Archives: Resident Evil RE5PAF = The Munchables RE6PRT = Summer Challenge: Athletics Tournament RE7PNK = Hunting Challenge -RE8J99 = Katekyo Hitman Reborn! Kindan no Yami no Delta +RE8J99 = Katekyoo Hitman Reborn! Kindan no Yami no Delta REAE69 = Celebrity Sports Showdown REAF69 = Celebrity Sports Showdown REAP69 = Celebrity Sports Showdown REBE4Z = Mr. Bean's Wacky World REBPMT = Mr Bean's Wacky World of Wii RECE6K = Spy Games: Elevator Mission -RECP6K = Spy Games: Elevator Mission REDE41 = Red Steel REDJ41 = Red Steel REDP41 = Red Steel @@ -748,16 +747,16 @@ REJEAF = Active Life: Extreme Challenge REJJAF = Family Trainer 2 REJPAF = Family Trainer: Extreme Challenge REKE41 = Gold's Gym: Cardio Workout -REKJ2N = Shape Boxing Wii de Enjoy Diet +REKJ2N = Shape Boxing: Wii de Enjoy Diet! REKP41 = My Fitness Coach: Cardio Workout REKU41 = Gold's Gym: Cardio Workout RELEA4 = Elebits RELJA4 = Elebits RELKA4 = Elebits RELPA4 = Eledees -REMJ8P = Doraemon Wii: Himitsu Douguou Ketteisen! +REMJ8P = Doraemon Wii: Himitsu Dougu-ou Ketteisen! RENE8P = Sonic and the Black Knight -RENJ8P = Sonic and the Black Knight +RENJ8P = Sonic to Ankoku no Kishi RENP8P = Sonic and the Black Knight REQE54 = Go, Diego, Go! Safari Rescue REQP54 = Go, Diego, Go! Safari Rescue @@ -766,7 +765,7 @@ REQY54 = Go, Diego, Go! Safari Rescue RESP41 = My Spanish Coach: Improve Your Spanish RETJAF = Ennichi no Tatsujin REUPNK = My Body Coach -REVJ8P = Imabikisou: Kaimei Hen +REVJ8P = Imabikisou Kaimei-hen REWFMR = My Horse Club: On the Trail of the Mysterious Appaloosa REWXMR = My Horse Club: On the Trail of the Mysterious Appaloosa REWYMR = My Horse Club: On the Trail of the Mysterious Appaloosa @@ -786,20 +785,20 @@ RF4E36 = Super Fruit Fall RF4P6M = Super Fruit Fall RF7J08 = Tatsunoko vs. Capcom: Cross Generation of Heroes RF8E69 = FIFA Soccer 08 -RF8J13 = FIFA 08 +RF8J13 = FIFA 08: World Class Soccer RF8K69 = FIFA 08 RF8P69 = FIFA 08 RF8X69 = FIFA 08 RF8Y69 = FIFA 08 RF9E69 = FIFA Soccer 09 All-Play RF9J13 = FIFA 09 All-Play -RF9K69 = FIFA 09 All-Play +RF9K69 = FIFA 09 - All-Play RF9P69 = FIFA 09 All-Play RF9R69 = FIFA 09 All-Play RF9X69 = FIFA 09 All-Play RF9Y69 = FIFA 09 All-Play RFAEAF = Active Life: Outdoor Challenge -RFAJAF = Family Trainer: Athletic World +RFAJAF = Family Trainer RFAPAF = Family Trainer RFBE01 = Endless Ocean RFBJ01 = Forever Blue @@ -836,14 +835,14 @@ RFPP01 = Wii Fit Plus RFPW01 = Wii Fit Plus RFQE69 = FaceBreaker K.O. Party RFQJ13 = FaceBreaker K.O. Party -RFQK69 = FaceBreaker: K.O. Party +RFQK69 = FaceBreaker K.O. Party RFQP69 = FaceBreaker: K.O. Party RFRE5G = Furu Furu Park RFRJC0 = Furu Furu Park RFSEEB = Shiren the Wanderer -RFSJ8P = Fushigi no Dungeon: Furai no Shiren 3 +RFSJ8P = Fushigi no Dungeon: Fuurai no Shiren 3: Karakuri Yashiki no Nemuri-hime RFTE70 = Backyard Football -RFUJA4 = Mahjong Kakutou Club Wii: Wi-Fi Taiou +RFUJA4 = Mahjong Fight Club Wii: Wi-Fi Taiou RFVE52 = Monkey Mischief! Party Time RFVP52 = Monkey Mischief! 20 Games RFWE5Z = Safari Adventures Africa @@ -854,7 +853,7 @@ RFZP41 = Imagine Fashion Idol RG2EXS = Guilty Gear XX Accent Core RG2JJF = Guilty Gear XX Accent Core RG2PGT = Guilty Gear XX Accent Core -RG4JC0 = Let's Go By Train Shinkansen EX +RG4JC0 = Densha de Go! Shinkansen EX: San'you Shinkansen Hen RG5EWR = Guinness World Records: The Videogame RG5PWR = Guinness World Records: The Videogame RG6E69 = Boogie SuperStar @@ -867,13 +866,11 @@ RG9P54 = Carnival Games: Mini Golf RGAE8P = Planet 51: The Game RGAP8P = Planet 51: The Game RGBE08 = Harvey Birdman: Attorney at Law -RGBP08 = Harvey Birdman: Attorney at Law RGCEXS = MiniCopter: Adventure Flight -RGCJJF = Petitcopter Wii Adventure Flight +RGCJJF = Puchi Copter Wii: Adventure Flight RGCPGT = Radio Helicopter RGDEA4 = Target: Terror -RGDPA4 = Target: Terror -RGEJJ9 = The World of Golden Eggs Norinori Rhythm +RGEJJ9 = The World of Golden Eggs: Nori Nori Rhythm kei RGFE69 = The Godfather: Blackhand Edition RGFF69 = The Godfather: Blackhand Edition RGFI69 = The Godfather: Blackhand Edition @@ -882,21 +879,20 @@ RGFS69 = The Godfather: Blackhand Edition RGGJAF = Gegege no Kitarou: Youkai Daiundoukai RGHE52 = Guitar Hero III: Legends of Rock RGHJ52 = Guitar Hero III Legends of Rock -RGHK52 = Guitar Hero III Legends of Rock +RGHK52 = Guitar Hero III - Legends of Rock RGHP52 = Guitar Hero III: Legends of Rock -RGIJC8 = G1 Jockey Wii +RGIJC8 = GI Jockey Wii RGIPC8 = G1 Jockey Wii RGJE4Z = George of the Jungle: Search for the Secret RGJP7U = George of the Jungle: Search for the Secret RGKENR = Kidz Sports: Crazy Golf -RGKPNR = Crazy Mini Golf RGLE7D = Geometry Wars: Galaxies RGLP7D = Geometry Wars: Galaxies RGME5D = The Grim Adventures of Billy & Mandy RGMP5D = The Grim Adventures of Billy & Mandy -RGNJAF = Gintama Yorozuya Tuve -RGOJJ9 = The World of Golden Eggs Nissan Note Version -RGPJAF = Anime Slot Revolution Pachi-Slot Kidou Senshi Gundam II Ai Senshi Hen +RGNJAF = Gintama: Yorozuya Chuubu: Tsukkomable Douga +RGOJJ9 = The World of Golden Eggs: Nori Nori Rhythm kei - Nissan Note Original Version +RGPJAF = Anime Slot Revolution: Pachi-Slot Kidou Senshi Gundam II: Ai Senshi-hen RGQE70 = Ghostbusters: The Video Game RGQP70 = Ghostbusters: The Video Game RGSE8P = Ghost Squad @@ -921,7 +917,7 @@ RGZP70 = Godzilla Unleashed RH2E41 = Hell's Kitchen: The Video Game RH2P41 = Hell's Kitchen RH3E4Q = High School Musical 3: Senior Year Dance! -RH3J4Q = High School Musical 3: Senior Year Dance! +RH3J4Q = Disney High School Musical Dance! RH3P4Q = High School Musical 3: Senior Year Dance! RH4XUG = Hamster Heroes RH5EVN = Horse Life Adventures @@ -929,15 +925,14 @@ RH5PKM = Horse Life 2 RH6E69 = Harry Potter and the Half-Blood Prince RH6K69 = Harry Potter and the Half Blood Prince RH6P69 = Harry Potter and the Half-Blood Prince -RH7J8P = Jissen Pachislot Hisshouhou! Sammy's Collection Hokuto no Ken Wii +RH7J8P = Jissen Pachi-Slot Pachinko Hisshouhou! Sammy's Collection: Hokuto no Ken Wii RH8E4F = Tomb Raider: Underworld RH8JEL = Tomb Raider: Underworld RH8P4F = Tomb Raider: Underworld -RH8X4F = Tomb Raider: Underworld RH9JC8 = Harukanaru Toki no Naka de 4 RHAE01 = Wii Play RHAJ01 = Hajimete no Wii -RHAK01 = Wii Play +RHAK01 = Cheoeum Mannaneun Wii RHAP01 = Wii Play RHAW01 = Wii Play RHCE52 = The History Channel: Battle for the Pacific @@ -957,7 +952,7 @@ RHIJJ9 = Hajime no Ippo Revolution RHIP41 = Victorious Boxers Challenge RHJJ13 = Ginsei Table Games Wii RHKE18 = Help Wanted: 50 Wacky Jobs -RHKJ18 = Hataraku Hit +RHKJ18 = Hataraku Hito RHKP18 = Job Island: Hard Working People RHLE4Z = World Championship Poker Featuring Howard Lederer: All-In RHLPGT = World Championship Poker Featuring Howard Lederer: All-In @@ -968,12 +963,12 @@ RHNP70 = My Horse & Me RHOE8P = The House of the Dead: Overkill RHOJ8P = The House of the Dead: Overkill RHOP8P = The House of the Dead: Overkill -RHPJ8N = Akko De Pon! Ikasama Hourouki +RHPJ8N = Akko de Pon! Ikasama Hourou-ki RHQE4Q = Hannah Montana: Spotlight World Tour RHQP4Q = Hannah Montana: Spotlight World Tour RHQX4Q = Hannah Montana: Spotlight World Tour RHQY4Q = Hannah Montana: Spotlight World Tour -RHRJ99 = Katekyo Hitman Reborn! Dream Hyper Battle! Wii +RHRJ99 = Katekyoo Hitman Reborn! Dream Hyper Battle! Wii RHSE36 = Heatseeker RHSP36 = Heatseeker RHSX36 = Heatseeker @@ -988,7 +983,7 @@ RHWE52 = Hot Wheels: Beat That! RHWP52 = Hot Wheels: Beat That! RHXE78 = Battle of the Bands RHXP78 = Battle of the Bands -RHYJAF = Haneru no Tobira Wii +RHYJAF = Haneru no Tobira Wii: Giri Girissu RHZE41 = Petz Horsez 2 RHZP41 = Pippa Funnell: Ranch Rescue RI2E4Q = High School Musical: Sing It! @@ -999,7 +994,7 @@ RI6ENR = Summer Sports 2: Island Sports Party RI6P41 = Summer Sports Party RI7E4Z = Monster Mayhem: Build and Battle RI8E41 = Brothers In Arms: Road to Hill 30 -RI8P41 = Brothers In Arms: Road To Hill 30 +RI8P41 = Brothers in Arms: Road to Hill 30 RI9EGT = Diva Girls: Divas on Ice RI9PGT = Diva Girls: Princess on Ice RIAE52 = Ice Age: Dawn of the Dinosaurs @@ -1031,15 +1026,14 @@ RINP08 = Dead Rising: Chop Till You Drop RIOPSU = Horrible Histories: Ruthless Romans RIPEAF = One Piece: Unlimited Adventure RIPJAF = One Piece: Unlimited Adventure -RIPPAF = One Piece Unlimited Cruise 1: The Treasure Beneath the Waves RIQPUJ = Dancing on Ice RIRE8P = Iron Man RIRP8P = Iron Man RITFMR = Intervilles, le jeu officiel -RIUJAF = One Piece Unlimited Cruise 2: Awakening of a Hero -RIUPAF = One Piece Unlimited Cruise 2: Awakening of a Hero +RIUJAF = One Piece: Unlimited Cruise: Episode 2: Mezameru Yuusha +RIUPAF = One Piece: Unlimited Cruise 2: Awakening of a Hero RIVEXJ = Ivy The Kiwi? -RIVJAF = Ivy the Kiwi? +RIVJAF = Ivy the Kiwi RIVP99 = Ivy The Kiwi? RIWENR = Burger Island RIXE20 = Dodge Racing: Charger vs. Challenger @@ -1048,7 +1042,7 @@ RIYE52 = Space Camp RIYP52 = Space Camp RIZENR = Indianapolis 500 Legends RJ2E52 = 007: Quantum of Solace -RJ2JGD = 007: Quantum of Solace +RJ2JGD = 007: Nagusame no Houshuu RJ2P52 = 007: Quantum of Solace RJ3E20 = Jeep Thrills RJ3P7J = Jeep Thrills @@ -1059,7 +1053,7 @@ RJ6P69 = MySims Sky Heroes RJ7FWP = Télé 7 Jeux: Mots Fléchés RJ8E64 = Indiana Jones and the Staff of Kings RJ8P64 = Indiana Jones and the Staff of Kings -RJ9E5Z = thinkSMART Family +RJ9E5Z = Think Logic Trainer RJ9FMR = Think Logic Trainer RJ9HMN = Think Logic Trainer RJ9PFR = Think Logic Trainer @@ -1100,40 +1094,39 @@ RJSXUG = Kawasaki Jet Ski RJTJ01 = Minna no Joushiki Ryoku TV RJVEGN = Hysteria Hospital: Emergency Ward RJVPGN = Hysteria Hospital: Emergency Ward -RJWJEL = Jawa Mammoth and a Secret Stone +RJWJEL = Jawa: Mammoth to Himitsu no Ishi RJXE5G = Go Play Lumberjacks RJXXFR = Go Play Lumberjacks RJYE5Z = Doctor Fizzwizzle's Animal Rescue RJZP7U = SNK Arcade Classics Volume 1 RK2EEB = Trauma Center: New Blood -RK2JEB = Trauma Center: New Blood +RK2JEB = Caduceus: New Blood RK2P01 = Trauma Center: New Blood RK3J01 = And-Kensaku -RK4JAF = Kekkaishi +RK4JAF = Kekkaishi: Kokubourou no Kage RK5E01 = Kirby's Epic Yarn RK5J01 = Keito no Kirby -RK5K01 = Kirby's Epic Yarn +RK5K01 = Teolsil Kirby Iyagi RK5P01 = Kirby's Epic Yarn RK6E18 = Marble Saga: Kororinpa -RK6J18 = Kororinpa 2 +RK6J18 = Kororinpa 2: Anthony to Kin'iro Himawari no Tane RK6P18 = Marbles! Balance Challenge RK7J0A = Ougon no Kizuna RK8E54 = Major League Baseball 2K8 RK9EA4 = Karaoke Revolution RK9PA4 = Karaoke Revolution RKAE6K = Ultimate Shooting Collection -RKAJMS = Milestone Shooting Collection -RKAK8M = Milestone Shooting Collection Karous Wii -RKAP6K = Ultimate Shooting Collection +RKAJMS = Milestone Shooting Collection: Karous Wii +RKAK8M = Milestone Shooting Collection - Karous Wii RKBE41 = Cranium Kabookii RKBP41 = Cranium Kabookii RKDEEB = Trauma Center: Second Opinion -RKDJEB = Trauma Center: Second Opinion +RKDJEB = Caduceus Z: Futatsu no Chou Shittou RKDP01 = Trauma Center: Second Opinion RKEENR = Cate West: The Vanishing Files RKEPGN = Cate West: The Vanishing Files RKFEH4 = The King of Fighters Collection: The Orochi Saga -RKFKZA = King of Fighters Collection: The Orochi Saga +RKFKZA = The King of Fighters Collection - The Orochi Saga RKFP7U = King of Fighters Collection: The Orochi Saga RKGEGY = Bratz Kidz: Slumber Party RKGPGY = Bratz: Kidz Party @@ -1142,17 +1135,17 @@ RKHP52 = Kung Fu Panda: Legendary Warriors RKIENR = Kidz Sports: Ice Hockey RKIPUG = Kidz Sports: Ice Hockey RKIXUG = Kidz Sports: Ice Hockey -RKJJ0Q = 250 Mannin no Kanken Wii de Tokoton Kanji Nou +RKJJ0Q = Zaidan Houjin Nihon Kanji Nouryoku Kentei Kyoukai Koushiki Soft: 250 Mannin no Kanken: Wii de Tokoton Kanji Nou RKKE6K = Heavenly Guardian RKLEG9 = Coraline RKLPG9 = Coraline RKME5D = Mortal Kombat: Armageddon RKMP5D = Mortal Kombat: Armageddon -RKNJ2N = Kanken Wii: Kanji Ou Kettei Sen -RKOJBL = Relaxuma: Minna de Goyururi Seikatsu +RKNJ2N = Zaidan Houjin Nihon Kanji Nouryoku Kentei Kyoukai Kounin: Kanken Wii: Kanji-ou Ketteisen +RKOJBL = Rilakkuma: Minna de Goyururi Seikatsu RKPE52 = Kung Fu Panda -RKPJ52 = Kung Fu Panda -RKPK52 = Kung Fu Panda +RKPJ52 = DreamWorks Kung Fu Panda +RKPK52 = DreamWorks Kung Fu Panda RKPP52 = Kung Fu Panda RKPV52 = Kung Fu Panda RKPX52 = Kung Fu Panda @@ -1165,7 +1158,7 @@ RKTENR = Kidz Sports: International Soccer RKTXUG = Kidz Sports: International Football RKVE54 = The BIGS 2 RKVP54 = The Bigs 2: Baseball -RKWJ18 = Jigsaw Puzzle Kyo-no Wan Ko +RKWJ18 = Jigsaw Puzzle: Kyou no Wanko RKXE69 = Rock Band RKXP69 = Rock Band RKYE20 = Army Men: Soldiers of Misfortune @@ -1195,7 +1188,6 @@ RLCP7J = Love is... in bloom RLDEGY = Legend of the Dragon RLDPFK = Legend Of The Dragon RLEEFS = Ten Pin Alley 2 -RLEPFS = Ten Pin Alley 2 RLFE64 = Star Wars The Clone Wars: Lightsaber Duels RLFP64 = Star Wars The Clone Wars: Lightsaber Duels RLGE64 = LEGO Star Wars: The Complete Saga @@ -1220,12 +1212,11 @@ RLPP69 = Littlest Pet Shop RLQE52 = Big League Sports RLQP52 = World Championship Sports RLRE4F = Tomb Raider: Anniversary -RLRJEL = Tomb Raider: Anniversary +RLRJEL = Lara Croft Tomb Raider: Anniversary RLRP4F = Tomb Raider: Anniversary RLSE8P = Alien Syndrome RLSP8P = Alien Syndrome RLTENR = London Taxi: Rush Hour -RLTPNR = London Taxi: Rush Hour RLTXUG = London Taxi: Rush Hour RLUE4Q = Disney's Bolt RLUP4Q = Bolt @@ -1235,7 +1226,7 @@ RLUY4Q = Bolt RLVE78 = Avatar: The Last Airbender RLVP78 = Avatar: The Legend of Aang RLWE78 = Ratatouille -RLWJ78 = Ratatouille +RLWJ78 = Disney-Pixar Remy no Oishii Restaurant RLWP78 = Ratatouille RLWW78 = Ratatouille RLWX78 = Ratatouille @@ -1271,29 +1262,32 @@ RM8P01 = Mario Party 8 RM9EGM = Mushroom Men: The Spore Wars RM9PGM = Mushroom Men: The Spore Wars RMAE01 = Mario Power Tennis -RMAJ01 = Mario Power Tennis +RMAJ01 = Mario Tennis GC RMAP01 = Mario Power Tennis RMBE01 = Mario Super Sluggers RMBJ01 = Super Mario Stadium: Family Baseball RMCE01 = Mario Kart Wii RMCJ01 = Mario Kart Wii +RMCJ50 = Wiimms MKW-Textures 2022-12.jap RMCK01 = Mario Kart Wii +RMCK50 = Wiimms MKW-Textures 2022-12.kor +RMCKBR = Mario Kart Brown RMCP01 = Mario Kart Wii RMDE69 = Madden NFL 07 RMDP69 = Madden NFL 07 -RMEJDA = Major Dream +RMEJDA = Major Dream: Major Wii: Nagero! Gyroball!! RMFE68 = AMF Bowling Pinbusters! RMFP68 = AMF Bowling Pinbusters! RMGE01 = Super Mario Galaxy RMGJ01 = Super Mario Galaxy -RMGK01 = Super Mario Galaxy +RMGK01 = Super Mario Wii - Galaxy Adventure RMGP01 = Super Mario Galaxy RMHE08 = Monster Hunter Tri -RMHJ08 = Monster Hunter Tri +RMHJ08 = Monster Hunter tri- RMHP08 = Monster Hunter Tri RMIE20 = Margot's Word Brain RMIP7J = Margot's Word Brain -RMJJC8 = Mah-jong Rally Wii +RMJJC8 = Mahjong Taikai Wii RMKE01 = Mario Sports Mix RMKJ01 = Mario Sports Mix RMKP01 = Mario Sports Mix @@ -1310,16 +1304,14 @@ RMNPFR = My Pet Hotel RMOE52 = Monster Jam RMOP52 = Monster Jam RMPE54 = MLB Power Pros -RMPP54 = MLB Power Pros RMQENR = Myth Makers: Orbs of Doom RMQPUG = Myth Makers: Orbs of Doom -RMQXUG = Myth Makers: Orbs of Doom RMRE5Z = Cocoto Magic Circus RMRPNK = Cocoto Magic Circus RMRXNK = Cocoto Magic Circus RMSE52 = Marvel: Ultimate Alliance 2 RMSP52 = Marvel: Ultimate Alliance 2 -RMTJ18 = Momotarô Dentetsu 16 +RMTJ18 = Momotarou Dentetsu 16: Hokkaidou Daiidou no Maki! RMUE52 = Marvel: Ultimate Alliance RMUJ2K = Marvel: Ultimate Alliance RMUP52 = Marvel: Ultimate Alliance @@ -1327,7 +1319,6 @@ RMVE69 = Medal of Honor: Vanguard RMVP69 = Medal of Honor: Vanguard RMVX69 = Medal of Honor: Vanguard RMWE20 = M&M's Kart Racing -RMWP20 = M&M's Kart Racing RMXE78 = MX vs. ATV: Untamed RMXF78 = MX vs. ATV: Untamed RMXP78 = MX vs. ATV: Untamed @@ -1338,12 +1329,11 @@ RMZE5Z = Myth Makers: Trixie in Toyland RMZPUG = Myth Makers: Trixie in Toyland RMZXUG = Myth Makers: Trixie in Toyland RN2EAF = Namco Museum Remix -RN2K70 = Namco Museum Remix RN2P70 = Namco Museum Remix RN3E78 = Nicktoons: Attack of the Toybots -RN3J78 = Nicktoons: Attack of the Toybots +RN3J78 = SpongeBob to Nakamatachi: Toybot no Kougeki RN3P78 = Nicktoons: Attack of the Toybots -RN3X78 = Nicktoons: Attack Of The Toybots +RN3X78 = Nicktoons: Attack of the Toybots RN4E41 = Dawn of Discovery RN4P41 = ANNO: Create a New World RN5E78 = The Naked Brothers Band: The Video Game @@ -1361,14 +1351,13 @@ RNBE69 = NBA Live 08 RNBP69 = NBA Live 08 RNBX69 = NBA Live 08 RNCEH4 = SNK Arcade Classics Volume 1 -RNCPH4 = SNK Arcade Classics Volume 1 RNDJAF = Nodame Cantabile Dream Orchestra RNEEDA = Naruto Shippuden: Clash of Ninja Revolution 3 -RNEJDA = Naruto Shippuuden: Gekitou Ninja Taisen EX 3 +RNEJDA = Naruto Shippuuden: Gekitou Ninja Taisen! EX3 RNEPDA = Naruto Shippuden: Clash of Ninja Revolution 3 RNFE69 = Madden NFL 08 RNFP69 = Madden NFL 08 -RNGJ99 = Negima!? Neo-Pactio Fight!! +RNGJ99 = Negima! Neo-Pactio Fight!! RNHE41 = No More Heroes RNHJ99 = No More Heroes RNHK8M = No More Heroes @@ -1384,7 +1373,7 @@ RNME5Z = Ninjabread Man RNMPUG = Ninjabread Man RNMXUG = Ninjabread Man RNNE4Q = The Chronicles of Narnia: Prince Caspian -RNNJ4Q = The Chronicles of Narnia: Prince Caspian +RNNJ4Q = Narnia Koku Monogatari: Dai-2 Shou: Caspian Ouji no Tsunobue RNNP4Q = The Chronicles of Narnia: Prince Caspian RNNX4Q = The Chronicles of Narnia: Prince Caspian RNNY4Q = The Chronicles of Narnia: Prince Caspian @@ -1398,25 +1387,24 @@ RNPP69 = Need for Speed: ProStreet RNPX69 = Need for Speed: ProStreet RNPY69 = Need for Speed: ProStreet RNRE41 = Nitro Bike -RNRJ41 = Nitro Bike +RNRJ41 = Nitrobike RNRP41 = Nitro Bike RNSD69 = Need for Speed: Carbon RNSE69 = Need for Speed Carbon RNSF69 = Need for Speed: Carbon RNSJ13 = Need for Speed: Carbon -RNSP69 = Need for Speed Carbon -RNSX69 = Need for Speed: Carbon +RNSP69 = Need for Speed: Carbon RNUE8P = Nancy Drew: The White Wolf of Icicle Creek RNVE5Z = Anubis II RNVPUG = Anubis II RNVXUG = Anubis II -RNWJAF = Namco Carnival +RNWJAF = Minna de Asobou! Namco Carnival RNWKAF = Namco Museum Remix RNXEDA = Naruto: Clash of Ninja Revolution -RNXJDA = Naruto Shippuuden: Gekitou Ninja Taisen EX +RNXJDA = Naruto Shippuuden: Gekitou Ninja Taisen! EX RNXPDA = Naruto: Clash of Ninja Revolution RNYEDA = Naruto: Clash of Ninja Revolution 2 -RNYJDA = Naruto Shippuuden: Gekitou Ninja Taisen EX 2 +RNYJDA = Naruto Shippuuden: Gekitou Ninja Taisen! EX2 RNYPDA = Naruto: Clash of Ninja Revolution 2 RNZE69 = Ninja Reflex RNZJ13 = Ninja Reflex @@ -1425,9 +1413,9 @@ RNZP69 = Ninja Reflex RO2E7N = Ford Racing Off Road RO2P7N = Off Road RO3EXJ = Little King's Story -RO3J99 = Little King's Story +RO3J99 = Ousama Monogatari RO3P99 = Little King's Story -RO4JDA = Toshinden +RO4JDA = Toushinden RO5E52 = Hot Wheels: Battle Force 5 RO5P52 = Hot Wheels: Battle Force 5 RO7E7D = Legend of Spyro: The Eternal Night @@ -1444,8 +1432,8 @@ ROBPPL = Obscure 2 ROCE5Z = Cocoto Kart Racer ROCPNK = Cocoto Kart Racer RODE01 = WarioWare: Smooth Moves -RODJ01 = WarioWare: Smooth Moves -RODK01 = WarioWare: Smooth Moves +RODJ01 = Odoru Made in Wario +RODK01 = Chumchwora Made in Wario RODP01 = WarioWare: Smooth Moves ROEEJZ = Hotel for Dogs ROEPGT = Hotel For Dogs @@ -1459,12 +1447,12 @@ ROJE52 = Rapala: We Fish ROJP52 = Rapala: We Fish ROKJ18 = Karaoke Joysound Wii ROLE8P = Mario & Sonic at the Olympic Winter Games -ROLJ01 = Mario & Sonic at the Olympic Winter Games -ROLK01 = Mario & Sonic at the Olympic Winter Games +ROLJ01 = Mario & Sonic at Vancouver Olympic +ROLK01 = Mariowa Sonic Vancouver Donggye-olympic ROLP8P = Mario & Sonic at the Olympic Winter Games ROMJ08 = Monster Hunter G RONEG9 = Onechanbara: Bikini Zombie Slayers -RONJG9 = Onechanbara Revolution +RONJG9 = Oneechanbara Revolution RONPG9 = Onechanbara: Bikini Zombie Slayers ROPE41 = Open Season ROPP41 = Open Season @@ -1472,8 +1460,8 @@ ROQJEP = Baroque for Wii ROSJ01 = Takt of Magic ROTE20 = Twin Strike: Operation Thunder ROTP7J = Twin Strike: Operation Thunder -ROUJAF = One Piece Unlimited Cruise 1: The Treasure Beneath the Waves -ROUPAF = One Piece Unlimited Cruise 1: The Treasure Beneath the Waves +ROUJAF = One Piece: Unlimited Cruise: Episode 1: Nami ni Yureru Hihou +ROUPAF = One Piece: Unlimited Cruise 1: The Treasure Beneath the Waves ROVE6U = Playmobil: Circus ROVPHM = Playmobil: Circus ROWE08 = Ōkami @@ -1491,7 +1479,7 @@ RP3JAF = Pro Golfer Saru RP4E69 = MySims Party RP4J13 = Boku to Sim no Machi Party RP4P69 = MySims Party -RP5JA4 = Jikkyou Powerful Pro Baseball 15 +RP5JA4 = Jikkyou Powerful Pro Yakyuu 15 RP6E41 = Petz Crazy Monkeyz RP6P41 = Petz Monkey Madness RP7E52 = Pirates: Hunt for Blackbeard's Booty @@ -1522,7 +1510,7 @@ RPKE52 = World Series of Poker: Tournament of Champions 2007 Edition RPKP52 = World Series of Poker: Tournament of Champions 2007 Edition RPLE52 = Rapala Tournament Fishing RPLP52 = Rapala Tournament Fishing -RPMJA4 = Jikkyou Powerful Pro Major League 2 +RPMJA4 = Jikkyou Powerful Major League 2 Wii RPNE78 = Paws & Claws: Pet Resort RPOEC8 = Opoona RPOJC8 = Opoona @@ -1532,30 +1520,29 @@ RPPP41 = Prince of Persia: Rival Swords RPQES5 = Pool Party RPQPS5 = Pool Party RPSE4Q = Disney Princess: Enchanted Journey -RPSJ4Q = Disney Princess Wii +RPSJ4Q = Disney Princess: Mahou no Sekai he RPSP4Q = Disney Princess: Enchanted Journey RPTD52 = Puppy Luv RPTE52 = Puppy Luv: Your New Best Friend RPTP52 = Puppy Luv: Your New Best Friend -RPUJ8P = Puyo Puyo! 15th Anniversary +RPUJ8P = Puyo Puyo! Puyopuyo 15th Anniversary RPVE4Z = Purr Pals RPVPKM = Purr Pals RPWX41 = Prince of Persia: The Forgotten Sands RPWZ41 = Prince of Persia: The Forgotten Sands RPXE69 = EA Playground -RPXJ13 = EA Playground +RPXJ13 = Playground: Kouen de Asobou! RPXP69 = EA Playground RPYE9B = Super Swing Golf -RPYJ9B = Super Swing Golf +RPYJ9B = Swing Golf Pangya RPYP9B = Pangya! Golf With Style -RPZJA4 = Jikkyou Powerful Pro Baseball Wii Ketteiban +RPZJA4 = Jikkyou Powerful Pro Yakyuu Wii: Ketteiban RQ2JK6 = Crazy Climber Wii RQ3PGN = PDC World Championship Darts 2009 RQ4E78 = SpongeBob SquarePants: Creature from the Krusty Krab -RQ4J78 = SpongeBob SquarePants: Creature from the Krusty Krab +RQ4J78 = Nickelodeon SpongeBob SquarePants RQ4P78 = SpongeBob SquarePants: Creature from the Krusty Krab RQ5E5G = Mad Dog McCree Gunslinger Pack -RQ5P5G = Mad Dog McCree Gunslinger Pack RQ5X5G = Mad Dog McCree Gunslinger Pack RQ6EJJ = Cursed Mountain RQ6PKM = Cursed Mountain @@ -1578,9 +1565,9 @@ RQEP6V = Agatha Christie: Evil Under the Sun RQFE6U = Safecracker: The Ultimate Puzzle Adventure RQFP6V = Safecracker RQGE69 = MySims Racing -RQGJ13 = MySims Racing +RQGJ13 = Boku to Sim no Machi Racing RQGP69 = MySims Racing -RQIJ01 = Minna ga Shuyaku no NHK Kouhaku Quiz Kassen +RQIJ01 = NHK Kouhaku Quiz Gassen RQJE7D = Crash of the Titans RQJP7D = Crash of the Titans RQJX7D = Crash of the Titans @@ -1593,14 +1580,14 @@ RQMPVN = Ocean Commander RQNEWR = Scooby-Doo! First Frights RQNPWR = Scooby-Doo! First Frights RQOE69 = Spore Hero -RQOJ13 = Spore Hero +RQOJ13 = Spore: Kimi ga Tsukuru Hero RQOP69 = Spore Hero RQPE52 = Cabela's Trophy Bucks RQPP52 = Cabela's Trophy Bucks RQPZ52 = Cabela's Monster Buck Hunter RQQE70 = Backyard Football '09 RQREXJ = The Sky Crawlers: Innocent Aces -RQRJAF = The Sky Crawlers: Innocent Aces +RQRJAF = Sky Crawlers: Innocent Aces RQRPAF = The Sky Crawlers: Innocent Aces RQSE4Z = Pinball Hall of Fame: The Gottlieb Collection RQSP6M = Gottlieb Pinball Classics @@ -1632,7 +1619,7 @@ RRAE5Z = Rock 'N' Roll Adventures RRAPUG = Rock 'N' Roll Adventures RRAXUG = Rock 'N' Roll Adventures RRBE41 = Rayman Raving Rabbids -RRBJ41 = Rayman Raving Rabbids +RRBJ41 = Rabbids Party RRBP41 = Rayman Raving Rabbids RRCE52 = Barbie Horse Adventures: Riding Camp RRCP52 = Barbie Horse Adventures: Riding Camp @@ -1646,7 +1633,7 @@ RRGE52 = Madagascar: Escape 2 Africa RRGP52 = Madagascar 2: Escape 2 Africa RRGX52 = Madagascar 2 RRHPUJ = Mary King's Riding School 2 -RRHXUJ = Mary King's Riding School 2 +RRHXUJ = Ride RRIPTV = Paint Works RRJFMR = Ready Steady Cook: The Game RRJIMR = Ready Steady Cook: The Game @@ -1669,7 +1656,7 @@ RRQX52 = Shrek's Carnival Craze Party Games RRRE5Z = Real Heroes: Firefighter RRRPRM = Real Heroes: Firefighter RRSE4Q = Meet the Robinsons -RRSJ4Q = Meet The Robinsons +RRSJ4Q = Walt Disney Pictures Presents Lewis to Mirai Dorobou: Wilbur no Kiken na Jikan Ryokou RRSP4Q = Meet The Robinsons RRSX4Q = Meet The Robinsons RRTE52 = Block Party 20 Games @@ -1700,7 +1687,7 @@ RS4PXS = Castle of Shikigami III RS5EC8 = Samurai Warriors: Katana RS5JC8 = Sengoku Musou KATANA RS5PC8 = Samurai Warriors: Katana -RS7J01 = Eyeshield 21 Field Saikyō no Senshi Tachi +RS7J01 = Eyeshield 21: Field Saikyou no Senshi-tachi RS8J8N = Shanghai RS9E8P = Sonic Riders: Zero Gravity RS9J8P = Sonic Riders: Shooting Star Story @@ -1709,7 +1696,7 @@ RSAE78 = SpongeBob's Atlantis SquarePantis RSAP78 = SpongeBob's Atlantis SquarePantis RSBE01 = Super Smash Bros. Brawl RSBJ01 = Dairantou Smash Brothers X -RSBK01 = Dairantou Smash Brothers X +RSBK01 = Daenantu Smash Brothers X RSBP01 = Super Smash Bros. Brawl RSCD7D = Scarface: The World Is Yours RSCE7D = Scarface: The World Is Yours @@ -1719,10 +1706,11 @@ RSDJAF = SD Gundam: Scad Hammers RSEJGD = Soul Eater Monotone Princess RSFE7U = Muramasa: The Demon Blade RSFJ99 = Oboro Muramasa +RSFK7U = Muramasa: The Demon Blade RSFP99 = Muramasa: The Demon Blade RSHE69 = MySims Kingdom RSHJ13 = Boku to Sim no Machi Kingdom -RSHK69 = MySims Kingdom +RSHK69 = MySims Simdeurui Wangguk RSHP69 = MySims Kingdom RSIE69 = MySims RSIJ13 = Boku to Sim no Machi @@ -1734,10 +1722,10 @@ RSKP52 = Shrek The Third RSKX52 = Shrek The Third RSLEAF = Soulcalibur: Legends RSLJAF = Soulcalibur: Legends -RSLKAF = Soulcalibur: Legends +RSLKAF = Soulcalibur Legends RSLPAF = Soulcalibur: Legends RSME8P = Super Monkey Ball: Banana Blitz -RSMJ8P = Super Monkey Ball: Banana Blitz +RSMJ8P = Super Monkey Ball: Uki Uki Party Daishuugou RSMP8P = Super Monkey Ball: Banana Blitz RSND69 = The Simpsons Game RSNE69 = The Simpsons Game @@ -1755,11 +1743,11 @@ RSQEAF = We Ski RSQJAF = Family Ski RSQPAF = Family Ski RSRE8P = Sonic and the Secret Rings -RSRJ8P = Sonic and the Secret Rings +RSRJ8P = Sonic to Himitsu no Ring RSRP8P = Sonic and the Secret Rings RSSEH4 = Samurai Shodown Anthology RSSJH4 = Samurai Spirits: Rokuban Shoubu -RSSK52 = Samurai Spirits: Rokuban Shoubu +RSSK52 = Samurai Spirits - 6beonui Seungbu RSSP7U = Samurai Shodown Anthology RSTE64 = Star Wars: The Force Unleashed RSTJ52 = Star Wars: The Force Unleashed @@ -1777,7 +1765,7 @@ RSXK69 = SSX Blur RSXP69 = SSX Blur RSYE20 = Showtime Championship Boxing RSYP7J = Showtime Championship Boxing -RSZJES = Yukinko Daisenpuu +RSZJES = Yukinko Daisenpuu: Sayuki to Koyuki no Hie Hie Daisoudou RSZPGT = Legend of Sayuki RT2E20 = Arctic Tale RT2P7J = Arctic Tale @@ -1795,8 +1783,8 @@ RT7E69 = Tiger Woods PGA Tour 07 RT7F69 = Tiger Woods PGA Tour 07 RT7P69 = Tiger Woods PGA Tour 07 RT8E69 = Tiger Woods PGA Tour 08 -RT8J13 = Tiger Woods PGA Tour Golf 08 -RT8K69 = Tiger Woods PGA Tour Golf 08 +RT8J13 = Tiger Woods PGA Tour 08 +RT8K69 = Tiger Woods PGA Tour 08 RT8P69 = Tiger Woods PGA Tour 08 RT9E52 = Tony Hawk's Proving Ground RT9P52 = Tony Hawk's Proving Ground @@ -1807,8 +1795,8 @@ RTBP52 = Rapala Fishing Frenzy RTCE41 = Tom Clancy's Splinter Cell: Double Agent RTCP41 = Tom Clancy's Splinter Cell: Double Agent RTDE6K = The Monkey King: The Legend Begins -RTDJES = Shin Chuuka Taisen -RTDK8M = Shin Chuuka Taisen +RTDJES = Shin Chuuka Taisen: Michael to Meimei no Bouken +RTDK8M = Sin Junghwa-daeseon - Michaelgwa Meimeiui Moheom RTEE78 = Paws & Claws: Pet Vet RTEHMR = Real Stories: Veterinaire RTEPFR = My Vet Practice @@ -1818,19 +1806,19 @@ RTFK52 = Transformers: The Game RTFP52 = Transformers: The Game RTFX52 = Transformers: The Game RTFY52 = Transformers: The Game -RTGJ18 = Wi-Fi Taiō Gensen Table Games Wii +RTGJ18 = Gensen Table Game Wii RTHE52 = Tony Hawk's Downhill Jam RTHP52 = Tony Hawk's Downhill Jam RTIE8P = Wacky World of Sports -RTIJ8P = Wacky World of Sports +RTIJ8P = Chin Sports RTIP8P = Wacky World of Sports RTJE68 = Star Trek: Conquest RTJP68 = Star Trek: Conquest RTKE5Z = Octomania RTKJDQ = Sharuui Takoron -RTKK8M = Sharuui Takoron +RTKK8M = Modu Hamkke Takoron RTLE18 = Fishing Master: World Tour -RTLJ18 = Mezase Tsuri Master Sekai ni Challenge Hen +RTLJ18 = Mezase!! Tsuri Master: Sekai ni Challenge! Hen RTLP18 = Fishing Master: World Tour RTME41 = TMNT RTMP41 = TMNT: Teenage Mutant Ninja Turtles @@ -1843,11 +1831,11 @@ RTQENR = Monster Trux Offroad RTQPUG = Monster Trux Offroad RTQXUG = Monster Trux Offroad RTRE18 = Fishing Master -RTRJ18 = Mezase Tsuri Master +RTRJ18 = Mezase!! Tsuri Master RTRP18 = Fishing Master RTSEVN = Totally Spies! Totally Party RTSP41 = Totally Spies! Totally Party -RTTJAF = Tamagotchi no Furifuri Kagekidan +RTTJAF = Tamagotchi no Furi Furi Kagekidan! RTUEJJ = Secret Files Tunguska RTUFKM = Secret Files: Tunguska RTUPKM = Secret Files: Tunguska @@ -1857,9 +1845,9 @@ RTWE5D = TNA iMPACT! RTWP5D = TNA iMPACT! RTYP01 = Wii Chess RTZE08 = Zack & Wiki: Quest for Barbaros' Treasure -RTZJ08 = Takarajima Z Barbaros' Treasure -RTZK08 = Zack & Wiki: Quest For Barbaros' Treasure -RTZP08 = Zack & Wiki: Quest For Barbaros' Treasure +RTZJ08 = Takarajima Z: Barbaros no Hihou +RTZK08 = Zack & Wiki - Barbarosui Bomul +RTZP08 = Zack & Wiki: Quest for Barbaros' Treasure RU2E5Z = Winter Sports 2: The Next Challenge RU2P5Z = Winter Sports 2 The Next Challenge RU3E5Z = Summer Athletics: The Ultimate Challenge @@ -1909,26 +1897,26 @@ RULP4Q = Ultimate Band RULR4Q = Ultimate Band RUME5Z = Ski and Shoot RUMPFR = Summer Athletics -RUNJ0Q = New Unou Kids Wii EX +RUNJ0Q = New Unou Kids Wii RUOEPL = Aliens in the Attic RUOPPL = Aliens in the Attic RUPJC8 = Winning Post 7 Maximum 2008 RUQD78 = Up RUQE78 = Up RUQI78 = Up -RUQJJE = Carl Jii San no Sora Tobu Le +RUQJJE = Disney-Pixar Carl Jiisan no Soratobu Ie RUQP78 = Up RUQS78 = Up RUQX78 = Up RUREPL = Pool Hall Pro RURPPL = Pool Hall Pro RUSE78 = SpongeBob SquarePants featuring Nicktoons: Globs of Doom -RUSK78 = SpongeBob SquarePants Featuring Nicktoons: Globs of Doom +RUSK78 = Nickelodeon SpongeBob SquarePants featuring Nicktoons - Globs of Doom RUSP78 = SpongeBob SquarePants featuring Nicktoons: Globs of Doom RUSX78 = SpongeBob SquarePants Featuring Nicktoons: Globs of Doom RUSY78 = SpongeBob SquarePants featuring Nicktoons: Globs of Doom RUUE01 = Animal Crossing: City Folk -RUUJ01 = Machi He Ikouyo: Doubutsu no Mori +RUUJ01 = Machi e Ikou yo: Doubutsu no Mori RUUK01 = Animal Crossing: City Folk RUUP01 = Animal Crossing: Let's Go to the City RUWJC8 = Winning Post World @@ -1962,7 +1950,7 @@ RVIE4F = Bionicle Heroes RVIP4F = Bionicle Heroes RVJPFR = So Blonde: Back to the Island RVKEXJ = Valhalla Knights: Eldar Saga -RVKJ99 = Valhalla Knights: Elder Saga +RVKJ99 = Valhalla Knights: Eldar Saga RVKKZA = Valhalla Knights: Eldar Saga RVKP99 = Eldar Saga RVLPA4 = Rock Revolution @@ -1997,7 +1985,7 @@ RVYY52 = Call of Duty: World at War RVZE52 = Monsters vs. Aliens RVZP52 = Monsters vs. Aliens RW3E4Q = Pirates of the Caribbean: At World's End -RW3J4Q = Pirates of the Caribbean: At World's End +RW3J4Q = Disney Pirates of the Caribbean: At World's End RW3P4Q = Pirates Of The Caribbean: At World's End RW4D41 = My Word Coach: Develop your vocabulary RW5F41 = Who Wants To Be A Millionaire: 2nd Edition @@ -2009,8 +1997,8 @@ RW9P78 = WWE SmackDown vs. Raw 2009 RW9X78 = WWE SmackDown vs. Raw 2009 RWAD78 = WALL•E RWAE78 = WALL•E -RWAJ78 = WALL•E -RWAK78 = WALL•E +RWAJ78 = Disney-Pixar WALL-E +RWAK78 = Disney-Pixar WALL-E RWAP78 = WALL•E RWAR78 = WALL•E RWAU78 = WALL•E @@ -2051,8 +2039,8 @@ RWQPSP = WSC Real 08: World Snooker Championship RWRE4F = Wacky Races: Crash & Dash RWRP4F = Wacky Races: Crash & Dash RWSE8P = Mario & Sonic at the Olympic Games -RWSJ01 = Mario & Sonic at the Olympic Games -RWSK01 = Mario & Sonic at the Olympic Games +RWSJ01 = Mario & Sonic at Bejing Olympic +RWSK01 = Mariowa Sonic Beijing Olympic RWSP8P = Mario & Sonic at the Olympic Games RWTEG9 = Ben 10: Alien Force RWTPG9 = Ben 10: Alien Force @@ -2072,7 +2060,7 @@ RWZX5G = Wonder World Amusement Park RX2E70 = My Horse & Me: Riding for Gold RX2P70 = My Horse & Me 2 RX3E01 = ExciteBots: Trick Racing -RX3J01 = ExciteBots: Trick Racing +RX3J01 = Excite Mou Machine RX4E4Z = Casper's Scare School: Spooky Sports Day RX4PMT = Casper's Scare School: Spooky Sports Day RX5E52 = Tony Hawk: Ride @@ -2092,14 +2080,14 @@ RXAP78 = WWE SmackDown vs. Raw 2010 RXBE70 = Backyard Baseball '10 RXCE4Z = Dave Mirra BMX Challenge RXCPGT = Dave Mirra BMX Challenge -RXDD4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown +RXDD4Q = Th!nk Fast: The Ultimate Trivia Showdown RXDE4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown -RXDJ4Q = Disney Th!nk Haya Oshi Quiz +RXDJ4Q = Disney Think: Haya Oshi Quiz RXDP4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown RXDR4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown RXDX4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown RXDY4Q = Disney Th!nk Fast: The Ultimate Trivia Showdown -RXEJDA = Major Wii Perfect Closer +RXEJDA = Major Dream: Major Wii: Perfect Closer RXFEVN = Offshore Tycoon RXGE6K = Geon Cube RXGP6K = Geon Cube @@ -2117,7 +2105,7 @@ RXNEXS = Hooked Again: Real Motion Fishing RXNJJF = Bass Fishing Wii World Tournament RXNPGT = Big Catch Bass Fishing 2 RXPEXS = Hooked!: Real Motion Fishing -RXPJJF = Bass Fishing Wii +RXPJJF = Bass Fishing Wii: Rokumaru Densetsu RXPPGT = Big Catch Bass Fishing RXQEWR = Where the Wild Things Are RXQPWR = Where the Wild Things Are @@ -2131,19 +2119,19 @@ RXUX41 = Surf's Up RXVXWP = Télé 7 Jeux: Mots Croisés RXWE20 = M&M's Beach Party RXXE4Q = Spectrobes: Origins -RXXJ4Q = Spectrobes: Origins +RXXJ4Q = Kaseki Monster: Spectrobes RXXP4Q = Spectrobes: Origins RXYE4Z = Puzzle Challenge: Crosswords and More! RXYP4Z = Puzzle Challenge Crosswords RXZE52 = Cabela's Dangerous Hunts 2009 RXZP52 = Cabela's Dangerous Adventures RY2E41 = Rayman Raving Rabbids 2 -RY2J41 = Rayman Raving Rabbids 2 -RY2K41 = Rayman Raving Rabbids 2 +RY2J41 = Rabbids Party Returns +RY2K41 = Rayman - Raving Rabbids 2 RY2P41 = Rayman Raving Rabbids 2 RY2R41 = Rayman Raving Rabbids 2 RY3E41 = Rayman Raving Rabbids TV Party -RY3J41 = Rayman Raving Rabbids TV Party +RY3J41 = Rabbids Party: TV Party RY3K41 = Rayman Raving Rabbids: TV Party RY3P41 = Rayman Raving Rabbids: TV Party RY4J8P = Puyo Puyo 7 @@ -2153,7 +2141,8 @@ RY6EA4 = Walk It Out! RY6PA4 = Step to the Beat RY7PHZ = Ninja Captains RY8EFS = Bass Pro Shops: The Strike -RYAJDA = Yattaman Wii Bikkuridokkiri Machine De Mou Race Da Koron +RY9E69 = FIFA Soccer 09 All-Play +RYAJDA = Yatterman Wii: Bikkuri Dokkiri Machine de Mou Race da Koron RYBE69 = Boom Blox: Bash Party RYBP69 = Boom Blox: Bash Party RYDELT = Pet Pals: Animal Doctor @@ -2161,7 +2150,7 @@ RYDP6V = Pet Pals: Animal Doctor RYEEEB = 101-in-1 Party Megamix RYEPHZ = 101-in-1 Party Megamix RYGE9B = Rygar: The Battle of Argus -RYGJ9B = Argus no Senshi Muscle Impact +RYGJ9B = Argos no Senshi: Muscle Impact RYGP99 = Rygar: The Battle of Argus RYHES5 = Roogoo: Twisted Towers RYHPS5 = Roogoo: Twisted Towers @@ -2170,7 +2159,7 @@ RYIPNK = SPRay RYJPTV = Princess Lillifee's Magic Fairy RYKEAF = We Ski & Snowboard RYKJAF = Family Ski: World Ski & Snowboard -RYKK01 = We Ski & Snowboard +RYKK01 = Family Ski & Snowboard RYKPAF = Family Ski & Snowboard RYLDSV = Germany's Next Top Model RYLPSV = Top Model Academy @@ -2188,7 +2177,7 @@ RYTE4Z = PBR: Out of the Chute RYVJMS = Illvelo Wii RYWE01 = Big Brain Academy: Wii Degree RYWJ01 = Wii de Yawaraka Atama Juku -RYWK01 = Big Brain Academy: Wii Degree +RYWK01 = Wiiro Dahamkke! Mallangmallang Dunoegyosil RYWP01 = Big Brain Academy for Wii RYXE20 = Yamaha Supercross RYXP7J = Yamaha Supercross @@ -2196,18 +2185,18 @@ RYZE6U = World Party Games RYZPTV = Play the World RZ2JG9 = Simple Wii Series Vol. 1: The Minna de Kart Race RZ3JG9 = Simple Wii Series Vol. 2: The Minna de Bass Tsuri Taikai -RZ4JG9 = Simple Wii Series Vol. 3: The Casino Party +RZ4JG9 = Simple Wii Series Vol. 3: Asonde Oboeru: The Party Casino RZ5JG9 = Simple Wii Series Vol. 4: The Shooting Action RZ6JG9 = Simple Wii Series Vol. 5: The Block Kuzushi -RZ7JG9 = Simple Wii Series Vol. 6: The Waiwai Konbatto -RZ8JG9 = Simple 2000 Series Wii Vol. 1: The Table Game +RZ7JG9 = Simple Wii Series Vol. 6: The Wai Wai Combat +RZ8JG9 = Simple 2000 Series Wii Vol. 1: The Table Game: Mahjong, Igo, Shougi, Card, Hanafuda, Reversi, Gomoku Narabe RZ9EG9 = Family Party: 30 Great Games RZ9JG9 = Simple 2000 Series Wii Vol. 2: The Party Game RZ9PG9 = Family Party: 30 Great Games RZAPTV = Lernerfolg Grundschule Power Math RZCE6K = Saint RZDE01 = The Legend of Zelda: Twilight Princess -RZDJ01 = The Legend of Zelda: Twilight Princess +RZDJ01 = Zelda no Densetsu: Twilight Princess RZDK01 = The Legend of Zelda: Twilight Princess RZDP01 = The Legend of Zelda: Twilight Princess RZEE52 = Science Papa @@ -2230,8 +2219,8 @@ RZNJ01 = Zangeki no Reginleiv RZOE78 = World of Zoo RZOP78 = World of Zoo RZPE01 = Link's Crossbow Training -RZPJ01 = Link's Crossbow Training -RZPK01 = Link's Crossbow Training +RZPJ01 = Link no Bowgun Training +RZPK01 = Linkui Sagyeok Training RZPP01 = Link's Crossbow Training RZREGT = The Destiny of Zorro RZRPGT = The Destiny of Zorro @@ -2252,7 +2241,7 @@ RZZJEL = MadWorld RZZP8P = MadWorld S22JAF = Family Fishing S22K01 = Family Fishing -S25JGD = Dragon Quest 25 Collection: Famicom & Super Famicom Dragon Quest I-II-III +S25JGD = Dragon Quest 25 Shuunen Kinen: Famicom & Super Famicom Dragon Quest I-II-III S26PML = 2-in-1: Pony Friends 2 + My Riding Stables: Life with Horses S2AEAF = Active Life: Explorer S2AJAF = Minna de Bouken! Family Trainer @@ -2268,6 +2257,7 @@ S2HE70 = Haunted House S2HP70 = Haunted House S2IE8P = Iron Man 2 S2IP8P = Iron Man 2 +S2IZ8P = Iron Man 2 - Walmart Edition S2LE01 = PokéPark 2: Wonders Beyond S2LJ01 = PokéPark 2: Beyond the World S2LP01 = PokéPark 2: Wonders Beyond @@ -2281,7 +2271,7 @@ S2PYA4 = Pro Evolution Soccer 2012 S2QE54 = NBA 2K12 S2QP54 = NBA 2K12 S2RPNK = Reload -S2TJAF = Taiko no Tatsujin Wii: Dodoon to 2 Daime! +S2TJAF = Taiko no Tatsujin Wii: Dodoon to 2-daime! S2UE41 = Just Dance 2020 S2UP41 = Just Dance 2020 S2VEG9 = Victorious: Taking the Lead @@ -2311,10 +2301,11 @@ S3BEWR = Batman: The Brave and the Bold S3BPWR = Batman: The Brave and the Bold S3CENR = Triple Crown Championship Snowboarding S3DE18 = Deca Sports 3 -S3DJ18 = Deca Sporta 3 +S3DJ18 = Deca Sporta 3: Wii de Sports 10 Shumoku! S3DP18 = Sports Island 3 S3EE78 = Barbie Jet, Set & Style! S3EP78 = Barbie Jet, Set & Style! +S3EXVZ = Barbie Jet, Set & Style! S3FE69 = FIFA Soccer 13 S3FP69 = FIFA 13 S3FX69 = FIFA 13 @@ -2333,14 +2324,14 @@ S3PP4Q = Disney Princess: My Fairytale Adventure S3PX4Q = Disney Princess: My Fairytale Adventure S3RJMS = Twinkle Queen S3SJ18 = Karaoke Joysound Wii Super DX: Hitori de Minna de Utai Houdai! -S3TJAF = Taiko no Tatsujin Wii: Minna de Party ☆ 3 Daime! +S3TJAF = Taiko no Tatsujin Wii: Minna de Party 3-daime! S3WEG9 = Family Party: 30 Great Games Winter Fun S3WPG9 = Family Party: 30 Great Games Winter Fun S3XE78 = WWE '13 S3XP78 = WWE '13 S3ZE52 = Men In Black: Alien Crisis S3ZP52 = Men In Black: Alien Crisis -S4MJGD = Dragon Quest X Online: Mesamashi Itsutsu no Shuzoku +S4MJGD = Dragon Quest X: Mezameshi Itsutsu no Shuzoku Online S4SJGD = Dragon Quest X: Nemureru Yuusha to Michibiki no Meiyuu Online S59E01 = Samurai Warriors 3 S59JC8 = Sengoku Musou 3 @@ -2370,9 +2361,9 @@ S6IE78 = Disney Princess: Enchanting Storybooks S6IP78 = Disney Princess: Enchanting Storybooks S6RE52 = Wreck-It Ralph S6RP52 = Wreck-It Ralph -S6TJGD = Dragon Quest X (All in One Package) +S6TJGD = Dragon Quest X: All in One Package S72E01 = Kirby's Dream Collection: Special Edition -S72J01 = Hoshi no Kirby: 20th Anniversary Edition +S72J01 = Hoshi no Kirby: 20 Shuunen Special Collection S75E69 = Monopoly Streets S75P69 = Monopoly Streets S7AEWR = LEGO Batman 2: DC Super Heroes @@ -2400,7 +2391,7 @@ SA6EG9 = Ben 10: Galactic Racing SA6PAF = Ben 10: Galactic Racing SA7ESZ = Gummy Bears: Magical Medallion SA8P52 = The Amazing Spider-Man -SA9D7K = Bibi und Tina Das grosse Reiterfest +SA9D7K = Bibi & Tina: Das große Reiterfest SAAJA4 = Winning Eleven PLAY MAKER 2013 SABENR = Alien Monster Bowling League SABPJG = Alien Monster Bowling League @@ -2425,7 +2416,7 @@ SARE4Z = Aladdin Magic Racer SARPNK = Aladin: Magic Racer SASEWW = Atrévete a Soñar SATE6K = Chuck E. Cheese's Super Collection -SAUJ8P = Puyo Puyo!! 20th Anniversary +SAUJ8P = Puyo Puyo!! Puyopuyo 20th Anniversary SAVE5G = Alvin and the Chipmunks: The Squeakquel SAVX5G = Alvin and the Chipmunks: The Squeakquel SAWE52 = Angry Birds Trilogy @@ -2442,7 +2433,7 @@ SB3J08 = Sengoku BASARA 3 SB3P08 = Sengoku Basara: Samurai Heroes SB4E01 = Super Mario Galaxy 2 SB4J01 = Super Mario Galaxy 2 -SB4K01 = Super Mario Galaxy 2 +SB4K01 = Super Mario Wii 2 - Galaxy Adventure Together SB4P01 = Super Mario Galaxy 2 SB4W01 = Super Mario Galaxy 2 SB5E54 = NBA 2K11 @@ -2455,7 +2446,8 @@ SB9E78 = Barbie: Groom and Glam Pups SB9EVZ = Barbie: Groom and Glam Pups SB9P78 = Barbie: Groom and Glam Pups SB9X78 = Barbie: Groom and Glam Pups -SBAJGD = Dragon Quest Monsters: Battle Road Victory +SB9YVZ = Barbie: Groom and Glam Pups +SBAJGD = Dragon Quest: Monster Battle Road Victory SBBE18 = Beyblade: Metal Fusion - Battle Fortress SBBJ18 = Metal Fight Beyblade Gachinko Stadium SBBP18 = Beyblade: Metal Fusion - Counter Leone @@ -2506,8 +2498,8 @@ SC7P52 = Call of Duty: Black Ops SC7S52 = Call of Duty: Black Ops SC7Z52 = Call of Duty: Black Ops SC8E01 = Wii Play: Motion -SC8J01 = Wii Play: Motion -SC8K01 = Wii Play: Motion +SC8J01 = Wii Remocon Plus: Variety +SC8K01 = Wii Remocon Plusro Jeulgineun - Variety Game Box SC8P01 = Wii Play: Motion SC9P52 = Cabela's Big Game Hunter 2010 SCAE18 = Calling @@ -2531,7 +2523,7 @@ SCMJAF = Kamen Rider Climax Heroes OOO SCNEA4 = Scene It? Twilight SCNPA4 = Scene It? Twilight SCPE70 = Centipede: Infestation -SCQDRV = Schlag den Raab - Das 2. Spiel +SCQDRV = Schlag den Raab: Das 2. Spiel SCREJH = Chicken Riot SCRPJH = Chicken Riot SCSE52 = Cruise Ship Vacation Games @@ -2556,9 +2548,9 @@ SD2K41 = Just Dance 2 SD2P41 = Just Dance 2 SD2Y41 = Just Dance 2: Best Buy Edition SD3DSV = Der Gesundheitscoach -SD5PTV = Lernerfolg Grundschule Deutsch -SD6PTV = Lernerfolg Grundschule Englisch -SD7PTV = Lernerfolg Grundschule Mathematik +SD5PTV = Lernerfolg Grundschule: Deutsch - Klasse 1-4 +SD6PTV = Lernerfolg Grundschule: Englisch - Klasse 1-4 +SD7PTV = Lernerfolg Grundschule: Mathematik - Klasse 1-4 SD8DSV = Mein neues Leben Abenteuer auf Tropicana SD9JAF = SD Gundam: Gashapon Wars SDAE5G = The Daring Game for Girls @@ -2573,7 +2565,7 @@ SDGE4Q = Disney Channel: All Star Party SDGP4Q = Disney Channel: All Star Party SDIE4Q = Disney Sing It: Party Hits SDIP4Q = Disney Sing It: Party Hits -SDJJAF = SD Gundam: G Generation World +SDJJAF = SD Gundam: GGeneration World SDLE78 = Dood's Big Adventure SDLP78 = Dood's Big Adventure SDMEG9 = Despicable Me: The Game @@ -2583,7 +2575,7 @@ SDNP41 = Just Dance SDOPLR = Doctor Who: Return To Earth SDPE54 = Dora's Big Birthday Adventure SDPP54 = Dora's Big Birthday Adventure -SDQJGD = Dragon Quest X Inishie no Ryu no Denshou Online +SDQJGD = Dragon Quest X: Inishie no Ryuu no Denshou Online SDREYG = Maximum Racing: Drag & Stock Racer SDRPNG = Drag & Stock Racer SDSPNG = We Dance @@ -2594,7 +2586,7 @@ SDUX41 = The Smurfs Dance Party - Walmart Edition SDVE41 = Driver: San Francisco SDVP41 = Driver: San Francisco SDWE18 = Lost in Shadow -SDWJ18 = Lost in Shadow +SDWJ18 = Kage no Tou SDWP18 = A Shadow's Tale SDXE4Q = Disney Universe SDXP4Q = Disney Universe @@ -2609,7 +2601,7 @@ SE3P41 = Just Dance 2015 SE8E41 = Just Dance 2018 SE8P41 = Just Dance 2018 SEAE69 = EA Sports Active: More Workouts -SEAJ13 = EA Sports Active More Workout +SEAJ13 = EA Sports Active Personal Trainer Wii: 6 Shuukan Shuuchuu Hikishime Program SEAP69 = EA Sports Active: More Workouts SECE69 = Create SECP69 = Create @@ -2620,7 +2612,7 @@ SELE69 = FIFA Soccer 11 SELP69 = FIFA 11 SELX69 = FIFA 11 SEME4Q = Disney Epic Mickey -SEMJ01 = Disney Epic Mickey: Mickey Mouse and the Magic Brush +SEMJ01 = Disney Epic Mickey: Mickey Mouse to Mahou no Fude SEMP4Q = Disney Epic Mickey SEMX4Q = Disney Epic Mickey SEMY4Q = Disney Epic Mickey @@ -2632,29 +2624,31 @@ SEPX41 = The Black Eyed Peas Experience D1 Edition SEPZ41 = The Black Eyed Peas Experience: Limited Edition SERE4Q = Disney Epic Mickey 2: The Power of Two SERF4Q = Disney Epic Mickey 2: The Power of Two -SERJ91 = Disney Epic Mickey 2: The Power of Two +SERJ91 = Disney Epic Mickey 2: Futatsu no Chikara SERK8M = Disney Epic Mickey 2: The Power of Two SERP4Q = Disney Epic Mickey 2: The Power of Two SERV4Q = Disney Epic Mickey 2: The Power of Two SESEWR = Sesame Street: Ready, Set, Grover! SESPWR = Sesame Street: Ready, Set, Grover! SESUWR = Sesame Street: Ready, Set, Grover! +SEUPEY = Retro City Rampage DX +SEVPEY = Shakedown: Hawaii SEZJHF = Inazuma Eleven Strikers 2012 Xtreme SF2P64 = Star Wars: The Force Unleashed II SF4E20 = Flatout SF4PXT = Flatout SF5E41 = Fit in Six -SF5J41 = Fit in Six +SF5J41 = Fit in Six: Karada o Kitaeru 6-tsu no Youso SF5P41 = My Fitness Coach: Club SF7E41 = Family Feud 2012 Edition SF8E01 = Donkey Kong Country Returns SF8J01 = Donkey Kong Returns SF8P01 = Donkey Kong Country Returns SFAE41 = Family Feud Decades -SFAJGD = Fullmetal Alchemist: Daughter of the Dusk +SFAJGD = Hagane no Renkinjutsushi: Fullmetal Alchemist: Tasogare no Shoujo SFBE70 = Backyard Sports Football: Rookie Rush SFDEAF = Active Life: Magical Carnival -SFDJAF = Issyoni Asobou! Dream Theme Park +SFDJAF = Issho ni Asobu! Dream Theme Park SFDPAF = Family Trainer: Magical Carnival SFEPYF = Fit Music SFGE69 = Hasbro: Family Game Night 4 - The Game Show @@ -2677,7 +2671,7 @@ SFTP78 = Wheel of Fortune SFUE64 = Star Wars: The Force Unleashed II SFVEXJ = Fishing Resort SFWE69 = 2010 FIFA World Cup South Africa -SFWJ13 = 2010 FIFA World Cup South Africa +SFWJ13 = 2010 FIFA World Cup: Minami Africa Taikai SFWK69 = 2010 FIFA World Cup South Africa SFWP69 = 2010 FIFA World Cup South Africa SFWX69 = 2010 FIFA World Cup South Africa @@ -2768,7 +2762,7 @@ SHFE20 = Basketball Hall of Fame: Ultimate Hoops Challenge SHGDRM = Holiday Games SHHE69 = Harry Potter and the Deathly Hallows, Part 1 SHHP69 = Harry Potter and the Deathly Hallows - Part 1 -SHIJ2N = Shape Boxing 2 Wii Enjoy Diet! +SHIJ2N = Shape Boxing 2: Wii de Enjoy Diet! SHKE20 = Hello Kitty Seasons SHKPNQ = Hello Kitty Seasons SHLPA4 = Silent Hill: Shattered Memories @@ -2789,7 +2783,7 @@ SHWE41 = Hollywood Squares SHXEWR = Happy Feet Two SHXPWR = Happy Feet 2 SHYE69 = NHL SlapShot -SHYP69 = EA Sports: NHL Slapshot +SHYP69 = NHL Slapshot SHZENR = Harley Davidson: Road Trip SI3E69 = FIFA Soccer 12 SI3P69 = FIFA 12 @@ -2803,18 +2797,18 @@ SIFESZ = The Island of Dr. Frankenstein SIFPNJ = The Island of Dr. Frankenstein SIHE4Z = Sing 4: The Hits Edition SIIE8P = Mario & Sonic at the London 2012 Olympic Games -SIIJ01 = Mario & Sonic at the London 2012 Olympic Games -SIIK01 = Mario & Sonic at the London 2012 Olympic Games +SIIJ01 = Mario & Sonic at London Olympic +SIIK01 = Mariowa Sonic London Olympic SIIP8P = Mario & Sonic at the London 2012 Olympic Games SIJE52 = iCarly 2: iJoin the Click! SIJP52 = iCarly 2: iJoin the Click! SILE78 = Worms: Battle Islands -SILP78 = Worms Battle Islands +SILP78 = Worms: Battle Islands SIME69 = MySims Collection SINPNG = We Sing: Robbie Williams SIPE7T = I SPY Game Pack SISENR = Princess Isabella: A Witch's Curse -SISJ0Q = Pelvic Fitness by Wii (Isometric & Karate Exercise) +SISJ0Q = Isometric & Karate Exercise: Wii de Kotsuban Fitness SISPUH = Princess Isabella: A Witch's Curse SITPNG = We Sing: Deutsche Hits SIUUNG = We Sing Down Under @@ -2841,7 +2835,7 @@ SJDK41 = Just Dance 3 SJDP41 = Just Dance 3 SJDX41 = Just Dance 3 Special Edition SJDY41 = Just Dance 3: Best Buy Exclusive Edition -SJDZ41 = Just Dance 3: Target Exclusive Edition +SJDZ41 = Just Dance 3: Target/Zellers Exclusive Edition SJEEPK = JumpStart Escape from Adventure Island SJFE4Z = Kid Fit Island Resort SJFPGR = Junior Fitness Trainer @@ -2872,7 +2866,7 @@ SJTP41 = Just Dance: Best Of SJUE20 = Dino Strike SJUPXT = Dino Strike SJVE20 = Shawn Johnson Gymnastics -SJWJA4 = Winning Eleven PLAY MAKER 2010 Japan Challenge +SJWJA4 = Winning Eleven Play Maker 2010: Aoki Samurai no Chousen SJXD41 = Just Dance 4 Special Edition SJXE41 = Just Dance 4 SJXP41 = Just Dance 4 @@ -2883,7 +2877,7 @@ SK4E52 = Shrek Forever After SK4I52 = Shrek Forever After SK4P52 = Shrek Forever After SK5PY1 = Kylie Sing & Dance -SK6KJD = K-POP Dance Festival +SK6KJD = K-Pop Dance Festival SK7PVZ = Disney Violetta: Rhythm & Music SK7XVZ = Disney Violetta: Rhythm & Music SK8D52 = Skylanders: Trap Team @@ -2896,8 +2890,8 @@ SKAEA4 = Karaoke Revolution Glee SKAPA4 = Karaoke Revolution Glee SKBEG9 = Kidz Bop Dance Party! SKCE20 = Bigfoot: King of Crush -SKDJ18 = Karaoke Joysound Wii Duet Song -SKEJ18 = Karaoke Joysound Wii: Enka Kayoukyoku Hen +SKDJ18 = Karaoke Joysound Wii: Duet Kyoku-hen +SKEJ18 = Karaoke Joysound Wii: Enka Kayoukyoku-hen SKGEA4 = Karaoke Revolution Glee Volume 2 SKGPA4 = Karaoke Revolution Glee Volume 2 SKHJAF = Kamen Rider Super Climax Heroes @@ -2917,6 +2911,7 @@ SKTE78 = All Star Karate SKTP78 = All Star Karate SKUE78 = Kung Fu Panda 2 SKUP78 = Kung Fu Panda 2 +SKUZ78 = Kung Fu Panda 2 (Exclusive) SKVE20 = Kevin Van Dam's Big Bass Challenge SKWPNK = Cocoto Kart Racer 2 SKXE20 = Pirate Blast @@ -2956,7 +2951,7 @@ SLIE52 = Little League World Series Baseball: Double Play SLJPKM = Let's Sing 8 - Spanish Version SLKPKM = Let’s Sing 2016 : Hits Français SLLEWW = Lucha Libre AAA: Héroes del Ring -SLMPWL = 40 Principales Karaoke Party Vol. 2 +SLMPWL = Los 40 Principales Karaoke Party Vol. 2 SLNP7M = The Voice Vol. 3 SLPP5D = Spirit of the Wolf SLREWR = LEGO The Lord of the Rings @@ -2989,7 +2984,7 @@ SM9E54 = Major League Baseball 2K12 SMAENR = Marines: Modern Urban Combat SMAPGN = Marines: Modern Urban Combat SMBE8P = Super Monkey Ball: Step & Roll -SMBJ8P = Super Monkey Ball: Step & Roll +SMBJ8P = Super Monkey Ball Athletic SMBP8P = Super Monkey Ball: Step & Roll SMCENR = We Wish You a Merry Christmas SMCPXT = We Wish You a Merry Christmas @@ -3004,9 +2999,9 @@ SMJE52 = Monster Jam: Path of Destruction SMJP52 = Monster Jam: Path of Destruction SMKE4Z = Gem Smashers SMLE54 = Major League Baseball 2K10 -SMMJ0Q = Momu chan Diet Wii Figurobics by Chon Dayon +SMMJ0Q = Momu-chan Diet Wii: Figurobics by Chon Dayon SMNE01 = New Super Mario Bros. Wii -SMNJ01 = New Super Mario Bros. Wii +SMNJ01 = New Super Mario Brothers Wii SMNK01 = New Super Mario Bros. Wii SMNP01 = New Super Mario Bros. Wii SMNW01 = New Super Mario Bros. Wii @@ -3021,8 +3016,8 @@ SMRE78 = WWE SmackDown vs. Raw 2011 SMRP78 = WWE SmackDown vs. Raw 2011 SMSE78 = Marvel Super Hero Squad: The Infinity Gauntlet SMSP78 = Marvel Super Hero Squad: The Infinity Gauntlet -SMTJ18 = Momotarô Dentetsu 2010 -SMUJAF = Daikaijuu Battle: Ultra Coliseum DX - Ultra Senshi Daishuuketsu +SMTJ18 = Momotarou Dentetsu 2010: Sengoku Ishin no Hero Daishuugou! no Maki +SMUJAF = Daikaijuu Battle: Ultra Coliseum DX: Ultra Senshi Daishuuketsu SMVE54 = Major League Baseball 2K11 SMWE4Z = Man vs. Wild SMYE20 = Minute to Win It @@ -3032,7 +3027,7 @@ SN2E69 = NERF N-Strike Double Blast Bundle SN3EYG = Maximum Racing: Rally Racer SN3PNG = Rally Racer SN4EDA = Naruto Shippuden: Dragon Blade Chronicles -SN4JDA = Naruto Shippuuden: Ryujinki +SN4JDA = Naruto Shippuuden: Ryuu Jin-ki SN4XGT = Naruto Shippuden: Dragon Blade Chronicles SN5EYG = Maximum Racing: Crash Car Racer SN5PNG = Crash Car Racer @@ -3064,7 +3059,6 @@ SNJP69 = NBA Jam SNKP54 = Nickelodeon Fit SNKX54 = Nickelodeon Fit SNLE54 = Nickelodeon Dance -SNLP54 = Nickelodeon Dance SNLX54 = Nickelodeon Dance SNMEAF = Namco Museum Megamix SNOPY1 = Now! That's What I Call Music: Dance & Sing @@ -3078,7 +3072,7 @@ SNUPJW = Happy Neuron Academy SNVE69 = Need for Speed: The Run SNVJ13 = Need for Speed: The Run SNVP69 = Need for Speed: The Run -SNXJDA = Naruto Shippuuden: Gekitou Ninja Taisen Special +SNXJDA = Naruto Shippuuden: Gekitou Ninja Taisen! Special SNYEVZ = Monster High: 13 Wishes SNYPVZ = Monster High: 13 Wishes SNZEVZ = Barbie: Dreamhouse Party @@ -3097,7 +3091,7 @@ SOKEA4 = Karaoke Joysound SOKJ18 = Karaoke Joysound Wii DX SOME01 = Rhythm Heaven Fever SOMJ01 = Minna no Rhythm Tengoku -SOMK01 = Rhythm World Wii +SOMK01 = Rhythm Sesang Wii SOMP01 = Beat the Beat: Rhythm Paradise SONDMR = My First Songs SONFMR = My First Songs @@ -3107,7 +3101,7 @@ SOSEG9 = Turbo: Super Stunt Squad SOSPAF = Turbo: Super Stunt Squad SOTE52 = Wipeout: The Game SOUE01 = The Legend of Zelda: Skyward Sword -SOUJ01 = The Legend of Zelda: Skyward Sword +SOUJ01 = Zelda no Densetsu: Skyward Sword SOUK01 = The Legend of Zelda: Skyward Sword SOUP01 = The Legend of Zelda: Skyward Sword SP2E01 = Wii Sports + Wii Sports Resort @@ -3142,7 +3136,7 @@ SPOPFR = Winter Sports 2011: Go for Gold SPPEFS = Power Punch SPQE7T = I SPY Spooky Mansion SPRE41 = The Price Is Right: 2010 Edition -SPTJEB = Hospital. 6 nin no Ishi +SPTJEB = Hospital. 6-nin no Ishi SPUE20 = Let's Paint SPVEA4 = Pro Evolution Soccer 2011 SPVPA4 = Pro Evolution Soccer 2011 @@ -3167,7 +3161,7 @@ SQIE4Q = Disney Infinity SQIP4Q = Disney Infinity SQIY4Q = Disney Infinity SQKE5G = Mama's 2-Pack -SQKK01 = Mama's 2-Pack +SQKK01 = Cooking Mama SQLE4Z = Cartoon Network: Punch Time Explosion XL SQLPGN = Cartoon Network: Punch Time Explosion XL SQME52 = Spider-Man: Edge of Time @@ -3185,7 +3179,7 @@ SQVP69 = FIFA 15 - Legacy Edition SQVX69 = FIFA 15 - Legacy Edition SQWE52 = The Voice: I Want You SR4E41 = Raving Rabbids: Travel in Time -SR4J41 = Raving Rabbids: Travel in Time +SR4J41 = Rabbids Party: Time Travel SR4P41 = Raving Rabbids: Travel in Time SR5E41 = Raving Rabbids Party Collection SR5P41 = Raving Rabbids Party Collection @@ -3193,7 +3187,7 @@ SR6EHG = Reader Rabbit 1st Grade SR7EHG = Reader Rabbit 2nd Grade SR8EHG = Reader Rabbit Kindergarten SR9EHG = Reader Rabbit Preschool -SRAJMS = Rajirugi Noa Wii +SRAJMS = Radirgy Noa Wii SRBPHS = Rugby League 3 SRCE69 = Rock Band: Country Track Pack 2 SREXNL = Reader Rabbit Kindergarten @@ -3213,7 +3207,7 @@ SRNE70 = Project Runway SRNP70 = Project Runway SROENS = Rodea the Sky Soldier SROJQC = Tenkuu no Kishi Rodea -SROKZ5 = Rodea the Sky Soldier +SROKZ5 = Cheongongui Gisa Rodea SROPNS = Rodea the Sky Soldier SRPE4Q = Disney Tangled SRPP4Q = Disney Tangled @@ -3255,7 +3249,7 @@ SSCPWR = Scene It? Bright Lights! Big Screen! SSCSWR = Scene It? Bright Lights! Big Screen! SSCXPM = Scene It? Bright Lights! Big Screen! SSDDRV = Schlag den Raab -SSEDNG = We Sing: Encore +SSEDNG = We Sing Vol. 2 SSEPNG = We Sing: Encore SSEVNG = We Sing: Encore SSFPKM = Sing 4: The Hits Edition @@ -3271,7 +3265,7 @@ SSMPGD = Mensa Academy SSNEYG = Sniper Elite SSNPHY = Sniper Elite SSPE52 = Skylanders: Spyro's Adventure -SSPJGD = Skylanders: Spyro's Adventure +SSPJGD = Skylanders: Spyro no Daibouken SSPP52 = Skylanders: Spyro's Adventure SSPX52 = Skylanders: Spyro's Adventure SSPY52 = Skylanders: Spyro's Adventure @@ -3306,6 +3300,7 @@ STAE78 = Pictionary STAP78 = Pictionary STAU78 = Pictionary STDEFP = Reload +STDURN = Reload STEETR = Tetris Party Deluxe STEJ18 = Tetris Party Premium STEPTR = Tetris Party Deluxe @@ -3360,7 +3355,7 @@ SU2P54 = Nickelodeon Dance 2 SU2X54 = Nickelodeon Dance 2 SU3DMR = U-Sing 2 SU3FMR = U-Sing 2 -SU3HMR = U-Sing 2: Popstars Edition +SU3HMR = U-Sing 2 SU3PMR = U-Sing 2 SU3SMR = U-Sing 2 SU3UMR = U-Sing 2: Australian Edition @@ -3379,7 +3374,7 @@ SU9P4Q = Disney Planes SU9X4Q = Disney Planes SUKE01 = Kirby's Return to Dream Land SUKJ01 = Hoshi no Kirby Wii -SUKK01 = Kirby's Return to Dream Land +SUKK01 = Byeorui Kirby Wii SUKP01 = Kirby's Adventure Wii SUMJC8 = Winning Post World 2010 SUNEYG = Deer Drive Legends @@ -3407,8 +3402,8 @@ SUXJA4 = Winning Eleven PLAY MAKER 2010 SUXPA4 = Pro Evolution Soccer 2010 SUXXA4 = Pro Evolution Soccer 2010 SUXYA4 = Pro Evolution Soccer 2010 -SUYDRV = Schlag den Raab - Das 3. Spiel -SUZD7K = Benjamin Blümchen - Törööö im Zoo +SUYDRV = Schlag den Raab: Das 3. Spiel +SUZD7K = Benjamin Blümchen: Törööö! im Zoo SV2E78 = Big Beach Sports 2 SV2P78 = Big Beach Sports 2 SV3EG9 = Madagascar 3: The Video Game @@ -3430,7 +3425,7 @@ SVHE69 = FIFA 14 - Legacy Edition SVHP69 = FIFA 14 - Legacy Edition SVHX69 = FIFA 14 - Legacy Edition SVME01 = Super Mario All-Stars -SVMJ01 = Super Mario Collection: 25th Anniversary Edition +SVMJ01 = Super Mario Collection SVMK01 = Super Mario Collection SVMP01 = Super Mario All-Stars: 25th Anniversary Edition SVOEWW = El Chavo @@ -3474,13 +3469,13 @@ SWBE52 = DJ Hero 2 SWBP52 = DJ Hero 2 SX2PNG = Jungle Kartz SX3EXJ = Pandora's Tower -SX3J01 = Pandora’s Tower: Until I Return to Your Side +SX3J01 = Pandora no Tou: Kimi no Moto e Kaeru made SX3P01 = Pandora's Tower SX4E01 = Xenoblade Chronicles SX4J01 = Xenoblade SX4P01 = Xenoblade Chronicles SX5E4Z = Santa Claus is Comin' to Town! -SX6JAF = Pretty Cure All Stars Everyone Gather ☆ Let's Dance +SX6JAF = Precure All Stars: Zenin Shuugou ☆ Let's Dance! SX7E52 = Teenage Mutant Ninja Turtles SX7P52 = Teenage Mutant Ninja Turtles SX8E52 = X-Men Destiny @@ -3515,7 +3510,9 @@ SZAE69 = Rock Band 2 SZAP69 = Rock Band 2 SZBE69 = Rock Band 3 SZBP69 = Rock Band 3 +23EE41 = Just Dance 2023 Wii Edition AFRE01 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 8. +AISE41 = Just Dance Ember AMEE01 = New Super Mario Bros. Wii 11 American Revolution AMNE01 = Another Super Mario Bros. Wii AMOR04 = Guitar Hero III Custom : HARDcore @@ -3525,7 +3522,10 @@ APRP03 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 6. APRP04 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 7. APRP06 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 5. APRP08 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 1. +ARIE41 = Just Dance Ariana +ASIE41 = Just Dance Asia ASMB01 = Another Super Mario Bros. Wii +ATGE02 = ATG's CT Pack BEPS01 = Guitar Hero III Custom : Rock n' Metal BOWE01 = New Super Mario Bros. Wii 17 Bowser's Last Laugh C3BE52 = Guitar Hero III Custom : Bossenator @@ -3537,7 +3537,9 @@ C4AEE9 = Harvest Moon: Magical Melody (Rainbow Version) C4GEE9 = Harvest Moon: Another Proud Life C80E52 = Guitar Hero III Custom : Rocks the 80's C80P52 = Guitar Hero III Custom: GH I & 80's +C84EE9 = Harvest Moon: Tree of Tranquility - Big Gay Edition CANE52 = Guitar Hero Custom: NOT Aerosmith but... +CB4E01 = Super Mario Gravity CBIEE9 = Harvest Moon: Pride Parade CCPE01 = Mario Kart Wii Custom: The Master Race CEMU69 = PunEmu @@ -3551,7 +3553,7 @@ CG3ECS = Guitar Hero III Custom : ClasSick Edition CG3PCS = Guitar Hero III Custom : ClasSick Edition CGBE52 = Guitar Hero III Custom: Rock Band CGBP52 = Guitar Hero III Custom : Rock Band -CGH370 = Guitar Hero III Custom : 70 New Song +CGH370 = Guitar Hero III Custom: 70 New Song CGH3IM = Guitar Hero III Custom : Iron Maiden CGH3LM = Guitar Hero III Custom : Legend of Music CGH3ME = Guitar Hero III Custom : Metallica @@ -3595,10 +3597,11 @@ CGVECD = Guitar Hero Aerosmith Custom : AC/DC Edition CGVEM2 = Guitar Hero Aerosmith Custom : Mini Concerts Edition 2 CGVEMC = Guitar Hero Aerosmith Custom : Mini Concerts Edition CGVEUV = Guitar Hero Aerosmith Custom : Ultimate Video Game Hero -CKBE88 = Mario Kart Wii Black +CKBE88 = Mario Kart Black CLAPSI = Sing IT: Clásicos CMDE52 = Guitar Hero III Custom: Megadeth CMKE01 = Mario Kart Wii Dragon Road +CNSMBW = Chaotic New Super Mario Bros. Wii CS0P00 = StarSing : Bollywood v2.0 CS0PZZ = StarSing : Pop Part. I v2.0 CS1P00 = StarSing : Country v2.0 @@ -3667,6 +3670,7 @@ CTFP00 = StarSing : Rock Ballads v2.0 CTGP00 = StarSing : Take That v2.0 CTHP00 = StarSing : Summer Party v2.0 CTIP00 = StarSing : Rocks! Part. I v2.0 +CTJBO1 = CT Jam Best Of CTJP00 = StarSing : Rocks! Part. II v2.0 CTKP00 = StarSing : Pop Hits v2.0 CTLP00 = StarSing : Britney Spears v2.0 @@ -3696,6 +3700,7 @@ CU8P00 = StarSing : Volume 6 v1.0 CU9P00 = StarSing : Volume 7 v1.0 CVLE38 = Mario Kart: Victory Lane CYWEE9 = Harvest Moon: A Proud Life +D40E01 = Peach's Castle Tech Demo DBSBT3 = Dragon Ball Budokai Tenkaichi 3 Version Latino DIYP01 = New Super Mario Bros. Wii 0-4 D.I.Y. DKCP01 = Darky Kart Riivo @@ -3703,9 +3708,13 @@ DKWE01 = Darky Kart Wii Vol. 1 DKWE02 = Darky Kart Wii Vol. 2 DKWE03 = Darky Kart Wii Vol. 3 DKWE04 = Darky Kart Wii Vol. 4 +DLCE41 = Just Dance 2015 All In One DLZEPW = Super Smash Bros. Brawl: Phoenix Wings +DMBP05 = Dark Super Mario Bros. Wii DMKE01 = Mario Kart Wii 2 DMSP4Q = SingItStar: Best of Disney +DMVE26 = Dark Mario Vacation +DOLL41 = Just Dance Melody DQAJSC = Aquarius Baseball (Simplified Chinese Translation) DRP22Q = SingItStar Deutsch Rock-Pop Vol. 2 DUAP01 = DU Super Mario Bros. : Anniversary Edition @@ -3713,16 +3722,57 @@ DUCE01 = Kustom Mariokart Wii DUDE01 = New Super Mario Bros. Wii Scooby-Doo! Hack ENDP01 = New SUPER MARIO BROS. Wii 20 The End For Now EVOP01 = New Super Mario Bros. Wii 0-5 Evolution +FC2E41 = Just Dance Focus 2 FF4ENG = Fatal Frame 4: Mask of the Lunar Eclipse +FURE41 = Just Dance: Furry Party +G0050C = Pokémon: Blue Version +G0060C = Pokémon: Red Version +G01E01 = Super Smash Bros. Melee: SD Remix G01J01 = Super Smash Bros. Melee: SD Remix G01P01 = Super Smash Bros. Melee: SD Remix G02E01 = Super Smash Bros. Melee: 20XX Training Pack G02J01 = Super Smash Bros. Melee: 20XX Training Pack G02P01 = Super Smash Bros. Melee: 20XX Training Pack +G2MK01 = Metroid Prime 2: Dark Echoes +G4NEDA = Naruto Gektiou Ninja Taisen! 4 [Eng] +G4SK01 = The Legend of Zelda: Four Swords + +GACE01 = Super Smash Bros. Melee: Akaneia Build +GAEE01 = Animal Forest e+ +GAKE01 = Beyond Melee +GAYE41 = Just Pride +GBIK08 = Biohazard +GCDK08 = Biohazard Code: Veronica Complete +GCREBM = Xeno Crisis +GCRJBM = Xeno Crisis +GCRPBM = Xeno Crisis +GDXE8P = Sonic Riders DX +GEAK8P = Eternal Arcadia Legends +GFEK01 = Fire Emblem: Souen no Kiseki GFZJ8P = F-Zero AX GGPE01 = Mario Kart Arcade GP GGPE02 = Mario Kart Arcade GP 2 GGPJ02 = Mario Kart Arcade GP 2 +GH2E41 = Just Dance GH2 +GLME02 = Luigi's Mansion: First-Person Optimized +GLMERP = Luigi's Mansion Repainted +GLMK01 = Luigi's Mansion +GLSE01 = Super Luigi Sunshine +GM2EBJ = Monkeyed Ball 2: Witty Subtitle +GM2EDX = Super Monkey Ball Deluxe +GM8K01 = Metroid Prime +GMPE02 = Mario Party 4 Widescreen +GMSE02 = Super Mario Sunshine Multiplayer +GMSE03 = Super Mario Sunburn +GMSE04 = Super Mario Eclipse +GMSE05 = Super Mario Solarshine +GMSK01 = Super Mario Sunshine +GP5E02 = Mario Party 5+ Base Patch +GP5E03 = Mario Party 5 Widescreen +GP5E04 = Mario Party 5+ Widescreen Patch +GP6E02 = Mario Party 6 Widescreen +GP7E02 = Mario Party 7 CPU Only +GP7E03 = Mario Party 7 Widescreen +GTME01 = Super Smash Bros. Melee Training Mode GVS32E = Virtua Striker 3 Ver. 2002 GVS32J = Virtua Striker 3 Ver.2002 (Triforce) GVS45J = Virtua Striker 4 @@ -3730,10 +3780,18 @@ GVS46E = Virtua Striker 4 Ver.2006 GVS46J = Virtua Striker 4 Ver.2006 GVSJ9P = Virtua Striker 4 Ver.2006 GX2E01 = Pokémon XG: Next Gen +GXSRTE = Sonic Riders Tournament Edition +GXTE8P = Sonic Riders Tournament Edition +GZ2K01 = Zelda no Densetsu: Twilight Princess +GZBEB2 = Zatch Bell! Go! Go! Mamodo Fight!! +GZLK01 = Zelda no Densetsu: Kaze no Takuto HBWE01 = New Super Mario Bros. Wii: Hellboy Edition +HSMP01 = Harder Super Mario Bros. Wii +JF3E41 = Just Dance Focus 3 JOUE01 = New Super Mario Bros. Wii 10 The Journey KHPE01 = Kirby Air Ride Hack Pack KLSEXJ = The Last Story (NTSC-U, Japanese Audio) +KMGE01 = Kaizo Mario Galaxy KMKE01 = Kustom Mario Kart Wii KMNE03 = Newer Super Mario Bros. Wii KMNE10 = Koopa Country @@ -3741,9 +3799,18 @@ KMNJ03 = Newer Super Mario Bros. Wii KMNP03 = Newer Super Mario Bros. Wii KMNP10 = Koopa Country L40P4Q = Sing IT: Pop hits, los 40 principales +LFG001 = Luigi's Final Ghosthunt +M64E01 = Super Mario Galaxy 64: Holiday Special +MDIE01 = Wii Music: RiiArranged - Song Pack 1 +MDIE02 = Wii Music: RiiArranged - Song Pack 2 +MDIE03 = Wii Music: RiiArranged - Song Pack 3 +MDIE04 = Wii Music: RiiArranged - Song Pack 4 +MDIE05 = Wii Music: RiiArranged - Song Pack 5 MDUE01 = Mario Kart: Track Grand Priix MECPSI = SingItStar Mecano METE01 = New Super Metroid Bros. Wii +MG1E01 = Super Mayro Galaxy +MG2E01 = Super Mayro Galaxy Twoad MIJPSI = SingItStar Michael Jackson MILPSI = Sing IT Star: Miliki MK7P41 = Mario Kart 7 Wii @@ -3751,23 +3818,35 @@ MKDE02 = Darky Kart Wii MKTE01 = Mario Kart Wii Teknik MKWP01 = Super Mario Kart for Wii MMRE01 = D.U. Super Mario Bros 2.1 Madness Returns +MP1E16 = New Super Mario Bros. Wii - Mod Pack 1 MRRE01 = New Super Mario Bros. Wii Retro Remix MRRP01 = New Super Mario Bros. Wii Retro Remix +MSDEZ4 = Mini Super Mario Bros Wii Deluxe NEWE01 = New Super Mario Bros Wii 15 A New World +NGSE01 = Super Mario Galaxy 2: The New Green Stars +NHMP01 = New Super Mario Bros. Wii Halloween Mayhem NMGE01 = Neo Mario Galaxy NMGP01 = Neo Mario Galaxy NMNP01 = Newer Super Mario Bros. Wii +NPXW69 = New Pokémon X Wii NRJ1FR = StarSing : NRJ Music Tour v1.1 NSMB02 = New Super Mario Bros. Wii 2 +NSME03 = Newer Super Mario Bros 3 +NSSBW1 = New Super Shell Bros. Wii NSSP01 = Newer Summer Sun NWRP01 = Newer Super Mario Bros. Wii +NYIW69 = New Yoshi's Island Wii +OMGD01 = Outer Mario Galaxy ONKELZ = SingItStar Böhse Onkelz PAL OTFPSI = Sing IT: Operación triunfo +PC5P01 = Wii Points Card PDUE01 = Another Super Mario Bros. Wii +PIKE25 = Pikmin 251 PMNEO1 = New Old Super Mario Bros. Wii POPPSI = SingItStar Pop PPNE01 = New Super Mario Bros. Wii 2: The Next Levels PPNP01 = New Super Mario Bros. Wii 2: The Next Levels +PRMEME = Super Smash Bros. Project Meme 6.9 PROE01 = New Super Mario Bros. Wii 14 Project Mario PT1PSI = SingIt Star Portugal Hits PT2PSI = SingIt Portugal Hits Summer Party @@ -3776,26 +3855,46 @@ PUTA01 = Guitar Hero III Custom : Rock Hits PWNP69 = Pwned Super Mario Bros. Wii R01PET = SingItStar Queen R02PEA = SingItStar Rock Ballads +R14E41 = Just Dance Mega R15POH = SingIt Star Radio 105 +R24E01 = Chibi-Robo! [ENG] +R3ME02 = Metroid Prime: Trilogy - Google Translated +R3MEM1 = Metroid: Other M-Maxximum Edition- R4ZE01 = Fatal Frame 4: Mask of the Lunar Eclipse R4ZP01 = Fatal Frame IV: Mask of the Lunar Eclipse +R64E02 = RiiMajor - Song Pack 1 +R64E03 = RiiMajor - Song Pack 2 +R64E04 = RiiMajor - Song Pack 3 +R64E05 = Melodii +R7CE01 = Captain Rainbow [Eng] R7FEUD = Final Fantasy Fables: Chocobo's Dungeon Undub +R8EEQC = Earth Seeker [ENG] R8FJSC = Takumi Restaurant wa Daihanjou! (Simplified Chinese Translation) R8PC01 = Super Paper Mario(CN) +R8PE02 = Super Paper Isaiah RADP01 = New Super Mario Bros. Wii 0-6 Radiance RCCR78 = Guitar Hero III Custom: Coheed and Cambria RCHC52 = Guitar Hero III Custom : Guitar Hero II +RCME13 = Mario Kart Wii HoopaN13 RCOC99 = Meitantei Conan: Tsuioku no Mirage +RCTE70 = Bola de Drac Z Budokai Tenkaichi 3 Edició en Català [BETA 1] [CUSTOM] +RDCE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Castellano [Beta 2][CUSTOM] RDPE70 = Dragon Ball Z Budokai Tenkaichi 3 Versión! Castellano [BETA 1] RDSZ70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino RDUE01 = DU Super Mario Bros. : Find That Princess RDWE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino[GAMMA][CUSTOM] +RDWPAF = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino Final[CUSTOM] RDXE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino Beta 3 -RDYE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino Beta 3 Update 1 +RDYE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino [BETA 3 - UPDATE 1 ] RDZE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino REBE70 = Dragon Ball Z Budokai Tenkaichi 2[ALPHA][CUSTOM] +RESE70 = Dragon Ball Z Budokai Tenkaichi 3 Versión! Español +REVE64 = Revo Kart 64 REYE70 = Dragon Ball Z Budokai Tenkaichi 3 Version! Latino [BETA 3 - UPDATE 2 ] +RFEK01 = Fire Emblem Akatsuki no Megami +RFEP02 = Fire Emblem: Radiant Dawn - Reverse Recruitment RFEPUD = Fire Emblem: Radian Dawn Undub +RFPE02 = Dii Fit Plus RFYE70 = Dragon Ball Z Budokai Tenkaichi 3 Versión! Latino [BETA 3 - UPDATE 3 ] RG0E52 = Guitar Hero III Custom : Green Day Plus RG1552 = Guitar Hero III Custom : Weird Al Yankovic @@ -3809,6 +3908,7 @@ RGCM52 = Guitar Hero III Custom : Metallica RGCS52 = Guitar Hero III Custom : ClasSick Edition RGEK52 = Guitar Hero III Custom: Slipknot RGGE52 = Guitar Hero III Custom : Rock The Games +RGHA52 = Guitar Hero III Custom: Nutella Edition 1 RGHC20 = Guitar Hero III Custom : Fail Edition RGHC53 = Guitar Hero III - MUSE RGHE18 = Guitar Hero 2k18 @@ -3819,16 +3919,23 @@ RGHE62 = Sweet Home Alabama - GH3 RGHE69 = Guitar Hero III Custom : Legends of METAL RGHEMR = Guitar Hero III Custom : Modern Rock RGHI52 = Guitar Hero III Custom: Chimba +RGHN52 = Guitar Hero III Custom: Guitar Hero Brasil +RGHO52 = Guitar Hero III Custom: Animes Brasil RGHPOH = SingItStar Italian Greatest Hits RGHPS2 = Guitar Hero III Custom : J-Music RGHX52 = Guitar Hero III Custom: Anime's Alex Chan RGKE52 = Guitar Hero III Custom : KoRn RGRM52 = Guitar Hero III Custom: Rock & Metal RGVE99 = Guitar Hero Aerosmith Custom: NOT Aerosmith but... +RGXC52 = Guitar Hero III - Rock Hits Custom v2 RGXEFN = Guitar Hero III Custom: Meteo Last Custom RGXM52 = Guitar Hero III Custom : xMxExTxAxLx's Edition RGZC52 = Guitar Hero III Custom : Led Zeppelin RGZE52 = Guitar Hero III Custom : Shred Edition +RHAE02 = Rii Play +RHAE03 = Dii Play +RHAE04 = Wii Tanks Master +RHAE05 = Wii Tanks Pro RHD222 = The House of the Dead 2 RHD333 = The House of the Dead 3 RHGH52 = Guitar Hero III Custom : RandomHero's @@ -3836,11 +3943,18 @@ RI1POH = SingItStar Italian Party RI2POH = SingItStar Italian Party vol. 2 RI3POH = SingItStar Italian Top.it RJJG52 = Guitar Hero III Custom : JJ-KwiK's Edition +RJKE85 = Jacky Kart Wii +RJKP85 = Jacky Kart Wii +RJUE41 = Just Dance China RK2EUD = Trauma Center: New Blood Undub RKDEUD = Trauma Center: Second Opinion Undub RL9ESD = Guitar Hero Linkin Park RLIL78 = Guitar Hero 2nd Custom -RMCC01 = Mario Kart Wii (Custom) +RM8E02 = Mario Party 8 Widescreen +RM8E03 = Mario Party 8 WS, GSS, No Motion +RM8E04 = Mario Party 8 GCC, No Motion +RM8E05 = Mario Party 8 CPU Only +RMCC01 = Mario Kart Wii RMCE02 = Wiimms MKW Fun 2010-02.p RMCE03 = Wiimms MKW Fun 2010-10.p RMCE04 = Wiimms MKW Fun 2010-12.p @@ -3849,6 +3963,7 @@ RMCE06 = Wiimms MKW Fun 2010-12.ntsc RMCE07 = Wiimms MKW Retro 2011-02.ntsc RMCE08 = Wiimms MKW Fun 2011-03.ntsc RMCE09 = Wiimms MKW Fun 2011-06.ntsc +RMCE0C = MKWii CTs from 2010 RMCE10 = Wiimms MKW Fun 2011-07.ntsc RMCE11 = Wiimms MKW Fun 2011-08.ntsc RMCE12 = Wiimms MKW Fun 2011-11.ntsc @@ -3859,6 +3974,9 @@ RMCE16 = Wiimms MKW Fun 2012-05.ntsc RMCE17 = Wiimms MKW Fun 2012-09.ntsc RMCE18 = Wiimms MKW N64 2012-10.ntsc RMCE19 = Wiimms MKW Fun 2012-12.ntsc +RMCE1C = 100cc Pack +RMCE1H = MKWII HoopaN13 +RMCE1N = Mario Kart Wii HoopaN13 RMCE20 = Wiimms MKW Fun 2013-04.ntsc RMCE21 = Wiimms MKW Fun 2013-09.ntsc RMCE22 = Wiimms MKW Fun 2013-10.ntsc @@ -3878,12 +3996,28 @@ RMCE35 = Wiimms MKW-Fun 2017-12.usa RMCE36 = Wiimms MKW-Fun 2018-03.usa RMCE37 = Wiimms MKW-Fun 2018-06.usa RMCE38 = Wiimms MKW-Fun 2018-09.usa +RMCE39 = Wiimms Mario Kart Fun 2018-12 +RMCE3H = 3Hunts's Custom Track Pack +RMCE3S = Hide and Seek 3DS Pack RMCE40 = Wiimms MKW-Fun 2019-03.usa RMCE41 = Wiimms MKW-Fun 2019-06.usa RMCE42 = Wiimms MKW-Fun 2019-10.usa -RMCE54 = MARIO KART CRIS DELUXE +RMCE43 = Wiimms MKW-Fun 2020-02.usa +RMCE44 = Wiimms MKW-Fun 2020-06.usa +RMCE45 = Wiimms MKW-Fun 2020-12 +RMCE46 = Wiimms MKW-Fun 2021-09.usa +RMCE47 = Wiimms MKW-History 2021-12.usa +RMCE48 = Wiimms MKW-Fun 2022-05.usa +RMCE49 = Wiimms MKW-Fun 2022-11.usa +RMCE4D = 4DR Yoshi1998's Texture And Music Pack +RMCE4P = Potatoman44's CTs Stretched +RMCE50 = Wiimms MKW-Textures 2022-12.usa +RMCE54 = MARIO KART CRIS DELUXE 2 +RMCE5C = 5cc Pack +RMCE60 = Mario Kart Wii Faraphel RMCE64 = Peach Kart 8 RMCE69 = Cria Kart Wii +RMCE6N = Hide and Seek N64 Pack RMCE70 = Stickboy Kart Wii RMCE73 = Mario Kart Adventures RMCE74 = Mario Kart Adventures @@ -3891,29 +4025,167 @@ RMCE75 = Cam, Tom and Troy's CTGP Pack RMCE76 = Pro CT Pack RMCE77 = SpyKid's CT Pack RMCE78 = Mario Kart: Double Dash!! Wii +RMCE7T = Cuber's Hack Pack RMCE81 = Spade's Custom Track Pack +RMCE86 = Mario Kart Cris 4 +RMCE88 = Mario Kart Cris Deluxe 3.0 RMCE89 = Mario Kart Cris Kuin +RMCE8X = Mario Kart Wii X DS +RMCE90 = Mario Kart Fusion -Golden style- +RMCE91 = Mario Kart Fusion -Cris style- RMCE92 = MKWLH100's Custom Track Pack RMCE93 = MKW Hack Pack +RMCE94 = Mario Kart Fusion -Classic Style- +RMCE95 = Mario Kart Fusion -Diamond style- RMCE96 = Mario Kart 6 +RMCE97 = Mario Kart Fusion v2.0 -Deluxe style- RMCE98 = Mario Kart Wii Awesomeness -RMCEA1 = Mario Kart Adventures v0.8 +RMCE99 = Mario Kart Fusion v2.0 -Cris style- +RMCE9R = Rookie's Texture And Music Pack +RMCEA1 = Mario Kart Adventures +RMCEA2 = Mario Kart Wii Deluxe -Blue Edition- +RMCEA3 = Mario Kart Wii Deluxe -Red Edition- +RMCEA4 = Mario Kart Wii Deluxe -Green Edition- +RMCEA5 = Alpha's Track Mix +RMCEA6 = Mario Kart Wii Deluxe -Koopa Edition- +RMCEA7 = Ant Kart Wii RMCEA8 = Mario Kart Arcade JY +RMCEA9 = Mario Kart Wii - The Top 100 +RMCEAI = Mario Kart Wii AIParam Edition +RMCEAQ = Antique Kart Wii +RMCEAT = André's Retro Texture and Music Pack +RMCEAX = Mario Kart Wii but You Never Stop Accelerating RMCEB1 = Mario Kart Wii 2017 -RMCEB2 = Mario Kart Wii 2017 - Version 2.0 +RMCEB2 = Mario Kart Wii 2017 RMCEB4 = Mario Kart Wii Deluxe +RMCEB5 = Mario Kart Wii Deluxe B-Sides RMCEB6 = Mario Kart 7 JY RMCEB8 = Mario Kart Mania +RMCEBC = Neptune777 Forza MAX Broad Challenge +RMCEBM = MKW Hack Pack vX InvisibleRacing +RMCEBR = Mario Kart Brown +RMCEBT = Boost Track Grand Prix +RMCEC7 = Cosmic Kart +RMCECD = Cederic's MKW Texture and Music Pack +RMCECG = Color Grand Prix +RMCECH = Chis Kart Wii +RMCECK = Confused Kart Wii +RMCECL = CTGP Revolution Classic +RMCECN = Hide and Seek GCN Pack RMCECT = Mario Kart Wii CTGP Revolution +RMCECU = Mario Kart Wii but the CPUs Are Impossible +RMCECY = CTGP Classic Pack +RMCED3 = DryBowser Kart Wii +RMCED8 = DryBowser's Unused CT Pack +RMCEDC = Mario Kart Wii but You Can Only Drive on the Road RMCEDK = Darky Kart Wii +RMCEDT = Drift Rebalance with CT +RMCEDX = Dxrk X Hari's Pack +RMCEEX = MKW Exploration Pack +RMCEF1 = Fancy's CT Pack +RMCEF4 = Fe4less' Authentic Texture Pack +RMCEFA = MKW Hack Pack vX 200KMH Version +RMCEFC = Falco's Texture Pack +RMCEFE = Fancy's CT Pack - Extra Edition +RMCEFK = Formula Kart Wii +RMCEFL = Mario Kart Wii Forza MAX LOOK +RMCEFO = Neptune777 Forza MAX Origins +RMCEFR = MKW Hack Pack vX 2X Frames Version RMCEG2 = Mario Kart Wii CTGP Revolution +RMCEG4 = Diddz' Gang Custom Track Pack +RMCEG5 = New Mario Kart Wii 64 +RMCEGB = Hide and Seek GBA Pack +RMCEGN = Giant Objects Mode: Complete Edition RMCEGP = Mario Kart Wii CTGP Revolution +RMCEGT = Neptune777 Xtreme Race GTX +RMCEH5 = HD Battle Track Texture Pack +RMCEH8 = HD's Retro Pack +RMCEHC = CTGP-R HNS Pack +RMCEHD = Mario Kart Wii - HD - Remaster +RMCEHK = MKW Hack Pack vX 1st Person Edition +RMCEHX = Hide and Seek Extreme Pack +RMCEHY = Hypersonic Kart Wii +RMCEI4 = Mario Kart Infinite +RMCEIR = MKW Hack Pack vX Item Rain +RMCEIT = Invisibility Toggle +RMCEJ3 = JTG Texture Pack +RMCEJ6 = JHFR CT Pack +RMCEK1 = 1-Lap Kart Wii +RMCEK3 = King Toad's Epic Music and Texture Pack +RMCEKB = Krash&Burn's Other Texture Pack +RMCEKK = Krash Kart Wii +RMCEKW = Kiwi's Hide and Seek Pack RMCEL1 = Luma's CT Pack RMCEL9 = Mario Kart Legacii +RMCELG = Legacy Kart Wii +RMCEM4 = Mario Kart Super Circuit Wii RMCEM6 = New Mario Kart Seven RMCEM9 = New Mario Kart: Double Dash!! +RMCEMN = Mario Kart Midnight +RMCEMX = Maxed Kart Wii +RMCEMZ = Mizy's Texture Pack +RMCEN2 = Nintendo Remasters +RMCEN8 = Nitro CT Pack +RMCENA = New Adventure All-Stars +RMCENG = Neptune777 Forza MAX New Generation +RMCENH = Navi's HNS CT Pack +RMCENL = Neptune777 Forza MAX Next Layer +RMCENQ = Nevesqq's Texture n' Music Pack +RMCEO4 = OptPack CT Pack +RMCEP4 = Potatoman44's Transformed Tracks +RMCEPG = Penguin Kart Wii +RMCEPH = MKW Hack Pack vX CTDN Version +RMCEPK = Pride Kart Wii +RMCEPT = Platinum Hack Pack +RMCER4 = Ray Kart Wii +RMCER9 = Rosa Kart Wii +RMCERB = Bear Kart Wii +RMCERE = Mario Kart 64Re +RMCERL = Random Laps +RMCERM = Mario Kart Wii Remake +RMCES0 = $uicideboy$ Texture & Music Pack +RMCES1 = Smacpack +RMCESC = Secret Tracks +RMCESH = Shortcut Practice Pack +RMCESR = S☆Ris CT Pack +RMCEST = Skipper's 200Kmh Distribution +RMCESU = SnorgUp's Textures and Music Pack +RMCESY = Spyro's Texture Pack +RMCET0 = TomB's CT Pack +RMCET1 = Wiimms Intermezzo +RMCET2 = Toxic's Texture and Music Pack +RMCET6 = Man - O - Wii's Least Favorites Pack +RMCET7 = Cam, Tom And Troy's CT Pack +RMCETD = AlmostTWD's Favourites +RMCETH = Mario Kart Wii Theob78's Pack +RMCETP = Tan in the Snow Pack +RMCETW = Trent Kart Wii +RMCETX = Toxic's Hide and Seek Pack +RMCEU7 = Mario Kart Wii Ultra Pack +RMCEVI = Vintage Kart Wii +RMCEVK = Violet Kart Wii +RMCEVS = Variation Sensation +RMCEVY = Variety Pack +RMCEW5 = Releasio Kart Wee RMCEW6 = Mario Kart Wii Ultimate +RMCEW8 = Waluigi Kart Wii +RMCEWH = Wheel Kart Wii RMCEWS = Wine's CT Pack +RMCEX1 = Xenon's Hide and Seek CT Collection +RMCEX4 = Mario Kart X +RMCEX5 = Mario Kart Wii - Battle Royale +RMCEXA = Xander Kart Wii +RMCEY3 = Yoshi's Racing Resort +RMCEY8 = Yeet Kart Wii +RMCEY9 = Yosh's Track Pack +RMCEYP = Yoshi's Racing Resort Plus +RMCEYT = Yosh's Track Pack DX +RMCEZ2 = ZPL's Track Collection +RMCEZ8 = Zef Kart Wii +RMCEZC = Zef's CT Pack +RMCEZH = ZPL's Hide and Seek Collection +RMCEZP = Mario Kart Z +RMCJ06 = Wiimms MKW Fun 2010-12.ntsc RMCJ12 = Wiimms MKW Fun 2011-11 RMCJ30 = Wiimms MKW-Fun 2015-12.jap RMCJ31 = Wiimms MKW-Fun 2016-02.jap @@ -3924,17 +4196,44 @@ RMCJ35 = Wiimms MKW-Fun 2017-12.jap RMCJ36 = Wiimms MKW-Fun 2018-03.jap RMCJ37 = Wiimms MKW-Fun 2018-06.jap RMCJ38 = Wiimms MKW-Fun 2018-09.jap +RMCJ39 = Wiimms Mario Kart Fun 2018-12 RMCJ40 = Wiimms MKW-Fun 2019-03.jap RMCJ41 = Wiimms MKW-Fun 2019-06.jap RMCJ42 = Wiimms MKW-Fun 2019-10.jap +RMCJ43 = Wiimms MKW-Fun 2020-02.jap +RMCJ44 = Wiimms MKW-Fun 2020-06.jap +RMCJ45 = Wiimms MKW-Fun 2020-12.jap +RMCJ46 = Wiimms MKW-Fun 2021-09.jap +RMCJ48 = Wiimms MKW-Fun 2022-05.jap +RMCJ49 = Wiimms MKW-Fun 2022-11.jap +RMCJ60 = Mario Kart Wii Faraphel RMCJ64 = Peach Kart 8 RMCJ76 = Pro CT Pack +RMCJ86 = Mario Kart Cris 3.500 CT +RMCJ90 = Mario Kart Fusion +RMCJ91 = Wiimms Mario Kart Fun 2021-09 Reserved RMCJ93 = MKW Hack Pack RMCJA1 = Mario Kart Adventures v0.8 +RMCJA2 = Mario Kart Wii Deluxe +RMCJBR = Mario Kart Brown RMCJCT = Mario Kart Wii CTGP Revolution RMCJL1 = Luma's CT Pack +RMCJT1 = Wiimms Intermezzo +RMCJYP = Yoshi's Racing Resort Plus RMCK41 = Wiimms MKW-Fun 2019-06.kor RMCK42 = Wiimms MKW-Fun 2019-10.kor +RMCK43 = Wiimms MKW-Fun 2020-02.kor +RMCK44 = Wiimms MKW-Fun 2020-06.kor +RMCK45 = Wiimms MKW-Fun 2020-12.kor +RMCK46 = Wiimms MKW-Fun 2021-09.kor +RMCK47 = Wiimms MKW-History 2021-12.kor +RMCK48 = Wiimms MKW-Fun 2022-05.kor +RMCK49 = Wiimms MKW-Fun 2022-11.kor +RMCK60 = Mario Kart Wii Faraphel +RMCK86 = Mario Kart Cris 4 +RMCK91 = Wiimms Mario Kart Fun 2021-09 Reserved +RMCKT1 = Wiimms Intermezzo +RMCKYP = Yoshi's Racing Resort Plus RMCP02 = Wiimms MKW Fun 2010-02.p RMCP03 = Wiimms MKW Fun 2010-10.p RMCP04 = Wiimms MKW Fun 2010-12.p @@ -3976,21 +4275,54 @@ RMCP39 = Wiimms MKW-Fun 2018-12.pal RMCP40 = Wiimms MKW-Fun 2019-03.pal RMCP41 = Wiimms MKW-Fun 2019-06.pal RMCP42 = Wiimms MKW-Fun 2019-10.pal +RMCP43 = Wiimms MKW-Fun 2020-02.pal +RMCP44 = Wiimms MKW-Fun 2020-06.pal +RMCP45 = Wiimms MKW-Fun 2020-12.pal +RMCP46 = Wiimms MKW-Fun 2021-09.pal +RMCP47 = Wiimms MKW-History 2021-12.pal +RMCP48 = Wiimms MKW-Fun 2022-05.pal +RMCP49 = Wiimms MKW-Fun 2022-11.pal +RMCP50 = Wiimms MKW-Textures 2022-12.pal +RMCP60 = Mario Kart Wii Faraphel RMCP64 = Peach Kart 8 RMCP76 = Pro CT Pack +RMCP86 = Mario Kart Cris 4 +RMCP90 = Mario Kart Fusion +RMCP91 = Wiimms Mario Kart Fun 2021-09 Reserved RMCP93 = MKW Hack Pack -RMCPA1 = Mario Kart Adventures v0.8 +RMCP95 = The NMeade's Mario Kart Fun v2.0.1 +RMCP96 = Super Mario Kart Wii +RMCPA1 = Mario Kart Adventures +RMCPA2 = Mario Kart Wii Deluxe +RMCPBR = Mario Kart Brown +RMCPCA = Mario Kart Wii (Catalan Translation) RMCPG2 = Mario Kart Wii CTGP Revolution RMCPGP = Mario Kart CTGP Revolution RMCPL1 = Luma's CT Pack +RMCPT1 = Wiimms Intermezzo +RMCPT2 = Mario Kart Wii - Japanese Regional +RMCPVP = Variety Pack +RMCPYC = Yoshi's Racing Resort Plus +RMCPYP = Yoshi's Racing Resort Plus +RMCR01 = Mario Kart Wii +RMCRYP = Yoshi's Racing Resort Plus RMGC01 = Super Mario Galaxy +RMGE04 = Super Mario Earth +RMGE05 = Super Mario Galaxy: No Black Holes +RMGE06 = Super Mario Galaxy: Anti Piracy +RMGE07 = Transformationless Mario Galaxy +RMGE08 = Super Mario Galaxy: Multiplayer Splitscreen RMGE52 = Guitar Hero III Custom : Megadeth +RMGE64 = SPG64 IN SMG! RMGR01 = Super Mario Galaxy -RMHC08 = Monster Hunter Tri (Custom) +RMHC08 = Monster Hunter Tri RMKE02 = Custom Kart 1 RMMP52 = Guitar Hero III Custom : Metal Mayhem RNEEUD = Naruto Shippuden: Clash of Ninja Revolution 3 Undub +RNVW01 = Super Mario Galaxy: Nvidia Shield TV +RODL01 = Kirby: Revenge of Dream Land ROMESD = Monster Hunter G (English Patched) +ROSE01 = Takt of Magic [ENG] RPJEUD = Arc Rise Fantasia Undub RQQE52 = Guitar Hero III Custom : Queen RSBE02 = Super Smash Bros. Project M Red Version @@ -4048,44 +4380,92 @@ RSBEBP = Super Smash Bros. Brawl Plus RSBEC3 = Super Smash Bros. Project M 3.5 Netplay Build RSBEDH = Super Smash Bros. Brawl Dark Hole/D.A.R.S. RSBEDT = Super Smash Bros. Ultimate Dark Phoenix: Tournament Edition +RSBEI4 = Super Smash Bros. Brawl Iceballz's Build +RSBEK0 = Super Smash Bros. Khaos +RSBELX = Super Smash Bros. Project Lx +RSBEMT = MrTacos's ModPack RSBEN1 = Super Smash Bros. Project M +RSBENQ = Super Smash Bros. but Not Quite! (Gamma Version) +RSBEPL = Super Smash Bros. Project+ RSBEPM = Super Smash Bros. Project M RSBEPW = Super Smash Bros. Project M Wi-Fi +RSBERC = Super Smash Bros. Recolor +RSBERX = Super Smash Bros. PMEX REMIX +RSBES4 = Super Smash Bros. Smash Pack +RSBESL = A Slumber Most Reprobate RSBETE = Super Smash Bros. Legacy TE +RSBEUV = Smash Universe Mod 1.0 +RSBEUW = Super Smash Bros Ultimate For Wii +RSBEW5 = Super Smash Bros. Project Wacky Funster RSBEWM = Super Smash Bros. Project M Wi-Fi RSBEXP = Super Smash Bros. Legacy XP RSBP02 = Master4Robin's Super Smash Bros. Brawl Hack Pack -RSFC99 = Muramasa: The Demon Blade (Custom) +RSFC99 = Muramasa: The Demon Blade (Chinese) RSJESD = Guitar Hero III Custom : System of a Down +RSPE02 = Checkered Sports +RSPE03 = Wii Sports: Storm City +RSPE04 = Dii Sports +RSPE05 = Luna's Wii Sports RSXX78 = Guitar Hero RadioHead RSYP06 = Super Smash Bros. Brawl : YF06's Mod RT4EUD = Tales of Symphonia: Dawn of the New World Undub +RTME70 = Dragon ball Z Budokai Tenkaichi 3 WII TSM RU1P4Q = Disney Sing It:: Sing It Star Singstar 1 RU2P4Q = Disney Sing It: Sing It Star Singstar 2 RUIGGD = SingItStar Ned. 80's +RVLE70 = Dragon Ball Z Budokai Tenkaichi 3 Version Latino Final[CUSTOM] RWDC52 = Guitar Hero III Custom: WD Custom RWWE52 = Guitar Hero III Custom : WWE The Hits RXGC15 = Guitar Hero III Custom - A7X (Avenged Sevenfold) RYAJSC = Yatterman Wii (Simplified Chinese Translation) -RZDC01 = The Legend of Zelda: Twilight Princess (Custom) +RZDC01 = The Legend of Zelda: Twilight Princess +RZNE01 = Zangeki no Reginleiv [Eng] +RZTE02 = Wii Sports Resort - Storm Island +RZTE03 = Wii Are Resorting To Violence S02PES = Sing It Star 90's -S5UE41 = Just Dance Unlimited Party +S12E41 = Just Dance Best Of 2 +S18E41 = Just Dance Fitted 2018 +S2PE41 = Just Dance 2020 Plus +S3EE41 = Just Dance 2023 +S3UE41 = Just Dance Spotlight +S4EE41 = Just Dance Edition Wii +S5SJHI = Inazuma Eleven GO Strikers 2013 +S5UE41 = Just Dance: Unlimited Party +S68E41 = Just Dance 2022 +S69E41 = Just Dance 2023 Edition +S7EE41 = Just Dance 2023 - Wii Edition S80U3Q = SingItStar Ultimate 80s +S85E41 = Just Dance 2021 +S85P41 = Just Dance 2021 SAME01 = New Super Mario Bros. Wii 11 American Revolution SANE01 = New Super Mario Bros. Wii Five Spica Edition SANT3Q = SingItStar Anthems SARP01 = New Super Mario Bros. Wii 4 Arcadia Another Ride SB3EUD = Sengoku Basara: Samurai Heroes Undub -SB4C01 = Super Mario Galaxy 2 (Custom) +SB4C01 = Super Mario Galaxy 2 +SB4DDM = Super Mario Galaxy 2: Daredevil Challenge SB4E02 = Neo Mario Galaxy SB4E03 = Super Mayro Galaxy SB4E04 = Super Mario Sunshine Galaxy SB4E05 = Season Cycle Galaxy +SB4E06 = Super Mario Another Galaxy +SB4E07 = Super Mario Galaxy 2: New Background +SB4E08 = Super Mario Galaxy: Remastered +SB4E09 = Super Mario Galaxy 2: Mii Green Stars +SB4E10 = Spinless Mario Galaxy 2 +SB4E11 = Transformationless Mario Galaxy 2 +SB4E14 = Super Mario Starshine (v1.4) SB4E25 = Super Mario Galaxy 2.5 +SB4E69 = Super Mario Galaxy 69 +SB4EXD = Super Mario Galaxy 2 Deluxe +SB4FE0 = Super Mario Galaxy 2: Fog Edition +SB4GSF = Super Mario Galaxy 2: The Green Star Festival SB4J02 = Neo Mario Galaxy SB4J05 = Season Cycle Galaxy SB4P02 = Neo Mario Galaxy SB4P05 = Season Cycle Galaxy +SB5E01 = Super Mario Galaxy 2 Plus +SBJE41 = Just Dance Melody SBOD3Q = SingItStar Best of Disney SBSE01 = New Super Mario Bros. Wii 17 Bowser's Last Laugh SBVG3Q = SingItStar Boybands vs Girlbands @@ -4094,25 +4474,33 @@ SCLE01 = Cliff Super Mario Bros. Wii SCLJ01 = Cliff Super Mario Bros. Wii SCLP01 = Cliff Super Mario Bros. Wii SCTE01 = The Curse of Black Toad +SCUE8P = Sonic Colors: Ultimate SDAE01 = Scooby-Doo! The Bros Adventure SDNP01 = New SUPER DODO BROS SDRP3Q = SingItStar Deutsch Rock-Pop Vol. 1 SDTH3Q = SingItStar Die Toten Hosen SDUEO1 = DU Super Mario Bros. : DU Edition SDUPO1 = DU Super Mario Bros. : DU Edition +SE1E41 = Just Dance East +SEHE41 = Just Dance Epic Hits +SEKE99 = Ikenie no Yoru [ENG] SEOP01 = New Super Mario Bros. Wii 8 Omega SEOP4Q = Sing It: Edad de Oro del Pop Español SFDE01 = New Super Mario Bros. Wii 9 Virtue: This Fall Darkness SFRE01 = Super Mario Bros. Frozen Edition SFRJ01 = Super Mario Bros. Frozen Edition SFRP01 = Super Mario Bros. Frozen Edition +SG4JDA = Naruto: Super Clash of Ninja 4 SGI1CL = SingIt Clasicos SGI1DB = Sing IT: Dibujos Animados SGI1MC = SingItStar Mecano SGI1ML = Sing It Star: Miliki SGI1PT = Sing IT: Party SGI1RC = Sing IT: Rocks 2 +SGNE41 = Just Dance: Generation SGPTI1 = Sing It Party +SH5E41 = Just Dance Hyper +SHIE41 = Just Dance Hits SIABOH = SingItStar Placebo SIBBHJ = SingItStar Country SIESP1 = Sing It: Canciones en Español @@ -4155,16 +4543,22 @@ SISRP4 = SingItStar Rocks! SISSOH = SingItStar Schlager SISTDK = SingItStar - Turkish Party SIXE01 = New Super Mario Bros Wii 16 Revelations +SJDJ02 = Just Dance Flamengo +SJEE41 = Just Dance 2014 Plus SJME89 = Just Dance Japan SK3EUD = Trauma Team Undub +SL1E41 = Just Dance Starlight SL2PUD = Project Zero 2: Wii Edition Undub SLBE01 = MLG Super Luigi Bros Wii SLBJ01 = MLG Super Luigi Bros. Wii SLBP01 = MLG Super Luigi Bros. Wii SLFE01 = New Super Mario Bros. 3 The Final Levels SLFP01 = New Super Mario Bros. 3: The Final Levels +SLNE01 = Super Luigi Land Wii SM3E01 = Super Mario Bros. 3+ +SMBWMM = New Super Mario Bros. Wii Master Mode SMD3OH = SingItStar e La Magia Disney +SMGS01 = Secret Mario Galaxy SMIG3Q = SingItStar Made in Germany SMME02 = Super Mario: Mushroom Adventure PLUS - Winter Moon SMMP01 = New Super Mario Bros. Wii ANDY AFRO'S Custom Collection Volume 4. @@ -4178,14 +4572,28 @@ SMNE06 = Newer Summer Sun SMNE07 = Newer Holiday Special SMNE08 = Epic Super Bowser World SMNE09 = Old Super Mario Bros. Wii +SMNE0S = New Super Mario Bros. S SMNE10 = Koopa Country SMNE11 = New Super Mario Bros. Wii 4 SMNE12 = Awesomer Super Luigi Mini +SMNE13 = Newest Super Mario Bros. Wii SMNE14 = New Super Mario Bros. Wii: Pain Coins SMNE15 = Newer Super Mario Bros. 7 +SMNE16 = Newer Super Mario Bros. Wii U 3 +SMNE17 = Newer Super Mario Bros. U Ghostly Edition +SMNE18 = Newer Super Mario Bros. Wii U 2 SMNE20 = New Super Mario Bros. H -SMNE23 = Newer Super Mario Bros. Wii: Falling Leaves +SMNE21 = New Super Spike Wii +SMNE22 = New Super Mario Bros. Jungle Adventure Wii +SMNE23 = Newer Falling Leaf +SMNE24 = Newer Super Luigi Bros. Wii U +SMNE25 = Awesome Super Mario Bros. Wii +SMNE26 = Awesomer Super Luigi Mini (Version 1) +SMNE27 = Bowser's New Recruit +SMNE28 = Super Penguin Bros. +SMNE29 = Newer Falling Leaf U SMNE31 = New Super Mario Bros. Wii - Other World +SMNE32 = Ultimate Super Luigi Wii SMNE34 = New Super Mario Bros. Wii: Yoshi Mode SMNE35 = New Super Mario Bros. Wii: Yoshi Mode - Classic Mode SMNE36 = New Super Mario Bros. Wii Hack Pack @@ -4214,19 +4622,65 @@ SMNE59 = New Super Mario Bros. Wii - Quenry17's Level Pack SMNE60 = Remixed Super Mario Bros. Wii SMNE61 = New Super Summer Vacation SMNE62 = New Super Bowser Wii +SMNE64 = New Super Mario Bros. Wii Ultimate SMNE65 = Ghostly Super Ghost Boos Wii SMNE66 = The Legend of Yoshi SMNE67 = Larsenv Super Mario Collection SMNE68 = The Legend of Yoshi DLC SMNE69 = Revised Super Mario Bros. Wii +SMNE71 = Super Mario Superstar +SMNE81 = Bob-Omb Super Mario Bros. Wii +SMNE82 = Quagsire Super Mario Bros. Wii +SMNE83 = Sans Super Mario Bros. Wii +SMNE84 = Toad and Toadette Super Mario Bros. Wii +SMNE86 = Random Super Mario Bros. Wii +SMNE87 = Random Super Mario Bros. Wii 2 +SMNE88 = DU Super Mario Bros. Wii: RoyalSuperMario Edition +SMNE89 = Easy Super Mario Bros. Wii +SMNE90 = Legend Of Custom Levels +SMNEAM = Adventure Super Mario Bros. Wii +SMNEAR = Newer Super Mario All-Stars Revived +SMNEAU = Newer Super Mario Bros. Wii Autumn Adventure +SMNEC7 = New Super Mario Bros. Wii Chaos Edition +SMNECB = Super Classic Mario Bros. Wii +SMNECZ = New Super Coinless Kaizo Wii +SMNEEA = Extra Super Mario Bros. Wii All Stars +SMNEFW = Mario's New Adventure: 1st World +SMNEG4 = New Super Ganondorf Bros. Wii +SMNEH3 = New Super Mario Bros. 3 Halloween Wii +SMNEHS = Custom Super Mario Bros. Wii Halloween Special +SMNEI3 = New Super Mario Bros. Wii Isabelle Edition +SMNEJS = Super Mario Jungle Jam +SMNEKE = A New Kaizo Era +SMNEL0 = New Super Mario Land Wii +SMNEL8 = New Super Larry Wii +SMNELE = New Super Mario Bros. Legacy SMNELL = Newer Super Luigi Wii SMNELM = Newer Super Luigi Wii: Dark Moon +SMNEM5 = Newer Mayro Bros. Wii +SMNEMB = New Super Minecraft Bros. Wii +SMNEMC = New Super Mario Bros. Wii Minecraft +SMNEMF = Mario's Final Adventure Wii SMNEMI = Midi's Super Mario Bros. Wii Just a Little Adventure +SMNEMR = Newer Super Luigi Wii: Dark Moon Reverse +SMNEMS = Mini Super Mario Bros. Wii +SMNEN2 = Normal Super Mario Bros. Wii +SMNEN5 = Newer Super Mario 54 +SMNENL = Newest Super Luigi Wii +SMNENT = Newest Super Mario Bros. Wii +SMNEPE = New Super Mario Bros. Wii: The Pro Edition SMNERE = Retro Mario Bros. SMNERV = RVLution Wii +SMNES8 = New Super SpongeBob Bros. Wii +SMNESL = Super Mario Starlight Adventure SMNESN = New Super Mario Bros. Wii H SMNESS = New Super Mario Bros. 7 +SMNEV0 = Vandalized Super Mario Bros. Wii +SMNEV3 = Volcano Newer Super Mario Bros. Wii +SMNEWC = Vanilla Wacky Super Mario Bros. Wii +SMNEWI = New Super Mario Bros. Wii Winter Edition SMNEXD = Deluxe Super Mario Bros. Wii +SMNEXE = Enhanced Super Mario Bros. Wii Deluxe SMNEXR = Super Mario Remix SMNEYE = 8Forrest's Super Mario Bros. Wii SMNEYL = Luigi's Super Yoshi Bros. @@ -4308,6 +4762,7 @@ SMNJZU = Duck Tales 3 SMNJZV = Release Super Mario Bros. Wii SMNJZW = Depot Super Mario Bros. Wii SMNJZY = Super Mario Skyland +SMNK03 = Newer Super Mario Bros. Wii SMNP02 = Awesomer Super Luigi Mini SMNP03 = Newer Super Mario Bros. Wii SMNP04 = Cannon Super Mario Bros. Wii @@ -4322,6 +4777,7 @@ SMNP14 = New Super Mario Bros. Wii: Pain Coins SMNP15 = Newer Super Mario Bros. 7 SMNP20 = New Super Mario Bros. H SMNP23 = Newer Super Mario Bros. Wii: Falling Leaves +SMNP30 = Super Luigi Land Wii SMNP31 = New Super Mario Bros. Wii - Other World SMNP34 = New Super Mario Bros. Wii: Yoshi Mode SMNP35 = New Super Mario Bros. Wii: Yoshi Mode - Classic Mode @@ -4358,12 +4814,20 @@ SMNP68 = The Legend of Yoshi DLC SMNP77 = New Super Mario Bros. Wii Arcadia SMNPAF = Again Super Mario Bros Wii.Frozen Special SMNPDU = DU Super Mario Bros. : Anniversary Edition +SMNPEF = The End for Newer Super Mario Bros. U +SMNPEV = New Super Mario Bros. Wii The End of Vacation... +SMNPF4 = Newer Super Mario 54 +SMNPGG = Super Mario Green Star Groove +SMNPLA = Luigi's Next Adventure SMNPLL = Newer Super Luigi Wii SMNPLM = Newer Super Luigi Wii: Dark Moon +SMNPLT = New Super Little Timmy Wii +SMNPMF = Mario's Final Adventure Wii SMNPMI = Midi's Super Mario Bros. Wii Just A Little Adventure SMNPO1 = New Super Mario Custom Edition SMNPRE = Retro Mario Bros. SMNPRV = RVLution Wii +SMNPSW = New Super Sonic Wii SMNPXD = Deluxe Super Mario Bros. Wii SMNPXR = Super Mario Remix SMNPYE = 8Forrest's Super Mario Bros. Wii @@ -4390,42 +4854,74 @@ SMVP01 = Super Mario Vacation SMWE01 = Newer Super Mario World U SMWJ01 = Newer Super Mario World U SMWP01 = Newer Super Mario World U +SNBE66 = Lava Super Mario Bros. Wii Apocalypse SNLE01 = New Super Mario Bros. Wii 0-2 Next Generation Levels SO3EUD = Rune Factory: Tides of Destiny Undub +SOLO41 = Just Dance Solo SOME02 = Rhythm Heaven Fever Repainted +SOMR01 = The rhythm of heaven +SOUE41 = Just Dance Ocean SP9P4Q = SingIt Star POP 2009 SPRE01 = New Super Mario Bros. Wii 14 Project Mario SRBP4Q = SingItStar: R&B SRGP01 = New Super Mario Bros Wii 2 Reggie SRHP01 = New Super Mario Bros. Wii 7 Retro Heaven +SRNE41 = Just Dance: Revolution SRNP01 = New Super Mario Bros. Wii Revolution SRVP01 = New Super Mario Bros Revolution +SRZE8P = Sonic Riders: Regravitified SSLPOH = SingItStar Legends +SSQE02 = Super Isaiah Party +SSQE03 = Mario Party Project Hudson +SSQE04 = Tanooki Mr. L Mail Shy Guy Mod +SSQE05 = Mario Party 9 Repainted +SSQE06 = Yoshi Party SSSE01 = New Super Mario Bros. Wii: Summer Sun ST8P75 = SingItStar 80's STAP75 = SingItStar Apres Ski Hits STCP75 = SingItStar Singstar STDP75 = SingItStar Deutsch Rock-Pop +STFE41 = Just Dance Focus STHP75 = SingItStar Hottest Hits STPP75 = SingItStar Pop Hits STQP75 = SingItStar Queen STRP75 = SingItStar Rock Ballads STSP75 = SingItStar Schlager +SU5E41 = Just Dance Lights +SUPE02 = Dii Party SURE01 = New Super Mario Bros. Wii 19 Resurrection U +SV1E41 = Just Dance: Unlimited Party (Vol. 1) +SV2E41 = Just Dance: Unlimited Party (Vol. 2) +SV4E41 = Just Dance Infinity Party +SVMEBR = New Super Mario All-Stars HD SWBP01 = New Super Mario Bros. Wii 0 Where It All Began SX3PUD = Pandora's Tower Undub SXEF52 = Guitar Hero III Custom : Megadeth SXFF52 = Guitar Hero III Custom : My Chemical Romance SZEE01 = New Super Mario Bros Wii 13 Shadow Zero Escape +TGSE01 = Super Mario Galaxy: The Green Stars +TKG1ES = Super Mario Galaxy: The Kaizo Green Stars +TKGS03 = Super Mario Galaxy 2: The Kaizo Green Stars +TLLE01 = Super Mario Galaxy 2: The Lost Levels +TPHE01 = Mario Kart Wii: The Puzzling Hotel +TPHJ01 = Mario Kart Wii: The Puzzling Hotel +TPHP01 = Mario Kart Wii: The Puzzling Hotel +ULTE41 = Just Dance Ultra UUUE01 = New Super Mario Bros. Wii 19 Resurrection U +UWSMG1 = Super Mario Galaxy: Underwater Edition +UWSMG2 = Super Mario Galaxy 2: Underwater Edition VIPE01 = New Super Mario Bros Wii 18 Vip Mix WARE01 = DU Super Wario Bros. WFFF4I = Fatal Frame 4: Mask of the Lunar Eclipse +WMXE01 = A Very Merry Wii Music Christmas +WMXK01 = A Very Merry Wii Music Christmas XBKE52 = Guitar Hero III Custom : Bullet For Kamelot XNWE52 = Guitar Hero III Custom: Nightwish XXXX02 = Mario Kart Teknik +Y1PE41 = Just Dance 2023 Wii Edition Extras ZM7E52 = Call of Duty - Modern Warfare - Reflex Edition - Zombie Mode ZXFP52 = Guitar Hero 3 Encore +DC8A = Line Attack Heroes W22E = Planet Fish W24E = 2 Fast 4 Gnomz W24P = 2 Fast 4 Gnomz @@ -4433,153 +4929,153 @@ W2AE = Big Bass Arcade W2CE = Brain Challenge W2CJ = Brain Challenge W2CP = Brain Challenge -W2FP = Physiofun - Balance Training -W2GD = Phoenix Wright Ace Attorney: Justice for All (Deutsche Version) -W2GE = Phoenix Wright: Ace Attorney Justice for All -W2GF = Phoenix Wright: Ace Attorney: Justice for All -W2GI = Phoenix Wright: Ace Attorney: Justice for All +W2FP = Physio Fun - Balance Training +W2GD = Phoenix Wright - Ace Attorney Justice for All +W2GE = Phoenix Wright - Ace Attorney Justice for All +W2GF = Phoenix Wright - Ace Attorney Justice for All +W2GI = Phoenix Wright - Ace Attorney - Justice for All W2GJ = Gyakuten Saiban 2 -W2GP = Phoenix Wright Ace Attorney: Justice for All -W2GS = Phoenix Wright Ace Attorney: Justice for All +W2GP = Phoenix Wright - Ace Attorney Justice for All +W2GS = Phoenix Wright - Ace Attorney - Justice for All W2IE = Fishie Fishie W2IP = Fishie Fishie -W2JE = Just Jam +W2JE = Just JAM W2KE = Let's Catch W2KJ = Let's Catch W2KP = Let's Catch W2LE = Bloons W2LP = Bloons -W2ME = Blaster Master: Overdrive -W2MP = Blaster Master: Overdrive +W2ME = Blaster Master - Overdrive +W2MP = Blaster Master - Overdrive W2OE = My Aquarium 2 -W2OJ = Blue Oasis: Michinaru Shinkai +W2OJ = Blue Oasis - Michinaru Shingai W2OP = My Aquarium 2 -W2PP = Physiofun: Pelvic Floor Training +W2PP = Physio Fun - Pelvic Floor Training W2TE = Drill Sergeant Mindstrong -W2TJ = Onitore ~Kyoukan wa Onigunsou~ +W2TJ = Onitore - Kyoukan wa Onigunsou W2TP = Brain Cadets W2YE = Fireplacing W2YP = My Fireplace -W34J = Simple Series Vol. 4: The Misshitsu kara no Dasshutsu -W3AE = Carmen Sandiego Adventures in Math: The Big Ben Burglary +W34J = Simple Series Vol. 4 - The Misshitsu kara no Dasshutsu +W3AE = Carmen Sandiego Adventures in Math - The Big Ben Burglary W3BE = Soccer Bashi W3BP = Soccer Bashi -W3DJ = 3° C +W3DJ = 3 Degrees Celcius W3FE = 3D Pixel Racing W3FP = 3D Pixel Racing -W3GD = Phoenix Wright Ace Attorney 3: Trials And Tribulations -W3GE = Phoenix Wright Ace Attorney: Trials and Tribulations -W3GF = Phoenix Wright: Ace Attorney: Trials and Tribulations -W3GI = Phoenix Wright: Ace Attorney: Trials and Tribulations +W3GD = Phoenix Wright - Ace Attorney Trials and Tribulations +W3GE = Phoenix Wright - Ace Attorney Trials and Tribulations +W3GF = Phoenix Wright - Ace Attorney Trials and Tribulations +W3GI = Phoenix Wright - Ace Attorney - Trials and Tribulations W3GJ = Gyakuten Saiban 3 -W3GP = Phoenix Wright Ace Attorney: Trials and Tribulations -W3GS = Phoenix Wright: Ace Attorney Trials and Tribulations (Textos en español) +W3GP = Phoenix Wright - Ace Attorney Trials and Tribulations +W3GS = Phoenix Wright - Ace Attorney - Trials and Tribulations W3JE = Triple Jumping Sports W3KE = ThruSpace W3KJ = Surinuke Anatousu -W3KP = ThruSpace: High Velocity 3D Puzzle -W3LE = Carmen Sandiego Adventures in Math: The Lady Liberty Larceny -W3ME = The Three Musketeers: One for all -W3MP = The Three Musketeers: One for all +W3KP = ThruSpace - High Velocity 3D Puzzle +W3LE = Carmen Sandiego Adventures in Math - The Lady Liberty Larceny +W3ME = The Three Musketeers - One For All +W3MP = The Three Musketeers - One For All W3PE = Triple Throwing Sports W3RE = Triple Running Sports W3SE = Triple Shot Sports -W3TE = Pearl Harbor Trilogy - 1941: Red Sun Rising -W42J = Fortune: Hoshi no Furisosogu Oka -W44E = Stop Stress: A Day of Fury -W44P = Stop Stress: A Day of Fury +W3TE = Pearl Harbor - Episode 1 - Red Sun Rising +W42J = F-O-R-T-U-N-E - Hoshi no Furi Sosogu Oka +W44E = Stop Stress - A Day of Fury +W44P = Stop Stress - A Day of Fury W48E = ShadowPlay W4AE = Arcade Sports -W4AP = Arcade Sports: Air Hockey, Bowling, Pool, Snooker +W4AP = Arcade Sports W4KE = Deer Captor -W4KJ = Shikagari -W4OJ = Shikakui Atama wo Marukusuru Challenge +W4KJ = Shika Gari +W4OJ = Shikakui Atama wo Maru Kusuru - Mainichi Minna no Challenge Hen W4TE = Spaceball Revolution W4TP = Spaceball Revolution W54E = 5 Spots Party W54P = 5 Spots Party W5AE = 5 Arcade Gems W5AP = 5 Arcade Gems -W5IE = 5 in 1 Solitaire -W6BE = Eco Shooter: Plant 530 +W5IE = 5-in-1 Solitaire +W6BE = Eco Shooter - Plant 530 W6BJ = 530 Eco Shooter -W6BP = Eco-Shooter: Plant 530 -W72P = Successfully Learning German Year 3 -W73P = Successfully Learning German Year 4 -W74P = Successfully Learning German Year 5 -W7IP = Successfully Learning German Year 2 -W82J = Jintori Action Taikokenchi Karakuri Shiro no Nazo +W6BP = Eco Shooter - Plant 530 +W72P = Successfully Learning German - Year 3 +W73P = Successfully Learning German - Year 4 +W74P = Successfully Learning German - Year 5 +W7IP = Successfully Learning German - Year 2 +W82J = Jintori Action! Taikoukenchi - Karakuri Shiro no Nazo W8BP = Babel Rising -W8CE = Bit.Trip Core -W8CJ = BIT.TRIP CORE: Rhythm Seijin no Gyakushuu -W8CP = Bit.Trip Core -W8DJ = Mebius Drive -W8IJ = Hachi-One Diver Wii +W8CE = Bit. Trip Core +W8CJ = Bit. Trip Core - Rhythm Seijin no Gyakushou +W8CP = Bit. Trip Core +W8DJ = Moebius Drive +W8IJ = 81diver Wii W8LE = Balloon Pop Festival -W8PJ = Ouchi de Mugen Puchi Puchi Wii -W8WE = Happy Holidays: Halloween -W8WP = Happy Holidays: Halloween +W8PJ = Ouchide Mugen Puti Puti +W8WE = Happy Holidays - Halloween +W8WP = Happy Holidays - Halloween W8XE = Battle Poker W9BE = Big Town Shoot Out -W9BP = Big Town Shoot +W9BP = Big Town Shoot Out W9IE = Evasive Space W9IJ = Kiken Kuuiki W9LE = Christmas Clix -W9RE = Happy Holidays: Christmas -W9RP = Happy Holidays: Christmas +W9RE = Happy Holidays - Christmas +W9RP = Happy Holidays - Christmas W9UE = Cruise Party W9UP = Cruise Party WA2E = Magnetica Twist WA2J = Minna de Puzzloop WA2P = Actionloop Twist -WA4E = WarioWare: D.I.Y. Showcase -WA4J = WarioWare: D.I.Y. Showcase -WA4P = WarioWare: Do It Yourself - Showcase -WA5E = Carmen Sandiego Adventures in Math: The Island of Diamonds +WA4E = WarioWare D.I.Y. Showcase +WA4J = WarioWare - D.I.Y. Showcase +WA4P = WarioWare D.I.Y. Showcase +WA5E = Carmen Sandiego Adventures in Math - The Island of Diamonds WA7E = Toribash -WA7P = Toribash Violence Perfected -WA8E = Art Style: Rotozoa -WA8J = Art Style: Penta Tentacles -WA8P = Art Style: Penta Tentacles +WA7P = Toribash - Violence Perfected +WA8E = Art Style - ROTOZOA +WA8J = Art Style Series - PENTA TENTACLES +WA8P = Art Style - PENTA TENTACLES WAAE = Aya and the Cubes of Light WAAP = Aya and the Cubes of Light WABE = Art of Balance WABP = Art of Balance WACE = Arcade Essentials WACP = Arcade Essentials -WAEE = Around The World -WAEP = Around the world -WAFE = Airport Mania: First Flight -WAFP = Airport Mania: First Flight +WAEE = Around the World +WAEP = Around the World +WAFE = Airport Mania - First Flight +WAFP = Airport Mania - First Flight WAGE = Pinocchio's Puzzle WAHE = Trenches Generals -WAHP = Trenches: Generals +WAHP = Trenches Generals WAIE = 101-in-1 Explosive Megamix WAIP = 101-in-1 Explosive Megamix WAJE = MotoHeroz WAJP = MotoHeroz -WAKE = Carmen Sandiego Adventures in Math: The Case of the Crumbling Cathedral -WALE = Art Style: Light Trax -WALJ = Art Style: Lightstream -WALP = Art Style: light trax -WAME = Carmen Sandiego Adventures in Math: The Great Gateway Grab +WAKE = Carmen Sandiego Adventures in Math - The Case of the Crumbling Cathedral +WALE = Art Style - light trax +WALJ = Art Style Series - Lightstream +WALP = Art Style - light trax +WAME = Carmen Sandiego Adventures in Math - The Great Gateway Grab WANE = Ant Nation WANP = Ant Nation WAOE = The Very Hungry Caterpillar's ABCs WAOJ = Harapeko Aomushi no ABC -WAOP = The Very Hungry Caterpillar´s ABC -WAQJ = Yakuman Wii: Ide Yousuke no Kenkou Mahjong -WARJ = Tsuushin Taikyoku Igo Doujou 2700 Mon -WASJ = Tsuushin Taikyoku: Hayazashi Syogi Sandan +WAOP = The Very Hungry Caterpillar's ABCs +WAQJ = Yakuman Wii - Ide Yosuke no Kenkou Mahjong +WARJ = Tsuushin Taikyoku - Igo Dojo 2700-Mon +WASJ = Tsuushin Taikyoku - Hayazashi Shogi Sandan WATE = Astro Bugz Revenge -WAUJ = Tsūshin Taikyoku: World Chess +WAUJ = Tsuushin Taikyoku - World Chess WAYE = And Yet It Moves WAYP = And Yet It Moves -WAZE = The Amazing Brain Train -WB2E = Strong Bad Episode 4: Dangeresque 3 -WB2P = Strong Bad Episode 4: Dangeresque 3 -WB3E = Strong Bad Episode 5: 8-bit is Enough -WB3P = Strong Bad Episode 5: 8-bit is Enough +WAZE = The Amazing Brain Train! +WB2E = Strong Bad's Cool Game for Attractive People - Episode 4 - Dangeresque 3 - The Criminal Projective +WB2P = Strong Bad's Cool Game for Attractive People - Episode 4 - Dangeresque 3 - The Criminal Projective +WB3E = Strong Bad's Cool Game for Attractive People - Episode 5 - 8-Bit Is Enough +WB3P = Strong Bad's Cool Game for Attractive People - Episode 5 - 8-Bit Is Enough WB4E = Wild West Guns WB4J = Wild West Guns WB4P = Wild West Guns @@ -4601,16 +5097,16 @@ WBBJ = Board Warriors WBBP = Snowboard Riot WBDE = Brain Drain WBDP = Brain Drain -WBEE = Pong Toss: Frat Party Games -WBEP = Beer Pong: Frat Party Games -WBFE = Bit.Trip Fate -WBFP = Bit.Trip Fate -WBGP = Bang Attack +WBEE = Pong Toss! Frat Party Games +WBEP = Beer Pong! - Frat Party Games +WBFE = Bit. Trip Fate +WBFP = Bit. Trip Fate +WBGP = Bang Attack - Project Bang WBHE = Blood Beach WBHP = Blood Beach WBIE = Boingz -WBJE = Harvest Moon: My Little Shop -WBJJ = Bokujou Monogatari Series: Makiba no Omise +WBJE = Harvest Moon - My Little Shop +WBJJ = Bokujou Monogatari Series - Makiba no Omise WBKE = Arkanoid Plus! WBKJ = Arkanoid Plus! WBKP = Arkanoid Plus! @@ -4618,33 +5114,32 @@ WBLE = Bubble Bobble Plus! WBLJ = Bubble Bobble Wii WBLP = Bubble Bobble Plus! WBME = My Pokémon Ranch -WBMJ = Minna no Pokémon Bokujou +WBMJ = Minna no Pokémon Bokujou - Platina Taiouban WBMP = My Pokémon Ranch WBNE = Bonsai Barber WBNJ = Bonsai Barber WBNP = Bonsai Barber WBOE = Gravitronix -WBPE = Plättchen Twist 'n' Paint -WBPP = PLÄTTCHEN - twist 'n' paint +WBPE = Plaettchen Twist 'n' Paint +WBPP = Plaettchen Twist 'n' Paint WBQE = Star Soldier R WBQJ = Star Soldier R WBQP = Star Soldier R -WBRP = Pirates: The Key of Dreams +WBRP = Pirates - The Key of Dreams WBSE = Pop WBSJ = Pop WBSP = Pop -WBTJ = Fantasic Tambourine WBVE = SPOGS Racing WBVP = SPOGS Racing WBWE = Critter Round-Up WBWJ = Saku Saku Animal Panic WBWP = Critter Round-Up -WBXE = Strong Bad Episode 1: Homestar Ruiner -WBXP = Strong Bad Episode 1: Homestar Ruiner -WBYE = Strong Bad Episode 2: Strong Badia - The Free -WBYP = Strong Bad Episode 2: Strong Badia - The Free -WBZE = Strong Bad Episode 3: Baddest of the Bands -WBZP = Strong Bad Episode 3: Baddest of the Bands +WBXE = Strong Bad's Cool Game for Attractive People - Episode 1 - Homestar Ruiner +WBXP = Strong Bad's Cool Game for Attractive People - Episode 1 - Homestar Ruiner +WBYE = Strong Bad's Cool Game for Attractive People - Episode 2 - Strong Badia the Free +WBYP = Strong Bad's Cool Game for Attractive People - Episode 2 - Strong Badia the Free +WBZE = Strong Bad's Cool Game for Attractive People - Episode 3 - Baddest of the Bands +WBZP = Strong Bad's Cool Game for Attractive People - Episode 3 - Baddest of the Bands WC2E = Crystal Defenders R2 WC2J = Crystal Defenders R2 WC2P = Crystal Defenders R2 @@ -4652,62 +5147,62 @@ WC6E = Chronos Twins DX WC6P = Chronos Twins DX WC8J = Line Attack Heroes WCHE = Chess Challenge! -WCHP = Chess Challenge +WCHP = Chess Challenge! WCIE = Crystal Defenders R1 WCIJ = Crystal Defenders R1 WCIP = Crystal Defenders R1 WCJE = Cocoto Platform Jumper -WCJP = Cocoto: Platform Jumper -WCKE = chick chick BOOM -WCKJ = chick chick BOOM -WCKP = chick chick BOOM -WCLE = Doc Clock: The Toasted Sandwich of Time +WCJP = Cocoto Platform Jumper +WCKE = Chick Chick BOOM +WCKJ = Chicken Battle! Chick Chick BOOM +WCKP = Chick Chick BOOM +WCLE = Doc Clock - The Toasted Sandwich of Time WCNJ = Tokyo City Nights WCOE = Cocoto Fishing Master WCOP = Cocoto Fishing Master WCPE = Copter Crisis WCPP = Copter Crisis WCRE = Carnival King -WCSE = CueSports: Pool Revolution -WCSJ = Cue Sports: Wi-Fi Taisen Billiards -WCSP = CueSports: Snooker vs Billiards +WCSE = Pool Revolution - Cue Sports +WCSJ = Cue Sports - Wi-Fi Taisen Billiards +WCSP = Cue Sports - Snooker vs. Billiards WCUE = 3-2-1, Rattle Battle! -WCUJ = Atsui 12-Game: FuriFuri Party! +WCUJ = Atsui 12 Game - Furi Furi Party! WCUP = 3-2-1, Rattle Battle! WCVE = Cave Story WCVP = Cave Story WCZE = ColorZ WCZJ = ColorZ WCZP = ColorZ -WD2J = Simple Wii Series Vol. 2: The Number Puzzle Neo -WD9E = Castlevania The Adventure ReBirth +WD2J = Simple Series Vol. 2 - The Number Puzzle neo +WD9E = Castlevania - The Adventure ReBirth WD9J = Dracula Densetsu ReBirth -WD9P = Castlevania: The Adventure ReBirth +WD9P = Castlevania - The Adventure ReBirth WDAJ = Darts Wii WDBE = Derby Dogs WDBJ = Derby Dog WDDE = Diner Dash WDDJ = Diner Dash WDDP = Diner Dash -WDEE = Magic Destiny Astrological Games -WDEP = Magic Destiny Astrological Games -WDFE = Defend your Castle -WDFP = Defend your Castle -WDHE = Art Style: ROTOHEX -WDHJ = Art Style: Dialhex -WDHP = Art Style: ROTOHEX -WDIJ = Simple Wii Series Vol. 1: The Block Kuzushi Neo +WDEE = Magic Destiny - Astrological Games +WDEP = Magic Destiny - Astrological Games +WDFE = Defend Your Castle +WDFP = Defend Your Castle +WDHE = Art Style - ROTOHEX +WDHJ = Art Style Series - DIALHEX +WDHP = Art Style - ROTOHEX +WDIJ = Simple Series Vol. 1 - The Block Kuzushi neo WDKE = Dart Rage WDME = Dr. Mario Online Rx WDMJ = Dr. Mario & Saikin Bokumetsu WDMP = Dr. Mario & Germ Buster -WDNJ = Discipline Teikoku no Tanjyou +WDNJ = Discipline - Teikoku no Tanjyou WDOE = Driift Mania WDOP = Driift Mania -WDPE = Dr. Mario Online Rx (Friend Battle Demo) -WDPJ = Dr. Mario Online Rx (Friend Battle Demo) -WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) -WDRE = Mr Driller W +WDPE = Dr. Mario Online Rx - Friend Battle +WDPJ = Dr. Mario & Saikin Bokumetsu - Furendo Taisen +WDPP = Dr. Mario & Germ Buster - Friend Battle +WDRE = Mr. Driller W WDRJ = Mr. Driller World WDRP = Mr. Driller W WDSE = Dragon Master Spell Caster @@ -4716,50 +5211,50 @@ WDVE = Voodoo Dice WDVP = Voodoo Dice WDXE = Diatomic WE6E = My Dolphin -WE6J = Sea Farm: Iruka to Watashi no Showtime +WE6J = Sea Farm - Iruka to Watashi no Showtime WE9E = Alien Crush Returns WE9J = Alien Crush Returns WE9P = Alien Crush Returns WEDE = Eduardo the Samurai Toaster -WEME = Aha! I Got It! Escape Game -WEMJ = 1 Nuke! Dasshutsu Game * My Home Hen -WEMP = Aha! I Got It! Escape Game +WEME = Aha! I Got It! - Escape Game +WEMJ = 1 Nuke! Dasshutsu Game - My Home Hen +WEMP = Aha! I Got It! - Escape Game WENE = TNT Racers WENP = TNT Racers WEQE = Equilibrio WEQJ = Katamuki Spirits WEQP = Equilibrio WERE = My Aquarium -WERJ = Blue Oasis: The Healing Space of Fish +WERJ = Blue Oasis - Sakana no Iyashi Kuuken WERP = My Aquarium -WETE = PictureBook Games: Pop-Up Pursuit -WETJ = Asoberu Ehon: Tobida Sugoroku -WETP = PictureBook Games: A Pop-Up Adventure +WETE = PictureBook Games - Pop-Up Pursuit +WETJ = Asoberu Ehon Tobida Sugoroku! +WETP = PictureBook Games - A Pop-Up Adventure WEVE = Viral Survival WEVJ = Peakvox Escape Virus WEVP = Viral Survival -WF2E = Final Fantasy Crystal Chronicles: My Life as a Darklord -WF2J = Final Fantasy Crystal Chronicles: Hikari to Yami no Himegimi to Sekai Seifuku no Tou -WF2P = Final Fantasy Crystal Chronicles: My Life as a Darklord -WF3E = Family Games - Pen & Paper Edition -WF4E = Final Fantasy IV: The After Years -WF4J = Final Fantasy IV: The After Years - Tsuki no Kikan -WF4P = Final Fantasy IV: The After Years +WF2E = Final Fantasy Crystal Chronicles - My Life as a Darklord +WF2J = Final Fantasy Crystal Chronicles - The Tower of the Chaos Princess +WF2P = Final Fantasy Crystal Chronicles - My Life as a Darklord +WF3E = Family Games - Pen and Paper Edition +WF4E = Final Fantasy IV - The After Years +WF4J = Final Fantasy IV - The After Years - Tsuki no Kikan +WF4P = Final Fantasy IV - The After Years WF5E = Family Card Games -WF5J = Okiraku Daifugou Wii +WF5J = Okiraku Daifugou Wii - Honkaku Wi-Fi Net Taisen WF5P = Family Card Games WF6E = Frobot WFAE = Fast Draw Showdown WFAP = Fast Draw Showdown WFBE = Sandy Beach -WFBJ = Beach e Oki o Tsukuccha Wow! +WFBJ = Beach de Oshiro wo Tsukuccha Wow! WFBP = Sandy Beach -WFCE = Final Fantasy Crystal Chronicles: My Life as a King -WFCJ = Final Fantasy Crystal Chronicles: Chiisana Ousama to Yakusoku no Kuni -WFCP = Final Fantasy Crystal Chronicles: My Life as a King +WFCE = Final Fantasy Crystal Chronicles - My Life as a King +WFCJ = Final Fantasy Crystal Chronicles - My Life as a King +WFCP = Final Fantasy Crystal Chronicles - My Life as a King WFDE = Save the Furries WFDP = Save the Furries -WFEE = Fenimore Fillmore "The Westerner" +WFEE = Fenimore Fillmore - The Westerner WFFE = Fun! Fun! Minigolf WFFJ = Fun! Fun! Minigolf WFFP = Fun! Fun! Minigolf @@ -4778,108 +5273,108 @@ WFME = Family & Friends Party WFMP = Family & Friends Party WFNE = Fish Tank WFNP = Fish Tank -WFPJ = Hirameki Card Battle Mekuruca -WFQE = Frogger: Hyper Arcade Edition -WFQP = Frogger: Hyper Arcade Edition +WFPJ = Hirameki Card Battle - Mekuruka +WFQE = Frogger - Hyper Arcade Edition +WFQP = Frogger - Hyper Arcade Edition WFRP = Frogger Returns -WFSJ = Minna no Theater Wii -WFTE = Fish 'em All -WFTP = Fish'em All! +WFSJ = Minna no Theatre Wii +WFTE = Fish'em All +WFTP = Fish'em All WFUE = Furry Legends WFUP = Furry Legends -WFVE = Soccer Up -WFVP = Football Up -WFWE = Flower Works -WFWP = Flowerworks: Follie's Adventure -WFXE = Cosy Fire +WFVE = Soccer Up! +WFVP = Football Up! +WFWE = Flowerworks +WFWP = Flowerworks - Follie's Adventure +WFXE = Cozy Fire WFXP = Cosy Fire WFYE = Family Games Pen & Paper Edition -WFYP = Family Games Pen & Paper Edition -WG2J = Sugar Bunnies Wii: Youkoso * Bunnies Field e +WFYP = Family Games - Pen & Paper Edition +WG2J = Sugarbunnies Wii - Youkoso Bunnies Field-e WG4E = GhostSlayer WGAE = Ghost Mania WGAP = Ghost Mania -WGDE = Gradius Rebirth -WGDJ = Gradius Rebirth: Updated -WGDP = Gradius Rebirth -WGFP = Girlfriends Forever: Magic Skate -WGGE = Gabrielle's Ghostly Groove: Monster Mix -WGGJ = Ushimitsu Monstruo Puchi: Fushigi na Oshiro no Dance Party -WGGP = Gabrielle's Ghostly Groove: Monster Mix +WGDE = Gradius ReBirth +WGDJ = Gradius ReBirth +WGDP = Gradius ReBirth +WGFP = Girlfriends Forever - Magic Skate +WGGE = Gabrielle's Ghostly Groove - Monster Mix +WGGJ = Ushimitsu Monstruo - Fushigina Oshiro no Dance Party +WGGP = Gabrielle's Ghostly Groove - Monster Mix WGLE = Gene Labs -WGMJ = Game SoundStation +WGMJ = Game Sound Station WGOE = World of Goo -WGOJ = World of Goo +WGOJ = Goo no Wakusei WGOP = World of Goo WGPE = AquaSpace -WGPJ = Aqua Living: TV de Nagameru Uotachi -WGPP = Zenquaria: Virtual Aquarium -WGSD = Phoenix Wright: Ace Attorney (Deutsche Version) -WGSE = Phoenix Wright: Ace Attorney -WGSF = Phoenix Wright: Ace Attorney (French Version) -WGSI = Phoenix Wright: Ace Attorney -WGSJ = Gyakuten Saiban: Yomigaeru Gyakuten -WGSP = Phoenix Wright: Ace Attorney -WGSS = Phoenix Wright: Ace Attorney (Textos en español) +WGPJ = Aqua Living - Terebi de Nagameru Sakanatachi +WGPP = Zenquaria - Virtual Aquarium +WGSD = Phoenix Wright - Ace Attorney +WGSE = Phoenix Wright - Ace Attorney +WGSF = Phoenix Wright - Ace Attorney +WGSI = Phoenix Wright - Ace Attorney +WGSJ = Gyakuten Saiban - Yomigaeru Gyakuten +WGSP = Phoenix Wright - Ace Attorney +WGSS = Phoenix Wright - Ace Attorney WGTJ = Sekai no Omoshiro Party Game WGUJ = Aero Guitar WGVE = Groovin' Blocks WGYE = Gyrostarr WH3E = Home Sweet Home WH3P = Home Sweet Home -WHBE = Hubert the Teddy Bear: Winter Games -WHEE = Heracles: Chariot Racing -WHEP = Heracles: Chariot Racing -WHFE = Heavy Fire: Special Operations -WHFP = Heavy Fire: Special Operations +WHBE = Hubert the Teddy Bear - Winter Games +WHEE = Heracles Chariot Racing +WHEP = Heracles Chariot Racing +WHFE = Heavy Fire - Special Operations +WHFP = Heavy Fire - Special Operations WHHJ = Let's Zenryoku Hitchhike!!!!!!!!! WHOE = Hockey Allstar Shootout WHPE = Sexy Poker WHPP = Sexy Poker WHPU = Sexy Poker -WHRE = Heron Steam Machine -WHRP = Heron: Steam Machine +WHRE = Heron - Steam Machine +WHRP = Heron - Steam Machine WHUE = Ghost Mansion Party WHUJ = Ghost Mansion Party WHUP = Ghost Mansion Party -WHVE = High Voltage: Hot Rod Show +WHVE = High Voltage Hot Rod Show WHWE = HoopWorld -WHWP = HoopWorld: BasketBrawl +WHWP = HoopWorld WHXE = Helix WHXP = Helix -WHYE = Heavy Fire: Black Arms +WHYE = Heavy Fire - Black Arms WHZE = Horizon Riders WHZP = Horizon Riders -WIBE = bittos+ -WICE = NyxQuest Kindred Spirits +WIBE = Bittos Plus +WICE = NyxQuest - Kindred Spirits WICJ = NyxQuest -WICP = NyxQuest: Kindred Spirits -WIDE = Dracula: Undead Awakening -WIDP = Dracula: Undead Awakening -WIEE = Tales of Monkey Island: Chapter 3 - Lair of the Leviathan -WIEP = Tales of Monkey Island Chapter 3: Lair of the Leviathan -WIGE = Incoming +WICP = NyxQuest - Kindred Spirits +WIDE = Dracula - Undead Awakening +WIDP = Dracula - Undead Awakening +WIEE = Tales of Monkey Island - Chapter 3 - Lair of the Leviathan +WIEP = Tales of Monkey Island - Chapter 3 - Lair of the Leviathan +WIGE = Incoming! WIHE = Play with Birds -WIKJ = Ivy the Kiwi? Mini -WILE = Tales of Monkey Island: Chapter 1 - Launch of the Screaming Narwhal -WILP = Tales of Monkey Island Chapter 1: Launch of the Screaming Narwhal +WIKJ = Ivy the Kiwi - Mini +WILE = Tales of Monkey Island - Chapter 1 - Launch of the Screaming Narwhal +WILP = Tales of Monkey Island - Chapter 1 - Launch of the Screaming Narwhal WINE = The Incredible Maze -WINJ = Chokkan! Balance * Labyrinth +WINJ = Chokkan! Balance Labyrinth WINP = The Incredible Maze -WIRE = Tales of Monkey Island: Chapter 5 - Rise of the Pirate God -WIRP = Tales of Monkey Island Chapter 5: Rise Of The Pirate God -WISE = Tales of Monkey Island: Chapter 2 - The Seige of Spinner Cay -WISP = Tales of Monkey Island Chapter 2: The Siege of Spinner Cay -WITE = Aha! I Found It! Hidden Object Game +WIRE = Tales of Monkey Island - Chapter 5 - Rise of the Pirate God +WIRP = Tales of Monkey Island - Chapter 5 - Rise of the Pirate God +WISE = Tales of Monkey Island - Chapter 2 - The Siege of Spinner Cay +WISP = Tales of Monkey Island - Chapter 2 - The Siege of Spinner Cay +WITE = Aha! I Found It! - Hidden Object Game WITJ = Aa! Mitsuketa! Item Sagashi Game -WITP = Aha! I Found It! Hidden Object Game +WITP = Aha! I Found It! - Hidden Object Game WIUE = Inkub WIVE = Space Invaders Get Even WIVJ = Space Invaders Get Even WIVP = Space Invaders Get Even -WIYE = Tales of Monkey Island: Chapter 4 - The Trial and Execution of Guybrush Threepwood -WIYP = Tales of Monkey Island Chapter 4: The Trial and Execution of Guybrush Threepwood -WJ2J = Jinsei Game: Happy Step +WIYE = Tales of Monkey Island - Chapter 4 - The Trial and Execution of Guybrush Threepwood +WIYP = Tales of Monkey Island - Chapter 4 - The Trial and Execution of Guybrush Threepwood +WJ2J = Jinsei Game - Happy Step WJAE = Jam City Rollergirls WJAP = Jam City Rollergirls WJCE = JellyCar 2 @@ -4888,67 +5383,67 @@ WJEP = Jett Rocket WJFE = Gnomz WJFP = Gnomz WJGJ = Jinsei Game -WJKE = Jewel Keepers Easter Island -WJKP = Jewel Keepers: Easter Island +WJKE = Jewel Keepers - Easter Island +WJKP = Jewel Keepers - Easter Island WJPJ = Janken Party Paradise WJSE = Jungle Speed WJSP = Jungle Speed WJWE = Bejeweled 2 WJWP = Bejeweled 2 -WK2J = Kappa-kun to Asobou: Kappa-kun to Ota no Shimikai -WK3J = Kappa-kun to Asobou: Kappa-kun to Mori no Nakamatachi -WK9J = Minna de Asobou Koinu de Kururin +WK2J = Kappa-kun to Asobou - Kappa-kun no Ota no Shimikai +WK3J = Kappa-kun to Asobou - Kappa-kun to 3 Bikino Koneko +WK9J = Minna de Asobou - Koinu de Kururin WKBE = You, Me, and the Cubes WKBJ = Kimi to Boku to Rittai -WKBP = You, Me and the Cubes +WKBP = You, Me, and the Cubes WKCE = Kyotokei WKCP = Kyotokei -WKDE = Pirates: The Key of Dreams -WKEJ = RakuRaku Kinen Apori Wii: Kinenka no Isha ga Osheru Nanoka de yameru Houhou -WKFE = Kung Fu Funk: Everybody is Kung Fu Fighting! -WKFP = Kung Fu Funk: Everybody Is Kung Fu Fighting +WKDE = Pirates - The Key of Dreams +WKEJ = Raku Raku Kinen Appli Wii - Kinenka no Isha ga Oshieru Nanoka de Yamaru Hoho +WKFE = Kung Fu Funk - Everybody is Kung Fu Fighting! +WKFP = Kung Fu Funk - Everybody is Kung Fu Fighting! WKHE = Big Kahuna Party WKIE = The Mystery of Whiterock Castle WKIP = The Mystery of Whiterock Castle WKJE = Karaoke Joysound WKKE = Party Fun Pirate -WKKJ = Kurohige Kiki Ippatsu -WKKP = Pop-Up Pirates! -WKNJ = Kanken Minna de Waiwai Kanji Nou -WKPJ = Kappa Kun to Mori no Nakama Tachi -WKQJ = Kentei! TV Wii Minna de Gotouchi Quiz Battle -WKRP = Karate Phants: Gloves of Glory -WKTE = Contra Rebirth +WKKJ = Kurohige Kiki Ippatsu Wii +WKKP = Pop-up Pirate! +WKNJ = Kanken - Minna de Wai Wai Kanji Nou +WKPJ = Kappa-kun to Asobou - Kappa-kun to Mori no Nakamatachi +WKQJ = Kentei TV! Wii - Minna de Gotouchi Quiz Battle! +WKRP = Karate Phants - Gloves of Glory +WKTE = Contra ReBirth WKTJ = Contra ReBirth WKTP = Contra ReBirth WKUJ = Downtown Nekketsu Dodgeball -WKWE = Adventure on Lost Island: Hidden Object Game -WKWJ = Item Sagashi * Yousei to Fushigi no Shima -WKWP = Adventure on LOST ISLAND: Hidden Object Game -WL2E = Target Toss Pro: Lawn Darts +WKWE = Adventure on Lost Island - Hidden Object Game +WKWJ = Item Sagashi - Yousei to Fushigi no Shima +WKWP = Adventure on Lost Island - Hidden Object Game +WL2E = Target Toss Pro - Lawn Darts WL5E = HB Arcade Disc Golf -WL9E = Let's Create! Pottery +WL9E = Let's Create! - Pottery WLCE = Bingo Party Deluxe WLCJ = Wai Wai Bingo Deluxe WLCP = Bingo Party Deluxe -WLDJ = Boku mo Sekai o Sukuitai: Battle Tournament -WLEE = Learning with the PooYoos: Episode 1 -WLEJ = Pooyoo to Asobou Episode 1 -WLEP = Learning with the PooYoos: Episode 1 +WLDJ = Bokumo Sekai wo Sukuitai +WLEE = Learning with The PooYoos - Episode 1 +WLEJ = PooYoo to Asobou - Episode 1 +WLEP = Learning with The PooYoos - Episode 1 WLGE = HB Arcade Cards WLIE = Liight -WLJJ = Boku mo Sekai o Sukuitai: Battle Tournament -WLKJ = Okiraku Tennis SP +WLJJ = Bokumo Sekai wo Sukuitai - Battle Tournament +WLKJ = Licca-chan Oshare House WLLE = Little Tournament Over Yonder WLLP = Little Tournament Over Yonder WLME = La-Mulana -WLMJ = La Mulana +WLMJ = La-Mulana WLMP = La-Mulana -WLNE = Learning with the PooYoos: Episode 2 -WLNP = Learning with the PooYoos: Episode 2 -WLOE = LostWinds: Winter of the Melodias -WLOJ = LostWinds: Winter of the Melodias -WLOP = LostWinds: Winter of the Melodias +WLNE = Learning with The PooYoos - Episode 2 +WLNP = Learning with The PooYoos - Episode 2 +WLOE = LostWinds - Winter of the Melodias +WLOJ = LostWinds - Winter of the Melodias +WLOP = LostWinds - Winter of the Melodias WLPE = Lonpos WLPJ = Lonpos WLPP = Lonpos @@ -4959,8 +5454,8 @@ WLWE = LostWinds WLWJ = LostWinds WLWP = LostWinds WLXJ = Phalanx -WLZE = lilt line -WLZP = lilt line +WLZE = Lilt Line +WLZP = Lilt Line WM2E = My Little Baby WM2P = My Little Baby WM3E = Manic Monkey Mayhem @@ -4968,73 +5463,73 @@ WM3P = Manic Monkey Mayhem WM4E = Mix Superstar WM4P = Mix Superstar WM5E = MDK2 -WM7E = Anima Ark of Sinners -WM7P = Anima Ark of Sinners +WM7E = ANIMA - Ark of Sinners +WM7P = ANIMA - Ark of Sinners WM8E = Bomberman Blast -WM8J = Wi-Fi 8-Nin Battle Bomberman +WM8J = Wi-Fi 8 Hito Battle Bomberman WM8P = Bomberman Blast -WM9E = Happy Hammerin +WM9E = Happy Hammerin' WM9J = Tataite! Mogupon WM9P = Happy Hammerin' WMAE = Magnetis WMAP = Magnetis -WMBE = MaBoShi's Arcade -WMBJ = Katachi no Game: Marubou Shikaku -WMBP = MaBoShi: The Three Shape Arcade -WMCE = Monsteca Corral: Monsters vs. Robots -WMCP = Monsteca Corral: Monsters Vs. Robots -WMDE = Madstone +WMBE = Maboshi's Arcade +WMBJ = Katachi no Game - Maru Bou Shikaku +WMBP = MaBoShi - The Three Shape Arcade +WMCE = A Monsteca Corral - Monsters vs. Robots +WMCP = A Monsteca Corral - Monsters vs. Robots +WMDE = MadStone WMGE = Mart Racer WMHE = Mouse House -WMJE = Dive: The Medes Islands Secret -WMJP = Dive: The Medes Islands Secret +WMJE = Dive - The Medes Islands Secret +WMJP = Dive - The Medes Islands Secret WMKE = Lead the Meerkats WMKP = Lead the Meerkats -WMLE = Major League Eating: The Game -WMLJ = Major League Eating: The Game +WMLE = Major League Eating - The Game +WMLJ = Major League Eating - The Game WMME = Muscle March WMMJ = Muscle Koushinkyoku WMMP = Muscle March WMOE = Moki Moki -WMOJ = Antaga Mawashite Sukuu Puzzle: Mochimochi Q +WMOJ = Anata ga Mawashite Sukuu Puzzle - Mochi Mochi Q WMOP = Moki Moki -WMPJ = Word Puzzle Moji Pitan Wii +WMPJ = Kotoba no Puzzle - Mojipittan Wii WMRE = Monochrome Racing WMRP = Monochrome Racing -WMSE = Enjoy your massage! -WMSP = Enjoy your massage! +WMSE = Enjoy your Massage! +WMSP = Enjoy Your Massage! WMWP = Miffy's World WMWX = Miffy's World -WMXE = Max & The Magic Marker -WMXJ = Max & the Magic Marker +WMXE = Max & the Magic Marker +WMXJ = Rakugaki Hero WMXP = Max & the Magic Marker WMZP = Mahjong -WN9E = Military Madness: Nectaris +WN9E = Military Madness - Nectaris WN9J = Nectaris -WN9P = Military Madness: Nectaris +WN9P = Military Madness - Nectaris WNAP = Back to Nature -WNEE = Penguins & Friends Hey! That's My Fish! -WNEP = Penguins & Friends Hey! That’s my Fish! +WNEE = Penguins & Friends - Hey! That's My Fish! +WNEP = Penguins & Friends - Hey! That's My Fish! WNGE = Bang Attack WNKE = Niki - Rock 'n' Ball WNKP = Niki - Rock 'n' Ball -WNPJ = Sugusuro Duo: New Pulsar R & V +WNPJ = Sugu Suro Duo - New Pulsar R&V WNSE = Newton vs The Horde WNSP = Newton vs The Horde WNVE = Neves Plus -WNVJ = Neves Plus -WNVP = Neves Plus: Phantheon of Tangrams -WNWJ = Hamekomi Lucky Puzzle Wii Return +WNVJ = Hamekomi Lucky Puzzle Wii +WNVP = Neves Plus - Pantheon of Tangrams +WNWJ = Hamekomi Lucky Puzzle Wii Returns WO6E = Family Pirate Party WO6J = Okiraku Sugoroku Wii WO6P = Family Pirate Party WOAE = Family Glide Hockey WOAJ = Okiraku Air Hockey Wii WOAP = Family Glide Hockey -WOBE = Art Style: ORBIENT -WOBJ = Art Style: Orbital -WOBP = Art Style: ORBIENT -WODJ = Oudaa! +WOBE = Art Style - ORBIENT +WOBJ = Art Style Series - ORBITAL +WOBP = Art Style - ORBIENT +WODJ = Order!! WOEJ = Oekaki Logic WOFE = Overflow WOGE = Family Mini Golf @@ -5049,144 +5544,144 @@ WOSJ = Okiraku Slot Car Racing Wii WOSP = Family Slot Car Racing WOTE = Overturn WOTJ = Overturn -WOTP = Overturn: Mecha Wars -WOXJ = Osu! Exercise Dojo +WOTP = Overturn +WOXJ = Osu! Exercise Doujou WOYE = Bit Boy!! -WOYJ = Bit Man +WOYJ = Bit Man!! WOYP = Bit Boy!! -WOZJ = Kodomo Kyouiku Telebi Wii: Aiue-Oumuzu +WOZJ = Kodomo Kyouiku Terebi Wii - Aiue Oumuzu WP2E = Potpourrii WP2P = Potpourrii -WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising -WP4E = Learning with the PooYoos: Episode 3 -WP4P = Learning with the PooYoos: Episode 3 +WP3P = Pearl Harbor - Episode 1 - Red Sun Rising +WP4E = Learning with The PooYoos - Episode 3 +WP4P = Learning with The PooYoos - Episode 3 WP5J = Pokosuka Racing -WP6J = Boku wa Plarail Untenshi: Shinkansen Joukikikansha-Hen +WP6J = Boku wa Plarail Untenshi - Shinkansen & Joukikikansha Hen WP7E = My Planetarium WP7J = Planetarium WP7P = My Starry Night -WP9J = Po-Ka-Zu Wii -WPAJ = Pokémon Fushigi no Dungeon: Ikuzo! Arashi no Boukendan +WP9J = Pokers Wii +WPAJ = Pokémon Fushigi no Dungeon - Ikuzo! Arashi no Boukendan WPBE = Pub Darts WPBP = Pub Darts WPCE = Doc Louis's Punch-Out!! -WPDJ = Chindouchuu!! Pole no Daibouken -WPFJ = Pokémon Fushigi no Dungeon: Susume! Honoo no Boukendan +WPDJ = Chindouchuu!! Paul no Daibouken +WPFJ = Pokémon Fushigi no Dungeon - Susume! Honou no Boukendan WPGE = Snowpack Park -WPGJ = Penguin Life -WPHJ = Pokémon Fushigi no Dungeon: Mesaze! Hikari no Boukendan +WPGJ = Penguin Seikatsu +WPHJ = Pokémon Fushigi no Dungeon - Mezase! Hikari no Boukendan WPIE = Pit Crew Panic! -WPIJ = Pit Crew Panic +WPIJ = Pit Crew Panic! WPIP = Pit Crew Panic! WPJE = Pucca's Kisses Game WPJP = Pucca's Kisses Game -WPKE = Texas Hold'Em Poker -WPKP = Texas Hold'Em Poker +WPKE = Texas Hold'em Poker +WPKP = Texas Hold'em Poker WPLE = Planet Pachinko -WPNJ = Ponjan +WPNJ = Ponjan Wii WPOJ = Popple to Mahou no Crayon WPPE = Family Table Tennis -WPPJ = Okiraku Ping Pong +WPPJ = Okiraku Ping Pong Wii WPPP = Family Table Tennis -WPQE = Protöthea -WPQP = Protöthea -WPRE = Art Style: Cubello -WPRJ = Art Style: Cubeleo -WPRP = Art Style: CUBELLO +WPQE = Protoethea +WPQP = Protothea +WPRE = Art Style - CUBELLO +WPRJ = Art Style Series - CUBELEO +WPRP = Art Style - CUBELLO WPSE = Pokémon Rumble -WPSJ = Ransen Pokémon Scramble +WPSJ = Ransen! Pokémon Scramble WPSP = Pokémon Rumble WPTJ = Fantasic Cube -WPUE = Bust-A-Move Plus! +WPUE = Bust-a-Move Plus! WPUJ = Puzzle Bobble Wii WPUP = Puzzle Bobble Plus! -WPVE = The Tales of Bearsworth Manor: Chaotic Conflicts -WPVJ = Kumanage Battle-Hen: Kiina no Kirai na Aoi Hoseki -WPVP = The Tales of Bearsworth Manor: Chaotic Conflicts +WPVE = The Tales of Bearsworth Manor - Chaotic Conflicts +WPVJ = Kumanage Battle Hen Kina no Kiraina Aoi Houseki +WPVP = The Tales of Bearsworth Manor - Chaotic Conflicts WPWE = Pong Toss Pro - Frat Party Games -WPXJ = Minna de Tobikome Penguin Diving Hooper Looper +WPXJ = Minna de Tobikome! Penguin Diving - Hooper Looper WPYE = Pallurikio WPYP = Pallurikio -WPZE = Bruiser & Scratch -WQ4J = Kentoushi FuriFuri Boxing +WPZE = Bruiser and Scratch +WQ4J = Kentoushi - Furi Furi Boxing WR2E = Rabbids Lab WR2P = Rabbids Lab WR4P = Rush Rush Rally Racing WR5E = Retro City Rampage WR5P = Retro City Rampage WR9E = Mega Man 9 -WR9J = RockMan 9: Yabou no Fukkatsu! +WR9J = Rockman 9 - Yabou no Fukkatsu!! WR9P = Mega Man 9 WRBE = Robocalypse - Beaver Defense WRBP = Robocalypse - Beaver Defense WRDE = Word Searcher WRDP = Word Searcher WREE = Racers' Islands - Crazy Arenas -WREP = Racers Islands Crazy Arenas +WREP = Racers' Islands - Crazy Arenas WRFE = Reel Fishing Challenge II WRFP = Reel Fishing Challenge II WRGE = Rage of the Gladiator WRGP = Rage of the Gladiator -WRIE = Rainbow Islands: Towering Adventure! -WRIJ = Rainbow Islands: Towering Adventure! -WRIP = Rainbow Islands: Towering Adventure! +WRIE = Rainbow Islands - Towering Adventure! +WRIJ = Rainbow Islands - Towering Adventure! +WRIP = Rainbow Islands - Towering Adventure! WRJE = Racers' Islands - Crazy Racers -WRJP = Racers Islands - Crazy Racers -WRLE = FAST Racing League -WRLP = FAST Racing League -WRNJ = BIT.TRIP RUNNER +WRJP = Racers' Islands - Crazy Racers +WRLE = FAST - Racing League +WRLP = FAST - Racing League +WRNJ = Bit. Trip Runner - Rhythm Seijin no Gekisou WRPE = Burn the Rope WRQE = Deer Drive Legends WRQP = Deer Drive Legends -WRRE = Robin Hood: The Return of Richard -WRRP = Robin Hood: The Return Of Richard -WRSE = Step Up +WRRE = Robin Hood - The Return of Richard +WRRP = Robin Hood - The Return of Richard +WRSE = Step Up! WRTE = Robox -WRUE = BIT.TRIP RUNNER -WRUP = Bit.Trip Runner +WRUE = Bit. Trip Runner +WRUP = Bit. Trip Runner WRXE = Mega Man 10 -WRXJ = RockMan 10 +WRXJ = Rockman 10 - Uchuu kara no Kyoui!! WRXP = Mega Man 10 WRYE = Robox WRYP = Robox WS2J = Saikyou Ginsei Igo -WS3E = Silver Star: Chess +WS3E = Silver Star Chess WS3J = Saikyou Ginsei Chess WS4J = Saikyou Ginsei Mahjong WS5J = Saikyou Ginsei Gomoku Narabe -WS6E = Silver Star: Reversi +WS6E = Silver Star Reversi WS6J = Saikyou Ginsei Reversi -WS7E = Fantasy Slots: Adventure Slots and Games -WS8J = Minna de Taisen Puzzle Shanghai +WS7E = Fantasy Slots - Adventure Slots and Games +WS8J = Minna de Taisen Puzzle - Shanghai Wii WS9E = Sudoku Challenge! WS9P = Sudoku Challenge! WSAE = Onslaught -WSAJ = MadSecta +WSAJ = Madsecta WSAP = Onslaught WSBJ = Sorcery Blade -WSCJ = Out of Galaxy: Gin no Koshika +WSCJ = Out of Galaxy - Gin no Koushika WSEJ = Princess Ai Monogatari -WSGE = Pop 'Em Drop 'Em Samegame +WSGE = Pop 'Em, Drop 'Em SameGame WSGJ = Same Game Wii -WSGP = Pop Them, Drop Them SAMEGAME -WSHE = Stonekeep: Bones of the Ancestors +WSGP = Pop Them, Drop Them SameGame +WSHE = Stonekeep - Bones of the Ancestors WSIJ = Saikyou Ginsei Shogi -WSJE = Spot The Differences! +WSJE = Spot the Differences! WSJP = Spot the Differences! WSLE = The Magic Obelisk -WSLJ = Shadow Walker +WSLJ = Shadow Walker - Kage no Shounen to Hikari no Yousei WSME = Eat! Fat! FIGHT! WSMJ = Tsuppari Oozumou Wii Heya WSMP = Eat! Fat! FIGHT! -WSNE = Sonic The Hedgehog 4 Episode I -WSNJ = Sonic the Hedgehog 4: Episode I -WSNP = Sonic The Hedgehog 4 Episode I +WSNE = Sonic the Hedgehog 4 - Episode I +WSNJ = Sonic the Hedgehog 4 - Episode I +WSNP = Sonic the Hedgehog 4 - Episode I WSRE = Space Trek WSSP = Solitaire WSTJ = Tenshi no Solitaire -WSUE = Shootanto: Evolutionary Mayhem -WSUJ = Shootanto: Kakohen -WSUP = Shootanto: Evolutionary Mayhem +WSUE = Shootanto - Evolutionary Mayhem +WSUJ = Shootanto - Kako Hen +WSUP = Shootanto - Evolutionary Mayhem WSWE = Swords & Soldiers WSWP = Swords & Soldiers WSXE = Stunt Cars @@ -5194,58 +5689,58 @@ WSXP = Stunt Cars WSYE = Snail Mail WSZE = Sneezies WSZP = Sneezies -WT2E = Target Toss: Pro Bags -WT3E = Tomena Sanner +WT2E = Target Toss Pro - Bags +WT3E = Tomena Sanner WT3J = Tomena Sanner Wii WT3P = Tomena Sanner -WT8J = Hajite! Block Rush -WTBJ = Fantasic Tambourine -WTDJ = Tomica Drive -WTEE = Tales of Elastic Boy: Mission 1 -WTEP = Tales of Elastic Boy Mission 1 -WTFE = Bit.Trip: Flux -WTFP = Bit.Trip Flux +WT8J = Hajiite! Block Rush +WTBJ = Fantastic Tambourine +WTDJ = Tomy Car Drive Shutsudou! Kinkyuu Sharyou Hen +WTEE = Tales of Elastic Boy - Mission 1 +WTEP = Tales of Elastic Boy - Mission 1 +WTFE = Bit. Trip Flux +WTFP = Bit. Trip Flux WTHJ = Kaku! Ugoku! Tsukamaeru! Sensei Wii -WTIE = Tiki Towers +WTIE = TikiTowers WTKE = TV Show King 2 WTKP = TV Show King 2 -WTME = Adventure Island: The Beginning +WTME = Adventure Island - The Beginning WTMJ = Takahashi Meijin no Bouken Jima Wii -WTMP = Adventure Island: The Beginning +WTMP = Adventure Island - The Beginning WTNE = Family Tennis WTNJ = Okiraku Tennis Wii WTPE = Tetris Party WTPJ = Tetris Party WTPP = Tetris Party -WTRE = Bit.Trip Beat -WTRJ = BIT.TRIP BEAT -WTRP = Bit.Trip Beat +WTRE = Bit. Trip Beat +WTRJ = Bit. Trip Beat +WTRP = Bit. Trip Beat WTTE = Toki Tori WTTP = Toki Tori WTUE = Tumblebugs 2 -WTWP = Fenimore Fillmore: The Westerner -WTXE = Texas Hold’em Tournament -WTXP = Texas Hold’em Tournament -WU2P = Successfully Learning Mathematics Year 3 -WU3P = Successfully Learning Mathematics Year 4 -WU4P = Successfully Learning Mathematics Year 5 +WTWP = Fenimore Fillmore - The Westerner +WTXE = Texas Hold'em Tournament +WTXP = Texas Hold'em Tournament +WU2P = Successfully Learning Mathematics - Year 3 +WU3P = Successfully Learning Mathematics - Year 4 +WU4P = Successfully Learning Mathematics - Year 5 WUBE = Ubongo WUBP = Ubongo -WUFE = Drop Zone: Under Fire +WUFE = Drop Zone - Under Fire WUHE = Grill-Off with Ultra Hand! -WUHJ = Grill-Off with Ultra Hand! -WUIP = Successfully Learning Mathematics Year 2 -WUKJ = Unou Kids Okigaru Unou Training -WUNE = Uno -WUNJ = Uno -WUNP = Uno +WUHJ = Wii de Ultra Hand +WUIP = Successfully Learning Mathematics - Year 2 +WUKJ = Unou Kids - Okigaru Unou Training +WUNE = UNO +WUNJ = UNO +WUNP = UNO WURE = Urbanix WURP = Urbanix -WVBE = Bit.Trip: Void -WVBJ = BIT.TRIP VOID -WVBP = Bit.Trip Void -WVCE = V.I.P. Casino: Blackjack -WVDJ = Kodomo Kyouiku TV Wii: Aiue-O-Chan +WVBE = Bit. Trip Void +WVBJ = Bit. Trip Void - Rhythm Seijin no Danmaku +WVBP = Bit. Trip Void +WVCE = V.I.P. Casino - Blackjack +WVDJ = Kodomo Kyouiku Terebi Wii - Aiue Ouchan WVFE = Bobby Carrot Forever WVFP = Bobby Carrot Forever WVIE = Violin Paradise @@ -5254,59 +5749,59 @@ WVKE = Water Warfare WVKJ = Bang Bang Kids WVKP = Water Warfare WVOE = Rock N' Roll Climber -WVOJ = Rock n' Roll Climber -WVOP = Rock'n Roll Climber +WVOJ = Rock N' Roll Climber +WVOP = Rock N' Roll Climber WVQE = Vampire Crystals WVQP = Vampire Crystals -WVSE = Gods Vs Humans -WVSP = Gods Vs Humans -WVUP = Mr Bumblebee Racing Champion -WW2P = Where's Wally? Fantastic Journey 2 -WW3P = Where's Wally? Fantastic Journey 3 -WWAE = Warmen Tactics -WWIP = Where's Wally? Fantastic Journey 1 +WVSE = Gods vs. Humans +WVSP = Gods vs. Humans +WVUP = Mister Bumblebee Racing Champion +WW2P = Where's Wally - Fantastic Journey 2 +WW3P = Where's Wally - Fantastic Journey 3 +WWAE = WarMen Tactics +WWIP = Where's Wally - Fantastic Journey 1 WWLP = The Will of Dr. Frankenstein -WWRE = Excitebike: World Rally -WWRJ = Excitebike: World Race -WWRP = Excitebike: World Challenge +WWRE = Excitebike - World Rally +WWRJ = Excitebike - World Race +WWRP = Excitebike - World Challenge WWTE = BurgerTime World Tour WWTP = BurgerTime World Tour -WWXE = Paper Wars: Cannon Fodder -WWXP = Paper Wars Cannon Fodder +WWXE = Paper Wars - Cannon Fodder +WWXP = Paper Wars - Cannon Fodder WX2P = Successfully Learning English Year 3 WX3P = Successfully Learning English Year 4 WX4P = Successfully Learning English Year 5 -WXBE = Ben 10: Alien Force - The Rise of Hex -WXBP = Ben 10: Alien Force - The Rise of Hex +WXBE = Ben 10 Alien Force - The Rise of Hex +WXBP = Ben 10 Alien Force - The Rise of Hex WXIP = Successfully Learning English Year 2 WXME = Xmas Puzzle -WXPE = Paint Splash! +WXPE = Paint Splash WXPP = Paint Splash -WXRE = Reel Fishing Ocean Challenge +WXRE = Reel Fishing - Ocean Challenge WXRP = Reel Fishing Ocean Challenge -WYIE = escapeVektor: Chapter 1 -WYIP = escapeVektor: Chapter 1 -WYKJ = Yomi Kiku Asobi +WYIE = escapeVektor - Chapter 1 +WYIP = escapeVektor - Chapter 1 +WYKJ = Yomi Kiku Asobi Wii WYME = Yummy Yummy Cooking Jam WYMP = Yummy Yummy Cooking Jam -WYSE = Yard Sale Hidden Treasures: Sunnyville -WYSP = Yard Sale Hidden Treasures Sunnyville +WYSE = Yard Sale Hidden Treasures - Sunnyville +WYSP = Yard Sale Hidden Treasures - Sunnyville WZAE = Zombii Attack WZBP = Cricket Challenge WZGE = Zoo Disc Golf WZHE = My Zoo -WZHJ = Animal Life: Doubutsu Fureai Seikatsu +WZHJ = Animal Life - Doubutsu Fureai Seikatsu WZHP = My Zoo -WZIE = Rubik's Puzzle Galaxy RUSH -WZIP = Rubik's Puzzle Galaxy: RUSH -WZJJ = Simple Series Vol. 5: The Judo -WZMJ = Simple Wii Series Vol. 3: The Mahjong +WZIE = Rubik's Puzzle Galaxy - RUSH +WZIP = Rubik's Puzzle Galaxy - RUSH +WZJJ = Simple Series Vol. 5 - The Judo +WZMJ = Simple Series Vol. 3 - The Mahjong WZPE = Zombie Panic in Wonderland WZPJ = Zombie in Wonderland WZPP = Zombie Panic in Wonderland -WZZE = The Tales of Bearsworth Manor: Puzzling Pages -WZZJ = Kumanage Puzzle-Hen: Piina no Suki na Akai Candy -WZZP = The Tales of Bearsworth Manor: Puzzling Pages +WZZE = The Tales of Bearsworth Manor - Puzzling Pages +WZZJ = Kumanage Puzzle Hen - Pina no Sukina Akai Candy +WZZP = The Tales of Bearsworth Manor - Puzzling Pages XH2E = Cave Story (Demo) XH2P = Cave Story (Demo) XH3E = Frobot (Demo) @@ -5324,21 +5819,21 @@ XH9P = ColorZ (Demo) XHAE = Pokémon Rumble (Demo) XHAP = Pokémon Rumble (Demo) XHCE = Final Fantasy Crystal Chronicles: My Life as a Darklord (Demo) -XHCJ = Final Fantasy Crystal Chronicles: My Life as a Darklord (Demo) +XHCJ = Final Fantasy Crystal Chronicles - The Tower of the Chaos Princess XHCP = Final Fantasy Crystal Chronicles: My Life as a Darklord (Demo) XHDE = NyxQuest: Kindred Spirits (Demo) XHDP = NyxQuest: Kindred Spirits (Demo) XHEE = BIT.TRIP BEAT (Demo) -XHEJ = BIT.TRIP BEAT (Demo) +XHEJ = Bit. Trip Beat XHEP = BIT.TRIP BEAT (Demo) XHFE = World of Goo (Demo) -XHFJ = Goo no Wakusei (Demo) +XHFJ = Goo no Wakusei XHFP = World of Goo (Demo) -XHHJ = Pokémon Fushigi no Dungeon: Mezase! Hikari no Boukendan (Demo) +XHHJ = Pokémon Fushigi no Dungeon - Mezase! Hikari no Boukendan (Demo) XHIE = Fluidity (Demo) XHIP = Hydroventure (Demo) XHJE = Thruspace (Demo) -XHJJ = Surinuke Anatousu (Demo) +XHJJ = Surinuke Anatousu XHJP = Thruspace (Demo) XHKE = Dive: The Medes Islands Secret (Demo) XHKP = Dive: The Medes Islands Secret (Demo) @@ -5376,7 +5871,7 @@ XICP = Gods vs Humans (Demo) XIDE = Racers Islands Crazy Racers (Demo) XIDP = Racers Islands Crazy Racers (Demo) XIEE = chick chick BOOM (Demo) -XIEJ = Chicken Battle! chick chick BOOM (Demo) +XIEJ = Chick Chick BOOM XIEP = chick chick BOOM (Demo) XIGE = Urbanix (Demo) XIGP = Urbanix (Demo) @@ -5404,7 +5899,7 @@ XIUP = Soccer Bashi (Demo) XIVE = Mix Superstar (Demo) XIVP = Mix Superstar (Demo) XIWE = Horizon Riders (Demo) -XIZE = 3D Pixel Racing (Demo) +XIZE = 3D Pixel Racing XIZP = 3D Pixel Racing (Demo) XJDE = MotoHeroz (Demo) XJDP = MotoHeroz (Demo) @@ -5415,7 +5910,7 @@ XJGE = Gnomz (Demo) XJGP = Gnomz (Demo) XJHE = Paint Splash (Demo) XJHP = Paint Splash (Demo) -XJIE = 2 Fast 4 Gnomz (Demo) +XJIE = 2 Fast 4 Gnomz XJIP = 2 Fast 4 Gnomz (Demo) XJJE = Vampire Crystals (Demo) XJJP = Vampire Crystals (Demo) @@ -5425,9 +5920,9 @@ FA2J = Exerion FA3J = Formation Z FA4J = Devil World FA4P = Devil World -FA5J = Fire Emblem: Ankoku Ryu to Hikari no Tsurugi +FA5J = Fire Emblem - Ankoku Ryuu to Hikari no Tsurugi FA6E = Donkey Kong Jr. Math -FA6J = Donkey Kong Jr. no Sansuu Asobi +FA6J = Donkey Kong Jr. no Sansou Asobi FA6P = Donkey Kong Jr. Math FA7E = Yoshi FA7J = Yoshi no Tamago @@ -5435,12 +5930,12 @@ FA7P = Mario & Yoshi FA7T = Yoshi FA8E = Kirby's Adventure FA8F = Kirby's Adventure -FA8J = Hoshi no Kirby: Yume no Izumi no Monogatari +FA8J = Hoshi no Kirby - Yume no Izumi no Monogatari FA8P = Kirby's Adventure FA8T = Kirby's Adventure -FA9E = Zelda II: The Adventure of Link -FA9J = The Legend of Zelda 2: Link no Bouken -FA9P = Zelda II: The Adventure of Link +FA9E = Zelda II - The Adventure of Link +FA9J = Zelda no Densetsu 2 - Link no Bouken +FA9P = Zelda II - The Adventure of Link FAAE = Donkey Kong FAAJ = Donkey Kong FAAP = Donkey Kong @@ -5490,7 +5985,7 @@ FAPE = NES Open Tournament Golf FAPJ = Mario Open Golf FAPP = NES Open Tournament Golf FAPT = NES Open Tournament Golf -FAQJ = Ninja Jajamaru-kun +FAQJ = Ninja JaJaMaru-kun FAQL = Ninja JaJaMaru-kun FAQN = Ninja JaJaMaru-kun FARE = Gradius @@ -5514,9 +6009,9 @@ FAYJ = Ikki FAZJ = Field Combat FAZQ = Downtown Nekketsu Koushinkyoku: Soreyuke Daiundoukai FB2J = Super Mario Bros. 2 -FB2L = Super Mario Bros.: The Lost Levels -FB2N = Super Mario Bros.: The Lost Levels -FB3J = Valkyrie no Bouken: Toki no Kagi Densetsu +FB2L = Super Mario Bros. - The Lost Levels +FB2N = Super Mario Bros. - The Lost Levels +FB3J = Valkyrie no Bouken - Toki no Kagi Densetsu FB4E = Lunar Pool FB4J = Lunar Ball FB4P = Lunar Pool @@ -5535,7 +6030,7 @@ FBCE = Excitebike FBCJ = Excitebike FBCP = Excitebike FBDE = Kid Icarus -FBDJ = Hikari Shinwa: Palutena no Kagami +FBDJ = Hikari Shinwa - Palthena no Kagami FBDP = Kid Icarus FBDT = Kid Icarus FBEE = Ice Climber @@ -5544,7 +6039,7 @@ FBEP = Ice Climber FBHE = Castlevania FBHJ = Akumajou Dracula FBHP = Castlevania -FBIE = Punch Out!! Featuring Mr. Dream +FBIE = Punch-Out!! FBIJ = Punch-Out!! FBIP = Punch-Out!! FBJE = Mighty Bomb Jack @@ -5552,21 +6047,21 @@ FBJJ = Mighty Bomb Jack FBJP = Mighty Bomb Jack FBKE = Teenage Mutant Ninja Turtles FBKJ = Gekikame Ninja Den -FBKP = Teenage Mutant Ninja Turles +FBKP = Teenage Mutant Ninja Turtles FBLE = Lode Runner FBLJ = Lode Runner FBLM = Lode Runner FBNE = Ninja Gaiden -FBNJ = Ninja Ryuukenden +FBNJ = Ninja Ryukenden FBNM = Ninja Gaiden -FBOJ = Gradius II +FBOJ = Gradius II - Gofer no Yabou FBQJ = Druaga no Tou FBRE = Galaga FBRJ = Galaga FBRP = Galaga FBRT = Galaga FBSE = Milon's Secret Castle -FBSJ = Meikyuu Kumikyoku: Milon no Daibouken +FBSJ = Meikyuu Kumikyoku - Milon no Daibouken FBSM = Milon's Secret Castle FBUE = Adventures of Lolo FBUJ = Adventures of Lolo @@ -5589,41 +6084,41 @@ FC3J = Bubble Bobble FC3P = Bubble Bobble FC3T = Bubble Bobble FC4J = Chack'n Pop -FC5J = Ganbare Goemon Karakuki Douchuu +FC5J = Ganbare Goemon! Karakuri Douchuu FC6E = StarTropics FC6J = Startropics FC6P = StarTropics FC7E = NES Play Action Football FC7J = NES Play Action Football -FC8E = Castlevania II: Simon's Quest -FC8J = Dracula II: Noroi no Fuuin -FC8P = Castlevania II: Simon's Quest +FC8E = Castlevania II - Simon's Quest +FC8J = Dracula II - Noroi no Fuuin +FC8P = Castlevania II - Simon's Quest FC9J = Metal Slader Glory FCAE = Star Soldier FCAJ = Star Soldier FCEJ = Esper Dream -FCFJ = Yie Ar Kung Fu +FCFJ = Yie Ar Kung-Fu FCGJ = TwinBee FCHJ = Flappy -FCIJ = Volguard 2 -FCJJ = SD Gundam World: Gachapon Senshi 2 - Capsule Senki +FCIJ = Volguard II +FCJJ = SD Gundam World - Gachapon Senshi 2 Capsule Senki FCNJ = Kekkyoku Nankyoku Daibouken FCNQ = Antarctic Adventure FCOJ = Battle City FCPE = Balloon Fight FCPJ = Balloon Fight FCPP = Balloon Fight -FCQE = Ninja Gaiden II: The Dark Sword of Chaos +FCQE = Ninja Gaiden II - The Dark Sword of Chaos FCQJ = Ninja Gaiden II FCRE = Adventure Island -FCRJ = Takahashi Meijin no Boukenjima +FCRJ = Takahashi Meijin no Bouken Jima FCRP = Adventure Island -FCRT = Hudson's Adventure Island +FCRT = Adventure Island FCSE = Super C FCSJ = Super Contra -FCSP = Probotector II: Return of the Evil Forces +FCSP = Probotector II - Return of the Evil Forces FCTE = Mega Man -FCTJ = RockMan +FCTJ = Rockman FCTP = Mega Man FCUE = Volleyball FCUJ = Volleyball @@ -5635,38 +6130,38 @@ FCWE = Super Mario Bros. 3 FCWJ = Super Mario Bros. 3 FCWP = Super Mario Bros. 3 FCWQ = Super Mario Bros. 3 -FCYE = Yoshi’s Cookie +FCYE = Yoshi's Cookie FCYJ = Yoshi no Cookie -FCYP = Yoshi’s Cookie +FCYP = Yoshi's Cookie FCYT = Yoshi's Cookie FCZE = King's Knight -FCZJ = Kings Knight +FCZJ = King's Knight FD2E = Double Dragon FD2J = Double Dragon FD2P = Double Dragon -FD3J = Nekketsu Koukou Dodgeball-bu Soccer-hen -FD3Q = Nekketsu Koukou Dodgeball-bu Soccer-hen +FD3J = Nekketsu Koukou Dodgeball Bu - Soccer Hen +FD3Q = Nekketsu Koukou Dodgeball-bu - Soccer Hen FD6E = Adventures of Lolo 2 FD6P = Adventures of Lolo 2 FD7E = Mega Man 3 -FD7J = RockMan 3: Dr. Wily no Saigo?! +FD7J = Rockman 3 - Dr. Wily no Saigo! FD7P = Mega Man 3 FDAE = Spelunker FDAJ = Spelunker FDAM = Spelunker -FDBJ = Famicom Mukashi Banashi: Shin Onigashima - Kouhen +FDBJ = Famicom Mukashibanashi - Shin Onigashima Zenkouhen FDCJ = Star Luster FDEJ = Mappy FDFE = Bases Loaded FDFJ = Moero!! Pro Yakyuu FDGE = Ghosts 'n Goblins -FDGJ = Makai-Mura -FDGP = Ghosts'n Goblins +FDGJ = Makaimura +FDGP = Ghosts 'n Goblins FDIJ = Bokosuka Wars -FDLE = Ninja Gaiden III: The Ancient Ship of Doom +FDLE = Ninja Gaiden III - The Ancient Ship of Doom FDLJ = Ninja Gaiden III FDNE = Mega Man 2 -FDNJ = RockMan 2 +FDNJ = Rockman 2 - Dr. Wily no Nazo FDNP = Mega Man 2 FDOE = Operation Wolf FDOJ = Operation Wolf @@ -5675,95 +6170,95 @@ FDPE = Blades of Steel FDPP = Blades of Steel FDQE = Double Dribble FDQP = Double Dribble -FDRP = Skate or Die -FDSJ = Famicom Tantei Club: Kieta Koukeisha (Kouhen) +FDRP = Skate or Die! +FDSJ = Famicom Tantei Club - Kieta Koukeisha FDTE = Renegade -FDTJ = Renegade +FDTJ = Nekketsu Kouha Kunio-kun FDUE = Super Dodge Ball -FDUJ = Nekketsu Koukou Dodge Ball Bu +FDUJ = Nekketsu Koukou Dodgeball Bu FDVE = River City Ransom FDVJ = Downtown Nekketsu Monogatari FDVP = Street Gangs FDVQ = Downtown Nekketsu Monogatari -FDWJ = Downtown Special: Kunio-kun no Jidaigeki Dayo Zenin Shuugou! -FDXJ = Famicom Tantei Club Part II: Ushiro ni Tatsu Shoujo (Kouhen) +FDWJ = Downtown Special Kunio-kun no Jidaigeki dayo Zennin Shuugou +FDXJ = Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo FDYJ = Fire Emblem Gaiden -FDZJ = Downtown Nekketsu Koushinkyoku -FDZQ = Downtown Nekketsu Koushinkyoku -FE5J = Toukaidou Gojuusan Tsugi -FE6J = Ninja kun Majyou no Bouken -FE7J = Ninja kun Ashura no Shou +FDZJ = Downtown Nekketsu Koushinkyoku - Soreyuke Daiundoukai +FDZQ = Downtown - Nekketsu Koushinkyoku +FE5J = Kanshaku Tamanage Kantarou no Toukaidou Gojuusan-tsugi +FE6J = Ninja-kun Majyou no Bouken +FE7J = Ninja-kun Ashura no Shou FE8J = Takeshi no Chousenjou -FE9J = Ike Ike! Nekketsu Hockey-bu: Subette Koronde Dairantou -FECE = Skykid +FE9J = Ike Ike! Nekketsu Hockey Bu - Subette Koronde Dairantou +FECE = Sky Kid FECJ = Sky Kid FEDJ = Dig Dug FEDL = Dig Dug FEDN = Dig Dug -FEEJ = Tantei Jingūji Saburō: Shinjuku Chūō Kōen Satsujin Jiken -FEFJ = Detective Saburo Jinguji 2: Yokohama-Ko Renzoku Satsujin Jiken +FEEJ = Tantei Jinguuji Saburo - Shinjuku Chuuou Kouen Satsujin Jiken +FEFJ = Tantei Jinguuji Saburou 2 - Yokohamakou Renzoku Satsujin Jiken FEGJ = Tantei Jinguuji Saburo - Kikenna Futari - Zenkouhen -FEHJ = Tantei Jinguuji Saburo: Toki no Sugiyuku Mama ni +FEHJ = Tantei Jinguuji Saburo - Toki no Sugiyuku Mama ni... FEIE = City Connection FEIJ = City Connection FEIP = City Connection -FEJJ = Nazo no Murasame Jou -FELJ = Transformers: Convoy no Nazo -FEMJ = Bio-Miracle Bokutte Upa -FEML = Bio Miracle Bokutte UPA -FEMN = Bio Miracle Bokutte UPA +FEJJ = Nazo no Murasamejou +FELJ = Transformers - Convoy no Nazo +FEMJ = Bio Miracle Bokutte Upa +FEML = Bio Miracle Bokutte Upa +FEMN = Bio Miracle Bokutte Upa FENE = Life Force FENJ = Salamander -FEOJ = Zoids: Mokushiroku +FEOJ = Zoids - Mokushiroku FEPJ = Getsu Fuuma Den -FEQE = Castlevania III: Dracula's Curse -FEQJ = Akumajo Densetsu -FEQP = Castlevania III Dracula's Curse -FERE = Zoda’s Revenge: StarTropics II +FEQE = Castlevania III - Dracula's Curse +FEQJ = Akumajou Densetsu +FEQP = Castlevania III - Dracula's Curse +FERE = Zoda's Revenge - StarTropics II FERJ = Zoda's Revenge -FERM = Startropics II: Zoda's Revenge +FERM = Zoda's Revenge - StarTropics II FERP = Zoda’s Revenge: StarTropics II FESE = Clu Clu Land -FESJ = Clu Clu Land +FESJ = Clu Clu Land - Welcome to New Clu Clu Land FESP = Clu Clu Land FEUE = Donkey Kong 3 FEUJ = Donkey Kong 3 FEUP = Donkey Kong 3 FEVJ = Atlantis no Nazo FEWJ = Dragon Buster -FEXJ = Wagyan Land -FF2J = Sugoro Quest: Dice no Senshi Tachi +FEXJ = Wagan Land +FF2J = Sugoro Quest - Dice no Senshi Tachi FF4E = BurgerTime FF4J = BurgerTime -FF5E = Double Dragon II: The Revenge -FF5J = Double Dragon 2: The Revenge -FF5P = Double Dragon II: The Revenge +FF5E = Double Dragon II - The Revenge +FF5J = Double Dragon II - The Revenge +FF5P = Double Dragon II - The Revenge FF6J = Ganbare Goemon 2 -FF7J = Ganbare Goemon Gaiden: Kieta Ougon Kiseru +FF7J = Ganbare Goemon Gaiden Kieta Ogon Kiseru FFAE = Final Fantasy FFAJ = Final Fantasy FFAM = Final Fantasy FFBJ = Final Fantasy II -FFDE = Crash 'N The Boys Street Challenge +FFDE = Crash 'n the Boys - Street Challenge FFDJ = Bikkuri Nekketsu Shin Kiroku! Harukanaru Kin Medal -FFEE = A Boy and His Blob: Trouble on Blobolonia -FFEP = A Boy and His Blob: Trouble on Blobolonia +FFEE = A Boy and His Blob - Trouble on Blobolonia +FFEP = A Boy and His Blob - Trouble on Blobolonia FFFJ = Final Fantasy III -FFGJ = SD Gundam World: Gachapon Senshi - Scramble Wars +FFGJ = SD Gundam World - Gachapon Senshi - Scramble Wars FFJJ = Metal Max FFKJ = Championship Lode Runner FFLE = Princess Tomato in the Salad Kingdom -FFLJ = Salad no Kuni no Tomato Hime +FFLJ = Salada no Kuni no Tomato Hime FFME = Blaster Master -FFMJ = Chou-Wakusei Senki MetaFight +FFMJ = Chou Wakusei Senki - Metafight FFMP = Blaster Master FFNE = Mega Man 4 -FFNJ = RockMan 4: Aratanaru Yabou!! +FFNJ = Rockman 4 - Arata Naru Yabou!! FFNP = Mega Man 4 -FFOJ = Moero TwinBee: Cinnamon Hakase o Sukue! -FFPB = Ufouria: The Saga -FFPJ = Furu Furu Park -FFPP = Ufouria: THE SAGA +FFOJ = Moero! TwinBee - Cinnamon Hakushi wo Sukue! +FFPB = Ufouria - The Saga +FFPJ = Hebereke +FFPP = Ufouria - The Saga FFQE = Shadow of the Ninja FFQM = Shadow of the Ninja FFRE = Faxanadu @@ -5771,16 +6266,16 @@ FFRJ = Faxanadu FFRP = Faxanadu FFTJ = Binary Land FFUE = Adventure Island 2 -FFUJ = Takahashi Meijin no Bouken Jima II -FFUP = Adventure Island 2 +FFUJ = Takahashi Meijin no Boken Jima II +FFUP = Adventure Island II FFVE = S.C.A.T. -FFVM = S.C.A.T.: Special Cybernetic Attack Team +FFVM = S.C.A.T. FFVP = S.C.A.T.: Special Cybernetic Attack Team -FFWP = Donkey Kong: Original Edition -FFXJ = 25th Anniversary SUPER MARIO BROS. -FFXP = Super Mario Brothers: 25th Anniversary Exclusive +FFWP = Donkey Kong - Original Edition +FFXJ = 25th Super Mario Bros. +FFXP = Super Mario Bros. FFYE = Mega Man 5 -FFYJ = RockMan 5: Blues no Wana!? +FFYJ = Rockman 5 - Blues no Wana! FFYP = Mega Man 5 FFZJ = Seicross FFZY = Contra @@ -5789,16 +6284,16 @@ FMCA = The Goonies JA2J = Shin Megami Tensei JA3J = Kamaitachi no Yoru JA4E = Super Ghouls 'n Ghosts -JA4J = Chou-Makai-Mura -JA4P = Super Ghouls'n Ghosts -JA5J = Heracles no Eikou III: Kamigami no Chinmoku +JA4J = Chou Makaimura +JA4P = Super Ghouls 'n Ghosts +JA5J = Heracles no Eikou III - Kamigami no Chinmoku JA6E = Zombies Ate My Neighbors JA6J = Zombies Ate My Neighbors JA6P = Zombies JA7D = ActRaiser JA7E = ActRaiser JA7F = ActRaiser -JA7J = Actraiser +JA7J = ActRaiser JA7P = ActRaiser JA8E = Final Fight JA8J = Final Fight @@ -5809,88 +6304,88 @@ JAAP = Super Mario World JAAQ = Super Mario World JAAT = Super Mario World JABJ = Mario no Super Picross -JABL = Mario’s Super Picross +JABL = Mario's Super Picross JACE = F-Zero JACJ = F-Zero JACP = F-Zero JACT = F-Zero -JADD = The Legend of Zelda: A Link to the Past -JADE = The Legend of Zelda: A Link to the Past -JADF = The Legend of Zelda: A Link to the Past -JADJ = Zelda no Densetsu: Kamigami no Triforce -JADP = The Legend of Zelda: A Link to the Past -JADT = The Legend of Zelda: A Link to the Past +JADD = The Legend of Zelda - A Link to the Past +JADE = The Legend of Zelda - A Link to the Past +JADF = The Legend of Zelda - A Link to the Past +JADJ = Zelda no Densetsu - Kamigami no Triforce +JADP = The Legend of Zelda - A Link to the Past +JADT = The Legend of Zelda - A Link to the Past JAEE = Donkey Kong Country JAEJ = Super Donkey Kong JAEP = Donkey Kong Country JAET = Donkey Kong Country -JAFD = SimCity +JAFD = Sim City JAFE = Sim City -JAFF = SimCity -JAFJ = SimCity -JAFP = SimCity -JAGJ = Fire Emblem: Monshou no Nazo -JAHE = R-Type III: The 3rd Lightning -JAHJ = R-Type III: The Third Lightning -JAHP = R-TYPE III: The Third Lightning -JAHQ = R-Type III: The Third Lightning +JAFF = Sim City +JAFJ = Sim City +JAFP = Sim City +JAGJ = Fire Emblem - Monshou no Nazo +JAHE = R-Type III - The Third Lightning +JAHJ = R-Type III - The Third Lightning +JAHP = R-Type III - The Third Lightning +JAHQ = R-Type III - The Third Lightning JAIE = Super Castlevania IV JAIJ = Akumajou Dracula JAIP = Super Castlevania IV -JAJE = Street Fighter II: The World Warrior -JAJJ = Street Fighter II -JAJP = Street Fighter II: The World Warrior -JALE = Contra III: The Alien Wars +JAJE = Street Fighter II - The World Warrior +JAJJ = Street Fighter II - The World Warrior +JAJP = Street Fighter II - The World Warrior +JALE = Contra III - The Alien Wars JALJ = Contra Spirits -JALP = Super Probotector: Alien Rebels +JALP = Super Probotector - Alien Rebels JALT = Contra III: The Alien Wars JAME = Gradius III JAMJ = Gradius III JAMM = Gradius III -JAMT = Gradius III -JAPJ = Fire Emblem: Seisen no Keifu -JAUJ = Famicom Bunko: Hajimari no Mori +JAMT = Gradius 3 +JAPJ = Fire Emblem - Seisen no Keifu +JAUJ = Famicom Bunko - Hajimari no Mori JAVE = Super Metroid JAVJ = Super Metroid JAVP = Super Metroid JAVT = Super Metroid -JAWE = Romance of the Three Kingdoms IV: Wall of Fire -JAWJ = San Goku Shi IV -JAZD = The Legend of the Mystical Ninja -JAZE = The Legend of The Mystical Ninja -JAZJ = Ganbare Goemon: Yukihime Kyuushutsu Emaki -JAZP = The Legend of the Mystical Ninja +JAWE = Romance of the Three Kingdoms IV - Wall of Fire +JAWJ = Sangokushi IV +JAZD = The Legend of Mystical Ninja +JAZE = The Legend of Mystical Ninja +JAZJ = Ganbare Goemon - Yukihime Kyuushutsu Emaki +JAZP = The Legend of Mystical Ninja JB3D = Harvest Moon JB3E = Harvest Moon JB3J = Harvest Moon JB3P = Harvest Moon JB5J = Super Gussun Oyoyo JB6J = Treasure Hunter G -JB7J = Front Mission: Gun Hazard +JB7J = Front Mission Series - Gun Hazard JB9J = Gakkou de atta Kowai Hanashi JBAE = Metal Marines JBAJ = Militia -JBBE = Super Street Fighter II: The New Challengers -JBBJ = Super Street Fighter II: The New Challengers -JBBP = Super Street Fighter II: The New Challengers +JBBE = Super Street Fighter II - The New Challengers +JBBJ = Super Street Fighter II - The New Challengers +JBBP = Super Street Fighter II - The New Challengers JBCE = Kirby's Dream Course JBCJ = Kirby Bowl JBCP = Kirby's Dream Course JBCT = Kirby's Dream Course -JBDD = Donkey Kong Country 2: Diddy's Kong-Quest -JBDE = Donkey Kong Country 2: Diddy's Kong Quest -JBDJ = Super Donkey Kong 2: Dixie & Diddy -JBDP = Donkey Kong Country 2: Diddy's Kong-Quest -JBDT = Donkey Kong Country 2: Diddy Kong's Quest +JBDD = Donkey Kong Country 2 - Diddy's Kong Quest +JBDE = Donkey Kong Country 2 - Diddy's Kong Quest +JBDJ = Super Donkey Kong 2 - Dixie & Diddy +JBDP = Donkey Kong Country 2 - Diddy's Kong Quest +JBDT = Donkey Kong Country 2 - Diddy's Kong Quest JBEJ = Magical Drop JBFJ = Otogirisou -JBGJ = Mystery Dungeon: Shiren the Wanderer -JBHJ = Heracles no Eikou IV: Kamigami-kara no Okurimono -JBIE = Street Fighter II Turbo: Hyper Fighting -JBIJ = Street Fighter II Turbo: Hyper Fighting -JBIP = Street Fighter II Turbo: Hyper Fighting +JBGJ = Fushigi no Dungeon 2 - Furai no Shiren +JBHJ = Heracles no Eikou IV - Kamigami kara no Okurimono +JBIE = Street Fighter II' Turbo - Hyper Fighting +JBIJ = Street Fighter II' Turbo - Hyper Fighting +JBIP = Street Fighter II' Turbo - Hyper Fighting JBKE = Breath of Fire II -JBKJ = Breath of Fire II: Shimei no Ko +JBKJ = Breath of Fire II - Shimei no Ko JBKP = Breath of Fire II JBLE = Pac-Attack JBLJ = Cosmo Gang the Puzzle @@ -5899,9 +6394,9 @@ JBNE = Darius Twin JBNJ = Darius Twin JBOJ = Panel de Pon JBOQ = Panel de Pon -JBPE = Donkey Kong Country 3: Dixie Kong's Double Trouble -JBPJ = Super Donkey Kong 3: Nazo no Krems Shima -JBPP = Donkey Kong Country 3: Dixie Kong’s Double Trouble +JBPE = Donkey Kong Country 3 - Dixie Kong's Double Trouble! +JBPJ = Super Donkey Kong 3 - Nazo no Krems Shima +JBPP = Donkey Kong Country 3 - Dixie Kong's Double Trouble! JBQE = Kirby's Avalanche JBQJ = Kirby's Avalanche JBQP = Kirby's Ghost Trap @@ -5916,9 +6411,9 @@ JBTJ = Super Turrican JBTP = Super Turrican JBUE = Super Turrican 2 JBUJ = Super Turrican Two -JBVJ = Der Langrisser +JBVJ = Langrisser, Der JBWE = Cybernator -JBWJ = Assault Suits Valken +JBWJ = Jusou Kihei Valken JBWP = Cybernator JBWT = Cybernator JBYE = Super R-Type @@ -5939,42 +6434,41 @@ JC8J = Final Fantasy IV JC8M = Final Fantasy II JC8P = Final Fantasy 2 JC9J = Final Fantasy V -JCAJ = DoReMi Fantasy: Milon no DokiDoki Daibouken -JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure -JCAN = DoReMi Fantasy: Milon's DokiDoki Adventure -JCBE = Super Mario RPG: Legend of the Seven Stars +JCAJ = DoReMi Fantasy - Milon no DokiDoki Daibouken +JCAL = DoReMi Fantasy - Milon's DokiDoki Adventure +JCAN = DoReMi Fantasy - Milon's DokiDoki Adventure +JCBE = Super Mario RPG JCBJ = Super Mario RPG -JCBM = Super Mario RPG: Legend of the Seven Stars +JCBM = Super Mario RPG JCCE = Kirby Super Star JCCJ = Hoshi no Kirby Super Deluxe -JCCP = Kirby’s Fun Pak +JCCP = Kirby's Fun Pak JCDE = Kirby's Dream Land 3 JCDJ = Hoshi no Kirby 3 -JCDM = Kirby’s Dream Land 3 -JCEJ = Fire Emblem: Thracia 776 -JCGJ = Ganbare Goemon 2: Kiteretsu Shougun Magginesu -JCHJ = Ganbare Goemon 3 -JCIJ = Famicom Tantei Club Part II: Ushiro ni Tatsu Shoujo +JCDM = Kirby's Dream Land 3 +JCEJ = Fire Emblem - Thracia 776 +JCGJ = Ganbare Goemon 2 - Kiteretsu Shogun Magginesu +JCHJ = Ganbare Goemon 3 - Shishijuurokube no Karakuri Manji Gatame +JCIJ = Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo JCJE = Super Punch-Out!! JCJJ = Super Punch-Out!! -JCJP = Super Punch Out!! -JCKE = Space Invaders: The Original Game -JCKJ = Space Invaders: The Original Game -JCKP = Space Invaders -The Original Game- +JCJP = Super Punch-Out!! +JCKE = Space Invaders - The Original Game +JCKJ = Space Invaders - The Original Game +JCKP = Space Invaders - The Original Game JCLD = Secret of Mana JCLE = Secret of Mana JCLF = Secret of Mana JCLJ = Seiken Densetsu 2 JCLP = Secret of Mana -JCMJ = Super Wagyan Land +JCMJ = Super Wagan Land JCNE = Prince of Persia JCNJ = Prince of Persia JCNP = Prince of Persia -JCTE = Ogre Battle: The March of the Black Queen -JCTJ = Densetsu no Ogre Battle: The March of the Black Queen -JCTM = Ogre Battle: The March of the Black Queen -JCUE = PilotWings -JCUJ = Tactics Ogre: Let Us Cling Together +JCTE = Ogre Battle - The March of the Black Queen +JCTJ = Densetsu no Ogre Battle +JCTM = Ogre Battle - The March of the Black Queen +JCUJ = Tactics Ogre JCVE = Pilotwings JCVJ = Pilotwings JCVP = Pilotwings @@ -5982,20 +6476,20 @@ JCWE = Super Mario Kart JCWJ = Super Mario Kart JCWP = Super Mario Kart JCXE = Nobunaga's Ambition -JCXJ = Super Nobunaga no Yabou: Zengokuban -JCYE = Uncharted Waters: New Horizons +JCXJ = Super Nobunaga no Yabou - Zengoku Han +JCYE = Uncharted Waters - New Horizons JCYJ = Daikoukai Jidai II -JCZE = Genghis Khan II: Clan of the Gray Wolf -JCZJ = Super Aoki Ookami to Shiroki Meshika: Genchou Hishi +JCZE = Genghis Khan II - Clan of the Gray Wolf +JCZJ = Super Aoki Oukami to Shiroki Mejika - Genchou Hishi JD2J = Bishoujo Janshi Suchie-Pai -JD3E = Super E.D.F. Earth Defense Force -JD3J = Super E.D.F. Earth Defense Force -JD3P = SUPER E.D.F.: Earth Defense Force +JD3E = Super E.D.F. - Earth Defense Force +JD3J = Super E.D.F. +JD3P = Super E.D.F. - Earth Defense Force JD4E = Rival Turf! JD4J = Rushing Beat JD4P = Rival Turf! JD5E = Brawl Brothers -JD5J = Rushing Beat Ran: Fukusei Toshi +JD5J = Rushing Beat Ran - Fukusei Toshi JD5P = Brawl Brothers JD6E = The Ignition Factor JD6J = Fire Fighting @@ -6003,11 +6497,11 @@ JD6M = The Ignition Factor JD7E = Super Adventure Island JD7J = Takahashi Meijin no Daibouken Jima JD7P = Super Adventure Island -JD8E = Super Adventure Island II +JD8E = Adventure Island II JD8J = Takahashi Meijin no Daibouken Jima II JD8P = Super Adventure Island II JD9E = Super Bonk -JD9J = Chou-Genjin +JD9J = Super Genjin JD9M = Super Bonk JDAE = Final Fantasy III JDAJ = Final Fantasy VI @@ -6028,62 +6522,62 @@ JDHJ = Super Famicom Wars JDIE = Super Star Wars JDIJ = Super Star Wars JDIP = Super Star Wars -JDJE = Super Star Wars: The Empire Strikes Back +JDJE = Super Star Wars - The Empire Strikes Back JDJJ = Super Star Wars The Empire Strikes Back -JDJP = Super Star Wars: The Empire Strikes Back +JDJP = Super Star Wars - The Empire Strikes Back JDKJ = Metal Max 2 -JDLE = Super Star Wars: Return of the Jedi +JDLE = Super Star Wars - Return of the Jedi JDLJ = Super Star Wars Return Of The Jedi -JDLP = Super Star Wars: Return of the Jedi +JDLP = Super Star Wars - Return of the Jedi JDMJ = Kirby no Kirakira Kizzu JDNE = Ghoul Patrol JDNJ = Ghoul Patrol JDNP = Ghoul Patrol -JDOJ = Heisei Shin Onigashima: Zenpen -JDPJ = Heisei Shin Onigashima: Kouhen -JDQJ = Romancing Sa-Ga 3 +JDOJ = Heisei Shin Onigashima Zenpen +JDPJ = Heisei Shin Onigashima Kouhen +JDQJ = Romancing SaGa 3 JDRJ = Clock Tower JDSJ = Shin Megami Tensei II -JDTJ = Shin Megami Tensei if... +JDTJ = Shin Megami Tensei If... JDUJ = Albert Odyssey JDVE = Wild Guns JDVJ = Wild Guns JDVP = Wild Guns -JDWE = Aero the Acrobat +JDWE = Aero the Acro-Bat JDWJ = Aero The Acrobat -JDWP = Aero The Acrobat +JDWP = Aero the Acro-Bat JDXE = Aero the Acrobat 2 JDXJ = Aero The Acrobat Two JDXP = Aero the Acrobat 2 -JDYJ = Rudra no Hihou -JDZD = Mystic Quest Legend​ +JDYJ = Rudora no Hihou +JDZD = Mystic Quest Legend JDZE = Final Fantasy Mystic Quest -JDZF = Mystic Quest Legend​ -JDZJ = Final Fantasy USA: Mystic Quest -JDZP = Mystic Quest Legend​ +JDZF = Final Fantasy Mystic Quest +JDZJ = Final Fantasy USA - Mystic Quest +JDZP = Mystic Quest Legend JEAE = Natsume Championship Wrestling JEAJ = Natsume Championship Wrestling JEAM = Natsume Championship Wrestling JEAP = Natsume Championship Wrestling JEBE = Mega Man X -JEBJ = RockMan X +JEBJ = Rockman X JEBP = Mega Man X JECE = Chrono Trigger JECJ = Chrono Trigger JECM = Chrono Trigger JECP = Chrono Trigger -JEDJ = Kunio-Kun no Dodge Ball Dayo Zenin Shuugo! +JEDJ = Kunio-kun no Dodgeball da yo Zenin Shugou! JEEJ = Majin Tensei -JEFJ = Majin Tensei II: Spiral Nemesis -JEGJ = Gouketuji Ichizoku +JEFJ = Majin Tensei II - Spiral Nemesis +JEGJ = Gouketsuji Ichizoku JEHE = Mega Man X2 -JEHJ = RockMan X2 +JEHJ = Rockman X2 JEHP = Mega Man X2 JEIJ = Metal Max Returns JEJJ = Tsukikomori -JEKJ = Kyūyaku Megami Tensei: Megami Tensei I・II +JEKJ = Kyuuyaku Megami Tensei NA3E = Bomberman Hero -NA3J = Bomberman Hero +NA3J = Bomberman Hero - Millian-Oujo wo Sukue! NA3P = Bomberman Hero NAAE = Super Mario 64 NAAJ = Super Mario 64 @@ -6092,9 +6586,9 @@ NABE = Mario Kart 64 NABJ = Mario Kart 64 NABP = Mario Kart 64 NABT = Mario Kart 64 -NACE = The Legend of Zelda: Ocarina of Time -NACJ = Zelda no Densetsu: Toki no Ocarina -NACP = The Legend of Zelda: Ocarina of Time +NACE = The Legend of Zelda - Ocarina of Time +NACJ = Zelda no Densetsu - Toki no Okarina +NACP = The Legend of Zelda - Ocarina of Time NADE = Star Fox 64 NADJ = Star Fox 64 NADP = Lylat Wars @@ -6110,42 +6604,41 @@ NAHE = Yoshi's Story NAHJ = Yoshi's Story NAHP = Yoshi's Story NAIE = Wave Race 64 -NAIJ = Wave Race 64: Kawasaki Jet Ski +NAIJ = Wave Race 64 NAIP = Wave Race 64 NAJ8 = The Legend of Zelda: Ocarina of Time (spanish translation) -NAJ9 = Super Smash Bros. -NAJJ = Tsumi to Batsu +NAJJ = Tsumi to Batsu - Hoshi no Keishousha NAJL = Sin & Punishment -NAJN = Sin and Punishment +NAJN = Sin & Punishment NAKD = Pokémon Snap NAKE = Pokémon Snap NAKF = Pokémon Snap NAKI = Pokémon Snap NAKJ = Pokémon Snap NAKP = Pokémon Snap -NAKS = Pokémon Snap +NAKS = Pokemon Snap NALE = Super Smash Bros. -NALJ = Nintendo All-Star Dairantou Smash Brothers +NALJ = Nintendo All-Star! Dairantou Smash Brothers NALP = Super Smash Bros. -NAME = Kirby 64: The Crystal Shards +NAME = Kirby 64 - The Crystal Shards NAMJ = Hoshi no Kirby 64 -NAMP = Kirby 64: The Crystal Shards -NAMT = Kirby 64: The Crystal Shards -NAND = Pokémon Puzzle League +NAMP = Kirby 64 - The Crystal Shards +NAMT = Kirby 64 - The Crystal Shards +NAND = Poke╠ümon Puzzle League NANE = Pokémon Puzzle League NANF = Pokémon Puzzle League NANJ = Pokémon Puzzle League NANP = Pokémon Puzzle League -NAOE = 1080° Snowboarding -NAOJ = 1080° Snowboarding -NAOP = 1080°: TenEighty Snowboarding -NAOT = 1080° Snowboarding +NAOE = 1080 Snowboarding +NAOJ = 1080 Snowboarding +NAOP = 1080 Snowboarding +NAOT = 1080 Snowboarding NAPJ = Custom Robo V2 -NARE = The Legend of Zelda: Majora's Mask -NARJ = Zelda no Densetsu: Majora no Kamen -NARP = The Legend of Zelda: Majora's Mask +NARE = The Legend of Zelda - Majora's Mask +NARJ = Zelda no Densetsu - Mujura no Kamen +NARP = The Legend of Zelda - Majora's Mask NASE = Cruis'n USA -NASJ = Cruisn USA +NASJ = Cruis'n USA NASP = Cruis'n USA NATE = Mario Tennis NATJ = Mario Tennis 64 @@ -6153,9 +6646,9 @@ NATP = Mario Tennis NAUE = Mario Golf NAUJ = Mario Golf 64 NAUP = Mario Golf -NAYE = Ogre Battle 64: Person of Lordly Caliber -NAYJ = Ogre Battle 64: Person of Lordly Caliber -NAYM = Ogre Battle 64: Person of Lordly Caliber +NAYE = Ogre Battle 64 - Person of Lordly Caliber +NAYJ = Ogre Battle 64 - Person of Lordly Caliber +NAYM = Ogre Battle 64 - Person of Lordly Caliber NAZE = Mario Party 2 NAZJ = Mario Party 2 NAZP = Mario Party 2 @@ -6173,13 +6666,13 @@ LADE = Phantasy Star LADJ = Phantasy Star LADP = Phantasy Star LAEE = Alex Kidd in Miracle World -LAEJ = Alex Kidd in Miracle World +LAEJ = Alex Kidd no Miracle World LAEP = Alex Kidd in Miracle World LAFJ = Ashura -LAFN = Secret Commando +LAFN = Secret Command LAFP = Secret Command -LAGE = Sonic the Hedgehog -LAGJ = Sonic the Hedgehog +LAGE = Sonic The Hedgehog +LAGJ = Sonic The Hedgehog LAGP = Sonic The Hedgehog LAHE = Space Harrier LAHJ = Space Harrier @@ -6187,46 +6680,46 @@ LAHP = Space Harrier LAIE = Enduro Racer LAIJ = Enduro Racer LAIP = Enduro Racer -LAJE = Sonic the Hedgehog 2 -LAJJ = Sonic the Hedgehog 2 +LAJE = Sonic The Hedgehog 2 +LAJJ = Sonic The Hedgehog 2 LAJP = Sonic The Hedgehog 2 LAKE = Wonder Boy in Monster Land -LAKJ = Super Wonder Boy: Monster World +LAKJ = Super Wonder Boy - Monster World LAKP = Wonder Boy in Monster Land -LALE = Fantasy Zone II: The Tears of OPA-OPA -LALJ = Fantasy Zone II: The Tears of Opa-Opa -LALP = Fantasy Zone II +LALE = Fantasy Zone II - The Tears of Opa-Opa +LALJ = Fantasy Zone II - Opa-Opa no Namida +LALP = Fantasy Zone II - The Tears of Opa-Opa LAME = Sonic Chaos LAMJ = Sonic Chaos LAMP = Sonic Chaos -LANE = Alex Kidd: The Lost Stars -LANJ = Alex Kidd: The Lost Stars -LANP = Alex Kidd: The Lost Stars +LANE = Alex Kidd - The Lost Stars +LANJ = Alex Kidd - The Lost Stars +LANP = Alex Kidd - The Lost Stars LAOE = R-Type LAOJ = R-Type LAOP = R-Type -LAPE = Wonder Boy III: The Dragon's Trap -LAPP = Wonder Boy III: The Dragon's Trap +LAPE = Wonder Boy III - The Dragon's Trap +LAPP = Wonder Boy III - The Dragon's Trap LAQE = Alex Kidd in Shinobi World LAQP = Alex Kidd in Shinobi World MA2J = Dyna Brothers MA3E = Puyo Puyo 2 -MA3J = Puyo Puyo Tsuu +MA3J = Puyo Puyo 2 MA3L = Puyo Puyo 2 MA4J = Bahamut Senki MA5J = Rent A Hero MA6E = Streets of Rage 2 -MA6J = Bare Knuckle II: Shitou no Chinkon Uta +MA6J = Bare Knuckle II - Shitou he no Chinkon Uta MA6P = Streets of Rage 2 MA7E = Shining in the Darkness -MA7J = Shining and the Darkness +MA7J = Shining Darkness MA7P = Shining in the Darkness -MA8E = Ecco: The Tides of Time +MA8E = Ecco - The Tides of Time MA8J = Ecco the Dolphin 2 -MA8P = Ecco: The Tides of Time +MA8P = Ecco - The Tides of Time MA9J = The Hybrid Front MAAE = Altered Beast -MAAJ = Juuouki +MAAJ = Juuouki - Altered Beast MAAP = Altered Beast MABE = Columns MABJ = Columns @@ -6238,7 +6731,7 @@ MADE = Ecco the Dolphin MADJ = Ecco the Dolphin MADP = Ecco the Dolphin MAEE = Golden Axe -MAEJ = Golden Axe +MAEJ = The Golden Axe MAEP = Golden Axe MAFE = Gunstar Heroes MAFJ = Gunstar Heroes @@ -6246,38 +6739,38 @@ MAFP = Gunstar Heroes MAGE = Ristar MAGJ = Ristar MAGP = Ristar -MAHE = Sonic the Hedgehog -MAHJ = Sonic the Hedgehog -MAHP = Sonic the Hedgehog +MAHE = Sonic The Hedgehog +MAHJ = Sonic The Hedgehog +MAHP = Sonic The Hedgehog MAIE = Space Harrier II MAIJ = Space Harrier II MAIP = Space Harrier II -MAJE = Toe Jam & Earl +MAJE = ToeJam & Earl MAJJ = ToeJam & Earl MAJP = ToeJam & Earl -MAKE = Shadow Dancer: The Secret of Shinobi -MAKJ = Shadow Dancer: The Secret of Shinobi -MAKP = Shadow Dancer: The Secret of Shinobi -MALE = Bonanza Bros. -MALJ = Bonanza Bros. -MALP = Bonanza Bros. -MAME = Sword of Vermillion -MAMJ = Vermilion +MAKE = Shadow Dancer - The Secret of Shinobi +MAKJ = Shadow Dancer +MAKP = Shadow Dancer - The Secret of Shinobi +MALE = Bonanza Bros +MALJ = Bonanza Bros +MALP = Bonanza Bros +MAME = Sword of Vermilion +MAMJ = Sword of Vermillion MAMP = Sword of Vermilion MANE = Gain Ground MANJ = Gain Ground MANP = Gain Ground -MAOE = Bio-Hazard Battle -MAOJ = Crying: Aseimei Sensou -MAOP = Bio-Hazard Battle +MAOE = Biohazard Battle +MAOJ = Crying - Aseimei Sensou +MAOP = Biohazard Battle MAPE = Comix Zone MAPJ = Comix Zone MAPP = Comix Zone MAQE = Streets of Rage -MAQJ = Bare Knuckle: Ikari no Tekken +MAQJ = Bare Knuckle - Ikari no Tekken MAQP = Streets of Rage MARE = Beyond Oasis -MARJ = The Story of Thor: Hikari o Tsugu Mono +MARJ = The Story of Thor - Hikari o Tsugu Mono MARP = The Story of Thor MASE = Vectorman MASJ = Vectorman @@ -6285,16 +6778,16 @@ MASP = Vectorman MATE = Sonic Spinball MATJ = Sonic Spinball MATP = Sonic Spinball -MAUJ = Puzzle & Action: Tant-R +MAUJ = Puzzle Action - Tanto-R MAVE = Wonder Boy in Monster World -MAVJ = Wonder Boy V: Monster World III -MAVP = Wonder Boy In Monster World +MAVJ = Wonder Boy V - Monster World III +MAVP = Wonder Boy in Monster World MAWE = Virtua Fighter 2 MAWJ = Virtua Fighter 2 MAWP = Virtua Fighter 2 MAXE = Alex Kidd in the Enchanted Castle -MAXJ = Alex Kidd: Tenkuu Mashiro -MAXP = Alex Kidd In The Enchanted Castle +MAXJ = Alex Kidd - Tenkuu Majou +MAXP = Alex Kidd in the Enchanted Castle MAYE = Alien Storm MAYJ = Alien Storm MAYP = Alien Storm @@ -6305,60 +6798,60 @@ MB3E = Monster World IV MB3J = Monster World IV MB3L = Monster World IV MB4J = Party Quiz Mega Q -MB5J = Rangurissah II -MB6E = Shining Force II -MB6J = Shining Force II: Inishie no Fuuin -MB6P = Shining Force II +MB5J = Langrisser II +MB6E = Shining Force II - Ancient Sealing +MB6J = Shining Force II - Inishie no Fuuin +MB6P = Shining Force II MB7E = Mega Turrican MB7P = Mega Turrican MB8E = Phantasy Star II -MB8J = Phantasy Star II: Kaerazaru Toki no Owari ni +MB8J = Phantasy Star II - Kaerazaru Toki no Owari ni MB8P = Phantasy Star II -MB9J = Pepenga Pengo +MB9J = Pepen ga Pengo MBAJ = Pulseman MBAL = Pulseman MBAN = Pulseman -MBBE = Sonic the Hedgehog 2 -MBBJ = Sonic the Hedgehog 2 -MBBP = Sonic the Hedgehog 2 +MBBE = Sonic The Hedgehog 2 +MBBJ = Sonic The Hedgehog 2 +MBBP = Sonic The Hedgehog 2 MBCE = Kid Chameleon MBCJ = Chameleon Kid MBCP = Kid Chameleon MBDE = Golden Axe II -MBDJ = Golden Axe II +MBDJ = The Golden Axe II MBDP = Golden Axe II MBEE = Shining Force -MBEJ = Shining Force: Kamigami no Isan +MBEJ = Shining Force - Kamigami no Isan MBEP = Shining Force -MBFE = Shinobi III: Return of the Ninja Master -MBFJ = The Super Soldier II -MBFP = Shinobi III: Return of the Ninja master +MBFE = Shinobi III - Return of the Ninja Master +MBFJ = The Super Shinobi II +MBFP = Shinobi III - Return of the Ninja Master MBGE = Dynamite Headdy MBGJ = Dynamite Headdy MBGP = Dynamite Headdy -MBHJ = Puzzle & Action: Ichidant-R -MBIE = Landstalker: The Treasures of King Nole -MBIJ = LandStalker: Koutei no Zaihou -MBIP = Landstalker: The Treasures of King Nole -MBJE = Ghouls'n Ghosts -MBJJ = Dai Makai-Mura -MBJP = Ghouls'n Ghosts +MBHJ = Puzzle & Action - Ichidant-R +MBIE = Landstalker - The Treasures of King Nole +MBIJ = LandStalker - Koutei no Zaihou +MBIP = Landstalker - The Treasures of King Nole +MBJE = Ghouls 'n Ghosts +MBJJ = Dai Makaimura +MBJP = Ghouls 'n Ghosts MBKJ = Crack Down MBKP = Crack Down -MBLJ = ESWAT: Cyber Police -MBLP = ESWAT City Under Siege -MBME = Sonic the Hedgehog 3 -MBMJ = Sonic the Hedgehog 3 -MBMP = Sonic the Hedgehog 3 +MBLJ = ESWAT - Cyber Police +MBLP = ESWAT - City Under Siege +MBME = Sonic The Hedgehog 3 +MBMJ = Sonic The Hedgehog 3 +MBMP = Sonic The Hedgehog 3 MBNJ = Chelnov MBOE = Golden Axe III -MBOJ = Golden Axe III +MBOJ = The Golden Axe III MBOP = Golden Axe III MBPE = Super Thunder Blade MBPJ = Super Thunder Blade MBPP = Super Thunder Blade MBQE = Streets of Rage 3 -MBQJ = Bare Knuckle III +MBQJ = Bare Knuckle III - Tekken Seiten MBQP = Streets of Rage 3 MBRE = Rolling Thunder 2 MBRJ = Rolling Thunder 2 @@ -6367,13 +6860,13 @@ MBSJ = Dyna Brothers 2 Special MBTE = Alien Soldier MBTJ = Alien Soldier MBTP = Alien Soldier -MBUE = Sonic 3D: Blast +MBUE = Sonic 3D Blast MBUJ = Sonic 3D Blast -MBUP = Sonic 3D: Flickies' Island -MBVJ = Jusu Kihei Leynos -MBWE = Columns III: Revenge of Columns -MBWJ = Columns III: Taiketsu! Columns World -MBWM = Columns III: Revenge of Columns +MBUP = Sonic 3D - Flickies' Island +MBVJ = Juso Kihei Leynos +MBWE = Columns III - Revenge of Columns +MBWJ = Columns III - Taiketsu! Columns World +MBWM = Columns III - Revenge of Columns MBXE = Ecco Jr. MBXJ = Ecco Jr. MBXM = Ecco Jr. @@ -6386,9 +6879,9 @@ MBZP = Eternal Champions MC2E = Earthworm Jim 2 MC2J = Earthworm Jim 2 MC2P = Earthworm Jim 2 -MC3E = Super Street Fighter II: The New Challengers -MC3J = Super Street Fighter 2: The New Challengers -MC3P = Super Street Fighter II: The New Challengers +MC3E = Super Street Fighter II - The New Challengers +MC3J = Super Street Fighter II - The New Challengers +MC3P = Super Street Fighter II - The New Challengers MC4E = Strider MC4J = Strider Hiryu MC4P = Strider @@ -6397,9 +6890,9 @@ MCAL = Gley Lancer MCAN = Gley Lancer MCBE = Powerball MCBJ = Wrestleball -MCCE = Phantasy Star III -MCCJ = Toki no Keishousha: Phantasy Star III -MCCP = Phantasy Star III: Generations of Doom +MCCE = Phantasy Star III - Generations of Doom +MCCJ = Toki no Keishousha - Phantasy Star III +MCCP = Phantasy Star III - Generations of Doom MCDE = Sonic & Knuckles MCDJ = Sonic & Knuckles MCDP = Sonic & Knuckles @@ -6411,38 +6904,38 @@ MCGE = Forgotten Worlds MCGJ = Forgotten Worlds MCGP = Forgotten Worlds MCHE = M.U.S.H.A. -MCHJ = Musha Aleste -MCHM = MUSHA +MCHJ = M.U.S.H.A. +MCHM = M.U.S.H.A. MCIJ = Gynoug MCJE = Splatterhouse 2 -MCJJ = Splatterhouse Part 2 +MCJJ = Splatterhouse MCJP = Splatterhouse 2 MCKE = Phantasy Star IV -MCKJ = Phantasy Star: Sennenki no Owari ni +MCKJ = Phantasy Star - Sennenki no Owari MCKP = Phantasy Star IV -MCLE = Street Fighter II': Special Champion Edition -MCLJ = Street Fighter II' Plus: Champion Edition -MCLP = Street Fighter II’: Special Champion Edition -MCMJ = Lord Monarch: Tokoton Sentou Densetsu -MCNJ = Hokuto no Ken: Shin Seikimatu Kyuseisyu Densetsu +MCLE = Street Fighter II - Special Champion Edition +MCLJ = Street Fighter II Dash Plus - Champion Edition +MCLP = Street Fighter II - Special Champion Edition +MCMJ = Lord Monarch - Tokoton Sentou Densetsu +MCNJ = Hokuto no Ken - Shin Seikimatsu Kyuseishu Densetsu MCOJ = Sorcerian MCPE = Earthworm Jim MCPJ = Earthworm Jim MCPP = Earthworm Jim -MCQE = Boogerman: A Pick and Flick Adventure -MCQP = Boogerman - A Pick and Flick Adventure -MCRE = Wolf of the Battlefield: MERCS -MCRJ = Senjou no Ookami II -MCRP = Wolf of the Battlefield: MERCS -MCSJ = Wonder Boy III: Monster Lair -MCSN = Wonder Boy III: Monster Lair -MCSP = Wonder Boy III: Monster Lair +MCQE = Boogerman - A Pick and Flick Adventure +MCQP = Boogerman +MCRE = Mercs - Wolf of the Battlefield +MCRJ = Senjou no Ōkami II +MCRP = Wolf of the Battlefield - MERCS +MCSJ = Wonder Boy III - Monster Lair +MCSN = Wonder Boy III - Monster Lair +MCSP = Wonder Boy III - Monster Lair MCTE = Clay Fighter MCTP = Clay Fighter -MCUJ = Dragon Slayer: The Legend of Heroes -MCVE = Pitfall: The Mayan Adventure -MCVJ = Pitfall: The Mayan Adventure -MCVP = Pitfall: The Mayan Adventure +MCUJ = Dragon Slayer - Eiyu Densetsu +MCVE = Pitfall - The Mayan Adventure +MCVJ = Pitfall - The Mayan Adventure +MCVP = Pitfall - The Mayan Adventure MCWE = Galaxy Force II MCWJ = Galaxy Force II MCWP = Galaxy Force II @@ -6450,13 +6943,13 @@ MCXJ = Dragon Slayer: The Legend of Heroes MCYE = The Revenge of Shinobi MCYJ = The Super Shinobi MCYP = The Revenge of Shinobi -MCZE = Shanghai II: Dragon's Eye -MCZP = Shanghai II Dragon's Eye -PA2J = Nekketsu Koukou Dodgeball Bu: CD Soccer Hen +MCZE = Shanghai II - Dragon's Eye +MCZP = Shanghai II - Dragon's Eye +PA2J = Yokai Douchuuki PA3J = Salamander PA4J = Parasol Stars PA6E = Bloody Wolf -PA6J = Narazumono Sentou Butai: Bloody Wolf +PA6J = Narazumono Sentou Butai - Bloody Wolf PA6P = Bloody Wolf PA7E = Alien Crush PA7J = Alien Crush @@ -6467,24 +6960,24 @@ PA9E = Splatterhouse PA9J = Splatterhouse PA9P = Splatterhouse PAAE = Bomberman '93 -PAAP = Bomberman'93 +PAAP = Bomberman '93 PABE = Bonk's Adventure -PABJ = PC Genjin +PABJ = PC Genjin - Pithecanthropus Computerus PABP = Bonk's Adventure PACE = Dungeon Explorer PACJ = Dungeon Explorer PACP = Dungeon Explorer PADE = R-Type -PADJ = R-Type I +PADJ = R-Type PADP = R-Type PAEE = Super Star Soldier PAEJ = Super Star Soldier PAEP = Super Star Soldier PAFE = Victory Run -PAFJ = Victory Run: Eikou no 13,000KM +PAFJ = Victory Run - Eikou no 13,000KM PAFP = Victory Run PAGJ = Bomberman '94 -PAGL = Bomberman'94 +PAGL = Bomberman '94 PAGN = Bomberman '94 PAHE = Battle Lode Runner PAHJ = Battle Lode Runner @@ -6492,7 +6985,7 @@ PAHP = Battle Lode Runner PAIE = New Adventure Island PAIJ = Takahashi Meijin no Shin Bouken Jima PAIP = New Adventure Island -PAJJ = Joshoken Necromancer +PAJJ = Jaseiken Necromancer PAKE = Dragon's Curse PAKJ = Adventure Island PAKP = Dragon's Curse @@ -6500,7 +6993,7 @@ PALE = Soldier Blade PALJ = Soldier Blade PALP = Soldier Blade PAME = Neutopia -PAMJ = Neutopia: Frey no Shou +PAMJ = Neutopia - Frey no Shou PAMP = Neutopia PANE = Military Madness PANJ = Nectaris @@ -6510,18 +7003,18 @@ PAOL = Final Soldier PAON = Final Soldier PAPJ = R-Type II PAQJ = Gradius -PARJ = Detana TwinBee -PARL = Detana Twin Bee -PARN = Detana Twin Bee +PARJ = Detana!! TwinBee +PARL = Detana!! TwinBee +PARN = Detana!! TwinBee PASJ = Cadash -PATJ = Kiki Kaikai -PAUJ = Kaizou Chounin Shubibinman +PATJ = KiKi KaiKai +PAUJ = Kaizou Choujin Shubibinman PAVE = Vigilante PAVJ = Vigilante PAVP = Vigilante PAWE = Galaga '90 PAWJ = Galaga '88 -PAWP = Galaga'90 +PAWP = Galaga '90 PAYJ = Valkyrie no Densetsu PAZJ = Genpei Toumaden PB2E = Neutopia II @@ -6549,37 +7042,37 @@ PBDJ = Double Dungeons PBDP = Double Dungeons PBEE = Moto Roader PBEJ = Moto Roader -PBEP = Motoroader -PBFJ = Fire ProWrestling: Combination Tag +PBEP = Moto Roader +PBFJ = Fire ProWrestling - Combination Tag PBHE = Bonk's Revenge -PBHJ = PC Genjin 2 +PBHJ = PC Denjin 2 PBHP = Bonk's Revenge -PBIE = Bonk 3: Bonk's Big Adventure -PBIJ = PC Genjin 3 -PBIP = Bonk III: Bonk's Big Adventure +PBIE = Bonk 3 - Bonk's Big Adventure +PBIJ = PC Denjin 3 +PBIP = Bonk 3 - Bonk's Big Adventure PBJE = Samurai Ghost -PBJJ = Genpei Toumaden: Kannoni +PBJJ = Genpei Toumaden - Kan no Ni PBJP = Samurai Ghost PBME = Legend of Hero Tonma PBMJ = Legend of Hero Tonma PBMP = Legend of Hero Tonma PBNE = Ninja Spirit -PBNJ = Saigou no Nindou: Ninja Spirit +PBNJ = Saigo no Nindou - Ninja Spirit PBNP = Ninja Spirit -PBSE = Chew Man Fu +PBSE = Chew-Man-Fu PBSJ = Be Ball -PBSP = Chew Man Fu +PBSP = Chew-Man-Fu PBTE = China Warrior PBTJ = The Kung Fu PBTP = China Warrior PBUE = Bravoman -PBUJ = Chouzetsu Rinjin Bravoman +PBUJ = Chouzetsurinjin Bravoman PBVJ = Benkei Gaiden -PBWE = Air “Zonk” -PBWJ = PC Denjin: Punkic Cyborgs -PBWP = Air 'Zonk' +PBWE = Air Zonk +PBWJ = PC Denjin - Punkic Cyborgs +PBWP = Air Zonk PBXE = Shockman -PBXJ = Kaizou Chounin Shubibinman 2: Atanaru Teki +PBXJ = Kaizou Choujin Shubibinman 2 - Aratanaru Teki PBXP = Shockman PBYJ = Out Live PBZE = J.J. & Jeff @@ -6588,7 +7081,7 @@ PC2E = Chase H.Q. PC2J = Chase H.Q. PC2P = Chase H.Q. PC3J = Darius Plus -PC4J = Space Invaders: Fukkatsu no Hi +PC4J = Space Invaders - Fukkatsu no Hi PC5J = Dragon Saber PC6J = Final Blaster PC7J = Mizubaku Daibouken @@ -6598,7 +7091,7 @@ PCAE = Silent Debuggers PCAJ = Silent Debuggers PCAP = Silent Debuggers PCBE = Dead Moon -PCBJ = Dead Moon: Tsuki Sekai no Akumu +PCBJ = Dead Moon - Getsu Sekai no Akumu PCBP = Dead Moon PCCJ = Makai Hakkenden Shada PCDJ = Appare! Gateball @@ -6620,8 +7113,8 @@ PCQJ = Psycho Chaser PCRJ = Break In PCRL = Break In PCRN = Break In -PCSJ = Digital Champ: Battle Boxing -PCSL = Digital Champ: Battle Boxing +PCSJ = Digital Champ +PCSL = Digital Champ Battle Boxing PCSN = Digital Champ Battle Boxing PCTJ = Power Tennis PCUJ = Fire ProWrestling 2nd Bout @@ -6630,58 +7123,57 @@ PCVP = World Class Baseball PCWJ = Image Fight PCXJ = Power League IV PCYJ = Wallaby!! Usagi no Kuni no Kangaroo Race -PDAJ = Hot Blood High School Dodgeball Club +PDAJ = Nekketsu Koukou Dodgeball Bu - PC Bangaihen PDCJ = Dai Makaimura PDDJ = Volfied -PDEJ = S.C.I.: Special Criminal Investigation +PDEJ = S.C.I. - Special Criminal Investigation PDFJ = Jigoku Meguri -PDGJ = Fire ProWrestling 3: Legend Bout +PDGJ = Fire ProWrestling 3 - Legend Bout PDHJ = Rastan Saga II -PDIE = Champion Wrestler PDIJ = Champion Wrestler -PDJJ = Street Fighter II': Champion Edition -PDJL = Street Fighter II': Champion Edition -PDJN = Street Fighter II: Champion Edition -QA2J = Nekketsu Koukou Dodge Ball-Bu: CD Soccer-hen -QA3E = SimEarth: The Living Planet +PDJJ = Street Fighter II Dash - Champion Edition +PDJL = Street Fighter II - Champion Edition +PDJN = Street Fighter II - Champion Edition +QA2J = Nekketsu Koukou Dodgeball Bu - CD Soccer Hen +QA3E = SimEarth - The Living Planet QA3J = SimEarth -QA3P = SimEarth: The Living Planet -QA4J = Super Darius II -QA5J = Space Invaders: The Original Game +QA3P = SimEarth - The Living Planet +QA4J = Super Darius 2 +QA5J = Space Invaders - The Original Game QA6J = Super Darius -QA7J = Legend of Xanadu: Kaze no Densetsu Xanadu +QA7J = Kaze no Densetsu Xanadu QA8J = Spriggan Mark 2 -QA9J = Kaze no Densetsu: Xanadu II -QAAE = Super Air Zonk -QAAJ = CD Denjin: Rockabilly Tengoku -QAAP = Super Air Zonk -QABE = Ys Book I & II -QABJ = Ys I + II -QABP = Ys Book I & II +QA9J = Kaze no Densetsu Xanadu II +QAAE = Super Air Zonk - Rockabilly-Paradise +QAAJ = CD Denjin - Rockabilly Tengoku +QAAP = Super Air Zonk - Rockabilly-Paradise +QABE = Ys - Book I & II +QABJ = Ys - Book I & II +QABP = Ys - Book I & II QACJ = Cho Aniki QACL = Cho Aniki QACN = Cho Aniki -QADJ = Gradius II: Gofer no Yabou -QADL = Gradius II: Gofer no Yabou -QADN = Gradius II Gofer No Yabou -QAEJ = A.III: A-Ressha de Ikou III +QADJ = Gradius II - Gofer no Yabou +QADL = Gradius II - Gofer no Yabou +QADN = Gradius II - Gofer no Yabou +QAEJ = The Path of the Warrior - Art of Fighting 3 QAFE = The Dynastic Hero -QAFJ = Chou Eiyuu Densetsu: Dynastic Hero +QAFJ = Chou Eiyuu Densetsu - Dynastic Hero QAFP = The Dynastic Hero QAGE = Gate of Thunder QAGJ = Gate of Thunder QAGP = Gate of Thunder QAHJ = Kawa no Nushi Tsuni Shizenha QAJJ = Image Fight II -QAKJ = Ai Chou Aniki -QALJ = The Atlas: Renaissance Voyager +QAKJ = Ai Cho Aniki +QALJ = The Atlas - Renaissance Voyager QANJ = Neo Nectaris QAOJ = Dungeon Explorer II -QAPJ = Akumajou Dracula X: Chi no Rondo -QAPL = Castlevania: Rondo of Blood -QAPN = Castlevania Rondo of Blood +QAPJ = Akumajou Dracula X - Chi no Rondo +QAPL = Castlevania - Rondo of Blood +QAPN = Castlevania - Rondo of Blood QAPP = Castlevania: Rondo of Blood -QAQJ = Dragon Slayer: Eiyuu Densetsu +QAQJ = Dragon Slayer - Eiyu Densetsu QARJ = Blood Gear QASE = Lords of Thunder QASJ = Winds of Thunder @@ -6690,16 +7182,16 @@ QATE = Riot Zone QATJ = Crest of Wolf QATP = Riot Zone QAUE = Monster Lair -QAUJ = Wonder Boy III: Monster Lair +QAUJ = Wonder Boy III - Monster Lair QAUP = Monster Lair -QAVJ = Bomberman: Panic Bomber +QAVJ = Bomberman - Panic Bomber QAWJ = Star Parodier QAWL = Star Parodier QAWN = Star Parodier QAXJ = Martial Champion QAYJ = Seirei Senshi Spriggan -QAZJ = Eikan wa Kimi ni: Kōkō Yakyū Zenkoku Taikai -QBAJ = L Dis +QAZJ = Eikan wa Kimi ni - Koko Yakyu Zenkoku Taikai +QBAJ = L-Dis QBBE = Fighting Street QBBJ = Fighting Street QBBP = Fighting Street @@ -6707,25 +7199,25 @@ SP4V = Castlevania: Rondo of Blood EA2E = Metal Slug 2 EA2J = Metal Slug 2 EA2P = Metal Slug 2 -EA3J = Galaxy Fight: Universal Warriors +EA3J = Galaxy Fight - Universal Warriors EA4E = Samurai Shodown III -EA4J = Samurai Spirits Kibeniro Musouken +EA4J = Samurai Spirits - Zankuro Musouken EA4P = Samurai Shodown III -EA5E = Fatal Fury 3: Road to the Final Victory -EA5J = Garou Densetsu 3: Road to the Final Victory -EA5P = Fatal Fury 3: Road To The Final Victory +EA5E = Fatal Fury 3 - Road to the Final Victory +EA5J = Garou Densetsu 3 - Road to the Final Victory +EA5P = Fatal Fury 3 - Road to the Final Victory EA6E = The King of Fighters '96 EA6J = The King of Fighters '96 EA6P = The King of Fighters '96 -EA7E = Samurai Shodown IV: Amakusa's Revenge -EA7J = Samurai Spirits: Amakusa Kourin -EA7P = Samurai Shodown IV: Amakusa's Revenge +EA7E = Samurai Shodown IV - Amakusa's Revenge +EA7J = Samurai Spirits - Amakusa Kourin +EA7P = Samurai Shodown IV - Amakusa's Revenge EA8E = Ironclad -EA8J = Ironclad: Chotetsu Brikinger -EA8M = Iron Clad +EA8J = IRONCLAD Chotetsu Brikinger +EA8M = Ironclad EA9J = Waku Waku 7 EAAE = Fatal Fury -EAAJ = Garou Densetsu: Shukumei no Takatai +EAAJ = Garou Densetsu - Shukumei no Tatakai EAAP = Fatal Fury EABE = World Heroes EABJ = World Heroes @@ -6737,7 +7229,7 @@ EADE = Art of Fighting EADJ = Ryuuko no Ken EADP = Art of Fighting EAEE = Samurai Shodown -EAEJ = Shin Samurai Spirits: Haohmaru Jigokuhen +EAEJ = Samurai Spirits EAEP = Samurai Shodown EAFE = Blue's Journey EAFJ = Raguy @@ -6748,9 +7240,9 @@ EAGP = The King of Fighters '94 EAHE = Baseball Stars 2 EAHJ = Baseball Stars 2 EAHP = Baseball Stars 2 -EAIE = Top Hunter -EAIJ = Top Hunter -EAIP = Top Hunter +EAIE = Top Hunter - Roddy & Cathy +EAIJ = Top Hunter - Roddy & Cathy +EAIP = Top Hunter - Roddy & Cathy EAJE = Metal Slug EAJJ = Metal Slug EAJP = Metal Slug @@ -6764,7 +7256,7 @@ EAME = Ninja Combat EAMJ = Ninja Combat EAMP = Ninja Combat EANE = Fatal Fury 2 -EANJ = Garou Densetsu 2: Aratanaru Tatakai +EANJ = Garou Densetsu 2 - Aratanaru Tatakai EANP = Fatal Fury 2 EAOE = King of the Monsters EAOJ = King of the Monsters @@ -6778,20 +7270,20 @@ EAQP = World Heroes 2 EARE = Neo Turf Masters EARJ = Neo Turf Masters EARP = Neo Turf Masters -EASE = Samurai Shodown 2 -EASJ = Shin Samurai Spirits Haoumaru Jigokuhen +EASE = Samurai Shodown II +EASJ = Shin Samurai Spirits EASP = Samurai Shodown II EATE = World Heroes 2 Jet EATJ = World Heroes 2 Jet EATP = World Heroes 2 Jet EAUJ = Twinkle Star Sprites -EAVE = The King of Fighters ’95 +EAVE = The King of Fighters '95 EAVJ = The King of Fighters '95 EAVP = The King of Fighters '95 EAWE = Fatal Fury Special EAWJ = Garou Densetsu Special EAWP = Fatal Fury Special -EAYJ = King of The Monsters 2 +EAYJ = King of the Monsters 2 - The Next Thing EAZE = World Heroes Perfect EAZJ = World Heroes Perfect EAZP = World Heroes Perfect @@ -6799,9 +7291,9 @@ EB2E = Real Bout Fatal Fury Special EB2J = Real Bout Garou Densetsu Special EB2P = Real Bout Fatal Fury Special EB3J = Soccer Brawl -EB4J = ASO II: Last Guardian +EB4J = ASO II - Last Guardian EB5E = The Last Blade -EB5J = The Last Blade +EB5J = Bakumatsu Roman Daini Maku - Gekka no Kenshi EB5P = The Last Blade EB6E = Metal Slug 3 EB6J = Metal Slug 3 @@ -6814,35 +7306,35 @@ EB9J = Pulstar EBAE = Magical Drop II EBAJ = Magical Drop 2 EBAP = Magical Drop II -EBBE = Fighters History Dynamite +EBBE = Fighter's History Dynamite EBBJ = Fighter's History Dynamite EBBP = Karnov's Revenge EBCJ = Flying Power Disc EBDE = Magical Drop III EBDJ = Magical Drop III -EBDP = Magical Drop 3 +EBDP = Magical Drop III EBEE = Street Slam EBEJ = Dunk Dream EBEP = Street Hoop EBFE = Spin Master EBFJ = Miracle Adventure -EBFP = Spin master +EBFP = Spin Master EBGE = The King of Fighters '97 EBGJ = The King of Fighters '97 EBGP = The King of Fighters '97 EBKJ = Last Resort EBLJ = Tsuukai GanGan Koushinkyoku EBMJ = Fire Suplex -EBNJ = Fu'un Mokushiroku: Kakutou Sousei +EBNJ = Fu'un Mokushiroku - Kakutou Sousei EBOJ = Fu'un Super Tag Battle EBPJ = League Bowling -EBQE = Ninja Master's +EBQE = Ninja Masters EBQJ = Ninja Master's Haou Ninpou-chou EBQP = Ninja Master's EBRJ = Joy Joy Kid -EBSE = The Path of the Warrior: Art of Fighting 3 -EBSJ = Art of Fighting: Ryuuko no Ken Gaiden -EBSP = The Path of the Warrior: Art of Fighting 3 +EBSE = Art of Fighting 3 +EBSJ = The Art of Fighting - Ryuuko no Ken Gaiden +EBSP = Art of Fighting 3 EBTJ = Crossed Swords EBUE = 2020 Super Baseball EBUJ = Super Baseball 2020 @@ -6857,34 +7349,34 @@ EBXP = Sengoku 2 EBZE = Real Bout Fatal Fury EBZJ = Real Bout Garou Densetsu EBZP = Real Bout Fatal Fury -ECAE = Real Bout Fatal Fury 2: The Newcomers -ECAJ = Real Bout Garou Densetsu 2: The Newcomers -ECAP = Real Bout Fatal Fury 2: The Newcomers +ECAE = Real Bout Fatal Fury 2 - The Newcomers +ECAJ = Real Bout Garou Densetsu 2 - The Newcomers +ECAP = Real Bout Fatal Fury 2 - The Newcomers ECCE = Metal Slug X ECCJ = Metal Slug X ECCP = Metal Slug X -ECDJ = Stakes Winner: G1 Kanzen Seihahe no Michi +ECDJ = Stakes Winner - G1 Kanzen Seihahe no Michi ECEE = The Last Blade 2 -ECEJ = Bakumatsu Rouman Dai Ni Maku: Gekka no Kenshi +ECEJ = Bakumatsu Roman Daini Maku - Gekka no Kenshi - Tsuki ni Saku Hana, Chiri Yuku Hana ECEP = The Last Blade 2 ECFJ = Blazing Star -ECGE = Shock Troopers: 2nd Squad -ECGJ = Shock Troopers: 2nd Squad -ECGP = Shock Troopers: 2nd Squad +ECGE = Shock Troopers - 2nd Squad +ECGJ = Shock Troopers - 2nd Squad +ECGP = Shock Troopers - 2nd Squad ECHE = The King of Fighters '98 -ECHJ = The King of Fighters '98: Dream Match Never Ends +ECHJ = The King of Fighters '98 ECHP = The King of Fighters '98 ECIE = Metal Slug 4 -ECIJ = The King of Fighters '99 +ECIJ = Metal Slug 4 ECIP = Metal Slug 4 ECJE = The King of Fighters '99 -ECJJ = Metal Slug 4 +ECJJ = The King of Fighters '99 ECJP = The King of Fighters '99 ECKE = NAM-1975 ECKJ = NAM-1975 ECKP = NAM-1975 ECLJ = Stakes Winner 2 -ECMJ = Tokuten Oh: Honoo no Libero +ECMJ = Tokuten Oh - Honoo no Libero ECNE = Sengoku 3 ECNJ = Sengoku Denshou 2001 ECNP = Sengoku 3 @@ -6896,21 +7388,21 @@ E53J = Black Dragon E53P = Black Tiger E54E = Ghosts 'n Goblins E54J = Makaimura -E54P = GHOSTS'N GOBLINS -E55E = Commando -E55J = Senji no Ookami -E55P = Commando +E54P = Ghosts 'n Goblins +E55E = Wolf of the Battlefield - Commando +E55J = Senjou no Ōkami +E55P = Wolf of the Battlefield - Commando E56E = Exed Exes -E56J = Exed Eyes +E56J = Exed Exes E56P = Exed Exes E57E = SonSon E57J = Son Son -E57P = SonSon +E57P = Son Son E58J = Mr. Do! E59J = Karate Dou E5AJ = Ikki E5BJ = Shanghai -E5VJ = Renegade +E5VJ = Nekketsu Kouha Kunio-kun E5WE = Wonder Boy in Monster Land E5WJ = Wonder Boy in Monster Land E5WP = Wonder Boy in Monster Land @@ -6939,44 +7431,44 @@ E6EJ = Libble Rabble E6FJ = Galaxian E6GJ = Namco Quester E6HJ = Face Off -E6IJ = Trink Force -E6JJ = Bakutotsu Kijuutei: BaRaDuKe II +E6IJ = Tank Force +E6JJ = Bakutotsu Kijuutei - Baraduke II E6KJ = Chouzetsu Rinjin - Berabow Man -E6LJ = Marchen Maze +E6LJ = Maerchen Maze E6ME = Tecmo Bowl E6MJ = Tecmo Bowl E6NE = Solomon's Key -E6NJ = Solomon no Kagi +E6NJ = Solomon's Key E6NP = Solomon's Key -E6OJ = Bomb Jack Arcade +E6OJ = Bomb Jack E6PE = Ninja Gaiden -E6PJ = Ninja Ryukenden Arcade -E6PP = NINJA GAIDEN +E6PJ = Ninja Ryukenden +E6PP = Ninja Gaiden E6QE = Rygar -E6QJ = Argos no Senshi +E6QJ = Argus no Senshi E6QP = Rygar E6SJ = New Rally-X -E6VE = Zaxxon 3-D +E6VE = Zaxxon E6VJ = Zaxxon E6VP = Zaxxon E6WE = Golden Axe E6WJ = Golden Axe E6WP = Golden Axe E6XE = Altered Beast -E6XJ = Altered Beast +E6XJ = Jyuouki E6XP = Altered Beast E6YJ = Space Invaders -E6ZE = Starforce +E6ZE = Star Force E6ZJ = Star Force E6ZP = Star Force -E72J = Starblade +E72J = Star Blade E73E = Mappy E73J = Mappy E73P = Mappy -E74J = Cosmo Gang the Puzzle +E74J = Cosmo Gang - The Puzzle E75J = Genpei Toumaden E76J = Emeraldia -E77J = The Return of Ishtar +E77J = Ishtar no Fukkatsu E78J = Solvalou E79E = Gaplus E79J = Gaplus @@ -6991,7 +7483,7 @@ E7HJ = Xevious E7IJ = Finest Hour E7JJ = Knuckle Heads E7KJ = Pac-Mania -E7LJ = Cosmo Gang the Video +E7LJ = Cosmo Gang - The Video E7MJ = Phelios E7NJ = Rolling Thunder E7OJ = Burning Force @@ -7003,18 +7495,18 @@ E7TJ = Hopping Mappy E7UJ = Splatterhouse E7VJ = Cyber Sled E7WJ = Numan Athletics -E7XJ = Youkai Douchuki +E7XJ = Youkai Douchuuki E7YJ = Sky Kid E7ZE = The Tower of Druaga E7ZJ = Druaga no Tou E7ZP = The Tower of Druaga -C93E = Last Ninja 2 -C93P = The Last Ninja 2 +C93E = Last Ninja 2 - Back with a Vengeance +C93P = Last Ninja 2 - Back with a Vengeance C94E = Tower Toppler C94P = Nebulus C95P = Impossible Mission C96E = Summer Games II -C96P = Summer Games 2 +C96P = Summer Games II C97E = California Games C97P = California Games C98P = Paradroid @@ -7023,12 +7515,12 @@ C9EP = Winter Games C9GP = Mayhem in Monsterland C9HE = Boulder Dash C9HP = Boulder Dash -C9IE = Cybernoid -C9IP = Cybernoid +C9IE = Cybernoid - The Fighting Machine +C9IP = Cybernoid - The Fighting Machine C9ME = Pitstop II C9MJ = Pitstop Two C9MP = Pitstop II -C9PP = The Last Ninja 3 +C9PP = Last Ninja 3 - Real Hatred is Timeless C9QP = Jumpman C9RP = International Karate + C9SP = Impossible Mission II @@ -7041,57 +7533,72 @@ C9YP = International Karate C9ZP = World Games XAAJ = Eggy XABJ = Aleste -XADJ = Yie Ar Kung-Fu 2 +XADJ = Yie-Gah-koutei no Gyakush - Yie Ar Kung-Fu 2 XAEJ = Space Manbow XAFJ = Metal Gear XAGJ = Road Fighter -XAHJ = Penguin Adventure: Yume Tairiku Adventure +XAHJ = Yume Tairiku Adventure XAIJ = Quarth -XAKJ = Parodius - Tako wa Chikyuu wo Sukuu +XAKJ = Parodius - Tako wa Chikyou wo Sukou XALJ = Contra -XAMJ = Knightmare: Majou Densetsu +XAMJ = Majou Densetsu XANJ = Gradius 2 -XAOJ = Gofer no Yabou: Episode II -XAPJ = Metal Gear 2: Solid Snake +XAOJ = Gofer no Yabou - Episode II +XAPJ = Metal Gear 2 - Solid Snake XAQJ = Salamander +5NEA = NWC24Editor HAAA = Photo Channel HABA = Wii Shop Channel +HABC = Wii Shop Channel HABK = Wii Shop Channel HACA = Mii Channel +HACC = Mii Channel HACK = Mii Channel HADE = Internet Channel HADJ = Internet Channel HADP = Internet Channel +HAFA = Forecast Channel HAFE = Forecast Channel HAFJ = Forecast Channel HAFP = Forecast Channel +HAGA = News Channel HAGE = News Channel HAGJ = News Channel HAGP = News Channel HAJE = Everybody Votes Channel HAJJ = Everybody Votes Channel HAJP = Everybody Votes Channel +HAKE = EULA +HAKJ = EULA +HAKK = EULA +HAKP = EULA +HALE = Region Select +HALJ = Region Select +HALK = Region Select +HALP = Region Select HAPE = Check Mii Out Channel HAPJ = Mii Contest Channel -HAPP = Check Mii Out Channel +HAPP = Mii Contest Channel HATE = Nintendo Channel -HATJ = Nintendo Channel +HATJ = Minna no Nintendo Channel HATP = Nintendo Channel -HAVJ = Today and Tomorrow Fortune Teller -HAVK = Today and Tomorrow Channel -HAVP = Today and Tomorrow Channel -HAWE = Metroid Prime 3 Preview -HAWP = Metroid Prime 3 Preview +HAVJ = Kyou to Ashita no Uranai Lucky Channel +HAVK = Jeulgeoun Halu Unse Channel +HAVP = Today & Tomorrow Channel +HAWE = Metroid Prime 3 Preview Channel +HAWP = Metroid Prime 3 Preview Channel HAYA = Photo Channel +HAYC = Photo Channel HAYK = Photo Channel HBNJ = TV no Tomo Channel G Guide for Wii HC2D = Watchever HC3J = USB Flash Optimization HC4E = Crunchyroll HC4P = Crunchyroll -HCAJ = Band Bros. DX Speaker Channel -HCAP = Jam with the Band Live +HCAJ = Daigasso Band Brothers DX Speaker Channel Shop +HCAP = Jam with the Band! Live HCBJ = Photo Channel 1.0 Restore Program +HCCJ = Address Information HCDJ = Digicam Print Channel HCFE = Wii Speak Channel HCFJ = Wii Speak Channel @@ -7103,16 +7610,16 @@ HCGP = Wii & the Internet HCGX = Wii & the Internet HCHJ = Demae Channel HCIJ = Wii no Ma -HCJP = BBC iPlayer Channel +HCJP = BBC iPlayer HCLE = Netflix HCLP = Netflix HCMP = Kirby TV Channel HCQE = Hulu Plus HCQJ = Hulu -HCRE = The Legend of Zelda: Skyward Sword Save Data Update Channel -HCRJ = The Legend of Zelda Skyward Sword Update -HCRK = The Legend of Zelda: Skyward Sword Save Data Update Channel -HCRP = The Legend of Zelda Skyward Sword Update +HCRE = The Legend of Zelda - Skyward Sword - Save Data Update Channel +HCRJ = Zelda Data Restoration Channel +HCRK = Data Boggu Channel +HCRP = The Legend of Zelda - Skyward Sword - Save Data Update Channel HCSE = Wii U Transfer Tool HCSJ = Wii U Transfer Tool HCSP = Wii U Transfer Tool @@ -7128,16 +7635,27 @@ HCWP = Amazon Instant Video HCXE = YouTube HCXJ = YouTube HCXP = YouTube +HCYE = Wii Menu Electronic Manual (Wii Mini) HCYJ = Wii U Main Unit Update Repair Program +HCYP = Wii Menu Manual (Mini Wii) HFNJ = Wii Fit Body Check Channel -JODI = Homebrew Channel -LULZ = Homebrew Channel -OHBC = Homebrew Channel RFNE = Wii Fit Channel +RFNJ = Wii Fit Channel +RFNK = Wii Fit Channel +RFNP = Wii Fit Channel +RFNW = Wii Fit Channel RFPE = Wii Fit Plus Channel +RFPJ = Wii Fit Plus Channel +RFPP = Wii Fit Plus Channel +RFPW = Wii Fit Plus Channel +RGWE = Rabbids Channel +RGWJ = Rabbids Channel +RGWP = Rabbids Channel RGWX = Rabbids Channel RMCE = Mario Kart Channel -WPSX = Playstation (PSX) Emulator +RMCJ = Mario Kart Channel +RMCK = Mario Kart Channel +RMCP = Mario Kart Channel 9XGX = SNES9xGX D01A = Wiimmfi Patcher D02A = Engine02 @@ -7159,7 +7677,7 @@ D0IA = IOS Check D0JA = Open Sram Lang Modifier D0KA = WiiBServer D0LA = LibWiiGameLoad -D0MA = Wiireader +D0MA = WiiReader D0NA = lsusb D0OA = Move the Pussy (Demo) D0PA = Wiilax Minitro @@ -7222,7 +7740,7 @@ D4QA = Sqrxz 4 D4SA = USB Loader GUI FX D51A = IOS51 Update D52A = cboot252 -D54A = cIOS Patchmii Installer +D54A = cIOS PatchMii Installer D55A = PID Extractor D56A = Shopping Channel Fixer D57A = Hijill GUI @@ -7249,7 +7767,7 @@ D6AA = Pussieloader D6BA = Updatersafe D6DA = Savegame Manager Mod D6EA = Sneek FS Dumper -D6FA = Anytitle Deleter Mod +D6FA = AnyTitle Deleter Mod D6HA = AnyTitle Deleter Mod DB D6IA = DVD Info D6KA = AnyTitle Deleter DB @@ -7277,7 +7795,7 @@ D7WA = Abbaye des Morts D7XA = NuGaSa D7YA = Resistor D81A = Newo Asteroids -D82A = cIOS Patchmii Installer with Korean Disc Support +D82A = cIOS PatchMii Installer with Korean Disc Support D83A = Wii MFE Port D84A = Gambol D85A = Wii EDuke32 @@ -7302,7 +7820,7 @@ D8XA = All In One Emuloader D8YA = Swissloader D8ZA = Tick Tock Zombie Shooter D91A = Jenny Thinks -D93A = Wiiraytracer +D93A = WiiRayTracer D94A = Nowhere D95A = RenderMii D96A = WiiMotionDemo @@ -7344,6 +7862,7 @@ DBAA = BowFishing Action DBBA = Balance Board Tools DBCA = BootMii Configuration Editor DBDA = Bluedump +DBEA = Beebem Wii DBGA = BlastGuy DBIA = Boot It DBLA = BlueMSX-wii @@ -7357,14 +7876,14 @@ DBWA = Reversmii DBXA = Biniax 2 DC6A = Frodo (C64-network.org) DC7A = Calculate -DCAA = Wiicasino +DCAA = WiiCasino DCBA = CascadeBeneath -DCCA = Christmascountdown +DCCA = ChristmasCountdown DCDA = cIOS Downgrader DCEA = Cheat Manager DCFA = Coverfloader DCGA = Ctr-Gcs -DCHA = Wiichatter +DCHA = Wii Chatter DCIA = cIOS Installer DCLA = Configurable USB Loader DCMA = Wiicm @@ -7397,7 +7916,7 @@ DDOA = DOP-Mii DDRA = Wii Duplicated Channel Remover DDSA = DeSmuME DDVA = Devolution -DDWA = DOP Mii Wiibrew Edition +DDWA = DOP-Mii WiiBrew Edition DE2A = Doubledown DE5A = Pictogrid DE7A = Commander Keen @@ -7426,7 +7945,7 @@ DFBA = Fsbrowser DFEA = FlipEm DFFA = Simple FS Dumper DFGA = Smashing! -DFIA = Fceugx Channel Installer +DFIA = FCE Ultra GX Channel Installer DFLA = Starfall DFMA = FMyLife DFRA = FridgeMagnets @@ -7440,7 +7959,7 @@ DG9A = Garnatron DGBA = Geexbox DGCA = GameCube Backup Launcher DGEA = GeckoOS -DGFA = Guitars On Fire +DGFA = GuitarsOnFire DGGA = Wii Rick Dangerous DGIA = Gravitii DGKA = ProjectGMC @@ -7481,7 +8000,7 @@ DISA = Wii Supersonic DITA = IOS236 Installer DIXA = cIOSx installer DJAA = Arcade Jigsaw -DJCA = Wii JellyCar +DJCA = JellyCar Wii DJFA = Joyflow DJJA = Jumping Jack DJQA = Jewel Quest @@ -7499,7 +8018,7 @@ DKHA = Katakana and Hiragana Practice DKKA = KoreanKii DKOA = Komopong DKPA = Kidspaint -DKSA = Wii Stpp +DKSA = Stppwii DKTA = Taiko DKWA = Kurushi DL3A = Ballion @@ -7512,7 +8031,7 @@ DLDA = Devilock DLEA = Preloader DLFA = LifeMii DLGA = Gravity Glider -DLIA = WiiMod Lite +DLIA = Wii Mod Lite DLLA = Lolicopocalypse DLMA = LoadMii DLNA = Lander @@ -7524,11 +8043,11 @@ DLXA = Linux Installer DM0A = Pom DM5A = Missle Command DM7A = Matches -DM9A = Checkregion +DM9A = CheckRegion DMAA = Mame Wii DMBA = Multiboot -DMCA = Cleanrip mod -DMDA = WiiMod +DMCA = CleanRip Mod +DMDA = Wii Mod DMEA = Mii Extractor DMFA = WiiMednafen DMGA = Mighty Channels @@ -7564,6 +8083,7 @@ DNPA = NeoPopWii DNRA = Newo Runner DNSA = Newo Shooter DNTA = NeoTanks +DNUA = Wii Donut DNWA = Nowell DO2A = O2EM DO3A = Three Point O @@ -7572,7 +8092,7 @@ DO5A = Planet Hively DO6A = Mini MP3 Player DOCA = Code Downloader DOEA = ShowTest -DOGA = Wii Maze of Galious +DOGA = MazeOfGaliousWii DOHA = HighOctane DOIA = Neogamma IOS Switcher DOMA = Mole @@ -7587,7 +8107,7 @@ DP2A = Pong2 DP3A = Inkpoly DP4A = Piirates DP5A = Pix -DP6A = IOS36 patcher +DP6A = IOS36 Patcher DP7A = Brawl+ Updatifier DP8A = Timeless DP9A = Alien Puzzle Wii @@ -7608,7 +8128,7 @@ DPPA = Project Panic DPRA = PlasmaRaketti DPSA = Playstats DPTA = Two Point Five -DPVA = Pattview +DPVA = PattView Wii DPWA = Pimp my Wii DQ1A = Q1rev DQ2A = Q2rev @@ -7633,10 +8153,10 @@ DRAA = RetroArch-Wii DRBA = Rock Band 2 WAD Installer DRCA = Wiicross DRDA = Drawmii -DREA = Wiirecipe +DREA = WiiRecipe DRFA = Radiofeeds DRGA = Reggie Dumper -DRIA = Cleanrip +DRIA = CleanRip DRKA = Robotfindskitten DRMA = Mr. Sitwell DROA = SlimeRoll @@ -7673,11 +8193,11 @@ DSMA = Sega Master System Plus DSOA = Bermuda Syndrome Wii DSPA = Super Star Shooter DSQA = Sqrxz -DSRA = Wiistrobe +DSRA = WiiStrobe DSSA = RSSMii DSTA = Wii Solitaire DSUA = Super Mario War -DSVA = scummVM +DSVA = ScummVM DSWA = SuperTux Wii DSXA = Super Pixel Jumper DSYA = SysCheck @@ -7694,6 +8214,7 @@ DTCA = The Catachthonic DTDA = Descent DTEA = Topedit DTFA = Triiforce +DTGA = RiiTag DTHA = Heretic DTIA = Wiitriis DTJA = Trojan @@ -7706,9 +8227,9 @@ DTPA = Paintown DTRA = Trucha Bug Restorer DTSA = Desert Bus DTTA = Toddtris -DTWA = Wiitweet +DTWA = WiiTweet DTXA = Texttris -DU0A = Dumpmiinand +DU0A = DumpMiiNAND DU7A = Uno DU8A = RealWnd DU9A = Harmonium @@ -7730,7 +8251,7 @@ DVGA = The Video Game DVHA = Horror Vacui DVIA = Vbagx Channel Installer DVLA = Vigiroth le livreur -DVNA = Wiivnc +DVNA = WiiVNC DVOA = Vectoroids DVPA = Progressiveswitch DVSA = GameCube Saver @@ -7742,10 +8263,11 @@ DW7A = Ravewild DWAA = WiiApple DWBA = WiirtualBoy DWCA = WiiFlow Channel Installer -DWDA = Wiiflow Banner Downloader +DWDA = WiiFlow Banner Downloader DWEA = WiiEarth DWFA = WiiFlow DWHA = WiiHandySDL +DWIA = Wii Donut DWJA = Jewel DWKA = Wiibreaker DWLA = Wii-Linux @@ -7765,7 +8287,7 @@ DX6A = Build Blocks DX7A = Roxoptr2 DX8A = Hexen DX9A = Sand Traps -DXBA = Wii X Ball +DXBA = WiiX-Ball DXCA = CorsixTH DXDA = DVDX DXEA = SDExplorer @@ -7812,92 +8334,123 @@ DZYA = Snake Two DZZA = OpenJazz FCEU = FCE Ultra GX HWFL = HackWiiFlow +JODI = Homebrew Channel +LULZ = Homebrew Channel MAUI = Backup Homebrew Channel NK2O = Neek2o +OHBC = Homebrew Channel PLUS = WiiMC+ PXWE = Project X: Love Potion Disaster RIIV = Riivolution RMCX = Mario Kart Wii CTGP Revolution Channel SEGA = Genesis Plus GX SMGX = SaveGame Manager GX +SNTX = Snes9x TX +SOMA = Sonic Mania +STUX = Super Tux Wii Edition ULFW = uLoader VBGX = Visual Boy Advance GX WIMC = WiiMC WMH1 = Mother 1+2+3 WN64 = Wii64 +WPSX = WiiSX 301E01 = GameCube Service Disc D23J01 = Game Taikai Yuushou Kinen: Tokusei SmaBro DX Movie Disc D24J01 = SmaBro DX Event-you Disc D28J01 = Interactive Multi-Game Demo Disk - April 2002 -D29J01 = Monthly Nintendo Shop Demo - May 2002 -D32J01 = Monthly Nintendo Shop Demo - June 2002 -D33J01 = Monthly Nintendo Shop Demo - July 2002 -D34J01 = Monthly Nintendo Shop Demo - July 2002 -D38J01 = Monthly Nintendo Shop Demo - September 2002 +D29J01 = Gekkan Nintendo Tentou Demo 2002.5.1 +D32J01 = Gekkan Nintendo Tentou Demo 2002.6.1 +D33J01 = Gekkan Nintendo Tentou Demo 2002.7.1 +D34J01 = Gekkan Nintendo Tentou Demo 2002.7.10 +D38J01 = Gekkan Nintendo Tentou Demo 2002.9.1 +D39J01 = Gekkan Nintendo Tentou Demo 2002.10.1 D42J01 = Gekkan Nintendo Tentou Demo 2002.11.1 D43E01 = The Legend of Zelda: Ocarina of Time / Master Quest D43J01 = Zelda no Densetsu: Toki no Ocarina GC / Ura Zelda D43P01 = The Legend of Zelda: Ocarina of Time / Master Quest D43U01 = The Legend of Zelda: Ocarina of Time (Bonus Disc) D43W01 = The Legend of Zelda: Ocarina of Time / Master Quest +D44J01 = Gekkan Nintendo Tentou Demo 2002.12.1 D46J01 = Gekkan Nintendo Tentou Demo 2003.1.1 +D47J01 = Gekkan Nintendo Tentou Demo 2003.2.1 +D48J01 = Gekkan Nintendo Tentou Demo 2003.3.1 +D49J01 = Gekkan Nintendo Tentou Demo 2003.4.1 D4BE08 = Resident Evil 4: Preview Disc D4BP01 = Resident Evil 4: Bonus Disc D4BU01 = Resident Evil 4: Bonus Disc +D52J01 = Gekkan Nintendo Tentou Demo 2003.5.1 D53J01 = Monthly Nintendo Shop Demo - May 2003 +D54J01 = Gekkan Nintendo Tentou Demo 2003.6.1 D55J01 = Interactive Disc Catalog Summer 2003 D56E01 = Interactive Multi-Game Demo Disc - Version 35 D56J01 = Pokémon Channel (Bonus Disc) D57E01 = Interactive Multi-Game Demo Disc - Version 34 D58E01 = Interactive Multi-Game Demo Disc - Version 33 D59E01 = Interactive Multi-Game Demo Disc - Version 32 +D59J01 = Gekkan Nintendo Tentou Demo 2003.7.1 D62E01 = Interactive Multi-Game Demo Disc - Version 31 +D62J01 = Gekkan Nintendo Tentou Demo 2003.8.1 D63E01 = Interactive Multi-Game Demo Disc - Version 30 D64E01 = Interactive Multi-Game Demo Disc - Version 29 +D64J01 = Gekkan Nintendo Tentou Demo 2003.10.1 D65E01 = Interactive Multi-Game Demo Disc - Version 28 +D65J01 = Gekkan Nintendo Tentou Demo 2003.11.1 D66E01 = Interactive Multi-Game Demo Disc - Version 27 D66JAF = Baten Kaitos: Eternal Wings and the Lost Ocean - Special Experience Disc D67E01 = Interactive Multi-Game Demo Disc - Version 26 -D67J01 = Monthly Nintendo Shop Demo - December 2003 +D67J01 = Gekkan Nintendo Tentou Demo 2003.12.1 D68E01 = Interactive Multi-Game Demo Disc - Version 25 -D68J01 = Monthly Nintendo Shop Demo - January 2004 +D68J01 = Gekkan Nintendo Tentou Demo 2004.1.1 D69E01 = Interactive Multi-Game Demo Disc - Version 24 D72E01 = Interactive Multi-Game Demo Disc - Version 23 D73E01 = Interactive Multi-Game Demo Disc - Version 22 +D73J01 = Gekkan Nintendo Tentou Demo 2004.2.1 D74E01 = Interactive Multi-Game Demo Disc - Version 21 D75E01 = Interactive Multi-Game Demo Disc - Version 20 +D75J01 = Gekkan Nintendo Tentou Demo 2004.3.1 D76E01 = Interactive Multi-Game Demo Disc - Version 19 D77E01 = Interactive Multi-Game Demo Disc - Version 18 +D77J01 = Gekkan Nintendo Tentou Demo 2004.4.1 D77P01 = Interactive Multi-Game Demo Disc - April 2006 D78E01 = Interactive Multi-Game Demo Disc - Version 17 -D78J01 = Monthly Nintendo Shop Demo - May 2004 +D78J01 = Gekkan Nintendo Tentou Demo 2004.5.1 D78P01 = Interactive Multi-Game Demo Disc - October 2005 D79E01 = Interactive Multi-Game Demo Disc - Version 16 +D79J01 = Gekkan Nintendo Tentou Demo 2004.6.1 D79P01 = Interactive Multi-Game Demo Disc - May 2005 D82E01 = Interactive Multi-Game Demo Disc - Version 15 -D82J01 = Monthly Nintendo Shop Demo - July 2004 +D82J01 = Gekkan Nintendo Tentou Demo 2004.7.1 D82P01 = Interactive Multi-Game Demo Disc - April 2005 D83E01 = Interactive Multi-Game Demo Disc - Version 14 D83P01 = Interactive Multi-Game Demo Disc - February 2005 D84E01 = Interactive Multi-Game Demo Disc - Version 13 +D84J01 = Gekkan Nintendo Tentou Demo 2004.8.1 D84P01 = Interactive Multi-Game Demo Disc - November 2004 D85E01 = Interactive Multi-Game Demo Disc - Version 12 +D85J01 = Gekkan Nintendo Tentou Demo 2004.9.1 D85P01 = Interactive Multi-Game Demo Disc - July 2004 D86E01 = Interactive Multi-Game Demo Disc - Version 11 +D86J01 = Gekkan Nintendo Tentou Demo 2004.10.1 D86P01 = Interactive Multi-Game Demo Disc - May 2004 D87E01 = GameCube Preview Disc +D87J01 = Gekkan Nintendo Tentou Demo 2004.11.1 D87P01 = Interactive Multi-Game Demo Disc - March 2004 D88E01 = Interactive Multi-Game Demo Disc - Version 10 +D88J01 = Gekkan Nintendo Tentou Demo 2004.12.1 D88P01 = Interactive Multi-Game Demo Disc - November 2003 D89E01 = Interactive Multi-Game Demo Disc - Version 9 D89J01 = Club Nintendo Original e-Catalog 2004 D89P01 = Interactive Multi-Game Demo Disc - September 2003 D92E01 = Interactive Multi-Game Demo Disc - Version 8 +D92J01 = Gekkan Nintendo Tentou Demo 2004-2005 Nenmatsunenshi-gou D92P01 = Interactive Multi-Game Demo Disc - June 2003 D93E01 = Interactive Multi-Game Demo Disc - Version 7 +D93J01 = Gekkan Nintendo Tentou Demo 2005.1.1 D93P01 = Interactive Multi-Game Demo Disc - April 2003 +D94J01 = Gekkan Nintendo Tentou Demo 2005.2.1 D94P01 = Interactive Multi-Game Demo Disc - February 2003 D95P01 = Interactive Multi-Game Demo Disc - December 2002 +D97J01 = Gekkan Nintendo Tentou Demo 2005.5.1 DALJ01 = Dairantou Smash Brothers DX (Demo) DBIJ08 = Biohazard - Movie Demo Disc DBJJ08 = Biohazard: Special Edition (Demo) @@ -7918,7 +8471,15 @@ DRSEAF = Soulcalibur II (Demo) DSWJ13 = Star Wars: Rogue Squadron II (Demo) DTLX01 = Action Replay DVJP08 = Viewtiful Joe (Promotional demo) -G01E01 = Super Smash Bros. Melee: SD Remix +E23J01 = Gekkan Nintendo Tentou Demo 2005.9.1 +E24J01 = Gekkan Nintendo Tentou Demo 2005.10.1 +E25J01 = Gekkan Nintendo Tentou Demo 2005.11.1 +E27J01 = Gekkan Nintendo Tentou Demo 2006.1.1 +E32J01 = Gekkan Nintendo Tentou Demo 2006.4.1 +E34J01 = Gekkan Nintendo Tentou Demo 2006.6.1 +E35J01 = Gekkan Nintendo Tentou Demo 2006.7.1 +E36J01 = Gekkan Nintendo Tentou Demo 2006.8.1 +E37J01 = Gekkan Nintendo Tentou Demo 2006.9.1 G2BE5G = Black & Bruised G2BP7D = Black & Bruised G2CD52 = True Crime: New York City @@ -7934,7 +8495,6 @@ G2GJB2 = Mobile Suit Gundam: Gundam vs. Z Gundam G2KE8P = NHL 2K3 G2KP8P = NHL 2K3 G2ME01 = Metroid Prime 2: Echoes -G2MEAB = Metroid Prime 3 (E3 Beta) G2MJ01 = Metroid Prime 2: Dark Echoes G2MP01 = Metroid Prime 2: Echoes G2NJ13 = Need for Speed - Underground 2 @@ -7963,7 +8523,7 @@ G3DE6L = Carmen Sandiego: The Secret of the Stolen Drums G3DP6L = Carmen Sandiego: The Secret of the Stolen Drums G3DX6L = Carmen Sandiego: The Secret of the Stolen Drums G3EE51 = XGIII: Extreme G Racing -G3EJ51 = XGIII: Extreme G Racing +G3EJB0 = XGIII: Extreme G Racing G3EP51 = XGIII: Extreme G Racing G3FD69 = TimeSplitters: Future Perfect G3FE69 = TimeSplitters: Future Perfect @@ -7986,9 +8546,9 @@ G3SE41 = Bust-A-Move 3000 G3SJC0 = Super Puzzle Bobble All Stars G3SWC0 = Super Puzzle Bobble All Stars G3TJ8P = Derby Tsuku 3: Derby Uma O Tsukurou! -G3VE69 = NBA Street Vol.3 +G3VE69 = NBA Street V3 G3VJ13 = NBA Street V3 - Mario de Dunk -G3VP69 = NBA Street Vol.3 +G3VP69 = NBA Street V3 G3XE52 = X-Men: The Official Game G3XP52 = X-Men: The Official Game G3YP52 = Shrek Super Slam @@ -8013,8 +8573,8 @@ G4IP52 = Shrek Smash n' Crash Racing G4ME69 = The Sims Bustin' Out G4MP69 = The Sims: Bustin' Out G4NJDA = Naruto: Gekitô Ninja Taisen! 4 -G4OE69 = The Sims 2 : Pets -G4OP69 = The Sims 2 : Pets +G4OE69 = The Sims 2: Pets +G4OP69 = The Sims 2: Pets G4PJ13 = The Sims G4QE01 = Super Mario Strikers G4QJ01 = Super Mario Strikers @@ -8034,7 +8594,7 @@ G5SE7D = Spyro: A Hero's Tail G5SP7D = Spyro: A Hero's Tail G5TE69 = Tiger Woods PGA Tour 2005 G5TP69 = Tiger Woods PGA Tour 2005 -G62E54 = Major League Baseball 2k6 +G62E54 = Major League Baseball 2K6 G63E41 = Tom Clancy's Rainbow Six 3 G63P41 = Tom Clancy's Rainbow Six 3 G6FD69 = 2006 FIFA World Cup @@ -8058,6 +8618,7 @@ G8FE8P = Virtua Quest G8FJ8P = Virtua Fighter Cyber Generation G8ME01 = Paper Mario: The Thousand-Year Door G8MJ01 = Paper Mario RPG +G8MK01 = Paper Mario RPG G8MP01 = Paper Mario: The Thousand-Year Door G8OJ18 = Bobobo-bo Bo-bobo Dassutsu! Hajike Royale G8SJAF = Battle Stadium D.O.N @@ -8112,7 +8673,7 @@ GAKE5D = Midway Arcade Treasures GALE01 = Super Smash Bros. Melee GALJ01 = Dairantou Smash Brothers DX GALP01 = Super Smash Bros. Melee -GAME5H = Army Men Sarges War +GAME5H = Army Men Sarge's War GANE7U = Animaniacs: The Great Edgar Hunt GANP7U = Animaniacs: The Great Edgar Hunt GAPE52 = American Chopper 2 - Full Throttle @@ -8179,12 +8740,12 @@ GBTJA7 = Bakuten Shoot Beyblade 2002: Nettou! Magne Tag Battle GBTP70 = Beyblade VForce - Super Tournament Battle GBVE41 = Batman: Vengeance GBVP41 = Batman Vengeance -GBWD64 = Star Wars Bounty Hunter -GBWE64 = Star Wars Bounty Hunter -GBWF64 = Star Wars Bounty Hunter +GBWD64 = Star Wars: Bounty Hunter +GBWE64 = Star Wars: Bounty Hunter +GBWF64 = Star Wars: Bounty Hunter GBWI64 = Star Wars: Bounty Hunter GBWP64 = Star Wars Bounty Hunter -GBWS64 = Star Wars Bounty Hunter +GBWS64 = Star Wars: Bounty Hunter GBXE51 = Dave Mirra Freestyle BMX 2 GBXP51 = Dave Mirra Freestyle BMX 2 GBYE0A = Super Bubble Pop @@ -8193,9 +8754,9 @@ GBZJ08 = Biohazard 0 GBZP08 = Resident Evil Zero GC2E9G = Conflict: Desert Storm II: Back to Baghdad GC2P75 = Conflict: Desert Storm II: Back to Baghdad -GC3D78 = Scooby-Doo!: Mystery Mayhem +GC3D78 = Scooby-Doo! Mystery Mayhem GC3E78 = Scooby-Doo!: Mystery Mayhem -GC3F78 = Scooby-Doo!: Mystery Mayhem +GC3F78 = Scooby-Doo! Mystery Mayhem GC3P78 = Scooby-Doo!: Mystery Mayhem GC4JBN = Shinseiki GPX Cyber Formula Road To The EVOLUTION GC5PNK = Cocoto: Kart Racer @@ -8292,7 +8853,7 @@ GDME01 = Disney's Magical Mirror Starring Mickey Mouse GDMJ01 = Disney's Mickey Mouse no Fushigi na Kagami GDMP01 = Disney's Magical Mirror Starring Mickey Mouse GDNJE8 = Dokapon DX -GDOP41 = Disney's Donald Duck PK +GDOP41 = Disney's Donald Duck: PK GDPJAF = Mr. Driller: Drill Land GDQE7L = Darkened Skye GDQP6S = Darkened Skye @@ -8379,15 +8940,15 @@ GF6I69 = FIFA 06 GF6P69 = FIFA 06 GF6S69 = FIFA 06 GF7E01 = Star Fox: Assault -GF7J01 = Star Fox - Assault -GF7P01 = Star Fox Assault +GF7J01 = Star Fox: Assault +GF7P01 = Star Fox: Assault GF8E69 = FIFA Street GF8P69 = FIFA Street -GFAD69 = FIFA Soccer 2003 +GFAD69 = FIFA Football 2003 GFAE69 = FIFA Soccer 2003 -GFAF69 = FIFA Soccer 2003 +GFAF69 = FIFA Football 2003 GFAI69 = FIFA Football 2003 -GFAJ13 = FIFA Soccer 2003 +GFAJ13 = FIFA 2003 GFAP69 = FIFA Football 2003 GFAS69 = FIFA Football 2003 GFBE5D = FireBlade @@ -8404,7 +8965,7 @@ GFFE5D = Freaky Flyers GFGEA4 = Frogger Beyond GFGJA4 = Frogger GFGPA4 = Frogger Beyond -GFHP6V = Neighbours From Hell +GFHP6V = Neighbours from Hell GFIE69 = 2002 FIFA World Cup GFIJ13 = 2002 FIFA World Cup GFKE69 = Freekstyle @@ -8416,6 +8977,7 @@ GFPEA4 = Frogger: Ancient Shadow GFQEA4 = Frogger's Adventures: The Rescue GFSD69 = 2002 FIFA World Cup GFSE69 = FIFA Soccer 2002 +GFSF69 = 2002 FIFA World Cup GFSJ13 = FIFA Soccer 2002 GFSP69 = 2002 FIFA World Cup GFSX69 = 2002 FIFA World Cup @@ -8441,9 +9003,9 @@ GGAJB2 = Mobile Suit Gundam: The Ace Pilot GGCE0A = Goblin Commander: Unleash The Horde GGCP0A = Goblin Commander: Unleash the Horde GGEE41 = Beyond Good & Evil -GGEP41 = Beyond Good And Evil -GGEX41 = Beyond Good And Evil -GGEY41 = Beyond Good And Evil +GGEP41 = Beyond Good & Evil +GGEX41 = Beyond Good & Evil +GGEY41 = Beyond Good & Evil GGFJ01 = GiFTPiA GGIJ13 = GoldenEye - Dark Agent GGKJB2 = Konjiki no Gashbell!! Yuujou Tag Battle - Full Power @@ -8459,10 +9021,10 @@ GGSPA4 = Metal Gear Solid: The Twin Snakes GGTE01 = Chibi-Robo! GGTJ01 = Chibi-Robo! GGTP01 = Chibi-Robo! -GGVD78 = Spongebob Squarepants : The Movie +GGVD78 = Spongebob Squarepants: The Movie GGVE78 = SpongeBob SquarePants: The Movie GGVP78 = Spongebob Squarepants: The Movie -GGVX78 = Spongebob Squarepants : The Movie +GGVX78 = Spongebob Squarepants: The Movie GGYE41 = Tom Clancy's Ghost Recon 2 GGYP41 = Tom Clancy's Ghost Recon 2 GGZE52 = Madagascar @@ -8545,7 +9107,7 @@ GHYE6S = The Haunted Mansion GHZE5D = NHL Hitz Pro GI2J18 = Momotarou Dentetsu 12 GIAE7D = Ice Age 2: The Meltdown -GIAP7D = Ice Age 2 : The Meltdown +GIAP7D = Ice Age 2: The Meltdown GIBE4F = The Italian Job GIBP4F = The Italian Job GICD78 = The Incredibles @@ -8606,12 +9168,12 @@ GJNE78 = Jimmy Neutron Boy Genius GJNP78 = Jimmy Neutron Boy Genius GJPJCM = Jikkyou Powerful Pro Yakyuu 11 GJSJ18 = Hudson Selection Vol. 2: Star Soldier -GJUD78 = Tak and the Power of JuJu +GJUD78 = Tak and the Power of Juju GJUE78 = Tak and the Power of Juju -GJUF78 = Tak and the Power of JuJu -GJUP78 = Tak and the Power of JuJu -GJWE78 = Tak: The Great JuJu Challenge -GJWP78 = Tak: The Great JuJu Challenge +GJUF78 = Tak and the Power of Juju +GJUP78 = Tak and the Power of Juju +GJWE78 = Tak: The Great Juju Challenge +GJWP78 = Tak: The Great Juju Challenge GJXE51 = Vexx GJXP51 = Vexx GJYE78 = Jimmy Neutron: Attack of the Twonkies @@ -8630,7 +9192,7 @@ GK4J01 = Baten Kaitos II: Hajimari no Tsubasa to Kamigami no Shishi GK5E78 = Monster House GK5P78 = Monster House GK5X78 = Monster House -GK6JA4 = Croket Banking No Kikiwosukue +GK6JA4 = Croket Banking no Kikiwosukue GK7E08 = Killer7 GK7J08 = Killer7 GK7P08 = Killer 7 @@ -8645,6 +9207,7 @@ GKDP01 = Doshin the Giant GKEJA4 = Jikkyou Powerful Pro Yakyuu 12 Ketteiban GKFEGG = Chaos Field GKFJ8P = Chaos Field Expanded +GKFJMS = Chaos Field Expanded GKGE01 = Donkey Konga GKGJ01 = Donkey Konga GKGP01 = Donkey Konga @@ -8690,7 +9253,7 @@ GKYP01 = Kirby Air Ride GKZD54 = Codename: Kids Next Door - Operation: V.I.D.E.O.G.A.M.E. GKZE9G = Codename Kids Next Door - Operation V.I.D.E.O.G.A.M.E GKZP54 = Codename Kids Next Door - Operation V.I.D.E.O.G.A.M.E -GL2E51 = Legends of Wrestling 2 +GL2E51 = Legends of Wrestling II GL2P51 = Legends of Wrestling II GL3JE8 = Lupin The Third - Umi Ni Kieta Hihou GL5E4F = LEGO Star Wars: The Video Game @@ -8711,7 +9274,7 @@ GLCS52 = Lemony Snickets A Series Of Unfortunate Events GLEE08 = Resident Evil 3: Nemesis GLEJ08 = BioHazard 3: Last Escape GLEP08 = Resident Evil 3: Nemesis -GLGP41 = Largo Winch : Empire Under Threat +GLGP41 = Largo Winch: Empire Under Threat GLHEG9 = Flushed Away GLHPG9 = Flushed Away GLIJA7 = Special Jinsei Game @@ -8742,9 +9305,9 @@ GLSF64 = Gladius GLSP64 = Gladius GLUE7U = Lotus Challenge GLVD4Q = The Chronicles of Narnia: The Lion Witch and the Wardrobe -GLVE4Q = The Chronicles of Narnia: The Lion Witch and the Wardrobe +GLVE4Q = The Chronicles of Narnia: The Lion, the Witch and the Wardrobe GLVF4Q = The Chronicles of Narnia: The Lion Witch and the Wardrobe -GLVP4Q = The Chronicles of Narnia: The Lion Witch and the Wardrobe +GLVP4Q = The Chronicles of Narnia: The Lion, the Witch and the Wardrobe GLWE51 = Legends of Wrestling GLWP51 = Legends of Wrestling GLXJ29 = Legend of Golfer @@ -8787,7 +9350,7 @@ GMFF69 = Medal of Honor: Frontline GMFI69 = Medal of Honor: Frontline GMFP69 = Medal of Honor: Frontline GMFS69 = Medal of Honor: Frontline -GMHE52 = Mat Hoffman's Pro Bmx 2 +GMHE52 = Matt Hoffman's Pro BMX 2 GMHP52 = Mat Hoffman's Pro BMX 2 GMIE70 = Mission Impossible: Operation Surma GMIJ70 = Mission - Impossible - Operation Surma @@ -8797,13 +9360,14 @@ GMJP41 = Monster Jam: Maximum Destruction GMKD5D = Mortal Kombat: Deadly Alliance GMKE5D = Mortal Kombat: Deadly Alliance GMKP5D = Mortal Kombat: Deadly Alliance -GMLEA4 = ESPN MLS Extra Time 2002 +GMLEA4 = ESPN MLS ExtraTime 2002 GMNE78 = Monsters, Inc. Scream Arena GMNP78 = Monsters, Inc. Scream Arena GMOP70 = Micro Machines GMPE01 = Mario Party 4 GMPJ01 = Mario Party 4 GMPP01 = Mario Party 4 +GMPW01 = Mario Party 4 GMQE70 = Monopoly Party GMQP70 = Monopoly Party GMRE70 = Big Air Freestyle @@ -8827,7 +9391,7 @@ GMZE41 = Monster 4x4: Masters Of Metal GN2E70 = Nascar: Dirt To Daytona GN3E5D = NHL Hitz 2003 GN3P5D = NHL Hitz 2003 -GN4E69 = Nascar 2005: Chase For The Cup +GN4E69 = NASCAR 2005: Chase for the Cup GN5E69 = NHL 2005 GN5P69 = NHL 2005 GN6E69 = NHL 06 @@ -8940,6 +9504,7 @@ GP4J18 = Hudson Selection Vol. 3: Bonk's Adventure GP5E01 = Mario Party 5 GP5J01 = Mario Party 5 GP5P01 = Mario Party 5 +GP5W01 = Mario Party 5 GP6E01 = Mario Party 6 GP6J01 = Mario Party 6 GP6P01 = Mario Party 6 @@ -9020,9 +9585,9 @@ GQLP54 = Dora the Explorer: Journey to the Purple Planet GQNE5D = Mortal Kombat: Deception GQPE78 = SpongeBob SquarePants: Battle for Bikini Bottom GQPP78 = SpongeBob Squarepants: Battle For Bikini Bottom -GQQD78 = SpongeBob SquarePants: Lights, Camera, PANTS! +GQQD78 = SpongeBob SquarePants: Lights, Camera, Pants! GQQE78 = SpongeBob SquarePants: Lights, Camera, Pants! -GQQF78 = SpongeBob SquarePants: Lights, Camera, PANTS! +GQQF78 = SpongeBob SquarePants: Lights, Camera, Pants! GQQH78 = SpongeBob SquarePants: Lights, Camera, Pants! GQQP78 = SpongeBob SquarePants: Lights, Camera, Pants! GQRJ18 = Hudson Selection Vol. 1: Cubic Lode Runner @@ -9040,7 +9605,7 @@ GQWX69 = Harry Potter: Quidditch World Cup GQXE69 = Madden NFL 2004 GQXP69 = Madden NFL 2004 GQZJ01 = Densetsu no Quiz Ou Ketteisen -GR2E52 = Lost Kingdoms 2 +GR2E52 = Lost Kingdoms II GR2JCQ = Rune II: Koruten no Kagi no Himitsu GR2P52 = Lost Kingdoms 2 GR3E5D = Red Card 2003 @@ -9060,7 +9625,7 @@ GR9P6L = Reign of Fire GRAE5Z = Rally Championship GRAP75 = Rally Championship GRBE6S = Robotech: Battlecry -GRBP6S = Robotech : Battlecry +GRBP6S = Robotech: Battlecry GRDP5D = RedCard GREE08 = Mega Man Network Transmission GREJ08 = RockMan EXE Transmission @@ -9101,7 +9666,7 @@ GRYE41 = Rayman Arena GRZJ13 = Medal of Honor: Rising Sun GS2D78 = Summoner: A Goddess Reborn GS2E78 = Summoner: A Goddess Reborn -GS2F78 = Summoner: La Deesse Reincarnee +GS2F78 = Summoner: La Déesse Réincarnée GS2P78 = Summoner: A Goddess Reborn GS3E51 = SX Superstar GS3P51 = SX Superstar @@ -9110,9 +9675,9 @@ GS8E7D = Spyro: Enter the Dragonfly GS8P7D = Spyro: Enter the Dragonfly GS9E6S = Shrek Extra Large GS9P6S = Shrek Extra Large -GSAE01 = Star Fox Adventures -GSAJ01 = StarFox Adventures -GSAP01 = Star Fox Adventures +GSAE01 = Star Fox: Adventures +GSAJ01 = Star Fox: Adventures +GSAP01 = Star Fox: Adventures GSBJ8P = Sonic Adventure 2: Battle GSCE51 = Jeremy McGrath SuperCross World GSCP51 = Jeremy McGrath SuperCross World @@ -9122,7 +9687,7 @@ GSGE5D = MLB SlugFest 2003 GSHE5D = SpyHunter GSHP5D = SpyHunter GSKE7D = The Scorpion King: Rise of the Akkadian -GSKP7D = The Scorpion King : Rise of the Akkadian +GSKP7D = The Scorpion King: Rise of the Akkadian GSMD52 = Spider-Man GSME52 = Spider-Man: The Movie GSMF52 = Spider-Man @@ -9149,17 +9714,17 @@ GSUE70 = Superman: Shadow of Apokolips GSUP70 = Superman: Shadow of Apokolips GSVE78 = MX Superfly featuring Ricky Carmichael GSVP78 = MX Superfly featuring Ricky Carmichael -GSWD64 = Star Wars Rogue Leader: Rogue Squadron II +GSWD64 = Star Wars Rogue Squadron II: Rogue Leader GSWE64 = Star Wars Rogue Squadron II: Rogue Leader GSWF64 = Star Wars Rogue Squadron II: Rogue Leader GSWI64 = Star Wars Rogue Squadron II: Rogue Leader -GSWJ64 = Star Wars Rogue Squadron II +GSWJ13 = Star Wars Rogue Squadron II GSWP64 = Star Wars Rogue Squadron II: Rogue Leader GSWS64 = Star Wars Rogue Leader: Rogue Squadron II GSXD64 = Star Wars: The Clone Wars GSXE64 = Star Wars: The Clone Wars GSXF64 = Star Wars: The Clone Wars -GSXI64 = Star Wars - The Clone Wars +GSXI64 = Star Wars: The Clone Wars GSXJ13 = Star Wars: Clone Sensou GSXP64 = Star Wars: The Clone Wars GSXS64 = Star Wars: The Clone Wars @@ -9186,7 +9751,7 @@ GT7P41 = Tom Clancy's Splinter Cell: Pandora Tomorrow GT7X41 = Tom Clancy's Splinter Cell: Pandora Tomorrow GT8E78 = Big Mutha Truckers GT8P7N = Big Mutha Truckers -GTAE5S = Top Angler : Real Bass Fishing +GTAE5S = Top Angler: Real Bass Fishing GTAP5S = Top Angler: Real Bass Fishing GTBJC0 = NHK Tensai Bit-Kun - Gramon Battle GTCJBL = GT Cube @@ -9213,7 +9778,7 @@ GTLX52 = True Crime: Streets of LA GTMJDA = Mutsu To Nohohon GTNJ18 = Hudson Selection Vol. 4: Adventure Island GTOJAF = Tales of Symphonia -GTPP6S = Knights Of The Temple : Infernal Crusade +GTPP6S = Knights Of The Temple: Infernal Crusade GTQE6S = Tonka: Rescue Patrol GTRE78 = Tetris Worlds GTRJ8N = Tetris Worlds @@ -9236,7 +9801,7 @@ GU4Y78 = 2 Games in 1: The SpongeBob SquarePants Movie / Battle for Bikini Botto GU6E78 = Nicktoons - Battle for Volcano Island GUBE69 = The Urbz: Sims in the City GUBJ13 = The Urbz: Sims In The City -GUBP69 = The Urbz: Sims In The City +GUBP69 = The Urbz: Sims in the City GUCD69 = UEFA Champions League 2004-2005 GUCF69 = UEFA Champions League 2004-2005 GUCP69 = UEFA Champions League 2004-2005 @@ -9325,7 +9890,7 @@ GWBE41 = Worms Blast GWBP41 = Worms Blast GWDP6S = World Racing GWEE51 = 18 Wheeler: American Pro Trucker -GWEJ51 = 18 Wheeler: American Pro Trucker +GWEJB0 = 18 Wheeler: American Pro Trucker GWEP8P = 18 Wheeler American Pro Trucker GWGE4F = Swingerz Golf GWGJ4F = Wai Wai Golf @@ -9336,7 +9901,7 @@ GWJE52 = Tony Hawk's American Wasteland GWKE41 = Peter Jackson's King Kong: The Official Game of the Movie GWKP41 = Peter Jackson's King Kong: The Official Game of the Movie GWLE6L = Wallace & Gromit in Project Zoo -GWLP6L = Wallace & Gromit : Project Zoo +GWLP6L = Wallace & Gromit: Project Zoo GWLX6L = Wallace & Gromit in Project Zoo GWME51 = Worms 3D GWMP8P = Worms 3D @@ -9359,7 +9924,7 @@ GWUE7D = Whirl Tour GWUP7D = Whirl Tour GWVE52 = X2: Wolverine's Revenge GWVP52 = X-Men 2: Wolverine's Revenge -GWVX52 = X-Men 2 : Wolverine's Revenge +GWVX52 = X-Men 2: Wolverine's Revenge GWWE01 = Wario World GWWJ01 = Wario World GWWP01 = Wario World @@ -9405,7 +9970,7 @@ GXOP69 = SSX On Tour GXOX69 = SSX On Tour GXPE78 = Sphinx and the Cursed Mummy GXPP78 = Sphinx and the Cursed Mummy -GXQF41 = Taxi 3 +GXQF41 = Taxi 3: Le Jeu GXRE08 = Mega Man X: Command Mission GXRJ08 = Rockman X: Command Mission GXRP08 = Mega Man X: Command Mission @@ -9423,9 +9988,9 @@ GYAD78 = Barnyard GYAE78 = Barnyard GYAP78 = Barnyard GYAX78 = Barnyard -GYBE01 = Donkey Kong Jungle Beat +GYBE01 = Donkey Kong: Jungle Beat GYBJ01 = Donkey Kong Jungle Beat -GYBP01 = Donkey Kong Jungle Beat +GYBP01 = Donkey Kong: Jungle Beat GYFEA4 = Yu-Gi-Oh! The Falsebound Kingdom GYFJA4 = Yu-Gi-Oh! The Falsebound Kingdom GYFPA4 = Yu-Gi-Oh! The Falsebound Kingdom @@ -9471,9 +10036,9 @@ GZQP7D = Robots GZSE70 = Zoids Battle Legends GZSJDA = Zoids VS. II GZVJDA = Zoids vs. III -GZWE01 = Wario Ware Inc.: Mega Party Game$! -GZWJ01 = Atumare!! Made in Wario -GZWP01 = Wario Ware Inc.: Mega Party Game$! +GZWE01 = WarioWare, Inc.: Mega Party Game$! +GZWJ01 = Atsumare!! Made in Wario +GZWP01 = WarioWare, Inc.: Mega Party Game$! P2ME01 = Metroid Prime 2: Echoes (Bonus Disc) P4BJ08 = Biohazard 4 (Demo) PC6E01 = Pokémon Colosseum Bonus Disc diff --git a/Data/Sys/wiitdb-es.txt b/Data/Sys/wiitdb-es.txt index f45c4503dc24..87d1b198b926 100644 --- a/Data/Sys/wiitdb-es.txt +++ b/Data/Sys/wiitdb-es.txt @@ -1,4 +1,5 @@ -TITLES = https://www.gametdb.com (type: Wii language: ES_unique version: 20191106234230) +TITLES = https://www.gametdb.com (type: Wii language: ES_unique version: 20230727194141) +DCHJAF = We Cheer: Ohasta Produce ! Gentei Collabo Game Disc R22J01 = FlingSmash R23E52 = Barbie y las Tres Mosqueteras R23P52 = Barbie y las Tres Mosqueteras @@ -10,7 +11,13 @@ R29P52 = Millennium Championship Paintball 2009 R2AE7D = La era del hielo 2 R2AP7D = Ice Age 2: El Deshielo R2AX7D = Ice Age 2: El Deshielo +R2PJ9B = Super Swing Golf Season 2 +R2PKZ4 = Super Swing Golf Season 2 +R2QJC0 = Cooking Mama 2 Taihen Mama wa Ooisogashi +R2SJ18 = Deca Sporta 2 +R2VJ01 = Sin and Punishment: Successor to the Sky R2YP54 = ¡Mi Gran Fiesta de Cumpleaños! +R32J01 = Metroid Prime 2 R38X78 = Marvel Super Hero Squad: Edición Walmart R3PPWR = Speed Racer R3SP52 = Spider-Man: El Reino de las Sombras @@ -19,13 +26,14 @@ R3YE70 = Sam & Max: Season Two - Beyond Time and Space R3YP70 = Sam & Max: Temporada Dos - Más Allá del Tiempo y del Espacio R42P69 = Los Sims 2: Náufragos R43E69 = EA Sports Active +R43J13 = EA Sports Active Personal Trainer Wii 30-Hi Seikatsu Kaizen Program R43P69 = EA Sports Active R48P7D = Las Crónicas de Spiderwick R4BPGT = Futbolín +R4CK69 = SimCity Creator R4EP01 = Endless Ocean 2: Aventuras Bajo el Mar R4PP69 = Los Sims 2: Mascotas R4ZJ01 = Fatal Frame 4: Mask of the Lunar Eclipse -R55F41 = ¿Quién Quiere Ser Millonario? R55P41 = ¿Quién Quiere Ser Millonario? R59D4Q = Disney Club Penguin: ¡Día de Juegos! R59E4Q = Disney Club Penguin: ¡Día de Juegos! @@ -35,23 +43,30 @@ R5AX8P = La Brújula Dorada R5FP41 = Escuela de Campeones: Fútbol R5JES5 = Pirates vs. Ninjas Dodgeball R5JPS5 = Pirates vs. Ninjas Dodgeball +R5PJ13 = Harry Potter and the Order of the Phoenix R5PP69 = Harry Potter y la Orden del Fénix R5PX69 = Harry Potter y la Orden del Fénix R5UP41 = CSI: Determinación Mortal R5VE41 = James Cameron's Avatar: El Videojuego R5VP41 = James Cameron's Avatar: El Videojuego R5VX41 = James Cameron's Avatar: El Videojuego +R5XJ13 = MySims Agents R6APPU = Mi Nenuco juega +R6BK78 = de Blob R6XP69 = Hasbro: Juegos en Familia 2 R7AP69 = SimAnimals África -R7CJ01 = Capitán Arcoiris +R7EJ8P = NiGHTS: Journey of Dreams +R7FJGD = Final Fantasy Fables: Chocobo's Dungeon R7IP69 = Charm Girls Club: Pajama Party R7ZP41 = Concurso Loco TV Party R82P52 = Animal Planet: Escuela Veterinaria +R84J99 = Bokujo for Wii R84P99 = Harvest Moon: El Árbol de la Tranquilidad R85PG9 = Los Sábados Secretos: Bestias del Quinto Sol R8AP01 = PokéPark Wii: La Gran Aventura de Pikachu R8BP41 = Baby-sitter Party +R8FJHA = Takumi Restaurant ha Daihanjou! +R8GJC8 = G1 Jockey Wii 2008 R8GPC8 = G1 Jockey 2008 R8HP4Q = Hannah Montana: La Película R8HX4Q = Hannah Montana: La Película @@ -59,6 +74,7 @@ R8HY4Q = Hannah Montana: La Película R8IP78 = Bob Esponja Atrapados en el Congelador R8IS78 = Bob Esponja: Atrapados en el Congelador R8JPWR = El Señor de los Anillos: Las Aventuras de Aragorn +R8NJG0 = Batting Revolution R8OX54 = Vamos al Circo R8RP41 = Arthur y la Venganza de Maltazard R8SP41 = Gymkana Party @@ -74,7 +90,6 @@ R9EPNP = Brico Party: ¡Cuidado! Mancha R9GPWR = Ga'Hoole: La Leyenda de los Guardianes R9LP41 = Girls Life: Pijama Party R9TK69 = Tiger Woods PGA Tour 09 -RB5P41 = Brothers in Arms: Earned in Blood RB9D78 = Bratz: La Película RB9P78 = Bratz: La Película RB9X78 = Bratz: La Película @@ -82,7 +97,13 @@ RB9Y78 = Bratz: La Película RBEP52 = Bee Movie: El Videojuego RBEX52 = Bee Movie: El Videojuego RBGE54 = The Bigs +RBHJ08 = Biohazard 0 +RBLJ8P = Bleach: Shattered Blade +RBTJ8P = Sega Bass Fishing +RBUJ08 = Biohazard: The Umbrella Chronicles RBVP52 = Barbie en La Princesa de los Animales +RBWJ01 = Totsugeki Famicom Wars vs. +RBYJ78 = Barnyard RBYP78 = El Corral: Una Fiesta Muy Bestia RC2E78 = Cars: Mater-National RC2P78 = Cars: La Copa Internacional de Mate @@ -92,30 +113,39 @@ RC3P41 = Catz: Diviértete con Nuevos Felinos RC3X41 = Catz: Diviértete con Nuevos Felinos RC4SGT = Shin Chan: ¡Las Nuevas Aventuras para Wii! RC8P7D = Crash: Guerra al Coco-Maníaco +RCAJ78 = Cars +RCCJC0 = Cooking Mama RCFP41 = La Familia Cosmic RCGP54 = Carnival: Juegos de Feria RCIP41 = CSI: Pruebas Ocultas RCKPGN = Sports Challenge: Desafío Deportivo RCLP4Q = Chicken Little: As en Acción RCOPNP = Detective Conan: La Investigación de Mirápolis +RD6J8N = Doubutu Kisoutengai RD6PNP = Safar'Wii -RDBPAF = Dragon Ball Z : Budokai Tenkaichi 2 -RDDPA4 = Dance Dance Revolution: Hottest Party -RDGPA4 = Castlevania Judgement RDHP78 = Destroy All Humans! Big Willy Desatado! +RDIJG2 = The Dog Island RDKP01 = Donkey Kong Jet Race RDLP70 = Spy Fox in Dry Cereal RDMPHZ = Minon: Héroe Total +RDOJ41 = Dog to Mahou no Boushi RDOP41 = Dogz: ¡Diviértete con Más Perros! RDOX41 = Dogz: ¡Diviértete con Más Perros! RDPP54 = Dora al Rescate de la Princesa de la Nieve RDPX54 = Dora al Rescate de la Princesa de la Nieve RDQEGD = Dragon Quest Swords: La Reina Enmascarada y la Torre de los Espejos RDQPGD = Dragon Quest Swords: La Reina Enmascarada y la Torre de los Espejos -REBPMT = Mr. Bean en el Estrambótico Mundo de Wii +RDRJA4 = Dewy's Adventure +RDTJAF = Tamagotchi Pikadai +RDWJG9 = Dragon Blade: Wrath of Fire +RDXJ18 = Deca Sporta +RDXKA4 = Deca Sporta +REBPMT = Mr. Bean en el estrambótico mundo de Wii +REKJ2N = Shape Boxing Wii de Enjoy Diet REKP41 = Mi Experto en Fitness: Cardio Training REKU41 = Mi Experto en Fitness: Cardio Training RENE8P = Sonic y el Caballero Negro +RENJ8P = Sonic and the Black Knight RENP8P = Sonic y el Caballero Negro REQP54 = Go, Diego, Go!: Safari Rescue REQX54 = Go, Diego, Go!: Safari Rescue @@ -124,31 +154,40 @@ REYP4Q = Disney Sing It: High School Musical 3 - Fin de Curso REYX4Q = Disney Sing It: High School Musical 3 - Fin de Curso RF2P54 = Los 4 Fantásticos y Silver Surfer RF3P6M = Ferrari Challenge: Trofeo Pirelli +RF8J13 = FIFA 08 +RF9K69 = FIFA 09 All-Play +RFAJAF = Family Trainer: Athletic World RFKP41 = Mi Experto En Fitness: Mantente en Forma RFKX41 = Mi experto en Fitness: Mantente en Forma RFOP52 = Spider-Man: Amigo o Enemigo RFOX52 = Spider-Man: Amigo o Enemigo +RFQK69 = FaceBreaker: K.O. Party RFVP52 = ¡Los Monos Locos! RFZP41 = Imagina Ser Presenta: El Gran Concurso de la Moda RG5PWR = Guinness World Records: El Videojuego RG6P69 = Boogie Superstar RG8P41 = Animalz Sports: Dogz RGAP8P = Planet 51: El Videojuego +RGCJJF = Petitcopter Wii Adventure Flight RGFF69 = El Padrino: El Chantaje RGFI69 = El Padrino: El Chantaje RGFP69 = El Padrino: El Chantaje RGFS69 = El Padrino: El Chantaje RGHK52 = Guitar Hero III: Legends of Rock +RGIJC8 = G1 Jockey Wii RGJP7U = George de la Jungla RGQE70 = Los Cazafantasmas: El Videojuego RGQP70 = Los Cazafantasmas: El Videojuego RGWE41 = Rabbids Mi Caaasa!!! RGWP41 = Rabbids Mi Caaasa!!! RGWX41 = Rabbids Mi Caaasa!!! +RH3J4Q = High School Musical 3: Senior Year Dance! RH3P4Q = High School Musical 3: Fin de Curso Dance! RH5PKM = Horse Life 2: Amigos para Siempre RH6K69 = Harry Potter and the Half-Blood Prince RH6P69 = Harry Potter y el Misterio del Príncipe +RHAK01 = Wii Play +RHKJ18 = Hataraku Hit RHKP18 = Job Island RHQP4Q = Hannah Montana: Únete a Su Gira Mundial RHQX4Q = Hannah Montana: Únete a Su Gira Mundial @@ -159,7 +198,6 @@ RHSY36 = Heatseeker: Tormenta de Fuego RHZP41 = Horsez: El Valle del Rancho RI2P4Q = High School Musical: ¡Canta con ellos! RI8E41 = Brothers in Arms: Road to Hill 30 -RI8P41 = Brothers in Arms: Road to Hill 30 RI9PGT = Divagirls: Princesas Sobre Hielo RIAI52 = Ice Age 3: El Origen de los Dinosaurios RIAP52 = Ice Age 3: El Origen de los Dinosaurios @@ -169,12 +207,14 @@ RIHP8P = El Increíble Hulk RIJP69 = G.I. JOE RINP08 = Dead Rising: Terror en el Hipermercado RIOPSU = Esa Horrible Historia: Depravados Romanos -RIPPAF = One Piece Unlimited Cruise 1: El Tesoro Bajo las Olas RITFMR = Intervilles: Le Jeu Officiel -RIUPAF = One Piece - Unlimited Cruise 2: El Despertar de un Héroe +RIUJAF = One Piece Unlimited Cruise 2: Awakening of a Hero +RIUPAF = One Piece: Unlimited Cruise 2: El Despertar de un Héroe RIVEXJ = Ivy the Kiwi? +RIVJAF = Ivy the Kiwi? RIVP99 = Ivy the Kiwi? RIXP7J = Dodge Racing: Charger vs. Challenger +RJ2JGD = 007: Quantum of Solace RJ8P64 = Indiana Jones y el Cetro de los Reyes RJ9FMR = Think: Sigue Entrenando tu Cerebro RJ9PFR = Think: Sigue Entrenando tu Cerebro @@ -191,9 +231,18 @@ RJNE20 = Build 'n Race RJOP99 = Ju-On: The Grudge RJQP70 = Pajama Sam: Don't Fear the Dark RJZP7U = SNK Arcade Classics: Volumen 1 +RK2JEB = Trauma Center: New Blood +RK5K01 = Kirby's Epic Yarn +RK6J18 = Kororinpa 2 +RKAJMS = Milestone Shooting Collection +RKAK8M = Milestone Shooting Collection Karous Wii +RKDJEB = Trauma Center: Second Opinion +RKFKZA = King of Fighters Collection: The Orochi Saga RKFP7U = The King of Fighters Collection: The Orochi Saga RKHP52 = Kung Fu Panda: Guerreros Legendarios RKMP5D = Mortal Kombat: Armagedón +RKPJ52 = Kung Fu Panda +RKPK52 = Kung Fu Panda RKPP52 = Kung Fu Panda: El Videojuego RKPV52 = Kung Fu Panda: El Videojuego RKPY52 = Kung Fu Panda: El Videojuego @@ -207,14 +256,19 @@ RLFE64 = Star Wars: The Clone Wars - Lightsaber Duels RLFP64 = Star Wars: The Clone Wars - Duelo de Sables de Luz RLIE64 = LEGO Indiana Jones: La Trilogía Original RLIP64 = LEGO Indiana Jones: La Trilogía Original -RLLP70 = Go West!: Una Aventura de Lucky Luke +RLLP70 = Go West! Una Aventura de Lucky Luke RLNFMR = Supervivientes RLNHMR = Supervivientes RLNIMR = Supervivientes RLNPMR = Supervivientes +RLRJEL = Tomb Raider: Anniversary RLVP78 = Avatar: La Leyenda de Aang +RLWJ78 = Ratatouille RM5P7D = La Momia: La Tumba del Emperador Dragón RM9PGM = Mushroom Men: Las Guerras Espora +RMAJ01 = Mario Power Tennis +RMGK01 = Super Mario Galaxy +RMHJ08 = Monster Hunter Tri RMNDFR = Mi Hotel para Mascotas RMNHMN = Mi Hotel para Mascotas RMNPFR = Mi Hotel para Mascotas @@ -223,26 +277,30 @@ RMSP52 = Marvel Ultimate Alliance 2 RMUE52 = Marvel Ultimate Alliance RMUJ2K = Marvel Ultimate Alliance RMUP52 = Marvel Ultimate Alliance -RN3P78 = Bob Esponja: El Ataque de los Juguetes Roboticos +RN3J78 = Nicktoons: Attack of the Toybots +RN3P78 = Bob Esponja : El Ataque de los Juguetes Roboticos RN3X78 = Bob Esponja : El Ataque de los Jugetes Roboticos RN4P41 = ANNO: La Creación de un Nuevo Mundo RN5P78 = The Naked Brothers Band: El Videojuego -RNCPH4 = SNK Arcade Classics: Volumen 1 +RNEJDA = Naruto Shippuuden: Gekitou Ninja Taisen EX 3 RNIPGT = Cuerpo, Mente y Vida: Cuida lo que Comes +RNNJ4Q = The Chronicles of Narnia: Prince Caspian RNNP4Q = Las Crónicas de Narnia: El Príncipe Caspian RNNX4Q = Las Crónicas de Narnia: El Príncipe Caspian RNNY4Q = Las Crónicas de Narnia: El Príncipe Caspian RNNZ4Q = Las Crónicas de Narnia: El Príncipe Caspian RNOP01 = Another Code: R - Más Allá de la Memoria +RNRJ41 = Nitro Bike RNSD69 = Need for Speed: Carbono RNSE69 = Need for Speed: Carbon RNSF69 = Need for Speed: Carbono RNSP69 = Need for Speed: Carbono -RNSX69 = Need for Speed: Carbono +RNWJAF = Namco Carnival RNXJDA = Naruto Shippuuden Gekitou Ninja Taisen EX RNYJDA = Naruto Shippuuden Gekitou Ninja Taisen EX 2 RO2E7N = Ford Racing: Off Road RO2P7N = Ford Racing: Off Road +RO3J99 = Little King's Story RO7P7D = La Leyenda de Spyro: La Noche Eterna RO8E7D = The Legend of Spyro: Dawn of the Dragon RO8P7D = La Leyenda de Spyro: La Fuerza del Dragón @@ -250,11 +308,17 @@ RO8X7D = La Leyenda de Spyro: La Fuerza del Dragón ROAE36 = Overlord: La Leyenda Siniestra ROAP36 = Overlord: La Leyenda Siniestra ROBPPL = Obscure II +RODJ01 = WarioWare: Smooth Moves +RODK01 = WarioWare: Smooth Moves ROEPGT = Hotel para Perros ROLE8P = Mario & Sonic en los Juegos Olímpicos de Invierno +ROLJ01 = Mario & Sonic at the Olympic Winter Games +ROLK01 = Mario & Sonic at the Olympic Winter Games ROLP8P = Mario & Sonic en los Juegos Olímpicos de Invierno +RONJG9 = Onechanbara Revolution ROPP41 = Colegas en el Bosque -ROUPAF = One Piece - Unlimited Cruise 1: El Tesoro Bajo las Olas +ROUJAF = One Piece Unlimited Cruise 1: The Treasure Beneath the Waves +ROUPAF = One Piece: Unlimited Cruise 1: El Tesoro Bajo las Olas ROYE41 = Lluvia de Albóndigas ROYP41 = Lluvia de Albóndigas ROYX41 = Lluvia de Albóndigas @@ -264,26 +328,33 @@ RP7P52 = Piratas: El Tesoro de Barbanegra RPFP52 = Pitfall: La Gran Aventura RPFU52 = Pitfall: La Gran Aventura RPKP52 = World Series of Poker: Tournament of Champions +RPSJ4Q = Disney Princess Wii RPSP4Q = Disney Princesas: Un Viaje Encantado RPTD52 = Puppy Luv: Cuida tu Cachorro RPTP52 = Puppy Luv: Cuida tu Cachorro RPWX41 = Prince of Persia: Las Arenas Olvidadas +RPXJ13 = EA Playground +RPYJ9B = Super Swing Golf RPYP9B = Pangya! Golf con Estilo +RQ4J78 = SpongeBob SquarePants: Creature from the Krusty Krab RQ4P78 = Bob Esponja: La Criatura del Krustáceo Krujiente -RQ5P5G = Mad Dog McCree: Gunslinger Pack RQ5X5G = Mad Dog McCree: Gunslinger Pack RQEP6V = Agatha Christie: Maldad Bajo el Sol RQFP6V = Safecracker: El Desafío Definitivo +RQGJ13 = MySims Racing RQJP7D = Crash: Lucha de Titanes RQJX7D = Crash: Lucha de Titanes RQKP41 = Feria Party RQLP64 = Star Wars The Clone Wars: Héroes de la República RQNPWR = Scooby-Doo! Bienvenidos al Misterio +RQOJ13 = Spore Hero RQOP69 = Spore Héroes +RQRJAF = The Sky Crawlers: Innocent Aces RQTP6V = Agatha Christie: Y No Quedó Ninguno RQXP70 = Astérix en los Juegos Olímpicos RR5P70 = Ready 2 Rumble: Revolution RR7PVP = Real Madrid: The Game +RRBJ41 = Rayman Raving Rabbids RRCP52 = Barbie Horses: Escuela de Equitación RRGP52 = Madagascar 2: El Videojuego RRJFMR = Ready, Steady, Cook: The Game @@ -293,38 +364,50 @@ RRMP69 = Hasbro: Juegos en Familia RRMX69 = Hasbro: Juegos en Familia RRQP52 = Shrek Carnival Craze: Multijuegos RRQX52 = Shrek Carnival Craze: Multijuegos +RRSJ4Q = Meet The Robinsons RRSP4Q = Descubriendo a los Robinsons RRSX4Q = Descubriendo a los Robinsons RRTP52 = Family Games: 20 Juegos RS5JC8 = Sengoku Musô KATANA RSAP78 = Bob Esponja: Aventura en la Atlántida +RSBK01 = Dairantou Smash Brothers X +RSHK69 = MySims Kingdom RSKP52 = Shrek Tercero RSKX52 = Shrek Tercero -RSLKAF = Soulcalibur Legends RSLPAF = Soulcalibur Legends +RSMJ8P = Super Monkey Ball: Banana Blitz RSND69 = Los Simpson: El Videojuego RSNF69 = Los Simpson: El Videojuego RSNP69 = Los Simpson: El Videojuego RSNX69 = Los Simpson: El Videojuego RSRE8P = Sonic y los Anillos Secretos +RSRJ8P = Sonic and the Secret Rings RSRP8P = Sonic y los Anillos Secretos RSSK52 = Samurai Shodown Anthology RSTP64 = Star Wars: El Poder de la Fuerza +RSZJES = Yukinko Daisenpuu RT3P54 = Rockstar Games Presenta Table Tennis RT6FKM = El Tiovivo Mágico RT6PKM = El Tiovivo Mágico -RT8K69 = Tiger Woods PGA Tour 08 +RT8J13 = Tiger Woods PGA Tour Golf 08 +RTDJES = Shin Chuuka Taisen +RTDK8M = Shin Chuuka Taisen RTEHMR = Veterinarios en Acción RTEPFR = Mi Clínica Veterinaria RTFP52 = Transformers: El Videojuego RTFX52 = Transformers RTFY52 = Transformers +RTIJ8P = Wacky World of Sports RTIP8P = Locura Deportiva +RTKK8M = Sharuui Takoron +RTLJ18 = Mezase Tsuri Master Sekai ni Challenge Hen RTMP41 = Tortugas Ninja Jóvenes Mutantes +RTRJ18 = Mezase Tsuri Master RTSP41 = Totally Spies! Fiesta Total RTVP64 = Thrillville: Off the Rails RTYP01 = Wii Ajedrez RTZJ08 = Zack & Wiki: En Busca del Tesoro de Barbaros +RTZK08 = Zack & Wiki: Quest For Barbaros' Treasure RTZP08 = Zack & Wiki: En Busca del Tesoro de Barbaros RU2P5Z = Winter Sports 2: The Next Challenge RU5P4Q = Tiana y el Sapo @@ -340,9 +423,11 @@ RUIX4Q = Disney Sing It RUME5Z = Ski And Shoot RUOPPL = Pequeños Invasores RUQI78 = Up: El videojuego +RUQJJE = Carl Jii San no Sora Tobu Le RUQP78 = Up: El videojuego RUQS78 = Up: El Videojuego RUQX78 = Up: El videojuego +RUSK78 = SpongeBob SquarePants Featuring Nicktoons: Globs of Doom RUSP78 = Bob Esponja y Amigos: Globs of Doom RUSX78 = Bob Esponja y Amigos: Globs of Doom RUSY78 = Bob Esponja y Amigos: Globs of Doom @@ -353,46 +438,63 @@ RVAP78 = Avatar: La Leyenda de Aang - La Tierra Ardiente RVBPRS = Alvin y las Ardillas RVHP41 = Scrabble Interactivo: Edición 2009 RVJPFR = So Blonde: Perdidos en el Caribe +RVKJ99 = Valhalla Knights: Elder Saga RVQP41 = Desafío Cine Party RVTFMR = Veterinarios en Acción RVTPMR = Veterinarios en Acción RVTXMR = Veterinarios en Acción RVZP52 = Monstruos contra Alienígenas +RW3J4Q = Pirates of the Caribbean: At World's End RW3P4Q = Los Piratas del Caribe: En el Fin del Mundo RW4D41 = Mi Experto en Vocabulario RW5F41 = ¿Quién Quiere Ser Millonario? 2da Edición RW5P41 = ¿Quién Quiere Ser Millonario? 2da Edición RW8P41 = Imagina Ser: Amazona en Competición +RWAJ78 = WALL•E +RWAK78 = WALL•E RWFH41 = Mi Experto en Vocabulario RWMP78 = Worms: Una Gusanodisea Espacial RWRP4F = Los Autos Locos RWSE8P = Mario & Sonic en los Juegos Olímpicos +RWSJ01 = Mario & Sonic at the Olympic Games +RWSK01 = Mario & Sonic at the Olympic Games RWSP8P = Mario & Sonic en los Juegos Olímpicos RWUP52 = X-Men Orígenes: Lobezno RWUX52 = X-Men Orígenes: Lobezno RX4PMT = La Escuela de Miedos de Casper: Olimpiada Terrorífica RXDD4Q = Disney Th!nk Fast: Piensa y Acierta +RXDJ4Q = Disney Th!nk Haya Oshi Quiz RXDP4Q = Disney Th!nk Fast: Piensa y Acierta RXDR4Q = Disney Th!nk Fast: Piensa y Acierta RXDX4Q = Disney Th!nk Fast: Piensa y Acierta RXDY4Q = Disney Th!nk Fast: Piensa y Acierta RXIP52 = Transformers: La Venganza de los Caídos RXLP41 = Anatomía de Grey: El Videojuego +RXPJJF = Bass Fishing Wii RXQPWR = Donde Viven los Monstruos RXRPRS = El Valiente Desperaux RXRXRS = El Valiente Desperaux RXUP41 = Locos por el Surf RXUX41 = Locos por el Surf +RXXJ4Q = Spectrobes: Origins RXXP4Q = Spectrobes: Orígenes +RY2J41 = Rayman Raving Rabbids 2 +RY2K41 = Rayman Raving Rabbids 2 RY3E41 = Rayman Raving Rabbids: TV Party +RY3J41 = Rayman Raving Rabbids TV Party RY3K41 = Rayman Raving Rabbids TV Party RYBE69 = Boom Blox Bash Party RYBP69 = Boom Blox Smash Party +RYGJ9B = Argus no Senshi Muscle Impact RYIE9B = Spray RYIPNK = Spray +RYWK01 = Big Brain Academy: Wii Degree RYWP01 = Big Brain Academy para Wii RZAPTV = Power Math +RZDJ01 = The Legend of Zelda: Twilight Princess RZLP41 = Cooking Party +RZPJ01 = Link's Crossbow Training +RZPK01 = Link's Crossbow Training RZRPGT = El Destino de El Zorro RZYF41 = Mi Experto en Vocabulario RZYP41 = Mi Experto en Vocabulario @@ -403,6 +505,7 @@ S2ZP52 = Zhu Zhu Pets: Los Amigos del Bosque S33SKM = Let's Sing 9 - Versión Española S3BEWR = Batman: El Intrépido Batman S3BPWR = Batman: El Intrépido Batman +S3DJ18 = Deca Sporta 3 S3EP78 = Barbie: Planeta Fashionista S3MP69 = Los Sims 3 S3PP4Q = Disney Princesas: Reinos Mágicos @@ -416,11 +519,13 @@ S7FPGT = Zumba Kids: ¡Ven a la fiesta del baile! S7JPKM = Let's Sing 6 - Versión Española S7SP41 = Los Pitufos Party Pack SA3P5G = Alvin y las Ardillas 3 +SA3XGT = Alvin y las Ardillas 3 SALE4Q = Alicia en el País de las Maravillas SALP4Q = Alicia en el País de las Maravillas SAOP78 = Monster High: Instituto Monstruoso SAOXVZ = Monster High: Instituto Monstruoso SB2PNP = My Baby 2: ¡Mi Bebé Ha Crecido! +SB4K01 = Super Mario Galaxy 2 SB6P52 = Bakugan: Defensores de la Tierra SB9P78 = Barbie y el Salón de Belleza para Mascotas SBJEG9 = Ben 10 Ultimate Alien: Cosmic Destruction @@ -431,6 +536,8 @@ SBRPKM = Repetto presenta Ballerina SBVP78 = Bob Esponja: Botes de Choque SBVS78 = Bob Esponja: Botes de Choque SBZESZ = Triángulo de las Bermudas: Salvemos el Coral +SC8J01 = Wii Play: Motion +SC8K01 = Wii Play: Motion SCIP41 = CSI: La Conspiración SCJE4Q = LEGO Piratas del Caribe: El Videojuego SCJP4Q = LEGO Piratas del Caribe: El Videojuego @@ -452,19 +559,24 @@ SDPP54 = Dora la Exploradora: La Gran Aventura de Cumpleaños SDUE41 = Los Pitufos: Dance Party SDUP41 = Los Pitufos: Dance Party SDUX41 = Los Pitufos: Dance Party +SDWJ18 = Lost in Shadow SDWP18 = La Torre de las Sombras +SEAJ13 = EA Sports Active More Workout SEAP69 = EA Sports Active: Nuevos Retos +SEMJ01 = Disney Epic Mickey: Mickey Mouse and the Magic Brush SERF4Q = Disney Epic Mickey 2: El retorno de dos héroes SERP4Q = Disney Epic Mickey 2: El retorno de dos héroes SESPWR = Barrio Sésamo ¿Preparados? ¿Listos? ¡Coco! SESUWR = Barrio Sésamo ¿Preparados? ¿Listos? ¡Coco! SF2P64 = Star Wars: El Poder de la Fuerza II +SF5J41 = Fit in Six SF5P41 = Mi Experto en Fitness: Club SFIP01 = Mystery Case Files: El Incidente Malgrave SFPPFR = Fantastic Fútbol Fan Party SFQP8P = Capitán América: Supersoldado SFUE64 = Star Wars: El Poder de la Fuerza II SFWE69 = Copa Mundial de la FIFA Sudáfrica 2010 +SFWJ13 = 2010 FIFA World Cup South Africa SFWP69 = Copa Mundial de la FIFA Sudáfrica 2010 SFWX69 = Copa Mundial de la FIFA Sudáfrica 2010 SFWY69 = Copa Mundial de la FIFA Sudáfrica 2010 @@ -483,7 +595,6 @@ SHDP52 = Cómo Entrenar a Tu Dragón SHHP69 = Harry Potter y las Reliquias de la Muerte - Parte 1 SHMPLR = Pablo Diablo SHYE69 = NHL Slapshot -SHYP69 = NHL Slapshot SIAP52 = Ice Age 4: La formación de los continentes - Juegos en el Artico SIIE8P = Mario & Sonic en los Juegos Olímpicos - London 2012 SIIJ01 = Mario & Sonic en los Juegos Olímpicos - London 2012 @@ -514,17 +625,20 @@ SLNP7M = La Voz Vol. 3 SLPP5D = The Spirit of the Wolf SLRPWR = LEGO El Señor de los Anillos SLVP41 = Party Night ¿Te Atreves? +SMBJ8P = Super Monkey Ball: Step & Roll SMFE4Q = Phineas y Ferb: A Través de la 2a Dimensión SMFP4Q = Phineas y Ferb: A Través de la 2a Dimensión SMGE78 = Megamind: El Mega Escuadrón SMGP78 = Megamind: El Mega Escuadrón SMIE41 = ¿Quién Quiere Ser Millonario? +SMNJ01 = New Super Mario Bros. Wii SMNW01 = New Super Mario Bros. Wii (Chino Tradicional) SN4JDA = Naruto Shippuuden Ryujinki SNBP41 = NCIS Navy Investigación Criminal SNYEVZ = Monster High: 13 Deseos SNYPVZ = Monster High: 13 Deseos SOTE52 = Wipeout +SOUJ01 = The Legend of Zelda: Skyward Sword SP5PVV = The Kore Gang: La Exvasión de los Intraterrestres SP8E78 = Los Pingüinos de Madagascar: El Regreso del Dr. Espiráculo! SP8P78 = Los Pingüinos de Madagascar: El Regreso Del Dr. Espiráculo @@ -535,6 +649,7 @@ SPXP41 = Prince of Persia: Las Arenas Olvidadas SQLE4Z = Cartoon Network: Explosión de Puñetazos XL SQLPGN = Cartoon Network: Explosión de Puñetazos XL SQQPVZ = Disney Aviones: Equipo De Rescate +SR4J41 = Raving Rabbids: Travel in Time SR4P41 = Raving Rabbids: Regreso al Pasado SR9EHG = El Conejo Lector Preescolar SRPE4Q = Enredados @@ -549,10 +664,12 @@ SSCIWR = Scene It? Estrellas en Pantalla Gigante SSCPWR = Scene It? Estrellas en Pantalla Gigante SSCSWR = Scene It? Estrellas en Pantalla Gigante SSCXPM = Scene It? Estrellas en Pantalla Gigante +SSEDNG = We Sing: Encore SSFPKM = Sing 4 SSHPHH = Sherlock Holmes: The Case of the Silver Earring ST5E52 = Transformers: La Guerra por Cybertron ST5P52 = Transformers: La Guerra por Cybertron +ST7P01 = Distrito Fortuna STHE8P = Thor: God of Thunder STHP8P = THOR: Dios del Trueno STNE41 = Las Aventuras de Tintín: El Secreto del Unicornio @@ -566,11 +683,13 @@ STSY4Q = Toy Story 3: El Videojuego STTPGR = Hidden Mysteries: Titanic STXE69 = Tiger Woods PGA TOUR 12: The Masters STZP52 = Transformers: El Lado Oscuro de la Luna - Stealth Force Edition +SU3HMR = U-Sing 2: Popstars Edition SU3UMR = U-Sing 2: Edición Australiana SU5EVZ = Monster High: El Patinaje Extre-Mortífero SU5PVZ = Monster High: El Patinaje Laberíntico SU7PAF = El Origen de los Guardianes SU9P4Q = Disney Aviones +SUKK01 = Kirby's Return to Dream Land SUSFMR = U-Sing: Johnny Hallyday SUUP78 = uDraw Studio: Artista al Instante SV3EG9 = Madagascar 3: El videojuego @@ -578,9 +697,12 @@ SV3PAF = Madagascar 3: de Marcha por Europa SV6SRV = La Voz SV7PVZ = Los Pingüinos de Madagascar SVDP52 = Bob Esponja: La Venganza de Plankton -SVMP01 = Super Mario All-Stars: Edición 25 Aniversario -SVQPVZ = Barbie y sus hermanas: Refugio para cachorros +SVMJ01 = Super Mario Collection: 25th Anniversary Edition +SVMP01 = Super Mario All-Stars +SVQEVZ = Barbie y sus Hermanas: Refugio para Cachorros +SVQPVZ = Barbie y sus Hermanas: Refugio para Cachorros SVVPAF = Los Croods: ¡Fiesta Prehistórica! +SX3J01 = Pandora’s Tower: Until I Return to Your Side SX9PRV = La Voz Vol. 2 SY7PKM = Let's Sing 7 - Versión Española AMOR04 = Guitar Hero III Custom: HARDcore @@ -598,7 +720,6 @@ CG2P52 = Guitar Hero III Custom: Guitar Hero II CG3ECS = Guitar Hero III Custom: ClasSick Edition CG3PCS = Guitar Hero III Custom: ClasSick Edition CGBP52 = Guitar Hero III Custom: Rock Band -CGH370 = Guitar Hero III Custom: 70 New Song CGH3IM = Guitar Hero III Custom: Iron Maiden CGH3LM = Guitar Hero III Custom: Legend Of Music CGH3NE = Guitar Hero III Custom: Nostalgia Edition @@ -671,13 +792,14 @@ CTIP00 = StarSing: Rocks! Part. I v2.0 CTJP00 = StarSing: Rocks! Part. II v2.0 CTKP00 = StarSing: Pop Hits v2.0 DMSP4Q = Sing It: Películas Disney -DUAP01 = DU Super Mario Bros. : Edición Aniversario +GMSE02 = Super Mario Sunshine Multijugador HBWE01 = Nuevo Super Mario Bros. Wii: Edición Hellboy L40P4Q = SingIt: Pop hits, los 40 principales MKWP01 = Mario Kart Snes PPNE01 = New Super Mario Bros. Wii 2: Los Próximos Niveles PT2PSI = SingIt Portugal Hits Fiesta de Verano PUTA01 = Guitar Hero III Custom: Rock Hits +R24E01 = Chibi-Robo! RDUE01 = DU Super Mario Bros.: Find That Princess RG0E52 = Guitar Hero III Custom: Green Day Plus RG1552 = Guitar Hero III Custom: Weird Al Yankovic @@ -699,13 +821,16 @@ RGXM52 = Guitar Hero III Custom: xMxExTxAxLx's Edition RGZC52 = Guitar Hero III Custom: Led Zeppelin RGZE52 = Guitar Hero III Custom: Shred Edition RJJG52 = Guitar Hero III Custom: JJ-KwiK's Edition -RMCC01 = Mario Kart Wii (Personalizado) +RMCE88 = Mario Carritos Definitivo 3.0 RMCEB8 = Mario Kart Manía +RMCEFO = Neptune777 Forza MAX Orígenes +RMCPCA = Mario Kart Wii (traducción al catalán) RMGE52 = Guitar Hero III Custom: Megadeth RMHC08 = Monster Hunter Tri (Personalizado) RMMP52 = Guitar Hero III Custom: Metal Mayhem ROMESD = Monster Hunter G (parcheado al inglés) RQQE52 = Guitar Hero III Custom: Queen +RSBEUW = Super Smash Bros Ultimate Para Wii RSFC99 = Muramasa: The Demon Blade (Personalizado) RSJESD = Guitar Hero III Custom: System of a Down RSYP06 = Super Smash Bros. Brawl: YF06's Mod @@ -729,87 +854,292 @@ XBKE52 = Guitar Hero III Custom: Bullet For My Kamelot ZXFP52 = Guitar Hero: Rocks the 80s W2CP = Reto Mental W2FP = Entrenamiento de Equilibrio Physiofun +W2GD = Phoenix Wright Ace Attorney: Justice for All (Deutsche Version) +W2GE = Phoenix Wright: Ace Attorney Justice for All +W2GP = Phoenix Wright Ace Attorney: Justice for All +W2GS = Phoenix Wright Ace Attorney: Justice for All +W2JE = Just Jam +W2ME = Blaster Master: Overdrive W2MP = Blaster Master Overdrive W2PP = Ejercicios de Kegel Physiofun +W3AE = Carmen Sandiego Adventures in Math: The Big Ben Burglary W3GD = Phoenix Wright: Ace Attorney - Trials and Tribulations +W3GE = Phoenix Wright Ace Attorney: Trials and Tribulations W3GP = Phoenix Wright: Ace Attorney - Trials and Tribulations +W3GS = Phoenix Wright: Ace Attorney Trials and Tribulations W3KE = Thruspace W3KP = ThruSpace +W3LE = Carmen Sandiego Adventures in Math: The Lady Liberty Larceny +W3ME = The Three Musketeers: One for all W3MP = Los Tres Mosqueteros ¡Uno para todos! +W3TE = Pearl Harbor Trilogy - 1941: Red Sun Rising +W44E = Stop Stress: A Day of Fury +W44P = Stop Stress: A Day of Fury +W4AP = Arcade Sports: Air Hockey, Bowling, Pool, Snooker +W5IE = 5 in 1 Solitaire +W6BE = Eco Shooter: Plant 530 +W6BP = Eco-Shooter: Plant 530 +W72P = Successfully Learning German Year 3 +W73P = Successfully Learning German Year 4 +W74P = Successfully Learning German Year 5 +W7IP = Successfully Learning German Year 2 +W8CE = Bit.Trip Core +W8CP = Bit.Trip Core +W8WE = Happy Holidays: Halloween W8WP = Happy Holidays Halloween +W9BP = Big Town Shoot +W9RE = Happy Holidays: Christmas W9RP = Happy Holidays Christmas WA2J = Actionloop Twist +WA4E = WarioWare: D.I.Y. Showcase +WA4P = WarioWare: Do It Yourself - Showcase +WA5E = Carmen Sandiego Adventures in Math: The Island of Diamonds WA7P = Toribash - La Violencia Perfeccionada -WAEP = Around the World +WA8E = Art Style: Rotozoa +WA8P = Art Style: Penta Tentacles +WAEE = Around The World +WAFE = Airport Mania: First Flight +WAFP = Airport Mania: First Flight +WAHP = Trenches: Generals +WAKE = Carmen Sandiego Adventures in Math: The Case of the Crumbling Cathedral +WALE = Art Style: Light Trax WALP = Art Style: Light Trax +WAME = Carmen Sandiego Adventures in Math: The Great Gateway Grab +WAOP = The Very Hungry Caterpillar´s ABC +WAZE = The Amazing Brain Train +WB2E = Strong Bad Episode 4: Dangeresque 3 +WB2P = Strong Bad Episode 4: Dangeresque 3 +WB3E = Strong Bad Episode 5: 8-bit is Enough WB3P = Strong Bad Episode 5: 8-bit Is Enough +WBEE = Pong Toss: Frat Party Games +WBEP = Beer Pong: Frat Party Games +WBFE = Bit.Trip Fate +WBFP = Bit.Trip Fate +WBGP = Bang Attack +WBJE = Harvest Moon: My Little Shop WBLE = Bubble Bobble Plus +WBPE = Plättchen Twist 'n' Paint +WBPP = PLÄTTCHEN - twist 'n' paint +WBRP = Pirates: The Key of Dreams WBVP = Spogs Racing +WBXE = Strong Bad Episode 1: Homestar Ruiner +WBXP = Strong Bad Episode 1: Homestar Ruiner +WBYE = Strong Bad Episode 2: Strong Badia - The Free WBYP = Strong Bad Episode 2: Strong Badia the Free -WCHP = Chess Challenge! +WBZE = Strong Bad Episode 3: Baddest of the Bands +WBZP = Strong Bad Episode 3: Baddest of the Bands +WCJP = Cocoto: Platform Jumper +WCKE = chick chick BOOM WCKP = Chick Chick Boom +WCLE = Doc Clock: The Toasted Sandwich of Time +WCSE = CueSports: Pool Revolution +WCSP = CueSports: Snooker vs Billiards +WD9E = Castlevania The Adventure ReBirth WD9J = Castlevania: The Adventure ReBirth +WD9P = Castlevania: The Adventure ReBirth +WDEE = Magic Destiny Astrological Games +WDEP = Magic Destiny Astrological Games +WDFE = Defend your Castle +WDFP = Defend your Castle +WDHE = Art Style: ROTOHEX WDHP = Art Style: Rotohex WDMJ = Dr. Mario & Bactericida WDMP = Dr. Mario & Bactericida +WDPE = Dr. Mario Online Rx (Friend Battle Demo) +WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) +WDRE = Mr Driller W +WEME = Aha! I Got It! Escape Game +WEMP = Aha! I Got It! Escape Game WERE = Aquarium +WETE = PictureBook Games: Pop-Up Pursuit WETP = Juegos de libros ilustrados: Una aventura desplegable +WF2E = Final Fantasy Crystal Chronicles: My Life as a Darklord +WF2P = Final Fantasy Crystal Chronicles: My Life as a Darklord +WF3E = Family Games - Pen & Paper Edition +WF4E = Final Fantasy IV: The After Years +WF4P = Final Fantasy IV: The After Years +WFCE = Final Fantasy Crystal Chronicles: My Life as a King +WFCP = Final Fantasy Crystal Chronicles: My Life as a King +WFEE = Fenimore Fillmore +WFQE = Frogger: Hyper Arcade Edition +WFQP = Frogger: Hyper Arcade Edition +WFTE = Fish 'em All +WFTP = Fish'em All! +WFVE = Soccer Up +WFVP = Football Up +WFWE = Flower Works +WFWP = Flowerworks: Follie's Adventure +WFXE = Cosy Fire WFXP = Mi Chimenea WFYP = Family Games +WGDE = Gradius Rebirth +WGDP = Gradius Rebirth WGFP = Girlfriends Forever Magic Skate +WGGE = Gabrielle's Ghostly Groove: Monster Mix +WGGP = Gabrielle's Ghostly Groove: Monster Mix WGPP = Zenquaria: El Acuario Virtual WGSD = Phoenix Wright: Ace Attorney (Versión Alemana) +WGSE = Phoenix Wright: Ace Attorney +WGSF = Phoenix Wright: Ace Attorney (French Version) +WGSP = Phoenix Wright: Ace Attorney +WGSS = Phoenix Wright: Ace Attorney (Textos en español) +WHBE = Hubert the Teddy Bear: Winter Games +WHEE = Heracles: Chariot Racing +WHEP = Heracles: Chariot Racing +WHFE = Heavy Fire: Special Operations +WHFP = Heavy Fire: Special Operations +WHRE = Heron Steam Machine +WHRP = Heron: Steam Machine WHUE = Aventuras en la Casa Fantasma WHUP = Aventuras en la Casa Fantasma +WHVE = High Voltage: Hot Rod Show +WHWP = HoopWorld: BasketBrawl +WHYE = Heavy Fire: Black Arms +WIBE = bittos+ +WICE = NyxQuest Kindred Spirits +WICP = NyxQuest: Kindred Spirits +WIDE = Dracula: Undead Awakening +WIDP = Dracula: Undead Awakening +WIEE = Tales of Monkey Island: Chapter 3 - Lair of the Leviathan WIEP = Tales of Monkey Island: Episodio 3 - Lair of the Leviathan +WIGE = Incoming +WILE = Tales of Monkey Island: Chapter 1 - Launch of the Screaming Narwhal WILP = Tales of Monkey Island: Episodio 1 - Launch of the Screaming Narwhal +WIRE = Tales of Monkey Island: Chapter 5 - Rise of the Pirate God WIRP = Tales of Monkey Island: Episodio 5 - Rise of the Pirate God -WISP = Tales of Monkey Island: Episodio 2 : The Siege of Spinner Cay +WISE = Tales of Monkey Island: Chapter 2 - The Seige of Spinner Cay +WISP = Tales of Monkey Island: Episodio 2 - The Siege of Spinner Cay +WITP = Aha! I Found It! Hidden Object Game +WIYE = Tales of Monkey Island: Chapter 4 - The Trial and Execution of Guybrush Threepwood WIYP = Tales of Monkey Island: Episodio 4 - The Trial and Execution of Guybrush Threepwood +WJKE = Jewel Keepers Easter Island WJKP = Guardianes de Joyas: La Isla de Pascua +WKBP = You, Me and the Cubes +WKDE = Pirates: The Key of Dreams +WKFE = Kung Fu Funk: Everybody is Kung Fu Fighting! WKFP = Kung Fu Funk: Everybody is Kung Fu Fighting +WKKP = Pop-Up Pirates! +WKRP = Karate Phants: Gloves of Glory +WKTE = Contra Rebirth +WKWE = Adventure on Lost Island: Hidden Object Game WKWP = Aventura en la Isla Perdida: Juego de Objetos Escondidos +WL2E = Target Toss Pro: Lawn Darts +WL9E = Let's Create! Pottery WLEE = Aprender con los PooYoos: Episodio 1 WLEP = Aprender con los PooYoos: Episodio 1 WLNE = Aprender con los PooYoos Episodio 2 WLNP = Aprender con los PooYoos Episodio 2 +WLOE = LostWinds: Winter of the Melodias +WLOP = LostWinds: Winter of the Melodias WLTE = Lit +WLZE = lilt line +WLZP = lilt line +WM7E = Anima Ark of Sinners +WM7P = Anima Ark of Sinners +WM9E = Happy Hammerin +WMBE = MaBoShi's Arcade WMBP = MaBoShi: El arcade de las tres formas +WMCE = Monsteca Corral: Monsters vs. Robots WMCP = Monsteca Corral: Monsters vs Robots +WMDE = Madstone +WMJE = Dive: The Medes Islands Secret +WMJP = Dive: The Medes Islands Secret +WMLE = Major League Eating: The Game +WMSE = Enjoy your massage! +WMSP = Enjoy your massage! +WMXE = Max & The Magic Marker +WN9E = Military Madness: Nectaris WN9J = Military Madness: Nectaris +WN9P = Military Madness: Nectaris +WNEE = Penguins & Friends Hey! That's My Fish! +WNEP = Penguins & Friends Hey! That’s my Fish! WNVJ = Neves Plus: Pantheon of Tangrams WNVP = Neves Plus: Pantheon of Tangrams +WOBE = Art Style: ORBIENT WOBP = Art Style: Orbient +WOTP = Overturn: Mecha Wars +WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising WP4E = Aprender con los PooYoos Episodio 3 WP4P = Aprender con los PooYoos Episodio 3 WPJP = Pucca Misión Besos -WPVP = The Tales of Bearsworth Manor - Chaotic Conflicts +WPKE = Texas Hold'Em Poker +WPKP = Texas Hold'Em Poker +WPQE = Protöthea +WPQP = Protöthea +WPRE = Art Style: Cubello +WPRP = Art Style: CUBELLO +WPUE = Bust-A-Move Plus! +WPVE = The Tales of Bearsworth Manor: Chaotic Conflicts +WPZE = Bruiser & Scratch WR9J = Mega Man 9 WREP = Racers' Islands Crazy Arenas -WRJP = Racers' Islands - Crazy Racers -WRLE = FAST - Racing League -WRLP = FAST - Racing League +WRIE = Rainbow Islands: Towering Adventure! +WRIP = Rainbow Islands: Towering Adventure! +WRRE = Robin Hood: The Return of Richard WRRP = Robin Hood: The Return of Richard +WRSE = Step Up +WRUE = BIT.TRIP RUNNER +WRUP = Bit.Trip Runner WRXJ = Mega Man 10 +WS3E = Silver Star: Chess +WS6E = Silver Star: Reversi +WS7E = Fantasy Slots: Adventure Slots and Games +WSGE = Pop 'Em Drop 'Em Samegame WSGJ = Pop Them, Drop Them SAMEGAME +WSGP = Pop Them, Drop Them SAMEGAME +WSHE = Stonekeep: Bones of the Ancestors +WSJE = Spot The Differences! WSJP = ¡Descubra las Diferencias! WSMP = Eat! Fat! Fight! +WSNE = Sonic The Hedgehog 4 Episode I +WSNP = Sonic The Hedgehog 4 Episode I +WSUE = Shootanto: Evolutionary Mayhem +WSUP = Shootanto: Evolutionary Mayhem +WT2E = Target Toss: Pro Bags +WT3E = Tomena Sanner +WTEE = Tales of Elastic Boy: Mission 1 +WTEP = Tales of Elastic Boy Mission 1 +WTFE = Bit.Trip: Flux +WTFP = Bit.Trip Flux +WTIE = Tiki Towers +WTME = Adventure Island: The Beginning WTMP = Adventure Island The Beginning +WTRE = Bit.Trip Beat +WTRP = Bit.Trip Beat WTWP = Fenimore Fillmore The Westerner +WTXE = Texas Hold’em Tournament +WTXP = Texas Hold’em Tournament WU2P = Éxito en primaria Matemáticas curso 2º WU3P = Éxito en primaria Matemáticas curso 3º WU4P = Éxito en primaria Matemáticas curso 4º +WUFE = Drop Zone: Under Fire WUIP = Éxito en primaria Matemáticas curso 1º +WVBE = Bit.Trip: Void +WVBP = Bit.Trip Void +WVCE = V.I.P. Casino: Blackjack +WVOP = Rock'n Roll Climber WVSE = Gods vs Humans WVSP = Gods vs Humans -WVUP = Mister Bumblebee Racing Champion WW2P = ¿Dónde está Wally? Viaje Fantástico 2 WW3P = ¿Dónde está Wally? Viaje Fantástico 3 +WWAE = Warmen Tactics WWIP = ¿Dónde está Wally? Viaje Fantástico 1 +WWRE = Excitebike: World Rally +WWRP = Excitebike: World Challenge +WWXE = Paper Wars: Cannon Fodder +WWXP = Paper Wars Cannon Fodder WXBE = Ben 10 Alien Force The Rise of Hex +WXBP = Ben 10: Alien Force - The Rise of Hex +WXPE = Paint Splash! +WXRE = Reel Fishing Ocean Challenge +WYIE = escapeVektor: Chapter 1 +WYIP = escapeVektor: Chapter 1 +WYSE = Yard Sale Hidden Treasures: Sunnyville WYSP = Yard Sale Hidden Treasures: Sunnyville +WZIE = Rubik's Puzzle Galaxy RUSH +WZIP = Rubik's Puzzle Galaxy: RUSH WZPJ = Zombie Panic in Wonderland -WZZP = The Tales of Bearsworth Manor - Puzzling Pages +WZZE = The Tales of Bearsworth Manor: Puzzling Pages XH5E = Ayim And Yet It Moves Demo XIBP = Fish em All Demo XICE = Gods vs Humans Demo @@ -848,16 +1178,217 @@ XJEP = Aya and the Cubes of Light Demo XJGE = Gnomz Demo XJHE = Paint Splash Demo XJIE = 2 Fast 4 Gnomz Demo +FA9E = Zelda II: The Adventure of Link +FA9P = Zelda II: The Adventure of Link FABE = Donkey Kong Jr +FB2L = Super Mario Bros.: The Lost Levels +FB2N = Super Mario Bros.: The Lost Levels +FBIE = Punch Out!! Featuring Mr. Dream +FBKP = Teenage Mutant Ninja Turles +FC8E = Castlevania II: Simon's Quest +FC8P = Castlevania II: Simon's Quest +FCQE = Ninja Gaiden II: The Dark Sword of Chaos +FCSP = Probotector II: Return of the Evil Forces +FCYE = Yoshi’s Cookie +FDGP = Ghosts'n Goblins +FDLE = Ninja Gaiden III: The Ancient Ship of Doom +FDRP = Skate or Die +FECE = Skykid +FEML = Bio Miracle Bokutte UPA +FEMN = Bio Miracle Bokutte UPA +FEQE = Castlevania III: Dracula's Curse +FEQP = Castlevania III Dracula's Curse +FERE = Zoda’s Revenge: StarTropics II +FERM = Startropics II: Zoda's Revenge +FF5E = Double Dragon II: The Revenge +FF5P = Double Dragon II: The Revenge +FFDE = Crash 'N The Boys Street Challenge +FFEE = A Boy and His Blob: Trouble on Blobolonia +FFEP = A Boy and His Blob: Trouble on Blobolonia +FFPB = Ufouria: The Saga +FFPP = Ufouria: THE SAGA +FFUP = Adventure Island 2 +FFVM = S.C.A.T.: Special Cybernetic Attack Team +FFXJ = 25th Anniversary SUPER MARIO BROS. +JA4P = Super Ghouls'n Ghosts +JABL = Mario’s Super Picross +JADD = The Legend of Zelda: A Link to the Past +JADE = The Legend of Zelda: A Link to the Past +JADF = The Legend of Zelda: A Link to the Past +JADP = The Legend of Zelda: A Link to the Past +JAFD = SimCity +JAFP = SimCity +JAHE = R-Type III: The 3rd Lightning +JAHP = R-TYPE III: The Third Lightning +JAJE = Street Fighter II: The World Warrior +JAJP = Street Fighter II: The World Warrior +JALE = Contra III: The Alien Wars +JALP = Super Probotector: Alien Rebels +JAWE = Romance of the Three Kingdoms IV: Wall of Fire +JAZD = The Legend of the Mystical Ninja +JAZE = The Legend of The Mystical Ninja +JAZP = The Legend of the Mystical Ninja +JBBE = Super Street Fighter II: The New Challengers +JBBP = Super Street Fighter II: The New Challengers +JBDD = Donkey Kong Country 2: Diddy's Kong-Quest +JBDE = Donkey Kong Country 2: Diddy's Kong Quest +JBDP = Donkey Kong Country 2: Diddy's Kong-Quest +JBIE = Street Fighter II Turbo: Hyper Fighting +JBIP = Street Fighter II Turbo: Hyper Fighting +JBPE = Donkey Kong Country 3: Dixie Kong's Double Trouble +JBPP = Donkey Kong Country 3: Dixie Kong’s Double Trouble +JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure +JCAN = DoReMi Fantasy: Milon's DokiDoki Adventure +JCBE = Super Mario RPG: Legend of the Seven Stars +JCBM = Super Mario RPG: Legend of the Seven Stars +JCCP = Kirby’s Fun Pak +JCDM = Kirby’s Dream Land 3 +JCJP = Super Punch Out!! +JCKE = Space Invaders: The Original Game +JCKP = Space Invaders -The Original Game- +JCTE = Ogre Battle: The March of the Black Queen +JCTM = Ogre Battle: The March of the Black Queen +JCYE = Uncharted Waters: New Horizons +JCZE = Genghis Khan II: Clan of the Gray Wolf +JD3E = Super E.D.F. Earth Defense Force +JD3P = SUPER E.D.F.: Earth Defense Force +JD8E = Super Adventure Island II +JDJE = Super Star Wars: The Empire Strikes Back +JDJP = Super Star Wars: The Empire Strikes Back JDLE = Super Return of the Jedi +JDLP = Super Star Wars: Return of the Jedi +JDWE = Aero the Acrobat +JDWP = Aero The Acrobat +JDZD = Mystic Quest Legend​ +JDZF = Mystic Quest Legend​ +JDZP = Mystic Quest Legend​ +NACE = The Legend of Zelda: Ocarina of Time +NACP = The Legend of Zelda: Ocarina of Time NAJ8 = The Legend of Zelda: Ocarina of Time (traducido al español) -NARP = The Legend of Zelda : Majora's Mask +NAJN = Sin and Punishment +NAKS = Pokémon Snap +NAME = Kirby 64: The Crystal Shards +NAMP = Kirby 64: The Crystal Shards +NAND = Pokémon Puzzle League +NAOE = 1080° Snowboarding +NAOP = 1080°: TenEighty Snowboarding +NARE = The Legend of Zelda: Majora's Mask +NARP = The Legend of Zelda: Majora's Mask +NAYE = Ogre Battle 64: Person of Lordly Caliber +NAYM = Ogre Battle 64: Person of Lordly Caliber +LAFN = Secret Commando +LAGE = Sonic the Hedgehog +LAJE = Sonic the Hedgehog 2 LALE = Fantasy Zone II -EA5P = Fatal Fury 3 : Road To The Final Victory -E6PP = Ninja Gaiden -E6VE = Zaxxon +LALP = Fantasy Zone II +LANE = Alex Kidd: The Lost Stars +LANP = Alex Kidd: The Lost Stars +LAPE = Wonder Boy III: The Dragon's Trap +LAPP = Wonder Boy III: The Dragon's Trap +MA8E = Ecco: The Tides of Time +MA8P = Ecco: The Tides of Time +MAHE = Sonic the Hedgehog +MAHP = Sonic the Hedgehog +MAJE = Toe Jam & Earl +MAKE = Shadow Dancer: The Secret of Shinobi +MAKP = Shadow Dancer: The Secret of Shinobi +MALE = Bonanza Bros. +MALP = Bonanza Bros. +MAME = Sword of Vermillion +MAOE = Bio-Hazard Battle +MAOP = Bio-Hazard Battle +MAVP = Wonder Boy In Monster World +MAXP = Alex Kidd In The Enchanted Castle +MB6E = Shining Force II +MB6P = Shining Force II +MBBE = Sonic the Hedgehog 2 +MBBP = Sonic the Hedgehog 2 +MBFE = Shinobi III: Return of the Ninja Master +MBFP = Shinobi III: Return of the Ninja master +MBIE = Landstalker: The Treasures of King Nole +MBIP = Landstalker: The Treasures of King Nole +MBJE = Ghouls'n Ghosts +MBJP = Ghouls'n Ghosts +MBLP = ESWAT City Under Siege +MBME = Sonic the Hedgehog 3 +MBMP = Sonic the Hedgehog 3 +MBUE = Sonic 3D: Blast +MBUP = Sonic 3D: Flickies' Island +MBWE = Columns III: Revenge of Columns +MBWM = Columns III: Revenge of Columns +MC3E = Super Street Fighter II: The New Challengers +MC3P = Super Street Fighter II: The New Challengers +MCCE = Phantasy Star III +MCCP = Phantasy Star III: Generations of Doom +MCHM = MUSHA +MCLE = Street Fighter II': Special Champion Edition +MCLP = Street Fighter II’: Special Champion Edition +MCQE = Boogerman: A Pick and Flick Adventure +MCQP = Boogerman - A Pick and Flick Adventure +MCRE = Wolf of the Battlefield: MERCS +MCRP = Wolf of the Battlefield: MERCS +MCSN = Wonder Boy III: Monster Lair +MCSP = Wonder Boy III: Monster Lair +MCVE = Pitfall: The Mayan Adventure +MCVP = Pitfall: The Mayan Adventure +MCZE = Shanghai II: Dragon's Eye +MCZP = Shanghai II Dragon's Eye +PAAP = Bomberman'93 +PAGL = Bomberman'94 +PARL = Detana Twin Bee +PARN = Detana Twin Bee +PAWP = Galaga'90 +PBEP = Motoroader +PBIE = Bonk 3: Bonk's Big Adventure +PBIP = Bonk III: Bonk's Big Adventure +PBSE = Chew Man Fu +PBSP = Chew Man Fu +PBWE = Air “Zonk” +PBWP = Air 'Zonk' +PCSL = Digital Champ: Battle Boxing +PDJL = Street Fighter II': Champion Edition +PDJN = Street Fighter II: Champion Edition +QA3E = SimEarth: The Living Planet +QA3P = SimEarth: The Living Planet +QAAE = Super Air Zonk +QAAP = Super Air Zonk +QABE = Ys Book I & II +QABP = Ys Book I & II +QADL = Gradius II: Gofer no Yabou +QADN = Gradius II Gofer No Yabou +QAPL = Castlevania: Rondo of Blood +QAPN = Castlevania Rondo of Blood +EA5E = Fatal Fury 3: Road to the Final Victory +EA5P = Fatal Fury 3: Road To The Final Victory +EA7E = Samurai Shodown IV: Amakusa's Revenge +EA7P = Samurai Shodown IV: Amakusa's Revenge +EA8M = Iron Clad +EAIE = Top Hunter +EAIP = Top Hunter +EASE = Samurai Shodown 2 +EBBE = Fighters History Dynamite +EBDP = Magical Drop 3 +EBFP = Spin master +EBQE = Ninja Master's +EBSE = The Path of the Warrior: Art of Fighting 3 +EBSP = The Path of the Warrior: Art of Fighting 3 +ECAE = Real Bout Fatal Fury 2: The Newcomers +ECAP = Real Bout Fatal Fury 2: The Newcomers +ECGE = Shock Troopers: 2nd Squad +ECGP = Shock Troopers: 2nd Squad +E54P = GHOSTS'N GOBLINS +E55E = Commando +E55P = Commando +E57P = SonSon +E6ZE = Starforce +C93E = Last Ninja 2 +C93P = The Last Ninja 2 +C96P = Summer Games 2 +C9IE = Cybernoid +C9IP = Cybernoid +C9PP = The Last Ninja 3 HAAA = Canal Fotos -HABA = Canal Tienda +HABA = Canal Tienda Wii HACA = Canal Mii HACK = Canal Mii HADE = Canal internet @@ -866,6 +1397,7 @@ HADP = Canal Internet HAFE = Canal Tiempo HAFJ = Canal Tiempo HAFP = Canal Tiempo +HAGA = Canal Noticias HAGE = Canal Noticias HAGJ = Canal Noticias HAGP = Canal Noticias @@ -874,20 +1406,32 @@ HAJP = Canal Opiniones HAPE = Canal Miirame HAPP = Canal Concursos Mii HATE = Canal Nintendo +HATP = Canal Nintendo +HAVP = Canal La fortuna te sonríe +HAWE = Metroid Prime 3 Preview +HAWP = Metroid Prime 3 Preview HAYA = Canal Fotos -HCJP = Canal BBC iPlayer -JODI = Canal Homebrew -LULZ = Canal Homebrew -OHBC = Canal Homebrew +HCAJ = Band Bros. DX Speaker Channel +HCAP = Jam with the Band Live +HCFE = Canal Wii Speak +HCFP = Canal Wii Speak +HCRE = The Legend of Zelda: Skyward Sword - Canal de actualización de datos de guardado +HCRP = The Legend of Zelda: Skyward Sword - Canal de actualización de datos de guardado +RMCE = Canal Mario Kart +RMCP = Canal Mario Kart D64A = Wii64 DGPA = Genesis Plus GX DMAA = SDL Mame DNGA = NeoGamma +DNUA = Rosquilla Wii DOOA = WiiDoom DSDA = SuperDump 1.3 -DSVA = ScummVM +JODI = Canal Homebrew +LULZ = Canal Homebrew +OHBC = Canal Homebrew G3AS69 = El Señor de los Anillos: La Tercera Edad G3DX6L = Carmen Sandiego: El secreto de los tambores robados +G3FS69 = TimeSplitters: Futuro Perfecto G4MP69 = Los Sims: Toman La Calle G8MP01 = Paper Mario: La Puerta Milenaria G9TP52 = El Espantatiburones @@ -896,7 +1440,8 @@ GCBP7D = Crash Bandicoot: La Venganza de Cortex GCIP69 = Los Sims GDDP41 = Disney Pato Donald Cu@c Att@k?*! GENS69 = 007: Todo o Nada -GF4S52 = Los Cuatro Fantásticos™ and ©2005 +GF4S52 = Los 4 Fantásticos +GFSP69 = Mundial FIFA 2002 GH4S69 = Harry Potter y el Cáliz de Fuego GHBP7D = El Hobbit GHLZ69 = Harry Potter y la Piedra Filosofal @@ -911,9 +1456,14 @@ GLHPG9 = Ratónpolis GLNP69 = Looney Tunes: De Nuevo En Accion GLOS69 = El Señor de los Anillos: Las Dos Torres GNES78 = Buscando a Nemo -GOYS69 = GoldenEye : Agente Corrupto +GOYS69 = GoldenEye: Agente Corrupto GPQP6L = Las Supernenas: Arrasando las Salsas GPXP01 = Pokémon Box: Rubí y Zafiro +GQQD78 = Bob Esponja: ¡Luces, Cámara, Esponja! +GQQE78 = Bob Esponja: ¡Luces, Cámara, Esponja! +GQQF78 = Bob Esponja: ¡Luces, Cámara, Esponja! +GQQH78 = Bob Esponja: ¡Luces, Cámara, Esponja! +GQQP78 = Bob Esponja: ¡Luces, Cámara, Esponja! GQWX69 = Harry Potter: Quidditch Copa del Mundo GR9P6L = El Imperio del Fuego GSXS64 = Star Wars: Las Guerras Clon diff --git a/Data/Sys/wiitdb-fr.txt b/Data/Sys/wiitdb-fr.txt index f363420e7eac..8a359b9a0bb6 100644 --- a/Data/Sys/wiitdb-fr.txt +++ b/Data/Sys/wiitdb-fr.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: FR_unique version: 20191106234238) +TITLES = https://www.gametdb.com (type: Wii language: FR_unique version: 20230727194148) R22J01 = FlingSmash R23P52 = Barbie et les Trois Mousquetaires R25PWR = LEGO Harry Potter : Années 1 à 4 @@ -28,13 +28,11 @@ R3YP70 = Sam & Max : Saison 2 : Au-Delà du Temps et de l'Espace R42P69 = Les Sims 2 : Naufragés R43P69 = EA Sports Active R48P7D = Les Chroniques De Spiderwick -R49P01 = Donkey Kong : Jungle Beat R4BPGT = Baby Foot R4EP01 = Endless Ocean 2 : Aventuriers des Fonds Marins R4PP69 = Les Sims 2 : Animaux & Cie R4ZJ01 = Project Zero 4 - Mask of the Lunar Eclipse R54FMR = Des Chiffres & des Lettres -R55F41 = Qui Veut Gagner Des Millions : 1ère Edition R55P41 = Qui Veut Gagner Des Millions : 1ère Edition R57FMR = Questions pour un champion : Le jeu officiel R5AP8P = À la Croisée des Mondes : La Boussole d'Or @@ -48,6 +46,7 @@ R5TP69 = Grand Chelem Tennis R5UP41 = Les Experts: Préméditation R5VP41 = James Cameron's Avatar : The Game R5VX41 = James Cameron's Avatar : The Game +R5XJ13 = MySims Agents R5YD78 = All Star Pom Pom Girl 2 R5YP78 = All Star Pom Pom Girl 2 R62P4Q = Disney Sing It : Pop Hits @@ -81,7 +80,6 @@ R8RP41 = Arthur et la Vengeance de Maltazard R8SP41 = Vacances Sports Party R8UXMR = Adibou et les saisons magiques R8VP41 = Planète Nature : Au Secours des Animaux Sauvages -R92P01 = Nouvelle Façon de Jouer ! Pikmin 2 R94PMR = Total Dérapage R94XMR = Total Dérapage : Prêts pour le Grand Frisson ? R9BPMT = Bob le bricoleur : On s'amuse comme des fous @@ -93,6 +91,7 @@ R9IP01 = Nouvelle Façon de Jouer ! Pikmin R9JP69 = The Beatles : Rock Band R9LP41 = Girls Life: Pyjama Party R9SPPL = Sudoku Ball : Detective +RAAE01 = Disque Startup du Wii RB4P08 = Resident Evil 4 : Wii Edition RB4X08 = Resident Evil 4 : Wii Edition RB5P41 = Brothers in Arms : Earned in Blood @@ -199,7 +198,6 @@ RH3P4Q = High School Musical 3 Dance! Nos Années Lycée RH5PKM = Horse Life : Amis pour la vie RH6P69 = Harry Potter et le Prince de Sang-Mêlé RH8P4F = Tomb Raider : Underworld -RH8X4F = Tomb Raider : Underworld RHCP52 = The History Channel : Battle for the Pacific RHGP6Z = Agent Hugo : Lemoon Twist RHKP18 = Job Island @@ -226,9 +224,8 @@ RIHP8P = L'Incroyable Hulk RIJP69 = G.I. JOE : Le réveil du Cobra RINP08 = Dead Rising : Chop Till You Drop RIOPSU = Horribles Histoires : les Redoutables Romains -RIPPAF = One Piece Unlimited Cruise 1 : Le Trésor sous les Flots RITFMR = Intervilles : Le Jeu Officiel -RIUPAF = One Piece - Unlimited Cruise 2 : L'Eveil d'un Héros +RIUPAF = One Piece: Unlimited Cruise 2: L'Eveil d'un Héros RJ2P52 = 007 : Quantum of Solace RJ4PRM = Naissance de Rome : Sur les Traces de César RJ7FWP = Télé 7 Jeux : Mots Fléchés @@ -270,7 +267,6 @@ RLNFMR = Koh-Lanta RLNHMR = Koh-Lanta RLNIMR = Koh-Lanta RLRP4F = Tomb Raider : Anniversary -RLTPNR = London Taxi : Rush Hour RLTXUG = London Taxi : Rush Hour RLUP4Q = Volt : Star Malgré Lui RLUX4Q = Volt : Star Malgré Lui @@ -306,7 +302,6 @@ RNPP69 = Need for Speed : ProStreet RNPX69 = Need for Speed : ProStreet RNSF69 = Need for Speed : Carbon RNSP69 = Need for Speed : Carbon -RNSX69 = Need for Speed : Carbon RNXPDA = Naruto : Clash of Ninja Revolution European Version RO7P7D = The Legend of Spyro : The Eternal Night RO8P7D = La Légende de Spyro : La Naissance d'un Dragon @@ -319,7 +314,7 @@ ROLP8P = Mario & Sonic aux Jeux Olympiques d'Hiver RONPG9 = Onechanbara : Bikini Zombie Slayers ROPP41 = Les Rebelles de la Fôret ROTP7J = Twin Strike : Operation Thunder -ROUPAF = One Piece - Unlimited Cruise 1 : Le Trésor sous les Flots +ROUPAF = One Piece: Unlimited Cruise 1: Le Trésor sous les Flots ROVE6U = Playmobil Circus : Tous en Piste ROVPHM = Playmobil Circus: Tous en Piste ROYP41 = Tempête de boulettes géantes : Le Jeu Vidéo @@ -410,7 +405,7 @@ RTNP41 = Tenchu : Shadow Assassins RTUFKM = Secret Files : Tunguska RTUPKM = Secret Files : Tunguska RTVP64 = Thrillville : Le parc en folie -RTYP01 = Wii Echecs +RTYP01 = Wii Échecs RTZE08 = Zack & Wiki : Le Trésor de Barbaros RTZJ08 = Zack & Wiki : Le Trésor de Barbaros RTZP08 = Zack & Wiki : Le Trésor de Barbaros @@ -501,7 +496,6 @@ RY2P41 = Rayman Contre les Lapins Encore plus Crétins RY3P41 = Rayman Prod' présente : The Lapins Crétins Show RYBP69 = Boom Blox : Smash Party RYDP6V = Pet Pals: Vétérinaire -RYGP99 = Rygar : The Battle of Argus RYJPTV = Princesse Lillifee : La fée magique RYKEAF = Family Ski & Snowboard RYWP01 = Cérébrale Académie @@ -534,12 +528,14 @@ S6BP4Q = Rebelle S6BX4Q = Rebelle S6IP78 = Disney Princesse: Livres Enchantés S6RP52 = Les Mondes de Ralph +S72J01 = Hoshi no Kirby: 20th Anniversary Edition S7APWR = LEGO Batman 2 : DC Super Heroes S7BP69 = Trivial Pursuit Casual S7EP52 = Transformers : Édition Ultime Combat S7FPGT = Zumba Kids : La fête ultime pour les enfants S7SP41 = Les schtroumpfs Party Pack SA3P5G = Alvin et Les Chipmunks 3 +SA3XGT = Alvin et Les Chipmunks 3 SALE4Q = Alice au Pays des Merveilles SALP4Q = Alice au Pays des Merveilles SAOP78 = Monster High: Lycée d'Enfer @@ -580,6 +576,7 @@ SF5P41 = Mon Coach Personnel : Club Fitness SFGP69 = Hasbro : Best of des Jeux en Famille Vol. 4 SFIP01 = Mystery Case Files : L'Affaire Malgrave SFQP8P = Captain America : Super Soldier +SFWP69 = Coupe du Monde de la FIFA, Afrique du Sud 2010 SFWX69 = Coupe du Monde de la FIFA, Afrique du Sud 2010 SFWY69 = Coupe du Monde de la FIFA SG8PAF = Yogi l'Ours: Le Jeu Vidéo @@ -596,6 +593,7 @@ SHMPLR = Lucas la Cata SHVP78 = Hot Wheels SIAP52 = L'Âge de glace 4 : La dérive des continents - Jeux de l'Arctique SIIP8P = Mario & Sonic aux Jeux Olympiques de Londres 2012 +SILP78 = Worms : Battle Islands SINPNG = We Sing : Robbie Williams SJ2PWR = Scooby-Doo! Panique dans la Marmite SJ9P41 = Just Dance 2 : Extra Songs @@ -624,7 +622,6 @@ SNBP41 = NCIS: Adapté de la série TV SNHP69 = Need for Speed SNUPJW = Happy Neuron Academy - Testez Votre Q.I. SNYPVZ = Monster High : 13 souhaits -SOMP01 = Beat the Beat : Rhythm Paradise SONFMR = Mon Premier Karaoké SOSPAF = Turbo : Équipe de Cascadeurs SOUP01 = The Legend of Zelda : Skyward Sword @@ -676,6 +673,7 @@ SVDP52 = Bob l'éponge : La vengeance robotique de Plankton SVHP69 = FIFA 14 - Édition Essentielle SVHX69 = FIFA 14 - Édition Essentielle SVMP01 = Super Mario All-Stars +SVQEVZ = Barbie et ses soeurs : La grande aventure des chiots SVQPVZ = Barbie et ses soeurs : La grande aventure des chiots SVVPAF = Les Croods : Fête Préhistorique ! SXAP52 = Guitar Hero : World Tour @@ -683,56 +681,105 @@ SXBP52 = Guitar Hero : Metallica SXCP52 = Guitar Hero : Greatest Hits SXDP52 = Guitar Hero : Van Halen SXIP52 = Guitar Hero : Warriors of Rock +GMSE02 = Super Mario Sunshine Multijoueur R4ZP01 = Project Zero 4 - Mask of the Lunar Eclipse +RMCE88 = Le Mario Kare Deluxa por jatras +RMCJ91 = Wiimms Mario Kart Fun 2021-09 Reservé +RMCK91 = Wiimms Mario Kart Fun 2021-09 Reservé +RMCP91 = Wiimms Mario Kart Fun 2021-09 Réservé +RMCPCA = Mario Kart Wii (traduction en catalan) SBOD3Q = StarSing : Chansons Magiques de Disney v1.1 SILP4Q = SingItStar Latino +SNBE66 = Nouveau Super Mario Bros. Wii Apocalypse W2CP = Cérébral Challenge W2FP = Entrainement d'équilibre Physiofun +W2GD = Phoenix Wright Ace Attorney: Justice for All (Deutsche Version) +W2GF = Phoenix Wright: Ace Attorney: Justice for All W2GP = Phoenix Wright Ace Attorney : Justice for All W2MP = Blaster Master Overdrive W2PP = Programme de rééducation du périnée Physiofun +W3GD = Phoenix Wright Ace Attorney 3: Trials And Tribulations +W3GF = Phoenix Wright: Ace Attorney: Trials and Tribulations W3GP = Phoenix Wright Ace Attorney : Trials and Tribulations W3KE = Thruspace W3KP = Thruspace W3MP = Les Trois Mousquetaires : Tous pour un! W44P = Stop Stress : A Day of Fury W4AP = Arcade Sports : Air Hockey, Bowling, Pool, Snooker +W6BP = Eco-Shooter: Plant 530 +W72P = Successfully Learning German Year 3 +W73P = Successfully Learning German Year 4 +W74P = Successfully Learning German Year 5 +W7IP = Successfully Learning German Year 2 +W8CP = Bit.Trip Core W8WP = Happy Holidays Halloween +W9BP = Big Town Shoot W9RP = Happy Holidays Christmas WA4P = WarioWare : Do It Yourself - Showcase WA7P = Toribash - La violence perfectionnée WA8P = ArtStyle: Penta Tentacles +WAEP = Around the world +WAFP = Airport Mania: First Flight +WAHP = Trenches: Generals WALP = Art Style : light trax +WAOP = The Very Hungry Caterpillar´s ABC WB2P = Strong Bad Episode 4 : Dangeresque 3 WB3P = Strong Bad Episode 5 : 8-bit is Enough WBEP = Beer Pong : Frat Party Games +WBFP = Bit.Trip Fate +WBGP = Bang Attack +WBPP = PLÄTTCHEN - twist 'n' paint WBRP = Pirates : The Key of Dreams +WBXP = Strong Bad Episode 1: Homestar Ruiner WBYP = Strong Bad Episode 2 : Strong Badia - The Free WBZP = Strong Bad Episode 3 : Baddest of the Bands +WCHP = Chess Challenge WCJP = Cocoto : Platform Jumper +WCKP = chick chick BOOM WCSP = CueSports : Snooker vs Billiards WD9P = Castlevania : The Adventure ReBirth +WDEP = Magic Destiny Astrological Games +WDFP = Defend your Castle WDHP = ArtStyle : ROTOHEX WDMP = Dr. Mario & Bactericide +WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) +WEMP = Aha! I Got It! Escape Game WETP = Jeux de plateau en images : La chasse au trésor WF2P = Final Fantasy Crystal Chronicles : My Life as a Darklord +WF3E = Family Games - Pen & Paper Edition WF4P = Final Fantasy IV : Les Années Suivantes WFCP = Final Fantasy Crystal Chronicles : My Life as a King +WFQP = Frogger: Hyper Arcade Edition +WFTP = Fish'em All! +WFVP = Football Up WFWP = Flowerworks : Follie's Adventure WFXP = Feu de Bois Chaleureux +WFYP = Family Games Pen & Paper Edition +WGDP = Gradius Rebirth WGFP = Girlfriends Forever Magic Skate +WGGP = Gabrielle's Ghostly Groove: Monster Mix WGPP = Zenquaria L'aquarium Virtuel +WGSE = Phoenix Wright: Ace Attorney +WGSF = Phoenix Wright: Ace Attorney (French Version) +WGSP = Phoenix Wright: Ace Attorney WHEE = Heracles : Chariot Racing WHEP = Heracles : Chariot Racing +WHFP = Heavy Fire: Special Operations WHRP = Heron : Steam Machine WHUP = Ghost Party WHWP = HoopWorld : BasketBrawl WICP = NyxQuest : Kindred Spirits WIDP = Dracula : Undead Awakening WIEP = Tales of Monkey Island Chapter 3 : Lair of the Leviathan +WILP = Tales of Monkey Island Chapter 1: Launch of the Screaming Narwhal +WIRP = Tales of Monkey Island Chapter 5: Rise Of The Pirate God WISP = Tales of Monkey Island Chapter 2 : The Siege of Spinner Cay +WITP = Aha! I Found It! Hidden Object Game WIYP = Tales of Monkey Island Chapter 4 : The Trial and Execution of Guybrush Threepwood WJKP = Les Gardiens du Joyau : l'Île de l'Est +WKBP = You, Me and the Cubes +WKFP = Kung Fu Funk: Everybody Is Kung Fu Fighting +WKKP = Pop-Up Pirates! WKRP = Karate Phants : Gloves of Glory WKWP = Les aventures de l'ile perdue jeu d'objets cachés WLEE = Apprends avec les PooYoos: Episode 1 @@ -740,38 +787,76 @@ WLEP = Apprends avec les PooYoos: Episode 1 WLNE = Apprends avec les PooYoos: Episode 2 WLNP = Apprends avec les PooYoos: Episode 2 WLOP = LostWinds : Winter of the Melodias +WLZP = lilt line +WM7E = Anima Ark of Sinners +WM7P = Anima Ark of Sinners WMBP = MaBoShi : l'arcade des trois formes +WMCP = Monsteca Corral: Monsters Vs. Robots +WMJP = Dive: The Medes Islands Secret +WMSP = Enjoy your massage! WMWP = Le monde de Miffy WMWX = Le monde de Miffy +WN9E = Military Madness: Nectaris WN9P = Military Madness : Nectaris +WNEE = Penguins & Friends Hey! That's My Fish! +WNEP = Penguins & Friends Hey! That’s my Fish! WNVP = Neves Plus +WOBE = Art Style: ORBIENT WOBP = Art Style : ORBIENT WOTP = Overturn : Mecha Wars +WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising WP4E = Apprends avec les Pooyoos Episode 3 WP4P = Apprends avec les Pooyoos Episode 3 WPJP = Pucca Mission Bisous +WPKP = Texas Hold'Em Poker +WPQP = Protöthea +WPRE = Art Style: Cubello WPRP = Art Style : CUBELLO -WPVP = The Tales of Bearsworth Manor - Chaotic Conflicts +WPVE = The Tales of Bearsworth Manor: Chaotic Conflicts WR2E = Labo Lapins Crétins WR2P = Labo Lapins Crétins WR9P = Megaman 9 WRDP = Mot Cache +WREP = Racers Islands Crazy Arenas WRFE = Reel Fishing Challenge 2 WRFP = Reel Fishing Challenge 2 WRIP = Rainbow Islands : Towering Adventure! +WRJP = Racers Islands - Crazy Racers +WRLP = FAST Racing League WRRP = Robin Hood : Le Retour de Richard +WRUP = Bit.Trip Runner WRXP = Megaman 10 +WSGP = Pop Them, Drop Them SAMEGAME WSJP = Trouvez les Differences! +WSNP = Sonic The Hedgehog 4 Episode I +WSUE = Shootanto: Evolutionary Mayhem WSUP = Shootanto : Evolutionary Mayhem +WTEP = Tales of Elastic Boy Mission 1 +WTFP = Bit.Trip Flux WTMP = Adventure Island The Beginning +WTRE = Bit.Trip Beat WTRP = Bit.Trip : Beat WTWP = Fenimore Fillmore The Westerner +WTXP = Texas Hold’em Tournament +WU2P = Successfully Learning Mathematics Year 3 +WU3P = Successfully Learning Mathematics Year 4 +WU4P = Successfully Learning Mathematics Year 5 WUIP = Succès au primaire : Power maths +WVBP = Bit.Trip Void +WVOP = Rock'n Roll Climber +WVSP = Gods Vs Humans +WVUP = Mr Bumblebee Racing Champion +WW2P = Where's Wally? Fantastic Journey 2 +WW3P = Where's Wally? Fantastic Journey 3 WWIP = Où est Charlie ? Voyage Fantastique 1 +WWRP = Excitebike: World Challenge +WWXP = Paper Wars Cannon Fodder WXBE = Ben 10 Alien Force The Rise of Hex WXBP = Ben 10 Alien Force The Rise of Hex +WYIP = escapeVektor: Chapter 1 +WYSP = Yard Sale Hidden Treasures Sunnyville WZIP = Rubik's Puzzle Galaxy : RUSH -WZZP = The Tales of Bearsworth Manor - Puzzling Pages +WZZE = The Tales of Bearsworth Manor: Puzzling Pages XIBP = Fish em All Demo XICP = Gods vs Humans Demo XIDP = Racers Islands Crazy Racers Demo @@ -790,60 +875,163 @@ XIZP = 3D Pixel Racing Demo XJEP = Aya and the Cubes of Light Demo FA9P = Zelda II : The Adventure of Link FB2L = Super Mario Bros. : The Lost Levels +FBKP = Teenage Mutant Ninja Turles FC8P = Castlevania II : Simon's Quest FCSP = Probotector II : Return of the Evil Forces +FCYP = Yoshi’s Cookie +FDGP = Ghosts'n Goblins +FDRP = Skate or Die +FEML = Bio Miracle Bokutte UPA +FEQP = Castlevania III Dracula's Curse +FERM = Startropics II: Zoda's Revenge +FF5E = Double Dragon II: The Revenge +FF5P = Double Dragon II: The Revenge +FFEE = A Boy and His Blob: Trouble on Blobolonia FFEP = A Boy and His Blob : Trouble on Blobolonia +FFPB = Ufouria: The Saga +FFPP = Ufouria: THE SAGA +FFUP = Adventure Island 2 +FFVM = S.C.A.T.: Special Cybernetic Attack Team +JA4P = Super Ghouls'n Ghosts +JABL = Mario’s Super Picross JADD = The Legend of Zelda : A Link to the Past JADE = The Legend of Zelda : A Link to the Past JADF = The Legend of Zelda : A Link to the Past JADP = The Legend of Zelda : A Link to the Past +JAFF = SimCity +JAFP = SimCity JAHP = R-TYPE III : The Third Lightning JAJP = Street Fighter II : The World Warrior JALP = Super Probotector : Alien Rebels +JAZP = The Legend of the Mystical Ninja JBBP = Super Street Fighter II : The New Challengers JBDP = Donkey Kong Country 2 : Diddy's Kong-Quest JBIP = Street Fighter II Turbo : Hyper Fighting JBPP = Donkey Kong Country 3 : Dixie Kong’s Double Trouble +JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure JCBM = Super Mario RPG : Legend of the Seven Stars +JCCP = Kirby’s Fun Pak +JCDM = Kirby’s Dream Land 3 +JCJP = Super Punch Out!! +JCKP = Space Invaders -The Original Game- JCTM = Ogre Battle : The March of the Black Queen JD3P = SUPER E.D.F. : Earth Defense Force JDJP = Super Star Wars : The Empire Strikes Back JDLP = Super Star Wars : Return of the Jedi +JDWE = Aero the Acrobat +JDWP = Aero The Acrobat +JDZF = Mystic Quest Legend​ NACP = The Legend of Zelda : Ocarina of Time +NAJN = Sin and Punishment +NAKS = Pokémon Snap NAME = Kirby 64 : The Crystal Shards NAMP = Kirby 64 : The Crystal Shards +NAND = Pokémon Puzzle League +NAOP = 1080°: TenEighty Snowboarding NARP = The Legend of Zelda : Majora's Mask +NAYE = Ogre Battle 64: Person of Lordly Caliber +NAYM = Ogre Battle 64: Person of Lordly Caliber +LALP = Fantasy Zone II +LANP = Alex Kidd: The Lost Stars +LAPP = Wonder Boy III: The Dragon's Trap +MA8P = Ecco: The Tides of Time +MAHE = Sonic the Hedgehog +MAHP = Sonic the Hedgehog MAKP = Shadow Dancer : The Secret of Shinobi +MALP = Bonanza Bros. +MAOP = Bio-Hazard Battle MARP = La Légende de Thor -MB6P = Shining Force II +MAVP = Wonder Boy In Monster World +MAXP = Alex Kidd In The Enchanted Castle +MBBP = Sonic the Hedgehog 2 +MBFP = Shinobi III: Return of the Ninja master MBIP = Landstalker : Le Trésor du Roi Nole +MBJE = Ghouls'n Ghosts +MBJP = Ghouls'n Ghosts +MBLP = ESWAT City Under Siege +MBMP = Sonic the Hedgehog 3 +MBUP = Sonic 3D: Flickies' Island +MBWM = Columns III: Revenge of Columns +MC3P = Super Street Fighter II: The New Challengers +MCCP = Phantasy Star III: Generations of Doom MCHM = MUSHA : Metallic Uniframe Super Hybrid Armor +MCLP = Street Fighter II’: Special Champion Edition +MCQP = Boogerman - A Pick and Flick Adventure +MCRP = Wolf of the Battlefield: MERCS +MCSP = Wonder Boy III: Monster Lair +MCVP = Pitfall: The Mayan Adventure +MCZP = Shanghai II Dragon's Eye +PAAP = Bomberman'93 +PAGL = Bomberman'94 +PARL = Detana Twin Bee PAWP = Galaga'88 PB3P = Devil Crash +PBEP = Motoroader PBIP = Bonk III : Bonk's Big Adventure +PBSP = Chew Man Fu +PBWP = Air 'Zonk' PC2P = Taito Chase H.Q. PCSL = Digital Champ : Battle Boxing +PDJL = Street Fighter II': Champion Edition QA3P = SimEarth : The Living Planet +QAAP = Super Air Zonk +QABP = Ys Book I & II QADL = Gradius II : Gofer no Yabou +QAPL = Castlevania: Rondo of Blood +QAPN = Castlevania Rondo of Blood QAPP = Castlevania : Rondo of Blood +EA5E = Fatal Fury 3: Road to the Final Victory EA5P = Fatal Fury 3 : Road To The Final Victory +EA7P = Samurai Shodown IV: Amakusa's Revenge +EA8M = Iron Clad +EAIE = Top Hunter +EAIP = Top Hunter +EASE = Samurai Shodown 2 +EBDP = Magical Drop 3 +EBFP = Spin master +EBSP = The Path of the Warrior: Art of Fighting 3 +ECAP = Real Bout Fatal Fury 2: The Newcomers +ECGP = Shock Troopers: 2nd Squad +E54P = GHOSTS'N GOBLINS +E55P = Commando +E57P = SonSon +E6PP = NINJA GAIDEN +C93P = The Last Ninja 2 +C96P = Summer Games 2 +C9IP = Cybernoid HAAA = Chaîne Photos -HABA = Chaîne Boutique +HABA = Chaîne boutique Wii HACA = Chaîne Mii HACK = Chaîne Mii HADE = Chaîne Internet HADP = Chaîne Internet -HAFP = Chaîne Météo +HAFA = Chaîne météo +HAFP = Chaîne météo +HAGA = Chaîne infos HAGE = Chaîne infos -HAGP = Chaîne Infos -HAJP = Chaîne Votes -HAPP = Chaîne Concours Mii +HAGJ = Chaîne infos +HAGP = Chaîne infos +HAJP = Chaîne votes +HAPE = Chaîne Regardez-Mii +HAPP = Chaîne concours Mii HATP = Chaîne Nintendo -HAYA = Chaîne Photos +HAVP = Chaîne jour de chance +HAWP = Metroid Prime 3 Preview +HAYA = Chaîne photos +HAYK = Chaîne Photo +HCAP = Jam with the Band Live +HCFE = Chaîne Wii Speak HCFP = Chaîne Wii Speak HCMP = Chaîne Kirby TV +HCRE = The Legend of Zelda: Skyward Sword - Chaîne mise à jour des données +HCRP = The Legend of Zelda: Skyward Sword - Chaîne mise à jour des données +RMCE = Chaîne Mario Kart +RMCP = Chaîne Mario Kart +DNUA = Donut Wii +OHBC = Chaîne Homebrew +RMCX = Chaîne Mario Kart Wii CTGP Revolution G2FF78 = Tak 2: Le Sceptre des Rêves -G3AF69 = Le Seigneur des Anneaux : Le Tiers Âge +G3AF69 = Le Seigneur des Anneaux: Le Tiers Âge G3DP6L = Carmen Sandiego : Le Secret des Tam-Tams Volés G3MP41 = La Somme de toutes les Peurs G3XP52 = X-Men: Le Jeu Officiel @@ -854,19 +1042,21 @@ G4ZP69 = Les Sims 2 G5DP78 = Scooby-Doo! : Démasqué G6FF69 = Coupe du Monde de la FIFA 2006 G8MP01 = Paper Mario: La Porte Millénaire +G9TF52 = Gang de Requins GAVY78 = Avatar : Le Dernier Maître de l'Air GAZF69 = Harry Potter et le Prisonnier d'Azkaban -GC3F78 = Scooby-Doo! : Le Livre des Ténèbres -GCBP7D = Crash Bandicoot : La Vengeance de Cortex +GC3F78 = Scooby-Doo! Le Livre des Ténèbres +GCBP7D = Crash Bandicoot: La Vengeance de Cortex GCGP41 = Charlie's Angels: Les Anges se Déchaînent GCIP69 = Les Sims GCOF52 = Call of Duty : Le Jour De Gloire GCQF7D = Buffy contre les Vampires : Chaos Bleeds GDDP41 = Donald Cou@k Att@k?*! -GDOP41 = Disney's Donald Qui est PK ? +GDOP41 = Disney's Donald Qui est PK? GENF69 = James Bond 007: Quitte ou Double GF4F52 = Les 4 Fantastiques -GFAF69 = FIFA Football 2003 +GFHP6V = Un Voisin d'Enfer! +GFSF69 = Coupe du Monde FIFA 2002 GGVX78 = Bob l'Eponge : Le Film GH2P69 = Need for Speed : Poursuite Infernale 2 GH4F69 = Harry Potter et la Coupe de Feu @@ -877,27 +1067,28 @@ GHSY69 = Harry Potter et la Chambre des Secrets GHVP08 = Disney Cache-Cache Furtif GIAP7D = L'Age de Glace 2 GICF78 = Les Indestructibles +GIHF78 = Scooby-Doo! La Nuit des 100 Frissons GIHP78 = Scooby-Doo! : La Nuit des 100 Frissons GIQX78 = Les Indestructibles: La Terrible Attaque du Démolisseur -GJUF78 = Tak et le Pouvoir de Juju +GJUF78 = Tak & Le Pouvoir de Juju GKBPAF = Baten Kaitos : Les Ailes éternelles et l'Océan perdu GKJF78 = Cars: Quatre Roues -GKLF69 = Le Seigneur des Anneaux : Le Retour du Roi +GKLF69 = Le Seigneur des Anneaux: Le Retour du Roi GKMP41 = Prince of Persia: Les Deux Royaumes GL5X4F = Lego Star Wars : Le Jeu Vidéo GL7P64 = Lego Star Wars II: La Trilogie Originale -GLCF52 = Les Desastreuses Aventures des Orphelins Baudelaire +GLCF52 = Les Désastreuses Aventures des Orphelins Baudelaire: D'Apres Lemony Snicket GLGP41 = Largo Winch : Aller Simple pour les Balkans GLHPG9 = Souris City GLNP69 = Les Looney Tunes Passent à l'Action -GLOF69 = Le Seigneur des Anneaux : Les Deux Tours +GLOF69 = Le Seigneur des Anneaux: Les Deux Tours GLVF4Q = Le Monde de Narnia: Le Lion, la Sorcière et l'Armoire Magique GLZF69 = 007 : Bons Baisers de Russie GMFF69 = Medal of Honor : En Première Ligne GMNP78 = Monstres & Cie : Crazy Balls -GMWF52 = Minority Report: Le futur vous rattrape -GNEF78 = Le Monde De Némo -GONF69 = Medal of Honor : Les Faucons de Guerre +GMWF52 = Minority Report: Le Futur vous Rattrape +GNEF78 = Le Monde de Némo +GONF69 = Medal of Honor: Les Faucons de Guerre GOSP41 = Les Rebelles de la Forêt GOYF69 = GoldenEye : Au service du Mal GP3P78 = Le Pole Express @@ -909,20 +1100,25 @@ GQ4F78 = Bob L'éponge: La Créature du Crabe Croustillant GQFFFK = Franklin: Un anniversaire surprise GQLP54 = Dora l'Exploratrice: Voyage sur la Planète Violette GQPP78 = Bob l'Eponge: Bataille pour Bikini Bottom -GQQF78 = Bob L'éponge : Silence on tourne! +GQQD78 = Bob L'éponge: Silence on tourne! +GQQE78 = Bob L'éponge: Silence on tourne! +GQQF78 = Bob L'éponge: Silence on tourne! +GQQH78 = Bob L'éponge: Silence on tourne! +GQQP78 = Bob L'éponge: Silence on tourne! GQWX69 = Harry Potter: Coupe du Monde de Quidditch GR2P52 = Les Royaumes Perdus II -GR8F69 = Medal of Honor : Soleil Levant +GR8F69 = Medal of Honor: Soleil Levant GR9P6L = Le Règne Du Feu GRNP52 = Les Royaumes Perdus -GRUF78 = Power Rangers : Dino Tonnerre +GRRF78 = Les Razmoket: La Rançon Royale +GRUF78 = Power Rangers: Dino Tonnerre GSKP7D = Le Roi Scorpion : L'Ascension de l'Akkadien GTYP69 = Ty: Le Tigre de Tasmanie GU2F78 = 2 Games in 1: Les Indestructibles / Le Monde de Nemo GU3X78 = 2 Games in 1: Bob L'éponge le Film / Tak 2 Le Sceptre des Rêves GUBP69 = Les Urbz: Les Sims in the City -GVLF69 = Marvel Nemesis : L'Avenement des Imparfaits -GW7F69 = James bond 007 dans Espion pour Cible +GVLF69 = Marvel Nemesis: L'Avenement des Imparfaits +GW7F69 = James Bond 007 dans Espion pour Cible GWHP41 = Winnie l'Ourson: à la Recherche des Souvenirs Oubliés GWLX6L = Wallace & Gromit dans Le Project Zoo GWVX52 = X-Men 2 : La Vengeance de Wolverine diff --git a/Data/Sys/wiitdb-it.txt b/Data/Sys/wiitdb-it.txt index 3e064fd38722..92a041b28c23 100644 --- a/Data/Sys/wiitdb-it.txt +++ b/Data/Sys/wiitdb-it.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: IT_unique version: 20191106234245) +TITLES = https://www.gametdb.com (type: Wii language: IT_unique version: 20230727194156) R23P52 = Barbie e le Tre Moschettiere R25PWR = LEGO Harry Potter: Anni 1-4 R2AP7D = L'Era Glaciale 2: Il Disgelo @@ -91,8 +91,7 @@ RIHP8P = L'Incredibile Hulk RIJP69 = G.I. Joe: La nascita dei Cobra RINP08 = Dead Rising: Salme di Fine Stagione RIOPSU = Brutte Storie: I Rivoltanti Romani -RIPPAF = One Piece Unlimited Cruise 1 - The Treasure Beneath the Waves -RIUPAF = One Piece Unlimited Cruise 2: Il Risveglio di un Eroe +RIUPAF = One Piece: Unlimited Cruise 2: Il Risveglio di un Eroe RJ8E64 = Indiana Jones e il Bastone dei Re RJ8P64 = Indiana Jones e il Bastone dei Re RJAX52 = Call of Duty: Modern Warfare - Edizione Reflex @@ -107,7 +106,7 @@ RLBPWR = LEGO Batman: Il Videogioco RLFP64 = Star Wars The Clone Wars: L'era dei duelli RLGP64 = LEGO Star Wars: La Saga Completa RLIP64 = LEGO Indiana Jones: Le Avventure Originali -RLLP70 = Go West!: Un'Avventura di Lucky Luke +RLLP70 = Go West! Un'Avventura di Lucky Luke RLNFMR = L'Isola dei Famosi RLNHMR = L'Isola dei Famosi RLNIMR = L'Isola dei Famosi @@ -133,7 +132,7 @@ RO8X7D = The Legend of Spyro: L'Alba del Drago ROEPGT = Hotel Bau ROLP8P = Mario & Sonic ai Giochi Olimpici Invernali ROPP41 = Boog & Elliot a Caccia Di Amici -ROUPAF = One Piece Unlimited Cruise 1: Il Tesoro Sommerso +ROUPAF = One Piece: Unlimited Cruise 1: Il Tesoro Sommerso ROYP41 = Piovono Polpette: Il Videogioco ROYX41 = Piovono Polpette RP2P69 = Le So Tutte! @@ -253,6 +252,7 @@ S75P69 = Monopoly S7FPGT = Zumba Kids: Che la festa abbia inizio, con Zumba! S7SP41 = I Puffi Party Pack SA3P5G = Alvin Superstar 3: Si Salvi Chi Può +SA3XGT = Alvin Superstar 3: Si Salvi Chi Può SALP4Q = Alice nel Paese delle Meraviglie SAOP78 = Monster High: Scuola da Paura SAOXVZ = Monster High: Scuola da Paura @@ -342,8 +342,9 @@ SU7PAF = Le 5 Leggende SUUP78 = uDraw Studio: E sei subito artista! SV3PAF = Madagascar 3: Ricercati in Europa SV7PVZ = I Pinguini di Madagascar -SVDP52 = SpongeBob: La Vendetta Robotica de Plankton +SVDP52 = SpongeBob: La Vendetta Robotica di Plankton SVMP01 = Super Mario All-Stars: Edizione per il 25° anniversario +SVQEVZ = Barbie e le sue sorelle: Salvataggio Cuccioli SVQPVZ = Barbie e le sue sorelle: Salvataggio Cuccioli SVVPAF = I Croods: Festa Preistorica! SXAP52 = Guitar Hero 4: World Tour @@ -351,29 +352,155 @@ SXIP52 = Guitar Hero 6: Warriors of Rock CGIE52 = Guitar Hero III Custom: Iron Maiden CLAPSI = SingItStar Clásicos DMSP4Q = Sing It Star e la Magia Disney +G01E01 = Super Smash Bros. Melee: Remix SD MILPSI = SingItStar Miliki R15POH = SingItStar Radio 105 RGGE52 = Guitar Hero III Custom: Rock The Games +RMCPCA = Mario Kart Wii (traduzione in catalano) RSJESD = Guitar Hero III Custom: System Of A Down S02PES = SingItStar 90's SILP4Q = Sing It: Latino SP9P4Q = SingItStar POP 2009 WFFF4I = Fatal Frame 4: La Maschera dell'eclissi lunare W2CP = Brain Challenge L'Allena-Mente +W2FP = Physiofun - Balance Training +W2GD = Phoenix Wright Ace Attorney: Justice for All (Deutsche Version) +W2GI = Phoenix Wright: Ace Attorney: Justice for All +W2GP = Phoenix Wright Ace Attorney: Justice for All +W2MP = Blaster Master: Overdrive +W2PP = Physiofun: Pelvic Floor Training +W3GI = Phoenix Wright: Ace Attorney: Trials and Tribulations +W3KP = ThruSpace: High Velocity 3D Puzzle W3MP = I Tre Moschettieri Uno per tutti! +W44P = Stop Stress: A Day of Fury +W4AP = Arcade Sports: Air Hockey, Bowling, Pool, Snooker W6BP = 530 ECO SHOOTER +W72P = Successfully Learning German Year 3 +W73P = Successfully Learning German Year 4 +W74P = Successfully Learning German Year 5 +W7IP = Successfully Learning German Year 2 +W8CP = Bit.Trip Core W8WP = Happy Holidays Halloween +W9BP = Big Town Shoot W9RP = Happy Holidays Christmas +WA4P = WarioWare: Do It Yourself - Showcase +WA7P = Toribash Violence Perfected +WA8P = Art Style: Penta Tentacles +WAEP = Around the world +WAFP = Airport Mania: First Flight +WAHP = Trenches: Generals +WALP = Art Style: light trax +WAOP = The Very Hungry Caterpillar´s ABC +WB2P = Strong Bad Episode 4: Dangeresque 3 +WB3P = Strong Bad Episode 5: 8-bit is Enough +WBEP = Beer Pong: Frat Party Games +WBFP = Bit.Trip Fate +WBGP = Bang Attack +WBPP = PLÄTTCHEN - twist 'n' paint +WBRP = Pirates: The Key of Dreams +WBXP = Strong Bad Episode 1: Homestar Ruiner +WBYP = Strong Bad Episode 2: Strong Badia - The Free +WBZP = Strong Bad Episode 3: Baddest of the Bands +WCHP = Chess Challenge +WCJP = Cocoto: Platform Jumper +WCKP = chick chick BOOM +WCSP = CueSports: Snooker vs Billiards +WDEP = Magic Destiny Astrological Games +WDFP = Defend your Castle +WDHP = Art Style: ROTOHEX WDMP = Dr. Mario & Sterminavirus +WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) +WEMP = Aha! I Got It! Escape Game WETP = Giochi da tavolo animati: Un'avventura pop-up! +WF2P = Final Fantasy Crystal Chronicles: My Life as a Darklord +WF4P = Final Fantasy IV: The After Years +WFCP = Final Fantasy Crystal Chronicles: My Life as a King +WFQP = Frogger: Hyper Arcade Edition +WFTP = Fish'em All! +WFVP = Football Up +WFWP = Flowerworks: Follie's Adventure +WGFP = Girlfriends Forever: Magic Skate +WGGP = Gabrielle's Ghostly Groove: Monster Mix WGPP = Zenquaria™: Acquario virtuale +WGSF = Phoenix Wright: Ace Attorney (French Version) +WGSI = Phoenix Wright: Ace Attorney +WGSP = Phoenix Wright: Ace Attorney +WHEP = Heracles: Chariot Racing +WHFP = Heavy Fire: Special Operations +WHRP = Heron: Steam Machine WHUP = Fantasma Party +WHWP = HoopWorld: BasketBrawl +WICP = NyxQuest: Kindred Spirits +WIDP = Dracula: Undead Awakening +WIEP = Tales of Monkey Island Chapter 3: Lair of the Leviathan +WILP = Tales of Monkey Island Chapter 1: Launch of the Screaming Narwhal +WIRP = Tales of Monkey Island Chapter 5: Rise Of The Pirate God +WISP = Tales of Monkey Island Chapter 2: The Siege of Spinner Cay +WITP = Aha! I Found It! Hidden Object Game +WIYP = Tales of Monkey Island Chapter 4: The Trial and Execution of Guybrush Threepwood +WJKP = Jewel Keepers: Easter Island +WKBP = You, Me and the Cubes +WKFP = Kung Fu Funk: Everybody Is Kung Fu Fighting +WKKP = Pop-Up Pirates! +WKRP = Karate Phants: Gloves of Glory +WKWP = Adventure on LOST ISLAND: Hidden Object Game WLEE = Impara con i PooYoo: Episodio 1 WLEP = Impara con i PooYoo: Episodio 1 WLNE = Impara con i PooYoo: Episodio 2 WLNP = Impara con i PooYoo: Episodio 2 +WLOP = LostWinds: Winter of the Melodias +WLZP = lilt line +WM7P = Anima Ark of Sinners WMBP = MaBoShi: L'arcade delle tre forme +WMCP = Monsteca Corral: Monsters Vs. Robots +WMJP = Dive: The Medes Islands Secret +WMSP = Enjoy your massage! +WN9E = Military Madness: Nectaris +WN9P = Military Madness: Nectaris +WNEE = Penguins & Friends Hey! That's My Fish! +WNEP = Penguins & Friends Hey! That’s my Fish! +WNVP = Neves Plus: Phantheon of Tangrams +WOBP = Art Style: ORBIENT +WOTP = Overturn: Mecha Wars +WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising +WP4P = Learning with the PooYoos: Episode 3 +WPKP = Texas Hold'Em Poker +WPQP = Protöthea +WPRP = Art Style: CUBELLO +WPVP = The Tales of Bearsworth Manor: Chaotic Conflicts +WREP = Racers Islands Crazy Arenas +WRIP = Rainbow Islands: Towering Adventure! +WRJP = Racers Islands - Crazy Racers +WRLP = FAST Racing League +WRRP = Robin Hood: The Return Of Richard +WRUP = Bit.Trip Runner +WSGP = Pop Them, Drop Them SAMEGAME +WSNP = Sonic The Hedgehog 4 Episode I +WSUP = Shootanto: Evolutionary Mayhem +WTEP = Tales of Elastic Boy Mission 1 +WTFP = Bit.Trip Flux WTMP = ADVENTURE ISLAND The Beginning +WTRP = Bit.Trip Beat +WTWP = Fenimore Fillmore: The Westerner +WTXP = Texas Hold’em Tournament +WU2P = Successfully Learning Mathematics Year 3 +WU3P = Successfully Learning Mathematics Year 4 +WU4P = Successfully Learning Mathematics Year 5 +WUIP = Successfully Learning Mathematics Year 2 +WVBP = Bit.Trip Void +WVOP = Rock'n Roll Climber +WVSP = Gods Vs Humans +WVUP = Mr Bumblebee Racing Champion +WW2P = Where's Wally? Fantastic Journey 2 +WW3P = Where's Wally? Fantastic Journey 3 +WWIP = Where's Wally? Fantastic Journey 1 +WWRP = Excitebike: World Challenge +WWXP = Paper Wars Cannon Fodder +WXBP = Ben 10: Alien Force - The Rise of Hex +WYIP = escapeVektor: Chapter 1 +WYSP = Yard Sale Hidden Treasures Sunnyville +WZIP = Rubik's Puzzle Galaxy: RUSH +WZZP = The Tales of Bearsworth Manor: Puzzling Pages XIBP = Fish em All Demo XICP = Gods vs Humans Demo XIDP = Racers Islands Crazy Racers Demo @@ -390,35 +517,147 @@ XIUP = Soccer Bashi Demo XIVP = Mix Superstar Demo XIZP = 3D Pixel Racing Demo XJEP = Aya and the Cubes of Light Demo +FA9P = Zelda II: The Adventure of Link +FB2L = Super Mario Bros.: The Lost Levels +FBKP = Teenage Mutant Ninja Turles +FC8P = Castlevania II: Simon's Quest +FCSP = Probotector II: Return of the Evil Forces +FDGP = Ghosts'n Goblins +FDRP = Skate or Die +FEML = Bio Miracle Bokutte UPA +FEQP = Castlevania III Dracula's Curse FERM = Zoda's Revenge: StarTropics II -FFVM = S.C.A.T. +FF5P = Double Dragon II: The Revenge +FFEP = A Boy and His Blob: Trouble on Blobolonia +FFPP = Ufouria: THE SAGA +FFUP = Adventure Island 2 FFWP = Donkey Kong: Edizione Originale FFXP = Super Mario Brothers: Edizione Esclusiva per il 25° Anniversario -JCCP = Kirby's Fun Pak +JA4P = Super Ghouls'n Ghosts +JABL = Mario’s Super Picross +JADP = The Legend of Zelda: A Link to the Past +JAFP = SimCity +JAHP = R-TYPE III: The Third Lightning +JAJP = Street Fighter II: The World Warrior +JALP = Super Probotector: Alien Rebels +JAZP = The Legend of the Mystical Ninja +JBBP = Super Street Fighter II: The New Challengers +JBDP = Donkey Kong Country 2: Diddy's Kong-Quest +JBIP = Street Fighter II Turbo: Hyper Fighting +JBPP = Donkey Kong Country 3: Dixie Kong’s Double Trouble +JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure +JCBM = Super Mario RPG: Legend of the Seven Stars +JCDM = Kirby’s Dream Land 3 +JCJP = Super Punch Out!! +JCKP = Space Invaders -The Original Game- +JCTM = Ogre Battle: The March of the Black Queen +JD3P = SUPER E.D.F.: Earth Defense Force +JDJP = Super Star Wars: The Empire Strikes Back +JDLP = Super Star Wars: Return of the Jedi +JDWP = Aero The Acrobat +JDZP = Mystic Quest Legend​ JECM = CHRONO TRIGGER +NACP = The Legend of Zelda: Ocarina of Time +NAKS = Pokémon Snap +NAMP = Kirby 64: The Crystal Shards +NAOP = 1080°: TenEighty Snowboarding +NARP = The Legend of Zelda: Majora's Mask +NAYM = Ogre Battle 64: Person of Lordly Caliber +LALP = Fantasy Zone II +LANP = Alex Kidd: The Lost Stars +LAPP = Wonder Boy III: The Dragon's Trap +MA8P = Ecco: The Tides of Time +MAHP = Sonic the Hedgehog +MAKP = Shadow Dancer: The Secret of Shinobi +MALP = Bonanza Bros. +MAOP = Bio-Hazard Battle +MAVP = Wonder Boy In Monster World +MAXP = Alex Kidd In The Enchanted Castle +MB6P = Shining Force II +MBBP = Sonic the Hedgehog 2 +MBFP = Shinobi III: Return of the Ninja master +MBIP = Landstalker: The Treasures of King Nole +MBJP = Ghouls'n Ghosts +MBLP = ESWAT City Under Siege +MBMP = Sonic the Hedgehog 3 +MBUP = Sonic 3D: Flickies' Island +MBWM = Columns III: Revenge of Columns +MC3P = Super Street Fighter II: The New Challengers +MCCP = Phantasy Star III: Generations of Doom +MCHM = MUSHA +MCLP = Street Fighter II’: Special Champion Edition +MCQP = Boogerman - A Pick and Flick Adventure +MCRP = Wolf of the Battlefield: MERCS +MCSP = Wonder Boy III: Monster Lair +MCVP = Pitfall: The Mayan Adventure +MCZP = Shanghai II Dragon's Eye +PAAP = Bomberman'93 +PAGL = Bomberman'94 +PARL = Detana Twin Bee +PAWP = Galaga'90 +PBEP = Motoroader +PBIP = Bonk III: Bonk's Big Adventure +PBSP = Chew Man Fu +PBWP = Air 'Zonk' PCSL = DIGITAL CHAMP Battle Boxing +PDJL = Street Fighter II': Champion Edition +QA3P = SimEarth: The Living Planet +QAAP = Super Air Zonk +QABP = Ys Book I & II +QADL = Gradius II: Gofer no Yabou QAPL = CASTLEVANIA RONDO OF BLOOD QAPP = CASTLEVANIA RONDO OF BLOOD SP4V = CASTLEVANIA RONDO OF BLOOD +EA5P = Fatal Fury 3: Road To The Final Victory +EA7P = Samurai Shodown IV: Amakusa's Revenge +EA8M = Iron Clad +EAIP = Top Hunter +EBDP = Magical Drop 3 +EBFP = Spin master +EBSP = The Path of the Warrior: Art of Fighting 3 +ECAP = Real Bout Fatal Fury 2: The Newcomers +ECGP = Shock Troopers: 2nd Squad +E54P = GHOSTS'N GOBLINS E55P = Wolf of the Battlefield: Commando +E57P = SonSon +E6PP = NINJA GAIDEN +C93P = The Last Ninja 2 +C96P = Summer Games 2 +C9IP = Cybernoid HAAA = Canale Foto +HABA = Canale Wii Shop +HACA = Canale Mii +HADE = Canale Internet HADP = Canale Internet HAFP = Canale Meteo +HAGA = Canale Notizie HAGE = Canale Notizie +HAGJ = Canale Notizie HAGP = Canale Notizie +HAJP = Canale Vota Anche Tu +HAPP = Canale Concorsi Mii +HATP = Canale Nintendo +HAVP = Canal La fortuna ti sorride +HAWP = Metroid Prime 3 Preview HAYA = Canale Foto +HCFE = Canale Wii Speak +HCFP = Canale Wii Speak +HCMP = Canale TV Kirby +HCRE = The Legend of Zelda: Skyward Sword - Canale Aggrioornamento dati di +HCRP = The Legend of Zelda: Skyward Sword - Canale Aggrioornamento dati di +RMCP = Canale Mario Kart JODI = Canale Homebrew LULZ = Canale Homebrew OHBC = Canale Homebrew -G01E01 = Super Smash Bros. Melee: Remix SD G4MP69 = The Sims: Fuori Tutti G8MP01 = Paper Mario: Il Portale Millenario -GAZI69 = Harry Potter e il prigioniero di Azkaban +GAZI69 = Harry Potter e il Prigioniero di Azkaban GCBP7D = Crash Bandicoot: L'ira di Cortex GCOP52 = Call of Duty: L'Ora Degli Eroi GDDP41 = Paperino: Oper@zione P@pero ?*! GDOP41 = Disney's Donald Chi è PK? -GF4I52 = I fantastici 4 +GF4I52 = I Fantastici 4 +GFSP69 = Mondiali FIFA 2002 GH4I69 = Harry Potter e il Calice di Fuoco GHBP7D = Lo Hobbit GHLZ69 = Harry Potter e la Pietra Filosofale @@ -430,11 +669,17 @@ GKMP41 = Prince of Persia: I Due Troni GLCP52 = Lemony Snicket Una serie di sfortunati eventi GLHPG9 = Giù Per il Tubo GLOI69 = Il Signore degli Anelli: Le Due Torri +GNEP78 = Alla ricerca di Nemo GOSX41 = Boog & Elliot GPXP01 = Pokémon Box: Rubino e Zaffiro +GQQD78 = SpongeBob: Ciak si gira! +GQQE78 = SpongeBob: Ciak si gira! +GQQF78 = SpongeBob: Ciak si gira! +GQQH78 = SpongeBob: Ciak si gira! +GQQP78 = SpongeBob: Ciak si gira! GQWX69 = Harry Potter: La Coppa del Mundo di Quidditch GR9P6L = Il Regno del Fuoco -GSXI64 = Star Wars - La Guerra dei Cloni +GSXI64 = Star Wars: La Guerra dei Cloni GTYP69 = Ty la Tigre della Tasmania GVLP69 = Marvel Nemesis: L'Ascesa degli Esseri Imperfetti GWHP41 = Winnie the Pooh e le Pance Brontolanti diff --git a/Data/Sys/wiitdb-ja.txt b/Data/Sys/wiitdb-ja.txt index db4ea09d55c4..e5458b55e3a9 100644 --- a/Data/Sys/wiitdb-ja.txt +++ b/Data/Sys/wiitdb-ja.txt @@ -1,6 +1,6 @@ -TITLES = https://www.gametdb.com (type: Wii language: JA_unique version: 20191106234252) +TITLES = https://www.gametdb.com (type: Wii language: JA_unique version: 20230727194203) D2AJAF = みんなで冒険!ファミリートレーナー 体験版 -DCHJAF = WE CHEER +DCHJAF = WE CHEER: おはスタプロデュース! 限定コラボゲームディスク DHHJ8J = 平野綾 Premiumムービーディスク from 涼宮ハルヒの激動 DK6J18 = コロリンパ2 -アンソニーと黃金のひまわりのタネ- DQAJK2 = アクエリアスベースボール 〜限界の、その先へ〜 @@ -14,7 +14,7 @@ R2JJAF = 太鼓の達人Wii R2LJMS = Hula Wii フラで始める 美と健康!! R2PJ9B = スイングゴルフ パンヤ 2ndショット! R2QJC0 = クッキングママ2 たいへん!ママは おおいそがし!! -R2SJ18 = デカスポルタ2 +R2SJ18 = Deca Sporta 2: Wiiでスポーツ"10"種目! R2UJ8P = レッツタップ R2VJ01 = 罪と罰 宇宙の後継者 R2WJA4 = ウイニングイレブン プレーメーカー 2009 @@ -28,7 +28,7 @@ R3OJ01 = メトロイド アザーエム R3PJ52 = スピード・レーサー R3TJG9 = トップスピン3 R3UJGD = おやこであそぼ ミッフィーのおもちゃばこ -R43J13 = パーソナルトレーナーWii30日生活改善プログラム +R43J13 = EA Sports アクティブ パーソナルトレーナー: Wii30日生活改善プログラム R44J8P = 涼宮ハルヒの並列 R46JKB = ファントム・ブレイブWii R49J01 = Wiiであそぶ ドンキーコングジャングルビート @@ -69,7 +69,7 @@ R8DJA4 = 遊戯王ファイブディーズ デュエルトランサー R8EJQC = アースシーカー R8FJHA = 匠レストランは大繁盛! R8GJC8 = ジーワンジョッキー Wii 2008 -R8NJG0 = バッティング レボリューション +R8NJG0 = 日本野球機構承認 - バッティング レボリューション R8PJ01 = スーパーペーパーマリオ R92J01 = Wiiであそぶ ピクミン2 R96JAF = 風のクロノア -door to phantomile- @@ -95,7 +95,7 @@ RC5JDQ = お掃除戦隊くりーんきーぱー RCAJ78 = カーズ RCCJC0 = クッキングママ みんなといっしょにお料理大会 RCDE52 = コール オブ デューティ3 -RCHJAF = WE CHEER ~ウィーチア~ +RCHJAF = WE CHEER RCOJ99 = 名探偵コナン -追憶の幻想- RCPJ18 = コロリンパ RCQJDA = チョロQ Wii @@ -107,7 +107,7 @@ RDBJAF = ドラゴンボールZ Sparking! NEO RDDJA4 = ダンスダンスレボリューション ホッテストパーティー RDEJ0A = 全国デコトラ祭り RDGJA4 = 悪魔城ドラキュラ ジャッジメント -RDIJG2 = THE DOG ISLAND -ひとつの花の物語- +RDIJG2 = Artlist Collection: The Dog Island ~ひとつの花の物語~ RDKJ01 = ドンキーコング たるジェットレース RDMJ8N = Go!Go!ミノン RDOJ41 = わんこと魔法のぼうし @@ -117,7 +117,7 @@ RDSJAF = ドラゴンボールZ Sparking! METEOR RDTJAF = たまごっちのピカピカだいとーりょー! RDUJDQ = スゴロクロニクル 〜右手に剣を左手にサイコロを〜 RDWJG9 = ドラゴンブレイド -RDXJ18 = デカスポルタ +RDXJ18 = Deca Sporta: Wiiでスポーツ"10"種目! RDZJ01 = ディザスター デイ オブ クライシス RE4J08 = バイオハザード RE8J99 = 家庭教師ヒットマンREBORN! 禁斷の闇のデルタ @@ -151,13 +151,13 @@ RFUJA4 = 麻雀格闘倶楽部Wii Wi-Fi対応 RG2JJF = ギルティギア イグゼクス アクセントコア RG4JC0 = 電車でGO! 新幹線EX 山陽新幹線編 RGCJJF = プチコプターWii アドベンチャーフライト -RGEJJ9 = ザ ワールド オブ ゴールデンエッグス +RGEJJ9 = ザ ワールド オブ ゴールデンエッグス: ノリノリリズム系 RGGJAF = ゲゲゲの鬼太郎 妖怪大運動会 RGHJ52 = ギターヒーロー3 レジェンド オブ ロック RGIJC8 = ジーワンジョッキーWii RGNJAF = 銀魂 万事屋ちゅ〜ぶ ツッコマブル動画 -RGOJJ9 = ザ・ワールド・オブ・ゴールデンエッグス日産NOTE版 -RGPJAF = パチスロ「機動戦士ガンダムII 〜哀・戦士編〜」 +RGOJJ9 = ザ ワールド オブ ゴールデンエッグス: ノリノリリズム系 - Nissan Note オリジナルバージョン +RGPJAF = アニメスロットレボリューション パチスロ機動戦士ガンダムII ~哀・戦士編~ RGSJ8P = ゴースト・スカッド RGTJBL = ジーティー プロ シリーズ RGVJ52 = ギターヒーロー エアロスミス @@ -278,6 +278,7 @@ RQRJAF = スカイ・クロラ イノセン・テイセス RR3JA4 = ファミリーチャレンジWii RRBJ41 = ラビッツ・パーティー RRSJ4Q = ルイスと未来泥棒 ウィルバーの危険な時間旅行 +RRTE52 = 블록 파티! 20 게임들 RRUJJF = WINTER SPORTS 2009 - THE NEXT CHALLENGE RRWJAF = スーパーロボット大戦NEO RS3J52 = スパイダーマン3 @@ -307,7 +308,7 @@ RT3JEL = Rockstar Games presents Table Tennis RT4JAF = テイルズ オブ シンフォニア ラタトスクの騎士 RTDJES = 新・中華大仙 マイケルとメイメイの冒険 RTFJ52 = トランスフォーマー THE GAME -RTGJ18 = Wi-Fi対応 厳選テーブルゲームWii +RTGJ18 = 厳選テーブルゲーム Wii RTIJ8P = 珍スポーツ RTKJDQ = しゃるうぃ〜☆たころん RTLJ18 = めざせ!!釣りマスター -世界にチャレンジ編- @@ -315,6 +316,7 @@ RTNJCQ = 天誅4 RTOJ8P = 428 ~封鎖された渋谷で~ RTRJ18 = めざせ!!釣りマスター RTTJAF = たまごっちのフリフリ歌劇団 +RTYP01 = 通信対局 ワールドチェス RTZJ08 = 宝島Z バルバロスの秘宝 RUFJ99 = ルーンファクトリー フロンティア RUNJ0Q = NEW 右脳キッズWii @@ -365,7 +367,7 @@ RZ8JG9 = SIMPLE 2000シリーズWiiVol.1 THEテーブルゲーム RZ9JG9 = SIMPLE 2000シリーズWii Vol.2 THEパーティーゲーム RZDJ01 = ゼルダの伝説 トワイライトプリンセス RZJJ13 = デッドスペース エクストラクション -RZNJ01 = 斬撃のREGINLEIV +RZNJ01 = 斬撃のレギンレイヴ RZPJ01 = リンクのボウガントレーニング RZTJ01 = Wiiスポーツ リゾート RZTW01 = Wiiスポーツ リゾート @@ -376,7 +378,7 @@ S2AJAF = みんなで冒険!ファミリートレーナー S2LJ01 = ポケパーク2 ビヨンド・ザ・ワールド S2PJA4 = ウイニングイレブン プレーメーカー 2012 S2TJAF = 太鼓の達人Wii ドドーンと2代目! -S3DJ18 = デカスポルタ3 +S3DJ18 = Deca Sporta 3: Wiiでスポーツ S3HJ08 = 戦国BASARA3 宴 S3RJMS = トウィンクルクイーン S3SJ18 = カラオケJOYSOUND Wii SUPER DX @@ -384,7 +386,7 @@ S3TJAF = 太鼓の達人Wii みんなでパーティ☆3代目! S4MJGD = ドラゴンクエストX 目覚めし五つの種族 オンライン S4SJGD = ドラゴンクエストX 眠れる勇者と導きの盟友 オンライン S59JC8 = 戦国無双3 -S5KJAF = 太鼓の達人WII 超ごうか版 +S5KJAF = 太鼓の達人Wii 超ごうか版 S5QJC8 = 戦国無双3 猛将伝 S5SJHF = イナズマイレブンGO ストライカーズ 2013 S6TJGD = ドラゴンクエストX オールインワンパッケージ @@ -409,7 +411,7 @@ SD9JAF = SDガンダム ガシャポンウォーズ SDJJAF = SDガンダム Gジェネレーション ワールド SDQJGD = ドラゴンクエストX いにしえの竜の伝承 オンライン SDWJ18 = 影の塔 -SEAJ13 = パーソナルトレーナーWii6週間ひきしめプログラム +SEAJ13 = EA Sports アクティブ パーソナルトレーナー: Wii 6週間集中ひきしめプログラム SEKJ99 = イケニエノヨル SEMJ01 = ディズニー エピックミッキー ~ミッキーマウスと魔法の筆~ SEPE41 = ブラック・アイド・ピーズ・エクスペリエンス スペシャル・エディション @@ -498,69 +500,507 @@ SVMJ01 = スーパーマリオコレクション SW4JA4 = ウイニングイレブン プレーメーカー 2011 SX3J01 = パンドラの塔 君のもとへ帰るまで SX4J01 = ゼノブレイド -SX6JAF = プリキュア オールスターズ ぜんいんしゅうごう☆レッツダンス! +SX6JAF = プリキュア オールスターズ: ぜんいんしゅうごう☆レッツダンス! DBSBT3 = Dragon ball z SparkingMeteor DQAJSC = アクエリアスベースボール 限界の、その先へ +G2MK01 = メトロイドプライム2 ダークエコーズ +G4NEDA = カンタン操作で、超爽快忍者アクションが楽しめる! +G4SK01 = ゼルダの伝説 4つの剣+ +GBIK08 = バイオハザード +GCDK08 = バイオハザード コード:ベロニカ完全版 +GEAK8P = エターナルアルカディア レジェンド +GFEK01 = ファイアーエムブレム 蒼炎の軌跡 GGPE01 = マリオカート アーケードグランプリ GGPE02 = マリオカート アーケードグランプリ2 +GLMK01 = ルイージマンション +GM8K01 = メトロイドプライム +GMSE02 = Multiplayer Sunshine Super Mario +GMSK01 = スーパーマリオサンシャイン GVS32J = バーチャストライカー3 Ver.2002 (トライフォース) GVS45J = バーチャストライカー4 +GZ2K01 = ゼルダの伝説 トワイライトプリンセス +GZBEB2 = 金色のガッシュベル!! ゴー!ゴー!魔物ファイト!! +GZLK01 = ゼルダの伝説 風のタクト +R24E01 = Wiiであそぶ ちびロボ! +R7CE01 = キャプテン★レインボー +R8EEQC = アースシーカー R8FJSC = 匠レストランは大繁盛! +RMCEYP = ヨッシーレーシングリゾートプラス RMCJ12 = マリオカートWii カスタム(2011-11 Wiimm) +RMCJ86 = マリオカートクリス3,500CT +RMCJBR = マリオカート Brown +RMCJYP = ヨッシーレーシングリゾートプラス +RMCKYP = ヨッシーレーシングリゾートプラス +RMCPCA = マリオカートWii(カタルーニャ語版) +RMCPYP = ヨッシーレーシングリゾートプラス +ROSE01 = タクトオブマジック RYAJSC = ヤッターマンWii ビックリドッキリマシンで猛レースだコロン +RZNE01 = 斬撃のレギンレイヴ +SEKE99 = Ikenie no Yoru +SMNEXE = 強化されたスーパーマリオブラザーズ.Wiiデラックス +SNBE66 = マグマスーパーマリオブラザーズWii黙示録 +W2OJ = Blue Oasis: 미지의 심해 W2TJ = オニトレ~教官は鬼軍曹~ W34J = @SIMPLEシリーズ Vol.4 THE 密室からの脱出 +W3DJ = 3° C W42J = F・O・R・T・U・N・E フォーチュン~星のふりそそぐ丘~ +W4KJ = Shikagari +W4OJ = Shikakui Atama wo Marukusuru Challenge +W82J = Jintori Action Taikokenchi Karakuri Shiro no Nazo +W8CJ = BIT.TRIP CORE: Rhythm Seijin no Gyakushuu +W8DJ = Mebius Drive +W8IJ = Hachi-One Diver Wii +W8PJ = Ouchi de Mugen Puchi Puchi Wii W9IJ = 危険空域 WA2J = みんなでパズループ -WAQJ = 役満 Wii 井出洋介 の 健康 麻将 -WBTJ = ファンタジックタンバリン FANTASIC TAMBOURINE +WA4J = WarioWare: D.I.Y. Showcase +WA8J = Art Style: Penta Tentacles +WALJ = Art Style: Lightstream +WAQJ = 役満 Wii 井出洋介 の 健康 麻将 +WARJ = Tsuushin Taikyoku Igo Doujou 2700 Mon +WASJ = Tsuushin Taikyoku: Hayazashi Syogi Sandan +WAUJ = Tsūshin Taikyoku: World Chess +WBJJ = Bokujou Monogatari Series: Makiba no Omise +WBMJ = Minna no Pokémon Bokujou +WCKJ = chick chick BOOM +WCSJ = Cue Sports: Wi-Fi Taisen Billiards +WCUJ = Atsui 12-Game: FuriFuri Party! +WD2J = Simple Wii Series Vol. 2: The Number Puzzle Neo WD9J = ドラキュラ伝説 ReBirth WDBJ = ダービードッグ +WDHJ = Art Style: Dialhex +WDIJ = Simple Wii Series Vol. 1: The Block Kuzushi Neo WDMJ = Dr.MARIO&細菌撲滅 +WDNJ = Discipline Teikoku no Tanjyou +WDPJ = Dr. Mario Online Rx (Friend Battle Demo) +WE6J = Sea Farm: Iruka to Watashi no Showtime +WEMJ = 1 Nuke! Dasshutsu Game * My Home Hen +WERJ = Blue Oasis: The Healing Space of Fish +WETJ = Asoberu Ehon: Tobida Sugoroku +WF2J = Final Fantasy Crystal Chronicles: Hikari to Yami no Himegimi to Sekai Seifuku no Tou +WF4J = Final Fantasy IV: The After Years - Tsuki no Kikan +WF5J = Okiraku Daifugou Wii +WFBJ = Beach e Oki o Tsukuccha Wow! +WFCJ = Final Fantasy Crystal Chronicles: Chiisana Ousama to Yakusoku no Kuni WFPJ = ひらめきカードバトル メクルカ +WFSJ = みんなのシアターWii +WG2J = Sugar Bunnies Wii: Youkoso * Bunnies Field e +WGDJ = Gradius Rebirth: Updated +WGGJ = Ushimitsu Monstruo Puchi: Fushigi na Oshiro no Dance Party +WGMJ = Game SoundStation +WGOJ = World of Goo +WGPJ = Aqua Living: TV de Nagameru Uotachi +WGSJ = Gyakuten Saiban: Yomigaeru Gyakuten WHHJ = Let's 全力ヒッチハイク!!!!!!!!! +WIKJ = Ivy the Kiwi? Mini +WINJ = Chokkan! Balance * Labyrinth +WJ2J = Jinsei Game: Happy Step +WK2J = Kappa-kun to Asobou: Kappa-kun to Ota no Shimikai +WK3J = Kappa-kun to Asobou: Kappa-kun to Mori no Nakamatachi +WK9J = Minna de Asobou Koinu de Kururin +WKEJ = RakuRaku Kinen Apori Wii: Kinenka no Isha ga Osheru Nanoka de yameru Houhou +WKKJ = Kurohige Kiki Ippatsu +WKNJ = Kanken Minna de Waiwai Kanji Nou +WKPJ = Kappa Kun to Mori no Nakama Tachi +WKQJ = Kentei! TV Wii Minna de Gotouchi Quiz Battle +WKWJ = Item Sagashi * Yousei to Fushigi no Shima +WLDJ = Boku mo Sekai o Sukuitai: Battle Tournament +WLEJ = Pooyoo to Asobou Episode 1 +WLJJ = Boku mo Sekai o Sukuitai: Battle Tournament +WLKJ = リカちゃんおしゃれハウス +WLMJ = La Mulana +WLOJ = LostWinds: Winter of the Melodias +WM8J = Wi-Fi 8-Nin Battle Bomberman WM9J = たたいて!モグポン +WMBJ = Katachi no Game: Marubou Shikaku +WMLJ = Major League Eating: The Game +WMOJ = Antaga Mawashite Sukuu Puzzle: Mochimochi Q WMPJ = ことばのパズル もじぴったんWii +WMXJ = Max & the Magic Marker WN9J = NECTARIS(ネクタリス) WNPJ = すぐスロDUO「ニューパルサーR&V」 WNVJ = ハメコミ  LUCKY PUZZLE Wii リターン +WNWJ = Hamekomi Lucky Puzzle Wii Return +WOBJ = Art Style: Orbital WODJ = 王だぁ! WOKJ = カラオケJOYSOUND Wii +WOXJ = Osu! Exercise Dojo +WOYJ = Bit Man +WOZJ = Kodomo Kyouiku Telebi Wii: Aiue-Oumuzu WP5J = ポコスカれーしんぐ +WP6J = Boku wa Plarail Untenshi: Shinkansen Joukikikansha-Hen +WP9J = Po-Ka-Zu Wii WPAJ = ポケモン不思議のダンジョン いくぞ!嵐の冒険団 WPDJ = 珍道中!!ポールの大冒険 WPFJ = ポケモン不思議のダンジョン すすめ!炎の冒険団 +WPGJ = Penguin Life WPHJ = ポケモン不思議のダンジョン めざせ!光の冒険団 +WPIJ = Pit Crew Panic +WPNJ = Ponjan +WPPJ = Okiraku Ping Pong +WPRJ = Art Style: Cubeleo +WPSJ = Ransen Pokémon Scramble WPTJ = FANTASIC CUBE ファンタジックキューブ +WPVJ = Kumanage Battle-Hen: Kiina no Kirai na Aoi Hoseki +WPXJ = Minna de Tobikome Penguin Diving Hooper Looper +WQ4J = Kentoushi FuriFuri Boxing WR9J = ロックマン9 野望の復活!! +WRIJ = Rainbow Islands: Towering Adventure! +WRNJ = BIT.TRIP RUNNER WRXJ = 宇宙からの脅威!! +WS8J = Minna de Taisen Puzzle Shanghai +WSAJ = MadSecta +WSCJ = Out of Galaxy: Gin no Koshika WSGJ = さめがめ Wii +WSLJ = Shadow Walker +WSNJ = Sonic the Hedgehog 4: Episode I WSUJ = シュータント過去編 WT8J = はじいて! ブロック ラッシュ WTBJ = ファンタジックタンバリン FANTASIC TAMBOURINE +WTDJ = Tomica Drive +WTRJ = BIT.TRIP BEAT WUHJ = Wiiでウルトラハンド +WUKJ = Unou Kids Okigaru Unou Training +WUNJ = Uno +WVBJ = BIT.TRIP VOID +WVDJ = Kodomo Kyouiku TV Wii: Aiue-O-Chan +WVOJ = Rock n' Roll Climber +WWRJ = Excitebike: World Race +WYKJ = Yomi Kiku Asobi +WZHJ = Animal Life: Doubutsu Fureai Seikatsu WZJJ = @ SIMPLEシリーズ Vol.5 THE 柔道 +WZMJ = Simple Wii Series Vol. 3: The Mahjong WZPJ = ゾンビ イン ワンダーランド +WZZJ = Kumanage Puzzle-Hen: Piina no Suki na Akai Candy +FA5J = Fire Emblem: Ankoku Ryu to Hikari no Tsurugi +FA6J = Donkey Kong Jr. no Sansuu Asobi +FA8J = Hoshi no Kirby: Yume no Izumi no Monogatari +FA9J = The Legend of Zelda 2: Link no Bouken +FAQJ = Ninja Jajamaru-kun FB2J = スーパーマリオブラザーズ2 +FB3J = Valkyrie no Bouken: Toki no Kagi Densetsu +FBDJ = Hikari Shinwa: Palutena no Kagami +FBNJ = Ninja Ryuukenden +FBOJ = Gradius II +FBSJ = Meikyuu Kumikyoku: Milon no Daibouken +FC5J = Ganbare Goemon Karakuki Douchuu +FC8J = Dracula II: Noroi no Fuuin +FCFJ = Yie Ar Kung Fu +FCIJ = Volguard 2 +FCJJ = SD Gundam World: Gachapon Senshi 2 - Capsule Senki +FCRJ = Takahashi Meijin no Boukenjima +FCTJ = RockMan +FCZJ = Kings Knight +FD3J = Nekketsu Koukou Dodgeball-bu Soccer-hen +FD7J = RockMan 3: Dr. Wily no Saigo?! +FDBJ = Famicom Mukashi Banashi: Shin Onigashima - Kouhen +FDGJ = Makai-Mura +FDNJ = RockMan 2 +FDSJ = Famicom Tantei Club: Kieta Koukeisha (Kouhen) +FDTJ = Renegade +FDUJ = Nekketsu Koukou Dodge Ball Bu +FDWJ = Downtown Special: Kunio-kun no Jidaigeki Dayo Zenin Shuugou! +FDXJ = Famicom Tantei Club Part II: Ushiro ni Tatsu Shoujo (Kouhen) +FDZJ = Downtown Nekketsu Koushinkyoku +FE5J = Toukaidou Gojuusan Tsugi +FE6J = Ninja kun Majyou no Bouken +FE7J = Ninja kun Ashura no Shou +FE9J = Ike Ike! Nekketsu Hockey-bu: Subette Koronde Dairantou +FEEJ = Tantei Jingūji Saburō: Shinjuku Chūō Kōen Satsujin Jiken +FEFJ = Detective Saburo Jinguji 2: Yokohama-Ko Renzoku Satsujin Jiken +FEHJ = Tantei Jinguuji Saburo: Toki no Sugiyuku Mama ni +FEJJ = Nazo no Murasame Jou +FELJ = Transformers: Convoy no Nazo +FEMJ = Bio-Miracle Bokutte Upa +FEOJ = Zoids: Mokushiroku +FEQJ = Akumajo Densetsu +FESJ = Clu Clu Land +FEXJ = Wagyan Land +FF2J = Sugoro Quest: Dice no Senshi Tachi +FF5J = Double Dragon 2: The Revenge +FF7J = Ganbare Goemon Gaiden: Kieta Ougon Kiseru +FFGJ = SD Gundam World: Gachapon Senshi - Scramble Wars +FFLJ = Salad no Kuni no Tomato Hime +FFMJ = Chou-Wakusei Senki MetaFight +FFNJ = RockMan 4: Aratanaru Yabou!! +FFOJ = Moero TwinBee: Cinnamon Hakase o Sukue! +FFPJ = Furu Furu Park +FFUJ = Takahashi Meijin no Bouken Jima II FFXJ = 25th スーパーマリオブラザーズ +FFYJ = RockMan 5: Blues no Wana!? +JA4J = Chou-Makai-Mura +JA5J = Heracles no Eikou III: Kamigami no Chinmoku +JA7J = Actraiser +JADJ = Zelda no Densetsu: Kamigami no Triforce +JAFJ = SimCity +JAGJ = Fire Emblem: Monshou no Nazo +JAHJ = R-Type III: The Third Lightning +JAJJ = Street Fighter II +JAPJ = Fire Emblem: Seisen no Keifu +JAUJ = Famicom Bunko: Hajimari no Mori +JAWJ = San Goku Shi IV +JAZJ = Ganbare Goemon: Yukihime Kyuushutsu Emaki +JB7J = Front Mission: Gun Hazard +JBBJ = Super Street Fighter II: The New Challengers +JBDJ = Super Donkey Kong 2: Dixie & Diddy +JBGJ = Mystery Dungeon: Shiren the Wanderer +JBHJ = Heracles no Eikou IV: Kamigami-kara no Okurimono +JBIJ = Street Fighter II Turbo: Hyper Fighting +JBKJ = Breath of Fire II: Shimei no Ko +JBPJ = Super Donkey Kong 3: Nazo no Krems Shima +JBVJ = Der Langrisser +JBWJ = Assault Suits Valken +JCAJ = DoReMi Fantasy: Milon no DokiDoki Daibouken +JCEJ = Fire Emblem: Thracia 776 +JCGJ = Ganbare Goemon 2: Kiteretsu Shougun Magginesu +JCHJ = Ganbare Goemon 3 +JCIJ = Famicom Tantei Club Part II: Ushiro ni Tatsu Shoujo +JCKJ = Space Invaders: The Original Game +JCMJ = Super Wagyan Land +JCTJ = Densetsu no Ogre Battle: The March of the Black Queen +JCUJ = Tactics Ogre: Let Us Cling Together +JCXJ = Super Nobunaga no Yabou: Zengokuban +JCZJ = Super Aoki Ookami to Shiroki Meshika: Genchou Hishi +JD3J = Super E.D.F. Earth Defense Force +JD5J = Rushing Beat Ran: Fukusei Toshi +JD9J = Chou-Genjin +JDOJ = Heisei Shin Onigashima: Zenpen +JDPJ = Heisei Shin Onigashima: Kouhen +JDQJ = Romancing Sa-Ga 3 +JDTJ = Shin Megami Tensei if... +JDYJ = Rudra no Hihou +JDZJ = Final Fantasy USA: Mystic Quest +JEBJ = RockMan X +JEDJ = Kunio-Kun no Dodge Ball Dayo Zenin Shuugo! +JEFJ = Majin Tensei II: Spiral Nemesis +JEGJ = Gouketuji Ichizoku +JEHJ = RockMan X2 +JEKJ = Kyūyaku Megami Tensei: Megami Tensei I・II +NA3J = Bomberman Hero +NACJ = Zelda no Densetsu: Toki no Ocarina +NAIJ = Wave Race 64: Kawasaki Jet Ski +NAJJ = Tsumi to Batsu +NALJ = Nintendo All-Star Dairantou Smash Brothers +NAOJ = 1080° Snowboarding +NARJ = Zelda no Densetsu: Majora no Kamen +NAYJ = Ogre Battle 64: Person of Lordly Caliber +LAEJ = Alex Kidd in Miracle World +LAGJ = Sonic the Hedgehog +LAJJ = Sonic the Hedgehog 2 +LAKJ = Super Wonder Boy: Monster World +LALJ = Fantasy Zone II: The Tears of Opa-Opa +LANJ = Alex Kidd: The Lost Stars +MA3J = Puyo Puyo Tsuu +MA6J = Bare Knuckle II: Shitou no Chinkon Uta +MA7J = Shining and the Darkness +MAAJ = Juuouki +MAEJ = Golden Axe +MAHJ = Sonic the Hedgehog +MAKJ = Shadow Dancer: The Secret of Shinobi +MALJ = Bonanza Bros. +MAMJ = Vermilion +MAOJ = Crying: Aseimei Sensou +MAQJ = Bare Knuckle: Ikari no Tekken +MARJ = The Story of Thor: Hikari o Tsugu Mono +MAUJ = Puzzle & Action: Tant-R +MAVJ = Wonder Boy V: Monster World III +MAXJ = Alex Kidd: Tenkuu Mashiro +MB5J = Rangurissah II +MB6J = Shining Force II: Inishie no Fuuin +MB8J = Phantasy Star II: Kaerazaru Toki no Owari ni +MB9J = Pepenga Pengo +MBBJ = Sonic the Hedgehog 2 +MBDJ = Golden Axe II +MBEJ = Shining Force: Kamigami no Isan +MBFJ = The Super Soldier II +MBHJ = Puzzle & Action: Ichidant-R MBIJ = ランドストーカー 皇帝の財宝 +MBJJ = Dai Makai-Mura +MBLJ = ESWAT: Cyber Police +MBMJ = Sonic the Hedgehog 3 +MBOJ = Golden Axe III +MBQJ = Bare Knuckle III +MBVJ = Jusu Kihei Leynos +MBWJ = Columns III: Taiketsu! Columns World +MC3J = Super Street Fighter 2: The New Challengers +MCCJ = Toki no Keishousha: Phantasy Star III MCFJ = フェリオス(メガドライブ版) +MCHJ = Musha Aleste +MCJJ = Splatterhouse Part 2 +MCKJ = Phantasy Star: Sennenki no Owari ni +MCLJ = Street Fighter II' Plus: Champion Edition +MCMJ = Lord Monarch: Tokoton Sentou Densetsu +MCNJ = Hokuto no Ken: Shin Seikimatu Kyuseisyu Densetsu +MCRJ = Senjou no Ookami II +MCSJ = Wonder Boy III: Monster Lair +MCUJ = Dragon Slayer: The Legend of Heroes +MCVJ = Pitfall: The Mayan Adventure +PA2J = Nekketsu Koukou Dodgeball Bu: CD Soccer Hen +PA6J = Narazumono Sentou Butai: Bloody Wolf +PABJ = PC Genjin +PADJ = R-Type I +PAFJ = Victory Run: Eikou no 13,000KM +PAJJ = Joshoken Necromancer +PAMJ = Neutopia: Frey no Shou +PARJ = Detana TwinBee +PATJ = Kiki Kaikai +PAUJ = Kaizou Chounin Shubibinman +PBFJ = Fire ProWrestling: Combination Tag +PBHJ = PC Genjin 2 +PBIJ = PC Genjin 3 +PBJJ = Genpei Toumaden: Kannoni +PBNJ = Saigou no Nindou: Ninja Spirit +PBUJ = Chouzetsu Rinjin Bravoman +PBWJ = PC Denjin: Punkic Cyborgs +PBXJ = Kaizou Chounin Shubibinman 2: Atanaru Teki +PC4J = Space Invaders: Fukkatsu no Hi +PCBJ = Dead Moon: Tsuki Sekai no Akumu +PCMC = Gokuraku! Chuuka Taisen +PCSJ = Digital Champ: Battle Boxing PDAJ = 熱血高校ドッジボール部® PC番外編 +PDEJ = S.C.I.: Special Criminal Investigation +PDGJ = Fire ProWrestling 3: Legend Bout PDIJ = チャンピオンレスラー® +PDJJ = Street Fighter II': Champion Edition +QA2J = Nekketsu Koukou Dodge Ball-Bu: CD Soccer-hen +QA4J = Super Darius II +QA5J = Space Invaders: The Original Game +QA7J = Legend of Xanadu: Kaze no Densetsu Xanadu +QA9J = Kaze no Densetsu: Xanadu II +QAAJ = CD Denjin: Rockabilly Tengoku +QABJ = Ys I + II +QADJ = Gradius II: Gofer no Yabou +QAEJ = A.III: A-Ressha de Ikou III +QAFJ = Chou Eiyuu Densetsu: Dynastic Hero +QAKJ = Ai Chou Aniki +QALJ = The Atlas: Renaissance Voyager +QAPJ = Akumajou Dracula X: Chi no Rondo +QAQJ = Dragon Slayer: Eiyuu Densetsu +QAUJ = Wonder Boy III: Monster Lair +QAVJ = Bomberman: Panic Bomber +QAZJ = Eikan wa Kimi ni: Kōkō Yakyū Zenkoku Taikai +QBAJ = L Dis +EA3J = Galaxy Fight: Universal Warriors +EA4J = Samurai Spirits Kibeniro Musouken +EA5J = Garou Densetsu 3: Road to the Final Victory +EA7J = Samurai Spirits: Amakusa Kourin +EA8J = Ironclad: Chotetsu Brikinger +EAAJ = Garou Densetsu: Shukumei no Takatai +EAEJ = Shin Samurai Spirits: Haohmaru Jigokuhen +EAIJ = Top Hunter +EANJ = Garou Densetsu 2: Aratanaru Tatakai +EASJ = Shin Samurai Spirits Haoumaru Jigokuhen +EAYJ = King of The Monsters 2 +EB4J = ASO II: Last Guardian +EB5J = The Last Blade +EBNJ = Fu'un Mokushiroku: Kakutou Sousei +EBSJ = Art of Fighting: Ryuuko no Ken Gaiden +ECAJ = Real Bout Garou Densetsu 2: The Newcomers +ECDJ = Stakes Winner: G1 Kanzen Seihahe no Michi +ECEJ = Bakumatsu Rouman Dai Ni Maku: Gekka no Kenshi +ECGJ = Shock Troopers: 2nd Squad +ECHJ = The King of Fighters '98: Dream Match Never Ends +ECMJ = Tokuten Oh: Honoo no Libero +E55J = Senji no Ookami +E56J = Exed Eyes +E5VJ = Renegade +E6JJ = Bakutotsu Kijuutei: BaRaDuKe II +E6LJ = Marchen Maze +E6NJ = Solomon no Kagi +E6OJ = Bomb Jack Arcade +E6PJ = Ninja Ryukenden Arcade +E6QJ = Argos no Senshi E6XJ = 獣王記(アーケード版) +E72J = Starblade +E74J = Cosmo Gang the Puzzle +E77J = The Return of Ishtar +E7LJ = Cosmo Gang the Video +E7XJ = Youkai Douchuki +C9SP = 불가능한 임무 II +XADJ = Yie Ar Kung-Fu 2 +XAHJ = Penguin Adventure: Yume Tairiku Adventure +XAKJ = Parodius - Tako wa Chikyuu wo Sukuu +XAMJ = Knightmare: Majou Densetsu +XAOJ = Gofer no Yabou: Episode II +XAPJ = Metal Gear 2: Solid Snake +HAAA = 写真チヤンネル +HABA = Wiiショッピングチャンネル +HADE = インターネットチャンネル HADJ = インターネットチャンネル HAFJ = お天気チャンネル +HAFP = お天気チャンネル +HAGA = ニュースチャンネル +HAGE = ニュースチャンネル HAGJ = ニュースチャンネル +HAGP = ニュースチャンネル +HAPP = Miiコンテストチャンネル +HATJ = Nintendo Channel +HATP = みんなのニンテンドーチャンネル +HAVJ = Today and Tomorrow Fortune Teller +HAVP = きょうとあしたの占いラッキーチャンネル HBNJ = テレビの友チャンネル Gガイド for Wii HC3J = USB乄モリ一修復プ囗グラム HCAJ = バンブラDXスピーカーチャンネル +HCCJ = 住所情報 +HCDJ = デジカメプリントチャンネル +HCFP = Wiiスピークチャンネル +HCGJ = インターネットにつなぐとできること +HCHJ = 出前チャンネル HCIJ = Wiiの間 +HCRE = ゼルダの伝説スカイウォードソード データ修復チャンネル +HCRJ = The Legend of Zelda Skyward Sword Update +HCRP = ゼルダの伝説スカイウォードソード データ修復チャンネル HCYJ = Wii U本体更新 修復プログラム HFNJ = Wii Fit からだチェックチャンネル +RMCJ = マリオカートチャンネル +DSYA = 시스체크 +D29J01 = 月刊任天堂店頭デモ 5月号 +D32J01 = 月刊任天堂店頭デモ 6月号 +D33J01 = 月刊任天堂店頭デモ 7月号 +D34J01 = 月刊任天堂店頭デモ 7月増刊号 +D38J01 = 月刊任天堂店頭デモ 9月号 +D39J01 = 月刊任天堂店頭デモ 10月号 +D42J01 = 月刊任天堂店頭デモ 11月号 D43J01 = ゼルダの伝説 時のオカリナ GC +D44J01 = 月刊任天堂店頭デモ 12月号 +D46J01 = 月刊任天堂店頭デモ 1月号 +D47J01 = 月刊任天堂店頭デモ 2月号 +D48J01 = 月刊任天堂店頭デモ 3月号 +D49J01 = 月刊任天堂店頭デモ 4月号 +D52J01 = 月刊任天堂店頭デモ 5月号 D53J01 = ニンテンドーゲームキューブ ソフトeカタログ2003・春 +D54J01 = 月刊任天堂店頭デモ 6月号 +D59J01 = 月刊任天堂店頭デモ 7月号 +D62J01 = 月刊任天堂店頭デモ 8月号 +D64J01 = 月刊任天堂店頭デモ 10月号 +D65J01 = 月刊任天堂店頭デモ 11月号 +D67J01 = 月刊任天堂店頭デモ 12月号 +D68J01 = 月刊任天堂店頭デモ 1月号 +D73J01 = 月刊任天堂店頭デモ 2月号 +D75J01 = 月刊任天堂店頭デモ 3月号 +D77J01 = 月刊任天堂店頭デモ 4月号 +D78J01 = 月刊任天堂店頭デモ 5月号 +D79J01 = 月刊任天堂店頭デモ 6月号 +D82J01 = 月刊任天堂店頭デモ 7月号 +D84J01 = 月刊任天堂店頭デモ 8月号 +D85J01 = 月刊任天堂店頭デモ 9月号 +D86J01 = 月刊任天堂店頭デモ 10月号 +D87J01 = 月刊任天堂店頭デモ 11月号 +D88J01 = 月刊任天堂店頭デモ 12月号 D89J01 = クラブニンテンドー オリジナルeカタログ 2004 +D92J01 = 月刊任天堂店頭デモ 2004‐2005年末年始号 +D93J01 = 月刊任天堂店頭デモ 1月号 +D94J01 = 月刊任天堂店頭デモ 2月号 +D97J01 = 月刊任天堂店頭デモ 5月号 +E23J01 = 月刊任天堂店頭デモ 9月号 +E24J01 = 月刊任天堂店頭デモ 10月号 +E25J01 = 月刊任天堂店頭デモ 11月号 +E27J01 = 月刊任天堂店頭デモ 1月号 +E32J01 = 月刊任天堂店頭デモ 4月号 +E34J01 = 月刊任天堂店頭デモ 6月号 +E35J01 = 月刊任天堂店頭デモ 7月号 +E36J01 = 月刊任天堂店頭デモ 8月号 +E37J01 = 月刊任天堂店頭デモ 9月号 G2DJB2 = デジモンバトルクロニクル G2GJB2 = 機動戦士ガンダム ガンダムvs.Zガンダム G2MJ01 = メトロイドプライム2 ダークエコーズ @@ -569,7 +1009,7 @@ G2SJGE = 式神の城II G2VJ08 = ビューティフル ジョー 2 ブラックフィルムの謎 G2XJ8P = ソニックジェムズコレクション G3AJ13 = ロード・オブ・ザ・リング 中つ国第三紀 -G3EJ51 = エクストリームG3 +G3EJB0 = エクストリームG3 G3NJDA = NARUTO-ナルト-激闘忍者大戦!3 G3SJC0 = スーパーパズルボブル オールスターズ G3TJ8P = ダビつく3 ダービー馬をつくろう! @@ -584,6 +1024,7 @@ G4SJ01 = ゼルダの伝説 4つの剣+ G4WJ99 = 牧場物語 しあわせの詩 for ワールド G8FJ8P = バーチャファイター サイバージェネレーション G8MJ01 = ペーパーマリオRPG +G8MK01 = ペーパーマリオRPG G8OJ18 = ボボボーボ・ボーボボ 脱出!!ハジケ・ロワイヤル G8SJAF = バトルスタジアムD.O.N G8WJ01 = 突撃!!ファミコンウォーズ @@ -693,6 +1134,7 @@ GKBJAF = バテン・カイトス 終わらない翼と失われた海 GKDJ01 = 巨人のドシン GKEJA4 = 実況パワフルプロ野球12決定版 GKFJ8P = カオスフィールド エクスパンデッド +GKFJMS = カオスフィールド エクスパンデッド GKGJ01 = ドンキーコンガ GKJJ78 = カーズ GKLJ13 = ロード・オブ・ザ・リング/王の帰還 @@ -771,7 +1213,7 @@ GSMJ08 = スパイダーマン GSOJ8P = ソニック メガコレクション GSSJ8P = セガ サッカースラム GSTJ13 = SSX トリッキー -GSWJ64 = スター・ウォーズ ローグ スコードロン2 +GSWJ13 = スター・ウォーズ ローグ スコードロン2 GSXJ13 = スター・ウォーズ クローン戦争 GT2J18 = 天外魔境II MANJIMARU GT3J52 = トニーホークのプロスケーター3 @@ -797,7 +1239,7 @@ GVWJDQ = 学園都市 ヴァラノワールローゼス GW3JG2 = レッスルマニアX8 GW6JEM = ワールドサッカー ウイニングイレブン6 ファイナルエヴォリューション GW9JG2 = レッスルマニアXIX -GWEJ51 = 18 Wheeler +GWEJB0 = 18 Wheeler GWGJ4F = わいわいゴルフ GWPJG2 = WWE デイ・オブ・レコニング GWRJ01 = ウェーブレース ブルーストーム diff --git a/Data/Sys/wiitdb-ko.txt b/Data/Sys/wiitdb-ko.txt index c1451a9279f8..9e55c7bafcba 100644 --- a/Data/Sys/wiitdb-ko.txt +++ b/Data/Sys/wiitdb-ko.txt @@ -1,87 +1,9530 @@ -TITLES = https://www.gametdb.com (type: Wii language: KO_unique version: 20191106234300) +TITLES = https://www.gametdb.com (type: Wii language: KO_unique version: 20230727194210) +091E00 = 영화 채널 설치 디스크 Ver. A +410E01 = Wii 백업 디스크 v1.31 +413E01 = 디스크업데이트 디스크 +D2AJAF = 모두 모험! 패밀리 트레이너 체험판 +D2SE18 = 데카 스포츠 2 체험판 +D3DE18 = 데카 스포츠 3 체험판 +DASE4Q = 디즈니 에픽 미키 체험판 +DAUEPZ = 컨트리 댄스 체험판 +DAVE01 = 미스테리 케이스 파일즈: 말그레이브 사건 체험판 +DAXE01 = 젤다의 전설: 스카이워드 스워드 체험판 +DAXP01 = 젤다의 전설: 스카이워드 스워드 체험판 +DBBE18 = 베이블레이드: 메탈 퓨전 - 전투 요새 체험판 +DBKE69 = 붐 블록스 체험판 +DBKP69 = 붐 블록스 체험판 +DCAE18 = 콜링 체험판 +DCHEAF = 위 치어 체험판 +DCHJAF = 위 치어: 오하스타 프로듀스! 한정 콜라보 게임 디스크 +DD2P41 = 저스트 댄스 2 체험판 +DDWE18 = 로스트 인 쉐도우: 프레스 디스크 체험판 +DDWX18 = 로스트 인 쉐도우: 베스트 바이 체험판 +DHHJ8J = 스즈미야 하루히의 격동 히라노 아야 프리미엄 영화 디스크 +DHKE18 = 사람 구함: 50 개 엉뚱한 직업 체험판 +DK6E18 = 구슬 모험: 코로린파 체험판 +DK6J18 = 코로린파 2 - 앤써니와 황금 해바라기 씨앗 체험판 +DMHE08 = 몬스터 헌터 3 체험판 +DMHJ08 = 몬스터 헌터 3 체험판 +DPIE18 = 웁스! 프랭크 파티 체험판 +DQAJK2 = 물병자리 야구: 한계, 그 앞에 +DQGP69 = 마이심즈 레이싱 체험판 +DRME18 = 룸즈: 메인 빌딩 체험판 +DSFE7U = 무라마사: 데몬 블레이드 체험판 +DSRJ8P = 소닉과 비밀의 링 체험판 +DTOJ8P = 428: 봉쇄된 시부야에서 체험판 +DTZJ08 = 보물섬 Z 발바로스의 보물 체험판 +DWEJA4 = 위닝 일레븐 플레이 메이커 2008 체험판 +DWEPA4 = 프로 에볼루션 사커 2008 체험판 +DXSE18 = 데카 스포츠 체험판 +DZDE01 = 젤다의 전설: 황혼의 공주 체험판 +DZDP01 = 젤다의 전설: 황혼의 공주 체험판 +R22E01 = 플링스매쉬 +R22J01 = 두드려 튀다: 슈퍼 스매시 볼 플러스 +R22P01 = 플링스매쉬 +R23E52 = 바비와 삼총사 +R23P52 = 바비와 삼총사 +R24J01 = Wii로 즐기는 꼬마 로봇! +R25EWR = 레고 해리 포터: 1-4 년 +R25PWR = 레고 해리 포터: 1-4 년 +R26E5G = 데이터 이스트 아케이드 클래식 +R27E54 = 도라의 크리스탈 왕국 구하기 +R27X54 = 도라의 크리스탈 왕국 구하기 +R28E54 = 탑 스핀 4 +R28P54 = 탑 스핀 4 +R29E52 = NPPL 챔피언쉽 페인트볼 2009 +R29P52 = 밀레니엄 시리즈 챔피언쉽 페인트 볼 2009 +R2AE7D = 아이스 에이지 2: 멜트다운 +R2AP7D = 아이스 에이지 2: 멜트다운 +R2AX7D = 아이스 에이지 2: 멜트다운 +R2DEEB = 도카폰 왕국 +R2DJEP = 도카폰 왕국 Wii +R2DPJW = 도카폰 왕국 +R2EJ99 = 피쉬 아이즈 Wii +R2FE5G = 프레디 피쉬: 켈프 시드 미스터리 +R2FP70 = 프레디 피쉬: 켈프 시드 미스터리 +R2GEXJ = 프라질 드림즈: 달의 폐허 유적 +R2GJAF = 프라질 : 안녕 달의 폐허 +R2GP99 = 프라질 드림즈: 달의 폐허 유적 +R2HE41 = 페츠 승마 클럽 +R2IE69 = 매든 NFL 10 +R2IP69 = 매든 NFL 10 +R2JJAF = 태고의 달인 Wii +R2KE54 = 돈 킹 - 권투 +R2KP54 = 돈 킹 - 권투 +R2LJMS = 훌라 Wii - 훌라로 시작하는 아름다움과 건강!! +R2ME20 = M&M의 모험 +R2NE69 = 나스카 카트 레이싱 +R2OE68 = 중세 게임들 +R2OP68 = 중세 게임들 +R2PE9B = 슈퍼 스윙 골프 시즌 2 +R2PJ9B = 슈퍼 스윙 골프 시즌 2 R2PKZ4 = 스윙골프 팡야 2nd 샷! +R2PP99 = 슈퍼 스윙 골프 +R2QJC0 = 쿠킹 마마 2 - 큰일이다! 엄마는 바빠!! +R2RE4F = 포니 프렌즈 2 +R2RP4F = 포니 프렌즈 2 +R2SE18 = 데카 스포츠 2 +R2SJ18 = 데카 스포르타 2 +R2SP18 = 스포츠 아일랜드 2 +R2TE41 = 돌연변이 닌자 거북: 대충돌 +R2TP41 = 돌연변이 닌자 거북: 대충돌 +R2UE8P = 렛츠 탭 +R2UJ8P = 렛츠 탭 +R2UP8P = 렛츠 탭 +R2VE01 = 죄와 벌: 우주의 후계자 +R2VJ01 = 죄와 벌: 우주의 후계자 +R2VP01 = 죄와 벌: 우주의 후계자 +R2WEA4 = 프로 에볼루션 싸커 2009 +R2WJA4 = 위닝 일레븐 플레이 메이커 2009 +R2WPA4 = 프로 에볼루션 싸커 2009 +R2WXA4 = 프로 에볼루션 축구 2009 +R2YE54 = 생일 파티 배쉬 +R2YP54 = 내 생일! +R32J01 = Wii로 즐기는 메트로이드 프라임 2 - 검은 메아리 +R33E69 = AC/DC 라이브: 락 밴드 트랙 팩 +R33P69 = AC/DC 라이브: 락 밴드 노래 팩 +R34E69 = 락 밴드: 컨트리 트랙 팩 +R35JC8 = 삼국지 11 파워 업 키트 +R36E69 = 그린 데이: 락 밴드 +R36P69 = 그린 데이: 락 밴드 +R37E69 = 락 밴드: 메탈 트랙 팩 +R38E78 = 마벨 슈퍼 히어로 스쿼드 +R38P78 = 마벨 슈퍼 히어로 스쿼드 +R38X78 = 마벨 슈퍼 히어로 스쿼드: 월마트 에디션 +R38Y78 = 마벨 슈퍼 히어로 스쿼드 +R39EFP = 시마노 극한 낚시 +R39PNK = 시마노 극한 낚시 +R3AE20 = 스토리 아워: 모험담 +R3AP7J = 스토리 아워: 모험담 +R3BE8P = 쌈바 데 아미고 +R3BJ8P = 쌈바 데 아미고 +R3BP8P = 쌈바 데 아미고 +R3CE20 = 크라이슬러 클래식 레이싱 +R3CP7J = 크라이슬러 클래식 레이싱 +R3DES5 = 드림 핀볼 3D +R3DPS5 = 드림 핀볼 3D +R3EEWR = 게임 파티 3 +R3EPWR = 게임 파티 3 +R3FJA4 = 실황 파워풀 메이저 리그 3 +R3GXUG = 키즈 스포츠: 크레이지 미니 골프 +R3HP6Z = 에이전트 휴고: 훌라 홀리데이 +R3HX6Z = 에이전트 휴고: 훌라 홀리데이 +R3IJ01 = wII로 즐기는 메트로이드 프라임 +R3JE5G = 고 플레이 써커스 스타 +R3KP6N = 고층 건물 +R3LEWR = 그린 랜턴: 반지의 선택 +R3LPWR = 그린 랜턴: 맨헌터의 위협 +R3ME01 = 메트로이드 프라임: 3부작 +R3MP01 = 메트로이드 프라임: 3부작 +R3NEXS = 길티기어 이그젝스 액센트 코어 플러스 +R3NPH3 = 길티기어 이그젝스 액센트 코어 플러스 +R3OE01 = 메트로이드: 다른 M +R3OJ01 = 메트로이드: 다른 M +R3OP01 = 메트로이드: 다른 M +R3PEWR = 스피드 레이서: 비디오게임 +R3PJ52 = 스피드 레이서 +R3PPWR = 스피드 레이서: 비디오게임 +R3RE8P = 소닉 & 세가 올 스타즈 레이싱 +R3RP8P = 소닉 & 세가 올 스타즈 레이싱 +R3SE52 = 스파이더맨: 그림자들의 거미줄 +R3SP52 = 스파이더맨: 그림자들의 거미줄 +R3TE54 = 탑 스핀 3 +R3TJG9 = 탑 스핀 3 +R3TP54 = 탑 스핀 3 +R3UJGD = 엄마 아빠와 함께: 미피의 장난감 상자 +R3VEFP = 디어 드라이브 +R3VPNK = 디어 드라이브 +R3XE6U = 샘 & 맥스: 시즌 1 +R3XP6V = 샘 & 맥스: 시즌 1 +R3YE70 = 샘 & 맥스: 시즌 2: 시간과 공간 저편에 +R3YP70 = 샘 & 맥스: 시즌 2: 시간과 공간 저편에 +R3ZE69 = 락 밴드 트랙 팩: 클래식 락 +R42E69 = 심즈 2: 조난자 +R42P69 = 심즈 2: 조난자 +R43E69 = EA 스포츠 엑티브: 개인 트레이너 +R43J13 = EA 스포츠 엑티브 개인 트레이너 Wii 30 일 생활 개선 프로그램 +R43P69 = EA 스포츠 엑티브: 개인 트레이너 +R44J8P = 스즈미야 하루히의 병렬 +R46ENS = 팬텀 브레이브: 재회 +R46JKB = 팬텀 브레이브 Wii +R47E20 = ATV 쿼드 킹스 +R47P20 = ATV 쿼드 킹스 +R48E7D = 스파이더윅 연대기 +R48P7D = 스파이더윅 연대기 +R49E01 = 동키 콩: 정글 비트 +R49J01 = Wii로 즐기는 동키 콩 정글 비트 +R49P01 = 동키 콩: 정글 비트 +R4AE69 = 심애니멀즈 +R4AJ13 = 심애니멀즈 +R4AP69 = 심애니멀즈 +R4BEJZ = 챔피온쉽 테이블 축구 +R4BPGT = 테이블 축구 +R4CE69 = 심시티 나만의 도시 +R4CJ13 = 심시티 나만의 도시 R4CK69 = 심시티 나만의 도시 +R4CP69 = 심시티 나만의 도시 +R4DDUS = 세 개의 물음표 - 저주받은 성 +R4EE01 = 끝없는 바다: 푸른 세계 +R4EJ01 = 끝없는 바다 - 바다가 부르는 소리 +R4EP01 = 끝없는 바다 2: 바다가 부르는 소리 +R4FE20 = 스토리 아워: 요정 이야기 +R4FP7J = 스토리 아워: 요정 이야기 +R4IPNK = 매드 트럭스 +R4LPUG = 애슬레틱 피기 파티 +R4LXUG = 애슬레틱 피기 파티 +R4MJ0Q = 네모난 머리를 둥글게 하기 Wii +R4NE5G = 소령의 위풍당당한 행진 +R4NP5G = 소령의 위풍당당한 행진 +R4NX5G = 소령의 위풍당당한 행진 +R4PE69 = 심즈 2: 애완동물들 +R4PP69 = 심즈 2: 애완동물들 +R4QE01 = 마리오 파워 사커 +R4QJ01 = 마리오 파워 사커 R4QK01 = 마리오 파워 사커 -R64K01 = 위 뮤직 +R4QP01 = 마리오 파워 사커 +R4RE69 = 피파 10 +R4RJ13 = 피파 10 +R4RK69 = 피파 10 +R4RP69 = 피파 10 +R4RR69 = 피파 10 +R4RX69 = 피파 10 +R4RY69 = 피파 10 +R4RZ69 = 피파 10 +R4SE54 = MLB 슈퍼스타즈 +R4VEA4 = 스토리북 워크샵 +R4VJA4 = 텔레연극 Wii +R4WJA4 = 실황 파워풀 메이저 리그 2009 +R4YJ2M = 스케반 사장 레나 Wii 고양이 사장, 쓸 만한 사원 대모집 +R4ZJ01 = 령 제로: 월식의 가면 +R52E08 = 네오페츠 퍼즐 모험 +R52P08 = 네오페츠 퍼즐 모험 +R53PFH = 인 더 믹스 (아민 반 뷰렌 출연) +R54FMR = 카운트다운: 게임 +R55P41 = 백만장자가 되고 싶은 사람 : 1 번째 에디션 +R56EG9 = 아스트로 보이: 비디오 게임 +R56PG9 = 아스트로 보이: 비디오 게임 +R57FMR = 챔피언에 대한 질문 +R58DMR = 유 싱 +R58FMR = 유 싱 +R58IMR = 유 싱 +R58PMR = 유 싱 +R58SMR = 유 싱 +R59D4Q = 클럽 펭귄: 게임 데이! +R59E4Q = 클럽 펭귄: 게임 데이! +R59P4Q = 클럽 펭귄: 게임 데이! +R5AE8P = 황금 나침반 +R5AP8P = 황금 나침반 +R5AX8P = 황금 나침반 +R5DE5G = 플립의 뒤틀어진 세상 +R5EPMR = 카운트다운: 게임 +R5FE41 = 챔피언스 아카데미: 싸커 +R5FP41 = 챔피언스 아카데미: 풋볼 +R5GE78 = 당신은 초등학교 5학년 보다 똑똑한가요? 학격점 +R5IE4Q = 토이 스토리 매니아! +R5IP4Q = 토이 스토리 매니아! +R5IR4Q = 토이 스토리 매니아! +R5IX4Q = 토이 스토리 매니아! +R5JES5 = 해적 vs 닌자 돗지볼 +R5JPS5 = 해적 vs 닌자 돗지볼 +R5MJAF = 말의 퍼즐 모지핏탄 Wii 디럭스 +R5NJN9 = 도아라로 Wii +R5OENR = 파티 피그스: 농장 마당 게임들 +R5OXUG = 농장 마당 파티: 올림픽 참가 +R5PE69 = 헤리 포터와 불사조 기사단 +R5PJ13 = 헤리 포터와 불사조 기사단 +R5PP69 = 헤리 포터와 불사조 기사단 +R5PX69 = 헤리 포터와 불사조 기사단 +R5QPGT = 써커스 +R5SERW = 모티머 버켓과 스푸키 저택의 비밀 +R5TE69 = 그랜드 슬램 테니스 +R5TJ13 = 그랜드 슬램 테니스 +R5TP69 = 그랜드 슬램 테니스 +R5UE41 = CSI: 치명적인 의도 +R5UP41 = CSI: 치명적인 의도 +R5VE41 = 제임스 카메론의 아바타: 게임 +R5VP41 = 제임스 카메론의 아바타: 게임 +R5VX41 = 제임스 카메론의 아바타: 게임 +R5WEA4 = 사일런트 힐: 조각난 기억들 +R5WJA4 = 사일런트 힐: 조각난 기억들 +R5XJ13 = 마이심즈 에이전츠 +R5XP69 = 마이심즈 에이전츠 +R5YD78 = 올 스타 치어리더 2 +R5YE78 = 올 스타 치어 스쿼드 2 +R5YP78 = 올 스타 치어리더 2 +R62E4Q = 디즈니 싱 잇: 팝 히츠 +R62P4Q = 디즈니 싱 잇: 팝 히츠 +R63EG9 = 패밀리 파티: 30 그레이트 게임즈 아웃도어 펀 +R63PG9 = 패밀리 파티: 30 그레이트 게임즈 아웃도어 펀 +R64E01 = Wii 뮤직 +R64J01 = Wii 뮤직 +R64K01 = Wii 뮤직 +R64P01 = Wii 뮤직 +R65ENR = 벅 피버 +R66E41 = 프레스 유어 럭 2010 에디션 +R67E6K = 스마트 시리즈 제공: 자자의 모험 +R68E5G = 고 플레이 시티 스포츠 +R69E36 = 콜린 맥레이: 더트 2 +R69P36 = 콜린 맥레이: 더트 2 +R6APPU = 아기와 나 +R6BE78 = 더 블랍 +R6BJ78 = 블랍 화려한 세상 R6BK78 = 더 블랍 +R6BP78 = 더 블랍 +R6BX78 = 더 블랍 +R6CEAF = 위 치어 2 +R6CJAF = 위 치어: 춤추는 영혼! +R6DFJW = 도로교통법 +R6EE41 = 패밀리 Feud 2010 에디션 +R6FE41 = 식스 플래그스 펀 파크 +R6FERS = 식스 플래그스 펀 파크 +R6FP41 = 재미있는 공원 파티 +R6GPMR = 황금 빛 공들 +R6HE54 = 안녕, 카이란: 슈퍼 게임 데이 +R6HP54 = 안녕, 카이란: 슈퍼 게임 데이 +R6IE54 = 야구 블래스트! +R6JJGD = 강철의 연금술사 - 새벽의 왕자 +R6KP36 = 애시스 크리켓 2009 +R6KU36 = 애시스 크리켓 2009 +R6LEWR = 레고 락 밴드 +R6LPWR = 레고 락 밴드 +R6ME5Z = 미국의 넥스트 탑 모델 +R6MPML = 미국의 넥스트 탑 모델 +R6MXMR = 탑 모델 +R6NE41 = 숀 화이트 스노우보딩: 월드 스테이지 +R6NP41 = 숀 화이트 스노우보딩: 월드 스테이지 +R6NY41 = 숀 화이트 스노우보딩: 월드 스테이지 +R6OE78 = 카: 레이스 오 라마 +R6OP78 = 카: 레이스 오 라마 +R6OX78 = 카: 레이스 오 라마 +R6QE69 = 마이심즈 에이전츠 +R6REJH = 트랙매니아: 레이스 제작 +R6RPHH = 트랙매니아 +R6TEA4 = 토네이도 발생 +R6TPA4 = 토네이도 발생 +R6VE4Z = 클럽들의 왕 +R6VPGN = 클럽들의 왕 +R6WE68 = AMF 볼링 월드 레인스 +R6WP68 = AMF 볼링 월드 레인스 +R6XE69 = 하스브로: 패밀리 게임 나이트 2 +R6XP69 = 하스브로: 패밀리 게임 나이트 2 +R6YEXS = 스퀴볼즈 파티 +R6YPH3 = 스퀴볼즈 파티 +R72E5G = 케이크 매니아: 인 더 믹스! +R72P5G = 케이크 매니아: 인 더 믹스! +R74E20 = 아케이드 슈팅 갤러리 +R75E20 = 드림 살롱 +R77JAF = SD 건담: G 제너레이션 워즈 +R79JAF = 기동전사 건담: MS 전선 0079 +R7AE69 = 심애니멀 아프리카 +R7AJ13 = 심애니멀 아프리카 +R7AP69 = 심애니멀 아프리카 +R7BE20 = 젤리 벨리 탄도 콩 +R7BP7J = 젤리 벨리 탄도 콩 +R7CJ01 = 캡틴 레인보우 +R7EE8P = 나이츠: 꿈의 여행 +R7EJ8P = 나이츠: 별이 쏟아지는 밤의 이야기 +R7EP8P = 나이츠: 꿈의 여행 +R7FEGD = 파이널 판타지 우화집: 초코보의 던전 +R7FJGD = 초코보의 이상한 던전: 시간을 잇는 미궁 +R7FPGD = 파이날 판타지 우화집: 초코보의 던전 +R7GEAF = 드래곤 볼: 피콜로 대마왕의 역습 +R7GJAF = 드래곤 볼 천하제일 대모험 +R7GPAF = 드래곤 볼: 피콜로 대마왕의 역습 +R7HE6K = 육군 구조대 +R7IE69 = 챰 걸즈 클럽: 파자마 파티 +R7IP69 = 챰 걸즈 클럽: 파자마 파티 +R7KE6K = 락 블래스트 +R7LP7J = 마곳의 비퍼즐드! +R7MPFR = 뮤직 파티: 락 하우스 +R7MXFR = 뮤직 파티: 락 하우스 +R7NE20 = 콜드 스톤 크리머리: 스쿱 잇 업 +R7PE01 = 펀치 아웃!! +R7PJ01 = 펀치 아웃!! +R7PP01 = 펀치 아웃!! +R7QE52 = 카오틱: 그림자 전사들 +R7RE52 = 리틀 리그 월드 시리즈 야구 2009 +R7SE5G = 박물관 탈출 +R7SP5G = 박물관 탈출 +R7TFJW = 볼링 프로 +R7VEWR = 바캉스 섬: 해변 파티 +R7VPWR = 바캉스 섬: 해변 파티 +R7WE52 = 산악 스포츠 +R7WP52 = 산악 스포츠 +R7XE69 = 니드 포 스피드: 니트로 +R7XJ13 = 니드 포 스피드: 니트로 +R7XP69 = 니드 포 스피드: 니트로 +R7YFMR = 페킨 익스프레스 +R7ZE41 = 팀 엘리미네이션 게임즈 +R7ZP41 = 넉아웃 파티 +R82E52 = 동물 행성: 수의사 인생 +R82JG0 = 다트 Wii DX +R82P52 = 동물 행성: 수의사 인생 +R83EA4 = 팝픈 뮤직 +R83JA4 = 팝픈 뮤직 +R83PA4 = 팝픈 리듬 +R84EE9 = 하베스트 문: 평온의 나무 +R84J99 = 목장 이야기: 평온의 나무 +R84P99 = 하베스트 문: 평온의 나무 +R85EG9 = 비밀의 토요일: 5 번째 태양의 야수 +R85PG9 = 비밀의 토요일: 5 번째 태양의 야수 +R86E20 = 드림 댄스 & 치어 +R87EVN = 스키-두: 스노우모바일 도전 +R88J2L = 호빵맨 싱글벙글 파티 +R89JEL = 도쿄 친구 공원 II +R8AE01 = 포케파크 Wii - 피카츄의 대모험 +R8AJ01 = 포케파크 Wii - 피카츄의 대모험 +R8AP01 = 포케파크 Wii 피카츄의 대모험 +R8BE41 = 이미진 파티 베이비즈 +R8BP41 = 베이비시팅 파티 +R8DEA4 = 유희왕! 5D: 듀얼 트랜져 +R8DJA4 = 유희왕! 5D's: 듀얼 트랜져 +R8DPA4 = 유희왕! 5D: 카드 마스터 +R8EJQC = 어스 시커 +R8FES5 = 패스트 푸드 패닉 +R8FJHA = 장인 레스토랑은 대성공! +R8FPNP = 패스트 푸드 패닉 +R8GJC8 = G1 기수 Wii 2008 +R8GPC8 = G1 기수 Wii 2008 +R8HE4Q = 한나 몬타나: 영화 +R8HP4Q = 한나 몬타나: 영화 +R8HX4Q = 한나 몬타나: 영화 +R8HY4Q = 한나 몬타나: 영화 +R8HZ4Q = 한나 몬타나: 영화 +R8IE78 = 스펀지밥의 네모의 진실 +R8IP78 = 스펀지밥의 네모의 진실 +R8IS78 = 스펀지밥의 네모의 진실 +R8JEWR = 반지의 제왕: 아라곤의 모험 +R8JPWR = 반지의 제왕: 아라곤의 모험 +R8KPKM = 스트리트 풋볼 2 +R8LE20 = 치킨 블래스터 +R8LP7J = 치킨 블래스터 +R8NEA4 = 케이지: 프로 스타일 타격 연습 +R8NJG0 = 배팅 레볼루션 +R8OE54 = 링링 브라더스와 바넘 & 베일리 써커스 +R8OX54 = 나의 써커스 +R8PE01 = 슈퍼 페이퍼 마리오 +R8PJ01 = 슈퍼 페이퍼 마리오 R8PK01 = 슈퍼 페이퍼 마리오 -R96KAF = 바람의 크로노아 +R8PP01 = 슈퍼 페이퍼 마리오 +R8QPRT = 크레이지 퀴즈! 열정이 충분한가요? +R8RP41 = 아서와 말타자드의 복수 +R8SE41 = 휴가 스포츠 +R8SP41 = 월드 스포츠 파티 +R8SX41 = 월드 스포츠 파티 +R8TENR = 토너먼트 당구 +R8UXMR = 꼬마박사 아디부 +R8VE41 = 애완동물 구조대: 야생동물 수의사 +R8VP41 = 행성 구조대: 야생동물 수의사 +R8XE52 = 쥬라기 공원: 사냥 +R8XZ52 = 탑 샷 다이노서어 헌터 +R8YE52 = 카벨라의 위대한 게임 사냥꾼 2010 +R8ZE8P = 데이지 푸엔테스 필라테즈 +R8ZPGT = 데이지 푸엔테스 필라테즈 +R92E01 = 피크민 2 +R92J01 = Wii로 즐기는 피크민 2 +R92P01 = 피크민 2 +R94PMR = 얼티밋 레드 볼 첼린지 +R94XMR = 얼티밋 레드 볼 첼린지 +R96EAF = 바람의 크로노아 - 판토마일의 문 +R96JAF = 바람의 크로노아 - 판토마일의 문 +R96KAF = 바람의 크로노아: 판토마일의 문 +R96PAF = 바람의 크로노아 - 판토마일의 문 +R97E9B = 패밀리 펀 풋볼 +R9AE52 = 엑티비젼 데모 액션 팩 체험판 +R9BPMT = 뚝딱뚝딱 밥아저씨: 즐거운 축제 +R9CPMR = 나는 유명 인사... 나를 여기서 꺼내 줘! +R9DE78 = 그려라, 터치! 내가 만드는 세상: 넥스트 챕터 +R9DP78 = 그려라, 터치! 내가 만드는 세상: 넥스트 챕터 +R9EPNP = 픽스 잇: 주택 개조 도전 +R9GEWR = 수호자 전설: 가훌의 올빼미 +R9GPWR = 수호자 전설: 가훌의 올빼미 +R9HE78 = 당신은 초등학교 5학년보다 똑똑한가요? 게임 시간 +R9IE01 = 피크민 +R9IJ01 = Wii로 즐기는 피크민 R9IK01 = 피크민 +R9IP01 = 피크민 +R9JE69 = 비틀즈: 락 밴드 +R9JP69 = 비틀즈: 락 밴드 +R9KE20 = 그루빙의 블록들 +R9LE41 = 밤샘 파티 +R9LP41 = 걸즈 라이브: 밤샘 파티 +R9ME5Z = 월드 챔피언쉽 육상경기 +R9MPFR = 동계 육상경기 2009 +R9NPMR = 패밀리 포츈즈 +R9OE69 = 타이거 우즈 PGA 투어 10 R9OK69 = 타이거 우즈 PGA 투어 10 -R9TK69 = 타이거 우즈 PGA Tour 09 ALL-PLAY +R9OP69 = 타이거 우즈 PGA 투어 10 +R9QPNG = 댄스 파티 클럽 히트 +R9RPNG = 댄스 파티 팝 히트 +R9SPPL = 스도쿠 볼: 탐정 +R9TE69 = 타이거 우즈 PGA 투어 09 올 플레이 +R9TJ13 = 타이거 우즈 PGA 투어 09 올 플레이 +R9TK69 = 타이거 우즈 PGA 투어 09 올 플레이 +R9TP69 = 타이거 우즈 PGA 투어 09 올 플레이 +R9UE52 = 빌드 어 베어 워크샵: 프렌드쉽 밸리 +R9UPGY = 빌드 어 베어 워크샵: 프렌드쉽 밸리 +R9VE52 = 카벨라의 야외 모험 2010 +R9WPSP = WSC 리얼 09: 월드 스누커 챔피언쉽 +R9XE52 = 아케이드 존 +R9XP52 = 아케이드 존 +R9YES5 = 슬레드 쉬레드 +R9ZE54 = 메이저 리그 야구 2K9 +RAAE01 = Wii 시동 디스크 +RB2E6K = 벌룬 팝 +RB2J2K = 레인보우 팝 +RB2PGT = 팝! +RB4E08 = 레지던트 이블 4: Wii 에디션 +RB4J08 = 바이오하자드 4: Wii 에디션 +RB4P08 = 레지던트 이블 4: Wii 에디션 +RB4X08 = 레지던트 이블 4: Wii 에디션 +RB5E41 = 브라더스 인 암즈: 언드 인 블러드 +RB5P41 = 브라더스 인 암즈: 언드 인 블러드 +RB6J18 = 봄버맨 +RB7E54 = 불리: 장학금 에디션 +RB7P54 = 불리: 장학금 에디션 +RB8E70 = 백야드 야구 '09 +RB9D78 = 브라츠: 영화 +RB9E78 = 브라츠: 영화 +RB9P78 = 브라츠: 영화 +RB9X78 = 브라츠: 영화 +RB9Y78 = 브라츠: 영화 +RBAE41 = 블레이징 엔젤: WWII의 스쿼드 +RBAP41 = 블레이징 엔젤: WWII의 스쿼드 +RBBE18 = 봄버맨 랜드 Wii +RBBJ18 = 봄버맨 랜드 Wii +RBBP99 = 봄버맨 랜드 Wii +RBCP41 = TV 중독자들 +RBEE52 = 꿀벌 대소동 영화 게임 +RBEP52 = 꿀벌 대소동 영화 게임 +RBEX52 = 꿀벌 대소동 영화 게임 +RBFE20 = 분노의 핑퐁 +RBFP7J = 분노의 핑퐁 +RBGE54 = 더 빅스 +RBGP54 = 더 빅스 +RBHE08 = 레지던트 이블 아카이브스: 레지던트 이블 제로 +RBHJ08 = 바이오하자드 0 +RBHP08 = 레지던트 이블 아카이브스: 레지던트 이블 제로 +RBIEE9 = 하베스트 문: 동물 퍼레이드 +RBIJ99 = 목장 이야기: 두근 두근 동물 행진 +RBIP99 = 하베스트 문: 동물 퍼레이드 +RBKE69 = 붐 블록스 +RBKJ13 = 붐 블록스 RBKK69 = 붐 블록스 +RBKP69 = 붐 블록스 +RBLE8P = 블리치: 조각난 블레이드 +RBLJ8P = 블리치: 백인이 빛나는 윤무곡 +RBLP8P = 블리치: 조각난 블레이드 +RBME5G = 버스트 어 무브 배쉬! +RBMPGT = 버스트 어 무브 +RBNEG9 = 벤 10: 지구의 수호자 +RBNPG9 = 벤 10: 지구의 수호자 +RBNXG9 = 벤 10: 지구의 수호자 +RBOE69 = 부기 +RBOP69 = 부기 +RBPE4Z = 브런즈윅 프로 볼링 +RBPPGT = 브런즈윅 프로 볼링 +RBQENR = 클래식 브리티쉬 모터 레이싱 +RBQPUG = 클래식 브리티쉬 모터 레이싱 +RBRE5G = 블래스트 웍스: 빌드, 트레이드, 디스트로이 +RBRP5G = 블래스트 웍스: 빌드, 트레이드, 디스트로이 +RBRX5G = 블래스트 웍스: 빌드, 트레이드, 디스트로이 +RBSJ08 = 전국 바사라 2 영웅외전 (더블 팩) +RBTE8P = 세가 배스 낚시 +RBTJ8P = 세가 배스 낚시 +RBTP8P = 세가 배스 낚시 +RBUE08 = 레지던트 이블: 엄브렐러 크로니컬즈 +RBUJ08 = 하자드: 엄브렐러 크로니컬즈 RBUK08 = 바이오하자드: 엄브렐러 크로니컬즈 +RBUP08 = 레지던트 이블: 엄브렐러 크로니컬즈 +RBVE52 = 바비 공주와 숲 속 친구들 +RBVP52 = 바비 공주와 숲 속 친구들 +RBWE01 = 돌격!! 패미컴 대전 2 +RBWJ01 = 돌격!! 패미컴 대전 vs. +RBWP01 = 돌격!! 패미컴 대전 2 +RBXJ8P = 블리치: vs. 크루세이드 +RBYE78 = 신나는 동물농장 +RBYJ78 = 신나는 동물농장: 주인공은 나야, 젖소 오티스 +RBYP78 = 신나는 동물농장 +RBZE5Z = 빌리는 마법사: 로켓 빗자루 레이싱 +RBZPUG = 빌리는 마법사: 로켓 빗자루 레이싱 +RBZXUG = 빌리는 마법사: 로켓 빗자루 레이싱 +RC2E78 = 카즈: 메이터-내셔널 챔피언쉽 +RC2P78 = 카즈: 메이터-내셔널 챔피언쉽 +RC2X78 = 카즈: 메이터-내셔널 +RC2Y78 = 카즈: 메이터-내셔널 +RC3E41 = 애완동물 고양이들 2 +RC3J41 = 고양이와 마법의 모자 +RC3P41 = 고양이들 +RC3X41 = 고양이들 +RC4JD9 = 크레용 신 짱: 최강 가족 카스카베 왕 Wii +RC4SGT = 짱구는 못말려: 새로운 모험 Wii +RC5JDQ = 청소 전대 크린 키퍼 +RC7E20 = 바다 몬스터들: 선사시대 모험 +RC7P7J = 바다 몬스터들: 선사시대 모험 +RC8E7D = 크래쉬: 마인드 오버 뮤턴트 +RC8P7D = 크래쉬: 마인드 오버 뮤턴트 +RC8X7D = 크래쉬: 마인드 오버 뮤턴트 +RC9PGN = CID: 더미 +RCAE78 = 카 +RCAJ78 = 카 +RCAP78 = 카 +RCAX78 = 카 +RCAY78 = 카 +RCBE52 = 카벨라의 위대한 게임 사냥꾼 +RCBP52 = 카벨라의 위대한 게임 사냥꾼 +RCCE5G = 쿠킹 마마: 요리 경연 대회 +RCCJC0 = 쿠킹 마마: 모두와 함께 요리 대회 +RCCPGT = 쿠킹 마마 +RCDD52 = 콜 오브 듀티 3 +RCDE52 = 콜 오브 듀티 3 +RCDP52 = 콜 오브 듀티 3 +RCDX52 = 콜 오브 듀티 3 +RCEE5Z = 미니: 데스크탑 레이싱 +RCEPUG = 미니: 데스크탑 레이싱 +RCEXUG = 미니: 데스크탑 레이싱 +RCFE41 = 코스믹 패밀리 +RCFP41 = 코스믹 패밀리 +RCGE54 = 카니발 게임즈 +RCGP54 = 카니발 게임즈 +RCHEAF = 위 치어 +RCHJAF = 위 치어 +RCHPGT = 위 치어 +RCIE41 = CSI: 구체적인 증거 +RCIP41 = CSI: 구체적인 증거 +RCJE8P = 컨듀잇 +RCJP8P = 컨듀잇 +RCKPGN = 앨런 한센의 스포츠 도전 +RCLE4Q = 디즈니의 치킨 리틀: 액션 에이스 +RCLP4Q = 디즈니의 치킨 리틀: 액션 에이스 +RCOJ99 = 명탐정 코난: 추억의 환상 +RCOK99 = 명탐정 코난: 추억의 환상 RCOKZF = 명탐정 홈즈 추억의 환상 -RD2K41 = 레드스틸2 -RDXKA4 = 데카스포르타 Wii로 즐기는 스포츠 +RCOPNP = 명탐정 코난: 추억의 환상 +RCPE18 = 코로린파: 구슬 매니아 +RCPJ18 = 코로린파 +RCPP18 = 코로린파 +RCQEDA = 페니 레이서즈 파티: 터보-Q 스피드웨이 +RCQJDA = 초로 Q Wii +RCRE5D = 크루즌 +RCRP5D = 크루즌 +RCSE20 = 치킨 사격 +RCSP7J = 치킨 사격 +RCTE5Z = 카운터 포스 +RCTPGT = 카운터 포스 +RCUE52 = 카벨라의 전설적인 모험 +RCVE41 = 파 크라이: 복수 +RCVP41 = 파 크라이: 복수 +RCXE78 = 올 스타 치어 스쿼드 +RCXP78 = 올 스타 치어리더 +RCXX78 = 올 스타 치어리더 +RCYPGN = 체거 파티 퀴즈 +RD2E41 = 레드 스틸 2 +RD2J41 = 레드 스틸 2 +RD2K41 = 레드 스틸 2 +RD2P41 = 레드 스틸 2 +RD2X41 = 레드 스틸 2 +RD4EA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 2 +RD4JA4 = 댄스 댄스 레볼루션: 푸루푸루♪ 파티 +RD4PA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 2 +RD6EE9 = 동물 왕국: 야생동물 탐험 +RD6J8N = 동물 기상천외! 신비의 낙원에서 스쿠프 사진을 격사하라! +RD6PNP = 사파'Wii +RD8E52 = 스타와 함께 춤을 +RD9J18 = 퍼즐 시리즈 Vol.1 스도쿠 +RDAE52 = 스타와 함께 춤을: 위 댄스! +RDBE70 = 드래곤 볼 Z: 격투 천하제일 무도회 2 +RDBJAF = 드래곤 볼 Z: 스파킹! 네오 +RDBPAF = 드래곤 볼 Z: 격투 천하제일 무도회 2 +RDCE78 = 치명적인 생물들 +RDCP78 = 치명적인 생물들 +RDDEA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 +RDDJA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 +RDEJ0A = 전국 데코토라 축제 +RDFE41 = 숀 화이트 스노우보딩: 로드 트립 +RDFP41 = 숀 화이트 스노우보딩: 로드 트립 +RDGEA4 = 캐슬베니아 저지먼트 +RDGJA4 = 악마성 드라큘라 저지먼트 +RDGPA4 = 캐슬베니아 저지먼트 +RDHE78 = 모든 인류를 파괴하라! 빅 윌리 언리시쉬드 +RDHP78 = 모든 인류를 파괴하라! 빅 윌리 언리시쉬드 +RDIE41 = 강아지 섬 +RDIJG2 = 강아지 섬: 한편의 꽃 이야기 +RDIP41 = 강아지 섬 +RDJE4F = 데스 주니어: 악의 근원 +RDJP4F = 데스 주니어: 악의 근원 +RDKE01 = 동키 콩: 배럴 블래스트 +RDKJ01 = 동키 콩 타루 제트 레이스 +RDKP01 = 동키 콩: 제트 레이스 +RDLE5G = 건조한 시리얼의 스파이 폭스 +RDLP70 = 건조한 시리얼의 스파이 폭스 +RDME6K = 도미노 랠리 +RDMJ8N = 고! 고! 미논 +RDMPHZ = 미논: 매일매일 영웅 +RDNEA4 = 댄스 댄스 레볼루션: 디즈니 그루브 +RDOE41 = 애완동물 강이지들 2 +RDOJ41 = 강아지와 마법의 모자 +RDOP41 = 강아지들 +RDOX41 = 강아지들 +RDPE54 = 도라: 눈의 공주 구출작전 +RDPP54 = 도라: 눈의 공주 구출작전 +RDPX54 = 도라: 눈의 공주 구출작전 +RDQEGD = 드래곤 퀘스트 소드: 가면의 여왕과 거울의 탑 +RDQJGD = 드래곤 퀘스트 소드: 가면의 여왕과 거울의 탑 +RDQPGD = 드래곤 퀘스트 소드: 가면의 여왕과 거울의 탑 +RDREA4 = 듀이의 모험 +RDRJA4 = 수정 듀이의 대모험 +RDRPA4 = 듀이의 모험 +RDSE70 = 드래곤 볼 Z: 격투 천하제일 무도회 3 +RDSJAF = 드래곤 볼 Z: 스파킹! 메테오 +RDSPAF = 드래곤 볼 Z: 격투 천하제일 무도회 3 +RDTEAF = 타마고치: 파티 온! +RDTJAF = 타마고치의 반짝반짝 대통령! +RDTPAF = 타마고치: 파티 온! +RDUJDQ = 스고로 연대기 - 오른손에 칼을 왼손에 주사위를 +RDVE41 = 드라이버: 평행선 +RDVP41 = 드라이버: 평행선 +RDWEG9 = 드래곤 블레이드: 화염의 분노 +RDWJG9 = 드래곤 블레이드: 화염의 분노 +RDWPG9 = 드래곤 블레이드: 화염의 분노 +RDXE18 = 데카 스포츠 +RDXJ18 = 데카 스포르타 +RDXKA4 = 데카 스포르타 Wii로 즐기는 스포츠 +RDXP18 = 스포츠 아일랜드 +RDYEGN = CID: 더미 +RDZJ01 = 재앙: 위기의 날 +RDZP01 = 재앙: 위기의 날 +RE3ENR = WWII 에이스들 +RE4E08 = 레지던트 이블 아카이브스: 레지던트 이블 +RE4J08 = 바이오하자드 +RE4P08 = 레지던트 이블 아카이브스: 레지던트 이블 +RE5PAF = 문차블즈 +RE6PRT = 하계 도전: 운동경기 토너먼트 +RE7PNK = 사냥 도전 +RE8J99 = 가정교사 히트맨 부활! 금단의 어둠의 델타 +REAE69 = 셀리브리티 스포츠 쇼다운 +REAF69 = 셀리브리티 스포츠 쇼다운 +REAP69 = 셀리브리티 스포츠 쇼다운 +REBE4Z = 미스터 빈의 와키 월드 +REBPMT = 미스터 빈의 와키 월드 +RECE6K = 스파이 게임즈: 엘리베이터 미션 +REDE41 = 레드 스틸 +REDJ41 = 레드 스틸 +REDP41 = 레드 스틸 +REFP41 = 내 프랑스어 코치: 프랑스어 향상 +REGE36 = 긴급 대혼란 +REGP36 = 긴급 대혼란 +REHE41 = 긴급 영웅들 +REHP41 = 긴급 영웅들 +REJEAF = 엑티브 라이프: 극한 도전 +REJJAF = 패밀리 트레이너 2 +REJPAF = 패밀리 트레이너: 극한 도전 +REKE41 = 골드의 체육관: 심장 강화 운동 +REKJ2N = 쉐이프 복싱 Wii로 다이어트를 즐기세요! +REKP41 = 나의 피트니스 코치: 심장 강화 운동 +REKU41 = 나의 피트니스 코치: 심장 강화 운동 +RELEA4 = 엘레비츠 +RELJA4 = 엘레비츠 RELKA4 = 엘레비츠 -RFPK01 = 위 피트 플러스 +RELPA4 = 엘레비츠 +REMJ8P = 도라에몽 Wii: 비밀 도구왕 결정전! +RENE8P = 소닉과 검은 기사 +RENJ8P = 소닉과 검은 기사 +RENP8P = 소닉과 검은 기사 +REQE54 = 화이팅, 디에고, 화이팅! 사파리 구조대 +REQP54 = 화이팅, 디에고, 화이팅! 사파리 구조대 +REQX54 = 화이팅, 디에고, 화이팅! 사파리 구조대 +REQY54 = 화이팅, 디에고, 화이팅! 사파리 구조대 +RESP41 = 내 스페인어 코치: 스페인어 향상 +RETJAF = 축제의 달인 +REUPNK = 나의 바디 코치 +REVJ8P = 기화기초: 해명편 +REWFMR = 내 승마 클럽: 신비한 애팔루사 트레일 +REWXMR = 내 승마 클럽: 신비한 애팔루사 트레일 +REWYMR = 내 승마 클럽: 신비한 애팔루사 트레일 +REXE01 = 익사이트 트럭 +REXJ01 = 익사이트 트럭 +REXP01 = 익사이트 트럭 +REYE4Q = 디즈니 싱 잇: 고등학교 뮤지컬 3 고학년 +REYP4Q = 디즈니 싱 잇: 고등학교 뮤지컬 3 +REYX4Q = 디즈니 싱 잇: 고등학교 뮤지컬 3 +REZEJJ = 프리츠 체스 +REZPKM = 프리츠 체스 +RF2E54 = 판타스틱 4: 실버서퍼의 위험 +RF2P54 = 판타스틱 4: 실버서퍼의 위험 +RF3E52 = 페라리 도전: 피렐리 트로피 +RF3P6M = 페라리 도전: 피렐리 트로피 +RF4E36 = 슈퍼 후르츠 폴 +RF4P6M = 슈퍼 후르츠 폴 +RF7J08 = 타츠노코 vs. 캡콤: 크로스 제너레이션 오브 히어로즈 +RF8E69 = 피파 08 +RF8J13 = 피파 08 +RF8K69 = 피파 08 +RF8P69 = 피파 08 +RF8X69 = 피파 08 +RF8Y69 = 피파 08 +RF9E69 = 피파 09 올 플레이 +RF9J13 = 피파 09 올 플레이 +RF9K69 = 피파 09 올 플레이 +RF9P69 = 피파 09 올 플레이 +RF9R69 = 피파 09 올 플레이 +RF9X69 = 피파 09 올 플레이 +RF9Y69 = 피파 09 올 플레이 +RFAEAF = 엑티브 라이프: 아웃도어 첼린지 +RFAJAF = 패밀리 트레이너: 운동경기 세계 +RFAPAF = 패밀리 트레이너 +RFBE01 = 끝없는 바다 +RFBJ01 = 끝없는 바다 +RFBP01 = 끝없는 바다 +RFCEGD = 파이널 판타지 크리스탈 연대기 - 크리스탈 소지자 +RFCJGD = 파이널 판타지 크리스탈 연대기 - 크리스탈 소지자 +RFCPGD = 파이널 판타지 크리스탈 연대기: 크리스탈 소지자 +RFEE01 = 파이어 엠블렘: 새벽의 여신 +RFEJ01 = 파이어 엠블렘 - 새벽의 여신 +RFEP01 = 파이어 엠블렘: 새벽의 여신 +RFFEGD = 파이널 판타지 크리스탈 연대기: 시간의 메아리 +RFFJGD = 파이널 판타지 크리스탈 연대기 - 시간의 메아리 +RFFPGD = 파이널 판타지 크리스탈 연대기: 시간의 메아리 +RFJJAF = 패밀리 쟈키 +RFKE41 = 나의 피트니스 코치 +RFKP41 = 나의 피트니스 코치: 좋은 몸을 유지합시다 +RFKX41 = 나의 피트니스 코치: 좋은 몸을 유지합시다 +RFLE69 = 매든 NFL 09 올 플레이 +RFLP69 = 매든 NFL 09 올 플레이 +RFLPWK = Wii 프리로더 +RFMJAF = 프로 야구 패밀리 스타디움 +RFNE01 = Wii 핏 +RFNJ01 = Wii 핏 +RFNK01 = Wii 피트 +RFNP01 = Wii 핏 +RFNW01 = Wii 핏 +RFOE52 = 스파이더맨: 친구 또는 적 +RFOP52 = 스파이더맨: 친구 또는 적 +RFOX52 = 스파이더맨: 친구 또는 적 +RFPE01 = Wii 핏 플러스 +RFPJ01 = Wii 핏 플러스 +RFPK01 = Wii 피트 플러스 +RFPP01 = Wii 핏 플러스 +RFPW01 = Wii 핏 플러스 +RFQE69 = 페이스브레이커 K.O. 파티 +RFQJ13 = 페이스브레이커 K.O. 파티 RFQK69 = 페이스브레이커: K.O. 파티 -RGHK52 = 기타히어로3: 레전드 오브 락 -RH6K69 = 해리포터와 혼혈왕자 +RFQP69 = 페이스브레이커: K.O. 파티 +RFRE5G = 푸루푸루 공원 +RFRJC0 = 푸루푸루 공원 +RFSEEB = 풍래의 시렌 +RFSJ8P = 이상한 던전 풍래의 시렌 3 - 태엽장치 저택의 잠자는 공주 +RFTE70 = 백야드 풋볼 +RFUJA4 = 마작 격투 클럽 Wii: Wi-Fi 지원 +RFVE52 = 몽키 미스치프: 파티 타임 +RFVP52 = 몽키 미스치프! 20 게임 +RFWE5Z = 사파리 모험 아프리카 +RFWPNK = 사파리 모험 아프리카 +RFYFMR = 포트 보야르 +RFZE41 = 패션 파티를 상상해보세요 +RFZP41 = 패션 아이돌을 상상해보세요 +RG2EXS = 길티기어 이그젝스 액센트 코어 +RG2JJF = 길티기어 이그젝스 액센트 코어 +RG2PGT = 길티기어 이그젝스 액센트 코어 +RG4JC0 = 전차로 GO! 신칸센 EX 산요 신칸센편 +RG5EWR = 기네스 세계 기록: 비디오게임 +RG5PWR = 기네스 세계 기록: 비디오게임 +RG6E69 = 부기 슈퍼스타 +RG6P69 = 부기 슈퍼스타 +RG7EQH = 시티 빌더 +RG8E41 = 애완동물 스포츠 +RG8P41 = 애완동물 스포츠: 강아지 놀이터 +RG9E54 = 축제 게임들: 미니 골프 +RG9P54 = 축제 게임들: 미니 골프 +RGAE8P = 행성 51: 게임 +RGAP8P = 행성 51: 게임 +RGBE08 = 하비 버드맨: 변호사 +RGCEXS = 미니콥터 Wii 모험 비행 +RGCJJF = 쁘띠콥터 Wii - 모험 비행 +RGCPGT = 라디오 헬리콥터 +RGDEA4 = 타켓: 테러 +RGEJJ9 = 황금 달걀 - 황금 거위의 세계 +RGFE69 = 대부: 블랙핸드 에디션 +RGFF69 = 대부: 블랙핸드 에디션 +RGFI69 = 대부: 블랙핸드 에디션 +RGFP69 = 대부: 블랙핸드 에디션 +RGFS69 = 대부: 블랙핸드 에디션 +RGGJAF = 게게게의 키타로: 요괴 대운동회 +RGHE52 = 기타 히어로 III: 락의 전설들 +RGHJ52 = 기타 히어로 III: 락의 전설들 +RGHK52 = 기타 히어로 3: 락의 전설들 +RGHP52 = 기타 히어로 III: 락의 전설들 +RGIJC8 = G1 기수 Wii +RGIPC8 = G1 기수 Wii +RGJE4Z = 정글의 조지: 비밀 검색 +RGJP7U = 정글의 조지: 비밀 검색 +RGKENR = 키즈 스포츠: 크레이지 골프 +RGLE7D = 지오메트리 대전: 은하계 +RGLP7D = 지오메트리 대전: 은하계 +RGME5D = 빌리 & 맨드의 그림 모험 +RGMP5D = 빌리 & 맨드의 그림 모험 +RGNJAF = 은혼 해결사 튜브 - 츳코마블 동화 +RGOJJ9 = 더 월드 오브 골든 에그 닛산 노트 버전 +RGPJAF = 아니메 슬롯 레볼루션 파치슬롯 기동전사 건담 II - 슬픈 전사편 +RGQE70 = 고스트버스터즈: 비디오 게임 +RGQP70 = 고스트버스터즈: 비디오 게임 +RGSE8P = 고스트 스쿼드 +RGSJ8P = 고스트 스쿼드 +RGSP8P = 고스트 스쿼드 +RGTE41 = GT 프로 시리즈 +RGTJBL = GT 프로 시리즈 +RGTP41 = GT 프로 시리즈 +RGVE52 = 기타 히어로: 에어로스미스 +RGVJ52 = 기타 히어로: 에어로스미스 +RGVP52 = 기타 히어로: 에어로스미스 +RGWE41 = 엽기토끼: 집으로 +RGWJ41 = 엽기토끼: 집으로 +RGWP41 = 엽기토끼: 집으로 +RGWX41 = 엽기토끼: 집으로 +RGXE5D = 게임 파티 +RGXP5D = 게임 파티 +RGYE5Z = 액션 걸즈 레이싱 +RGYPUG = 액션 걸즈 레이싱 +RGZE70 = 고질라 언리쉬드 +RGZP70 = 고질라 언리쉬드 +RH2E41 = 헬 키친: 비디오 게임 +RH2P41 = 헬 키친 +RH3E4Q = 고등학교 뮤지컬 3: 고학년 댄스! +RH3J4Q = 고등학교 뮤지컬 댄스! +RH3P4Q = 고등학교 뮤지컬 3: 고학년 댄스! +RH4XUG = 햄스터 영웅들 +RH5EVN = 승마 인생 모험 +RH5PKM = 승마 인생 2 +RH6E69 = 해리 포터와 혼혈 왕자 +RH6K69 = 해리 포터와 혼혈 왕자 +RH6P69 = 해리 포터와 혼혈 왕자 +RH7J8P = 실전 파치슬롯 필승법! 사미의 컬렉션 북두의 권 Wii +RH8E4F = 툼 레이더: 언더월드 +RH8JEL = 툼 레이더: 언더월드 +RH8P4F = 툼 레이더: 언더월드 +RH9JC8 = 머나먼 시공 속에서 4 +RHAE01 = Wii 플레이 +RHAJ01 = 처음 만나는 Wii RHAK01 = 처음 만나는 Wii +RHAP01 = Wii 플레이 +RHAW01 = Wii 플레이 +RHCE52 = 히스토리 채널: 태평양 전쟁 +RHCP52 = 히스토리 채널: 태평양 전쟁 +RHDE8P = 하우스 오브 데드 2 & 3 리턴 +RHDJ8P = 하우스 오브 데드 2 & 3 리턴 +RHDP8P = 하우스 오브 데드 2 & 3 리턴 +RHEEJJ = 하인즈 볼프 교수의 중력 +RHEPKM = 하인즈 볼프 교수의 중력 +RHFE5D = 해피 피트 +RHFP5D = 해피 피트 +RHGP6Z = 에이전트 휴고: 레몬 트위스트 +RHGX6Z = 에이전트 휴고: 레몬 트위스트 +RHHJ8J = 스즈미야 하루히의 격동 +RHIEXJ = 승리를 거둔 복서들: 레볼루션 +RHIJJ9 = 시작의 일보 레볼루션 +RHIP41 = 승이를 거둔 복서들: 레볼루션 +RHJJ13 = 인생 테이블 게임즈 Wii +RHKE18 = 사람 구함: 50 개 엉뚱한 직업 +RHKJ18 = 일하는 사람 +RHKP18 = 잡 아일랜드: 열심히 일하는 사람들 +RHLE4Z = 월드 챔피언쉽 포커 하워드 레더러 참여: 올 인 +RHLPGT = 월드 챔피언쉽 포커 하워드 레더러 참여: 올 인 +RHMEE9 = 하베스트 문: 마법 멜로디 +RHMP99 = 하베스트 문: 마법 멜로디 +RHNE70 = 말과 나 +RHNP70 = 말과 나 +RHOE8P = 하우스 오브 데드: 오버킬 +RHOJ8P = 하우스 오브 데드: 오버킬 +RHOP8P = 하우스 오브 데드: 오버킬 +RHPJ8N = 악코로 폰! 이카사마 방랑기 +RHQE4Q = 한나 몬타나: 스포트라이트 월드 투어 +RHQP4Q = 한나 몬타나: 스포트라이트 월드 투어 +RHQX4Q = 한나 몬타나: 스포트라이트 월드 투어 +RHQY4Q = 한나 몬타나: 스포트라이트 월드 투어 +RHRJ99 = 가정교사 히트맨 REBORN! 드림 하이퍼 배틀! Wii +RHSE36 = 히트시커 +RHSP36 = 히트시커 +RHSX36 = 히트시커 +RHSY36 = 히트시커 +RHTE54 = 맨헌트 2 +RHTP54 = 맨헌트 2 +RHUE20 = 스케이트 시티 히어로즈 +RHUP7J = 스케이트 시티 히어로즈 +RHVE5Z = 크레이지 치킨 테일즈 +RHVPFR = 크레이지 치킨 테일즈 +RHWE52 = 핫 휠즈: 비트 댓! +RHWP52 = 핫 휠즈: 비트 댓! +RHXE78 = 밴드들의 배틀 +RHXP78 = 밴드들의 배틀 +RHYJAF = 하네루노 토비라 Wii 기리기릿스 +RHZE41 = 애완동물 말들 2 +RHZP41 = 피파 푸넬: 목장 구조대 +RI2E4Q = 고등학교 뮤지컬: 싱 잇! +RI2P4Q = 디즈니 싱 잇: 고등학교 뮤지컬 +RI3E5D = 앤트 불리 +RI3P5D = 앤트 불리 +RI6ENR = 하계 스포츠 2: 아일랜드 스포츠 파티 +RI6P41 = 하계 스포츠 파티 +RI7E4Z = 몬스터 대혼란: 빌드 앤 배틀 +RI8E41 = 브라더스 인 암스: 로드 투 힐 30 +RI8P41 = 브라더스 인 암스: 로드 투 힐 30 +RI9EGT = 디바 걸즈: 빙상의 디바 +RI9PGT = 디바 걸즈: 빙상의 공주 +RIAE52 = 아이스 에이지: 공룡시대 +RIAI52 = 아이스 에이지 3: 공룡시대 +RIAP52 = 아이스 에이지 3: 공룡시대 +RIBES5 = 이고르 게임 +RIBPKM = 이고르: 게임 +RICENR = 강철 쉐프 아메리카: 최고의 요리 +RIDE20 = 스마일리 월드: 아일랜드 챌린지 +RIDP7J = 스마일리 월드: 아일랜드 챌린지 +RIEEA4 = 카라오케 레볼루션 제공: 아메리카 아이돌 앙코르 +RIFEA4 = 카라오케 레볼루션 제공: 아메리카 아이돌 앙코르 2 +RIGE54 = 파이팅, 디에고, 파이팅! 위대한 다이노소어 구조대 +RIGP54 = 파이팅, 디에고, 파이팅! 위대한 다이노소어 구조대 +RIHE8P = 인크레더블 헐크 +RIHP8P = 인크레더블 헐크 +RIIEQH = 카트 레이서 +RIIPNG = 카트 레이서 +RIJE69 = G.I. 조: 전쟁의 서막 +RIJP69 = G.I. 조: 전쟁의 서막 +RIKEQH = 트럭 레이서 +RIKPNG = 트럭 레이서 +RILJ18 = 퍼즐 시리즈 볼륨 2: 일러스트 로직 + 컬러풀 로직 +RIME36 = 불가능한 임무 +RIMP6M = 불가능한 임무 +RINE08 = 데드 라이징: 찹 틸 유 드롭 +RINJ08 = 데드 라이징: 좀비의 희생 +RINP08 = 데드 라이징: 찹 틸 유 드롭 +RIOPSU = 끔찍한 역사 : 무자비한 로마인들 +RIPEAF = 원피스 언리미티드 어드벤쳐 +RIPJAF = 원피스 언리미티드 어드벤쳐 +RIQPUJ = 아이스 댄싱 +RIRE8P = 아이언맨 +RIRP8P = 아이언맨 +RITFMR = 인터빌즈: 공식 게임 +RIUJAF = 원피스: 언리미티드 크루즈 에피소드 2 - 눈을 뜨는 용자 +RIUPAF = 원피스: 언리미티드 크루즈 2: 영웅의 각성 +RIVEXJ = 아이비 더 키위? +RIVJAF = 아이비 더 키위? +RIVP99 = 아이비 더 키위? +RIWENR = 버거 아일랜드 +RIXE20 = 닷지 레이싱: 차져 vs. 도전자 +RIXP7J = 닷지 레이싱: 차져 vs. 도전자 +RIYE52 = 스페이스 캠프 +RIYP52 = 스페이스 캠프 +RIZENR = 인디애나폴리스 500 전설들 +RJ2E52 = 007: 퀀텀 오브 솔러 +RJ2JGD = 007: 위로의 보수 +RJ2P52 = 007: 퀀텀 오브 솔러 +RJ3E20 = 지프 스릴 +RJ3P7J = 지프 스릴 +RJ4ENR = 쥬얼 마스터: 로마의 요람 +RJ4PRM = 쥬얼 마스터: 로마의 요람 +RJ6E69 = 마이심즈: 하늘의 영웅들 +RJ6P69 = 마이심즈: 하늘의 영웅들 +RJ7FWP = TV 7 게임: 화살표 단어 +RJ8E64 = 인디아나 존스와 왕의 지팡이 +RJ8P64 = 인디아나 존스와 왕의 지팡이 +RJ9FMR = 씽크 로직 트레이너 +RJ9HMN = 씽크 로직 트레이너 +RJ9PFR = 씽크 로직 트레이너 +RJ9XML = 씽크 로직 트레이너 +RJAD52 = 콜 오브 듀티: 현대 전쟁 - 리플렉스 에디션 +RJAE52 = 콜 오브 듀티: 현대 전쟁 - 리플렉스 에디션 +RJAP52 = 콜 오브 듀티: 현대 전쟁 - 리플렉스 에디션 +RJAX52 = 콜 오브 듀티: 현대 전쟁 - 리플렉스 에디션 +RJBJAF = 대괴수 배틀 울트라 콜로세움 +RJCE52 = 스코어 인터내셔널 바자 1000: 월드 챔피언쉽 오프로드 레이싱 +RJCP52 = 스코어 인터내셔널 바자 1000: 월드 챔피언쉽 오프로드 레이싱 +RJDPKM = 나의 동물 센터 +RJEE70 = 젠가 월드 투어 +RJEP70 = 젠가 월드 투어 +RJFE5G = 질리안 마이클스의 피트니스 얼티메이텀 2009 +RJFPKM = 질리안 마이클스의 피트니스 얼티메이텀 2009 +RJGJDA = 인생 게임 Wii +RJHE52 = 마다가스카 카트즈 +RJHP52 = 마다가스카 카트즈 +RJIP6M = 페라리: 레이스 경험 +RJJE8P = 잠보! 사파리 동물 구조대 +RJJP8P = 잠보! 사파리 +RJMERS = 점퍼: 그리핀 이야기 +RJMPRS = 점퍼: 그리핀 이야기 +RJNE20 = 빌드 '엔 레이스 +RJOEXJ = 주온: 그루지 +RJOJJ9 = 공포 체감 주원 +RJOP99 = 주온 그루지 +RJPJA4 = 실황 파워풀 프로 야구 Wii +RJQE5G = 파자마 샘: 어둠을 두려워하지 마세요 +RJQP70 = 파자마 샘: 어두운 곳에서 숨을 필요가 없어요 +RJREA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 3 +RJRJA4 = 댄스 댄스 레볼루션: 뮤직 핏 +RJRPA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 3 +RJSENR = 카와사키 제트 스키 +RJSPUG = 카와사키 제트 스키 +RJSXUG = 카와사키 제트 스키 +RJTJ01 = 모두의 상식력 텔레비전 +RJVEGN = 히스테리 병원: 응급실 +RJVPGN = 히스테리 병원: 응급실 +RJWJEL = 자와: 매머드와 비밀 석조 +RJXE5G = 고 플레이 벌목꾼 +RJXXFR = 고 플레이 벌목꾼 +RJYE5Z = 피즈위즐 의사의 동물 구조대 +RJZP7U = SNK 아케이드 클래식스 볼륨 1 +RK2EEB = 트라우마 센터: 새로운 피 +RK2JEB = 트라우마 센터: 새로운 피 +RK2P01 = 트라우마 센터: 새로운 피 +RK3J01 = 앤드 검색 +RK4JAF = 결계사: 흑망루의 그림자 +RK5E01 = 털실 커비의 이야기 +RK5J01 = 털실 커비의 이야기 RK5K01 = 털실 커비의 이야기 +RK5P01 = 털실 커비의 이야기 +RK6E18 = 구슬 이야기: 코로린파 +RK6J18 = 코로린파 2 - 앤써니와 황금 해바라기 씨앗 +RK6P18 = 마블! 균형 도전 +RK7J0A = 황금의 굴레 +RK8E54 = 메이저 리그 야구 2K8 +RK9EA4 = 카라오케 레볼루션 +RK9PA4 = 카라오케 레볼루션 +RKAE6K = 얼티밋 슈팅 컬렉션 +RKAJMS = 마일스톤 슈팅 컬렉션 카라스 Wii RKAK8M = 마일스톤 슈팅 컬렉션 카라스 Wii +RKBE41 = 크랜니움 카부키 +RKBP41 = 크랜니움 카부키 +RKDEEB = 트라우마 센터: 다른 의사의 진단 +RKDJEB = 카두케우스 Z: 2개의 초집도 +RKDP01 = 트라우마 센터: 다른 의사의 진단 +RKEENR = 케이트 웨스트: 사라지는 파일들 +RKEPGN = 케이트 웨스트: 사라지는 파일들 +RKFEH4 = 킹 오브 파이터즈 컬렉션: 오로치 사가 RKFKZA = 킹 오브 파이터즈 컬렉션 오로치 사가 -RKPK52 = 쿵푸팬더 +RKFP7U = 킹 오브 파이터즈 컬렉션: 오로치 사가 +RKGEGY = 브라츠 키즈: 수면 파티 +RKGPGY = 브라츠: 키즈 파티 +RKHE52 = 쿵푸 팬더: 전설적인 전사들 +RKHP52 = 쿵푸 팬더: 전설적인 전사들 +RKIENR = 키즈 스포츠: 아이스 하키 +RKIPUG = 키즈 스포츠: 아이스 하키 +RKIXUG = 키즈 스포츠: 아이스 하키 +RKJJ0Q = 재단법인 일본 한자 능력 검정 협회 공식 소프트 250 만명의 한검 Wii +RKKE6K = 천상의 수호자 +RKLEG9 = 코렐라인 +RKLPG9 = 코렐라인 +RKME5D = 모탈 컴뱃: 아마겟돈 +RKMP5D = 모탈 컴뱃: 아마겟돈 +RKNJ2N = 재단법인 일본 한자 능력 검정 협회 공인 한검 Wii 한자왕 결정전 +RKOJBL = 리락쿠마: 모두 느긋한 생활 +RKPE52 = 쿵푸 팬더 +RKPJ52 = 쿵푸 팬더 +RKPK52 = 쿵푸 팬더 +RKPP52 = 쿵푸 팬더 +RKPV52 = 쿵푸 팬더 +RKPX52 = 쿵푸 팬더 +RKPY52 = 쿵푸 팬더 +RKQENR = 캔디스 케인의 사탕 공장 +RKSENR = 키즈 스포츠: 농구 +RKSPUG = 키즈 스포츠: 농구 +RKSXUG = 키즈 스포츠: 농구 +RKTENR = 키즈 스포츠: 인터내셔널 축구 +RKTXUG = 키즈 스포츠: 인터내셔널 축구 +RKVE54 = 더 빅스 2 +RKVP54 = 더 빅스 2: 야구 +RKWJ18 = 직소퍼즐 오늘의 강아지 +RKXE69 = 락 밴드 +RKXP69 = 락 밴드 +RKYE20 = 아미맨: 비운의 군인들 +RKYP7J = 아미맨: 비운의 군인들 +RKZEA4 = 로스트 인 블루: 난파 +RKZJA4 = 서바이벌 키즈 Wii +RKZPA4 = 로스트 인 블루: 난파 +RL2E78 = 갤럽 & 라이드! +RL2HMN = 말과 조랑말: 나의 마굿간 +RL2PFR = 말과 조랑말: 나의 마굿간 +RL3EMJ = 룩소르 3 +RL4E64 = 레고 인디아나 존스 2: 모험은 계속 +RL4P64 = 레고 인디아나 존스 2: 모험은 계속 +RL5E52 = 아이칼리 +RL5P52 = 아이칼리 +RL6E69 = 너프 N-스트라이크 엘리트 +RL7E69 = 아주 작은 애완동물 샵: 친구들 +RL7P69 = 아주 작은 애완동물 샵: 친구들 +RL8E54 = MLB 파워 프로스 2008 +RL9PHZ = 당구의 왕 +RLADMR = 딜 오어 노 딜: 뱅커가 돌아왔다 +RLAE20 = 딜 오어 노 딜 +RLAPMR = 딜 오어 노 딜: 뱅커가 돌아왔다 +RLBEWR = 레고 배트맨: 비디오게임 +RLBPWR = 레고 배트맨: 비디오게임 +RLCP7J = 사랑은... 활짝 폈습니다 +RLDEGY = 용의 전설 +RLDPFK = 용의 전설 +RLEEFS = 텐 핀 앨리 2 +RLFE64 = 스타 워즈 클론 전쟁: 광선검 결투 +RLFP64 = 스타 워즈 클론 전쟁: 광선검 결투 +RLGE64 = 레고 스타 워즈: 컴플리트 사가 +RLGJ52 = 레고 스타 워즈: 컴플리트 사가 +RLGP64 = 레고 스타 워즈: 컴플리트 사가 +RLHE52 = 리틀 리그 월드 시리즈 야구 2008 +RLHP52 = 리틀 리그 월드 시리즈 야구 2008 +RLIE64 = 레고 인디아나 존스: 오리지널 어드벤처스 +RLIP64 = 레고 인디아나 존스 : 오리지널 어드벤처스 +RLJEHJ = 라인 라이더 2: 언바운드 +RLJPKM = 라인 라이더 프리스타일 +RLKEGY = 코드 료코: 인피니티 퀘스트 +RLKPFK = 코드 료코: 인피니티 퀘스트 +RLLP70 = 서부로 가자! 럭키 루크의 모험 +RLNEVN = 생존자 +RLNFMR = 생존자 +RLNHMR = 생존자 +RLNIMR = 생존자 +RLNPMR = 생존자 +RLPE69 = 아주 작은 애완동물 샵 +RLPP69 = 아주 작은 애완동물 샵 +RLQE52 = 빅 리그 스포츠 +RLQP52 = 월드 챔피언쉽 스포츠 +RLRE4F = 툼 레이더: 애니버서리 +RLRJEL = 툼 레이더: 애니버서리 +RLRP4F = 툼 레이더: 애니버서리 +RLSE8P = 외계인 증후군 +RLSP8P = 외계인 증후군 +RLTENR = 런던 택시: 러쉬 아워 +RLTXUG = 런던 택시: 러쉬 아워 +RLUE4Q = 볼트 +RLUP4Q = 볼트 +RLUR4Q = 볼트 +RLUX4Q = 볼트 +RLUY4Q = 볼트 +RLVE78 = 아바타: 최후의 에어벤더 +RLVP78 = 아바타: 앙의 전설 +RLWE78 = 라따뚜이 +RLWJ78 = 라따뚜이 +RLWP78 = 라따뚜이 +RLWW78 = 라따뚜이 +RLWX78 = 라따뚜이 +RLWY78 = 라따뚜이 +RLWZ78 = 라따뚜이 +RLXEMJ = 룩소르: 파라오의 도전 +RLXP36 = 룩소르: 파라오의 도전 +RLYEWR = 루니 툰즈: 애크메 무기창고 +RLYPWR = 루니 툰즈: 애크메 무기창고 +RLZE4Z = 디펜딩 드 펭귄 +RLZPXT = 디펜딩 드 펭귄 +RM2E69 = 메달 오브 아너: 영웅들 2 +RM2J13 = 메달 오브 아너: 영웅들 2 +RM2P69 = 메달 오브 아너: 영웅들 2 +RM2U69 = 메달 오브 아너: 영웅들 2 +RM2X69 = 메달 오브 아너: 영웅들 2 +RM3E01 = 메트로이드 프라임 3: 오염 +RM3J01 = 메트로이드 프라임 3: 오염 +RM3P01 = 메트로이드 프라임 3: 오염 +RM4E41 = 몬스터 4x4: 월드 서킷 +RM4J41 = 몬스터 4x4: 월드 서킷 +RM4P41 = 몬스터 4x4: 월드 서킷 +RM5E7D = 미이라: 용 황제의 무덤 +RM5P7D = 미이라: 용 황제의 무덤 +RM6EEB = 바로크 +RM6P99 = 바로크 +RM7E4F = 몬스터 랩 +RM7P4F = 몬스터 랩 RM8E01 = 마리오 파티 8 RM8J01 = 마리오 파티 8 RM8K01 = 마리오 파티 8 RM8P01 = 마리오 파티 8 +RM9EGM = 버섯맨: 포자 대전 +RM9PGM = 버섯맨: 포자 대전 +RMAE01 = 마리오 파워 테니스 +RMAJ01 = Wii로 즐기는 마리오 테니스 GC +RMAP01 = 마리오 파워 테니스 +RMBE01 = 마리오 슈퍼 강타자들 +RMBJ01 = 슈퍼 마리오 스타디움 패밀리 야구 +RMCE01 = 마리오 카트 Wii +RMCJ01 = 마리오 카트 Wii RMCK01 = 마리오 카트 Wii +RMCK50 = Wiimms 마리오 카트-텍스쳐즈 2022-12.한국 +RMCKBR = 마리오 카트 Brown +RMCP01 = 마리오 카트 Wii +RMDE69 = 매든 NFL 07 +RMDP69 = 매든 NFL 07 +RMEJDA = 메이저 Wii 던져라! 자이로 볼! +RMFE68 = AMF 볼링 핀버스터즈! +RMFP68 = AMF 볼링 핀버스터즈! +RMGE01 = 슈퍼 마리오 갤럭시 +RMGJ01 = 슈퍼 마리오 갤럭시 RMGK01 = 슈퍼 마리오 Wii 갤럭시 어드벤처 +RMGP01 = 슈퍼 마리오 갤럭시 +RMHE08 = 몬스터 헌터 3 +RMHJ08 = 몬스터 헌터 3 +RMHP08 = 몬스터 헌터 3 +RMIE20 = 마곳의 워드 브레인 +RMIP7J = 마곳의 워드 브레인 +RMJJC8 = 마작 대회 Wii +RMKE01 = 마리오 스포츠 믹스 +RMKJ01 = 마리오 스포츠 믹스 +RMKP01 = 마리오 스포츠 믹스 +RMLEH4 = 메탈 슬러그 앤솔로지 +RMLJH4 = 메탈 슬러그 컴플리트 RMLK52 = 메탈슬러그 컴플리트 -RNHK8M = 노 모어 히어로즈 -RNPK69 = 니드포스피드: 프로스트리트 +RMLP7U = 메탈 슬러그 앤솔로지 +RMME7U = 머큐리 멜트다운 레볼루션 +RMMJ7U = 참을 수 없을 정도로 즐거워 +RMMP7U = 머큐리 멜트다운 레볼루션 +RMNDFR = 나의 애완동물 호텔 +RMNHMN = 나의 애완동물 호텔 +RMNPFR = 나의 애완동물 호텔 +RMOE52 = 몬스터 잼 +RMOP52 = 몬스터 잼 +RMPE54 = MLB 파워 프로스 +RMQENR = 미쓰 메이커즈: 운명의 보주 +RMQPUG = 미쓰 메이커즈: 운명의 보주 +RMRE5Z = 코코토 매직 써커스 +RMRPNK = 코코토 매직 써커스 +RMRXNK = 코코토 매직 써커스 +RMSE52 = 마벨: 얼티밋 얼라이언스 2 +RMSP52 = 마벨: 얼티밋 얼라이언스 2 +RMTJ18 = 모모타로 전철 16 홋카이도 대이동의 권! +RMUE52 = 마벨: 얼티밋 얼라이언스 +RMUJ2K = 마벨: 얼티밋 얼라이언스 +RMUP52 = 마벨: 얼티밋 얼라이언스 +RMVE69 = 메달 오브 아너: 선봉 +RMVP69 = 메달 오브 아너: 선봉 +RMVX69 = 메달 오브 아너: 선봉 +RMWE20 = M&M의 카트 레이싱 +RMXE78 = MX vs. ATV: 언테임드 +RMXF78 = MX vs. ATV: 언테임드 +RMXP78 = MX vs. ATV: 언테임드 +RMYE5Z = 미쓰 메이커즈: 슈퍼 카트 GP +RMYPUG = 미쓰 메이커즈: 슈퍼 카트 GP +RMYXUG = 미쓰 메이커즈: 슈퍼 카트 GP +RMZE5Z = 미쓰 메이커즈: 토이랜드의 트릭시 +RMZPUG = 미쓰 메이커즈: 토이랜드의 트릭시 +RMZXUG = 미쓰 메이커즈: 토이랜드의 트릭시 +RN2EAF = 남코 뮤지엄 리믹스 +RN2P70 = 남코 뮤지엄 리믹스 +RN3E78 = 닉툰즈: 토이봇의 공격 +RN3J78 = 스폰지 밥과 친구들: 토이봇의 공격 +RN3P78 = 닉툰즈: 토이봇의 공격 +RN3X78 = 닉툰즈: 토이봇의 공격 +RN4E41 = 던 오브 디스커버리 +RN4P41 = ANNO: 신세계 창조 +RN5E78 = 네이키드 브라더스 밴드: 비디오 게임 +RN5P78 = 네이키드 브라더스 밴드: 비디오 게임 +RN6ENR = 북미 사냥 축제 +RN6P7J = 북미 사냥 축제 +RN7E78 = 네이버후드 게임즈 +RN7P78 = 빅 패밀리 게임즈 +RN8JC8 = 노부나가의 야망・혁신 파워 업 키트 +RN9E4F = 벌레 섬 탈출 +RN9JEL = 네크로네시아 +RN9P4F = 벌레 섬 탈출 +RNAE69 = NCAA 풋볼 09 올 플레이 +RNBE69 = NBA 라이브 08 +RNBP69 = NBA 라이브 08 +RNBX69 = NBA 라이브 08 +RNCEH4 = SNK 아케이드 클래식 볼륨 1 +RNDJAF = 노다메 칸타빌레 드림 오케스트라 +RNEEDA = 나루토 질풍전: 닌자 격돌 레볼루션 3 +RNEJDA = 나루토 질풍전: 격투 닌자 대전 EX 3 +RNEPDA = 나루토 질풍전: 닌자 격돌 레볼루션 3 +RNFE69 = 매든 NFL 08 +RNFP69 = 매든 NFL 08 +RNGJ99 = 네기마!? 네오 파크티오 파이트!! +RNHE41 = 노 모어★히어로즈 +RNHJ99 = 노 모어★히어로즈 +RNHK8M = 노 모어★히어로즈 +RNHP99 = 노 모어★히어로즈 +RNIPGT = 마음, 몸, 영혼 : 영양 문제 +RNJE4F = 미니 닌자들 +RNJP4F = 미니 닌자들 +RNKE69 = 너프 엔-스트라이크 +RNKP69 = 너프 엔-스트라이크 +RNME5Z = 닌자브레드 맨 +RNMPUG = 닌자브레드 맨 +RNMXUG = 닌자브레드 맨 +RNNE4Q = 나니아 연대기: 캐스피언의 왕자 +RNNJ4Q = 나니아 연대기: 캐스피언의 왕자 +RNNP4Q = 나니아 연대기: 캐스피언의 왕자 +RNNX4Q = 나니아 연대기: 캐스피언의 왕자 +RNNY4Q = 나니아 연대기: 캐스피언의 왕자 +RNNZ4Q = 나니아 연대기: 캐스피언의 왕자 +RNOJ01 = 또다른 코드: R 기억의 문 +RNOP01 = 또다른 코드: R - 잊어버린 기억 여행 +RNPE69 = 니드 포 스피드: 프로스트리트 +RNPJ13 = 니드 포 스피드: 프로스트리트 +RNPK69 = 니드 포 스피드: 프로스트리트 +RNPP69 = 니드 포 스피드: 프로스트리트 +RNPX69 = 니드 포 스피드: 프로스트리트 +RNPY69 = 니드 포 스피드: 프로스트리트 +RNRE41 = 니트로 바이크 +RNRJ41 = 니트로 바이크 +RNRP41 = 니트로 바이크 +RNSD69 = 니드 포 스피드: 카본 +RNSE69 = 니드 포 스피드: 카본 +RNSF69 = 니드 포 스피드: 카본 +RNSJ13 = 니드 포 스피드: 카본 +RNSP69 = 니드 포 스피드: 카본 +RNUE8P = 낸시 드류 : 아이시클 강의 하얀 늑대 +RNVE5Z = 아누비스 II +RNVPUG = 아누비스 II +RNVXUG = 아누비스 II +RNWJAF = 모두 놀자! 남코 카니발 RNWKAF = 남코 뮤지엄 리믹스 +RNXEDA = 나루토: 닌자 격돌 레볼루션 +RNXJDA = 나루토 질풍전: 격투 닌자 대전 EX +RNXPDA = 나루토: 닌자 격돌 레볼루션 +RNYEDA = 나루토: 닌자 격돌 레볼루션 2 +RNYJDA = 나루토 질풍전: 격투 닌자 대전 EX 2 +RNYPDA = 나루토: 닌자 격돌 레볼루션 2 +RNZE69 = 닌자 리플렉스 +RNZJ13 = 닌자 리플렉스 RNZK69 = 닌자 리플렉스 +RNZP69 = 닌자 리플렉스 +RO2E7N = 포드 레이싱 오프 로드 +RO2P7N = 오프 로드 +RO3EXJ = 작은 왕의 이야기 +RO3J99 = 임금님 이야기 +RO3P99 = 작은 왕의 이야기 +RO4JDA = 투진전 +RO5E52 = 핫 휠즈: 배틀 포스 5 +RO5P52 = 핫 휠즈: 배틀 포스 5 +RO7E7D = 스파이로의 전설: 영원한 밤 +RO7P7D = 스파이로의 전설: 영원한 밤 +RO8E7D = 스파이로의 전설: 용의 여명 +RO8P7D = 스파이로의 전설: 용의 여명 +RO8X7D = 스파이로의 전설: 용의 여명 +RO9EFS = 아쿠아 패닉! +RO9PNK = 아쿠아 패닉! +ROAE36 = 오버로드: 암흑 전설 +ROAP36 = 오버로드: 암흑 전설 +ROBE7U = 옵스큐어: 후유증 +ROBPPL = 옵스큐어 2 +ROCE5Z = 코코토 카트 레이서 +ROCPNK = 코코토 카트 레이서 +RODE01 = 춤춰라 메이드 인 와리오 +RODJ01 = 춤춰라 메이드 인 와리오 RODK01 = 춤춰라 메이드 인 와리오 +RODP01 = 춤춰라 메이드 인 와리오 +ROEEJZ = 강아지 호텔 +ROEPGT = 강아지 호텔 +ROFE5Z = 오프로드 익스트림! 스페셜 에디션 +ROFPUG = 오프로드 익스트림! +ROFXUG = 오프로드 익스트림! +ROGE78 = 탁과 그로스의 수호자들 +ROGP78 = 탁과 그로스의 수호자들 +ROHJAF = 해피 댄스 컬렉션 +ROJE52 = 라팔라: 위 피쉬 +ROJP52 = 라팔라: 위 피쉬 +ROKJ18 = 카라오케 조이사운드 Wii +ROLE8P = 마리오와 소닉 밴쿠버 동계 올림픽 +ROLJ01 = 마리오와 소닉 밴쿠버 동계 올림픽 ROLK01 = 마리오와 소닉 밴쿠버 동계올림픽 +ROLP8P = 마리오와 소닉 밴쿠버 동계 올림픽 +ROMJ08 = 몬스터 헌터 G +RONEG9 = 오네찬바라: 비키니 좀비 슬레이어즈 +RONJG9 = 오네찬바라 레볼루션 +RONPG9 = 오네찬바라: 비키니 좀비 슬레이어즈 +ROPE41 = 오픈 시즌 +ROPP41 = 오픈 시즌 +ROQJEP = 바로크 Wii +ROSJ01 = 마법의 택트 +ROTE20 = 트윈 스트라이크: 오퍼레이션 썬더 +ROTP7J = 트윈 스트라이크: 오퍼레이션 썬더 +ROUJAF = 원피스: 언리미티 크루즈 에피소드 1 - 파도에 흔들리는 비보 +ROUPAF = 원피스: 언리미티 크루즈 에피소드 1 - 파도에 흔들리는 비보 +ROVE6U = 플레이모빌: 써커스 +ROVPHM = 플레이모빌: 써커스 +ROWE08 = 오오카미 +ROWJ08 = 오오카미 +ROWP08 = 오오카미 +ROXE20 = 주문하세요! +ROXP7J = 주문하세요! +ROXX7J = 주문하세요! +ROYE41 = 하늘에서 음식이 내린다면 +ROYP41 = 하늘에서 음식이 내린다면 +ROYX41 = 하늘에서 음식이 내린다면 +RP2E69 = 잘난척쟁이 +RP2P69 = 잘난척쟁이 +RP3JAF = 프로 골퍼 사루 +RP4E69 = 마이심즈 파티 +RP4J13 = 나와 심의 거리 파티 +RP4P69 = 마이심즈 파티 +RP5JA4 = 실황 파워풀 프로 야구 15 +RP6E41 = 애완동물들: 크레이지 몽키즈 +RP6P41 = 애완동물들: 몽키 매드네스 +RP7E52 = 해적: 검은 수염의 전리품 사냥 +RP7P52 = 해적: 검은 수염의 전리품 사냥 +RP9ERS = 스페이스 침스 +RP9PRS = 스페이스 침스 +RP9XRS = 스페이스 침스 +RPAF70 = 키드 패들: 로스트 인 게임 +RPBE01 = 포켓몬 배틀 레볼루션 +RPBJ01 = 포켓몬 배틀 레볼루션 +RPBP01 = 포켓몬 배틀 레볼루션 +RPCE20 = 퍼즐러 컬렉션 +RPCP41 = 퍼즐러 컬렉션 +RPCX7J = 퍼즐러 컬렉션 +RPDEGN = PDC 월드 챔피언쉽 다츠 2008 +RPDPGN = PDC 월드 챔피언쉽 다츠 2008 +RPFE52 = 피트폴: 메이안 어드벤처 +RPFP52 = 피트폴: 메이안 어드벤처 +RPFU52 = 피트폴: 메이안 어드벤처 +RPGE5D = 램페이지: 토탈 디스트럭션 +RPGP5D = 램페이지: 토탈 디스트럭션 +RPHPPN = 페파 피그: 게임 +RPIE52 = 핌프 마이 라이드 +RPIP52 = 핌프 마이 라이드 +RPJE7U = 아크 라이즈 판타지아 +RPJJ99 = 아크 라이즈 판타지아 +RPKE52 = 포커 세계 시리즈: 챔피언스 2007 토너먼트 에디션 +RPKP52 = 포커 세계 시리즈: 챔피언스 2007 토너먼트 에디션 +RPLE52 = 라팔라 토너먼트 낚시 +RPLP52 = 라팔라 토너먼트 낚시 +RPMJA4 = 실황 파워풀 프로 메이저 리그 2 +RPNE78 = 파우스 & 클라우스 : 애완동물 리조트 +RPOEC8 = 오푸나 +RPOJC8 = 오푸나 +RPOPC8 = 오푸나 +RPPE41 = 페르시아 왕자: 숙명의 검 +RPPP41 = 페르시아 왕자: 숙명의 검 +RPQES5 = 당구 파티 +RPQPS5 = 당구 파티 +RPSE4Q = 디즈니 공주들: 매혹적인 여행 +RPSJ4Q = 디즈니 공주들: 마법의 세계로 +RPSP4Q = 디즈니 공주들: 매혹적인 여행 +RPTD52 = 퍼피 러브 +RPTE52 = 퍼피 러브: 당신의 새로운 최고의 친구 +RPTP52 = 퍼피 러브: 당신의 새로운 최고의 친구 +RPUJ8P = 뿌요 뿌요! 15 주년 +RPVE4Z = 펄 팔스 +RPVPKM = 펄 팔스 +RPWX41 = 페르시아 왕자: 망각의 모래 +RPWZ41 = 페르시아 왕자: 망각의 모래 +RPXE69 = EA 플레이그라운드 +RPXJ13 = EA 플레이그라운드 - 공원에서 놀자! +RPXP69 = EA 플레이그라운드 +RPYE9B = 슈퍼 스윙 골프 +RPYJ9B = 스윙 골프 팡야 +RPYP9B = 팡야! 스타일 골프 +RPZJA4 = 실황 파워풀 프로 야구 Wii 결정판 +RQ2JK6 = 크레이지 클라이머 Wii +RQ3PGN = PDC 월드 챔피언쉽 다츠 2009 +RQ4E78 = 네모바지 스펀지밥: 좌충우돌 대모험 +RQ4J78 = 네모바지 스펀지밥: 좌충우돌 대모험 +RQ4P78 = 네모바지 스펀지밥: 좌충우돌 대모험 +RQ5E5G = 매드 독 맥크리 건슬링거 팩 +RQ5X5G = 매드 독 맥크리 건슬링거 팩 +RQ6EJJ = 저주받은 산 +RQ6PKM = 저주받은 산 +RQ6XKM = 저주받은 산 +RQ7E20 = 화성 패닉 +RQ7PXT = 화성 패닉 +RQ8E08 = 모토GP 08 +RQ8P08 = 모토GP 08 +RQ9E69 = NBA 라이브 09 올 플레이 +RQ9F69 = NBA 라이브 09 올 플레이 +RQ9P69 = NBA 라이브 09 올 플레이 +RQ9S69 = NBA 라이브 09 올 플레이 +RQBENR = 카와사키 쿼드 바이크스 +RQBPUG = 카와사키 쿼드 바이크스 +RQBXUG = 카와사키 쿼드 바이크스 +RQCEAF = 문차블즈 +RQCJAF = 타베몬 +RQEE6U = 아가사 크리스티: 백주의 악마 +RQEP6V = 아가사 크리스티: 백주의 악마 +RQFE6U = 금고털이: 어티밋 퍼즐 어드벤처 +RQFP6V = 금고털이 +RQGE69 = 마이심즈 레이싱 +RQGJ13 = 나와 심의 거리 레이싱 +RQGP69 = 마이심즈 레이싱 +RQIJ01 = NHK 홍백 퀴즈 전투 +RQJE7D = 크래쉬 오브 더 타이탄즈 +RQJP7D = 크래쉬 오브 더 타이탄즈 +RQJX7D = 크래쉬 오브 더 타이탄즈 +RQKE41 = 써커스 게임들 +RQKP41 = 놀이공원 파티 +RQLE64 = 스타 워즈 클론 전쟁: 공화국 영웅들 +RQLP64 = 스타 워즈 클론 전쟁: 공화국 영웅들 +RQMEVN = 오션 커맨더 +RQMPVN = 오션 커맨더 +RQNEWR = 스쿠비-두! 첫 번째 공포 +RQNPWR = 스쿠비-두! 첫 번째 공포 +RQOE69 = 스포어 히어로 +RQOJ13 = 스포어: 네가 만드는 히어로 +RQOP69 = 스포어 히어로 +RQPE52 = 카벨라의 트로피 벅스 +RQPP52 = 카벨라의 트로피 벅스 +RQPZ52 = 카벨라의 트로피 벅스 헌터 +RQQE70 = 백야드 풋볼 '09 +RQREXJ = 스카이 크롤러즈: 이노센트 에이스즈 +RQRJAF = 스카이 크롤러즈: 이노센트 에이스즈 +RQRPAF = 스카이 크롤러: 이노센트 에이스즈 +RQSE4Z = 핀볼 명예의 전당: 고틀리프 컬렉션 +RQSP6M = 고틀리프 핀볼 클래식 +RQTE6U = 아가사 크리스티: 그리고 아무도 없었다 +RQTP6V = 아가사 크리스티: 그리고 아무도 없었다 +RQUEFS = 슈퍼 픽업스 +RQVE20 = 태평양 해방자 +RQVP20 = 태평양 해방자 +RQWEG9 = 퍼즐 퀘스트: 명장들의 도전 +RQWPG9 = 퍼즐 퀘스트: 장군들의 도전 +RQXP70 = 아스테릭스: 미션 올림픽 게임 +RQYENR = 판타지 아쿠아리움 월드 +RQZE41 = 몬스터 4x4: 스턴트 레이서 +RQZP41 = 몬스터 4x4: 스턴트 레이서 +RR2ENR = 리그 레이서 2 +RR2PUG = 리그 레이서 2 +RR2XUG = 익스트림 트럭 레이싱 +RR3EA4 = 얼티밋 파티 첼린지 +RR3JA4 = 패밀리 패밀리 챌린지 Wii +RR3PA4 = 렛츠 파티! +RR4EGY = 빌드 어 베어 워크샵: 사계절의 친구 모피 +RR4PFK = 빌드 어 베어 워크샵: 사계절의 친구 모피 +RR5E70 = 레디 2 럼블 레볼루션 +RR5P70 = 레디 2 럼블 레볼루션 +RR7PVP = 레알 마드리드: 게임 +RR8PUJ = 인터내셔널 육상경기 +RR9E78 = WWE 스맥다운 vs. Raw 2009 +RRAE5Z = 락'앤'롤 어드벤처즈 +RRAPUG = 락'앤'롤 어드벤처즈 +RRAXUG = 락'앤'롤 어드벤처즈 +RRBE41 = 레이맨 엽기토끼 +RRBJ41 = 레이맨 엽기토끼 +RRBP41 = 레이맨 엽기토끼 +RRCE52 = 바비 승마 모험들: 승마 캠프 +RRCP52 = 바비 승마 모험들: 승마 캠프 +RRDE69 = 락 밴드 트랙 팩: 볼륨 2 +RRDP69 = 락 밴드 노래 팩 2 +RREE69 = 락 밴드 트랙 팩: 볼륨 1 +RREP69 = 락 밴드 노래 팩 1 +RRFEE9 = 릴 낚시: 낚시꾼의 꿈 +RRFPE9 = 릴 낚시: 낚시꾼의 꿈 +RRGE52 = 마다가스카 2: 뭉치면 산다 +RRGP52 = 마다가스카 2: 뭉치면 산다 +RRGX52 = 마다가스카 2: 뭉치면 산다 +RRHPUJ = 마리 킹의 승마 학교 2 +RRHXUJ = 마리 킹의 승마 학교 2 +RRIPTV = 페인트 작품 +RRJFMR = 레디 스테디 쿡: 게임 +RRJIMR = 레디 스테디 쿡: 게임 +RRJPMR = 레디 스테디 쿡: 게임 +RRKE70 = 어둠 속에 나 홀로 +RRKP70 = 어둠 속에 나 홀로 +RRLE78 = 브라츠: 걸즈 리얼리 락 +RRLP78 = 브라츠: 걸즈 리얼리 락 +RRLX78 = 브라츠: 걸즈 리얼리 락 +RRLY78 = 브라츠: 걸즈 리얼리 락 +RRLZ78 = 브라츠: 걸즈 리얼리 락 +RRME69 = 하스브로: 패밀리 게임 나이트 +RRMI69 = 하스브로: 패밀리 게임 나이트 +RRMP69 = 하스브로: 패밀리 게임 나이트 +RRMX69 = 하스브로: 패밀리 게임 나이트 +RRPE41 = 더 프라이스 이즈 라이트 +RRQE52 = 슈렉의 카니발 크레이즈 파티 게임들 +RRQP52 = 슈렉의 카니발 크레이즈 파티 게임들 +RRQX52 = 슈렉의 카니발 크레이즈 파티 게임들 +RRRE5Z = 리얼 히어로즈: 파이어파이터 +RRRPRM = 리얼 히어로즈: 파이어파이터 +RRSE4Q = 로빈슨 가족 +RRSJ4Q = 로빈슨 가족 윌버의 위험한 시간 여행 +RRSP4Q = 로빈슨 가족 +RRSX4Q = 로빈슨 가족 +RRTE52 = 블록 파티 20 게임들 +RRTP52 = 블록 파티! 20 게임들 +RRUFRT = 동계 스포츠 2009: 다음 도전 +RRUJJF = 동계 스포츠 2009: 다음 도전 +RRUPRT = 동계 스포츠 2009: 다음 도전 +RRVENR = 배틀 레이지: 기계 충돌 +RRVPNR = 배틀 레이지: 로봇 대전 +RRWJAF = 슈퍼 로봇 대전 NEO +RRXE5Z = 몬스터 트럭 아레나즈: 스페셜 에디션 +RRXPUG = 몬스터 트럭 아레나즈 +RRXXUG = 몬스터 트럭 아레나즈 +RRYEHG = 로그 트루퍼 +RRYPHY = 로그 트루퍼 +RRZEGY = 루빅의 세계 +RRZPGY = 루빅의 퍼즐 세계 +RS2E20 = 얼티밋 오리 사냥 +RS2EGJ = 얼티밋 오리 사냥 +RS2PGJ = 얼티밋 오리 사냥 +RS3E52 = 스파이더맨 3 +RS3J52 = 스파이더맨 3 +RS3P52 = 스파이더맨 3 +RS3X52 = 스파이더맨 3 +RS4EXS = 식신의 성 III +RS4JJF = 식신의 성 III +RS4PXS = 식신의 성 III +RS5EC8 = 사무라이 전사들: 카타나 +RS5JC8 = 전국무쌍 카타나 +RS5PC8 = 사무라이 전사들: 카타나 +RS7J01 = 아이실드 21: 필드 최강의 전사들 +RS8J8N = 상하이 +RS9E8P = 소닉 라이더스: 무중력 +RS9J8P = 소닉 라이더스: 슈팅 스타 이야기 +RS9P8P = 소닉 라이더스: 무중력 +RSAE78 = 스펀지밥 - 아틀란티스 +RSAP78 = 스펀지밥 - 아틀란티스 +RSBE01 = 대난투 스매시 브라더스 X +RSBJ01 = 대난투 스매시 브라더스 X RSBK01 = 대난투 스매시 브라더스 +RSBP01 = 대난투 스매시 브라더스 X +RSCD7D = 스카페이스: 세상은 너의 것 +RSCE7D = 스카페이스: 세상은 너의 것 +RSCP7D = 스카페이스: 세상은 너의 것 +RSCU7D = 스카페이스: 세상은 너의 것 +RSDJAF = SD 건담: 스캐드 해머스 +RSEJGD = 소울 이터: 모노톤 공주 +RSFE7U = 무라마사: 데몬 블레이드 +RSFJ99 = 오보로 무라마사 +RSFK7U = 무라마사: 데몬 블레이드 +RSFP99 = 무라마사: 데몬 블레이드 +RSHE69 = 마이심즈 왕국 +RSHJ13 = 마이심즈 왕국 RSHK69 = 마이 심즈 심들의 왕국 -RSLKAF = 소울 칼리버 레전즈 +RSHP69 = 마이심즈 왕국 +RSIE69 = 마이심즈 +RSIJ13 = 마이심즈 +RSIP69 = 마이심즈 +RSJE41 = 파검: 기사단의 그림자 (감독판) +RSJP41 = 파검: 기사단의 그림자 (감독판) +RSKE52 = 슈렉 3 +RSKP52 = 슈렉 3 +RSKX52 = 슈렉 3 +RSLEAF = 소울 칼리버: 전설들 +RSLJAF = 소울 칼리버: 전설들 +RSLKAF = 소울칼리버: 전설들 +RSLPAF = 소울 칼리버: 전설들 +RSME8P = 슈퍼 몽키 볼: 바나나 블리츠 +RSMJ8P = 슈퍼 몽키 볼: 우키 우키 파티 대집합 +RSMP8P = 슈퍼 몽키 볼: 바나나 블리츠 +RSND69 = 심슨가족 게임 +RSNE69 = 심슨가족 게임 +RSNF69 = 심슨가족 게임 +RSNP69 = 심슨가족 게임 +RSNX69 = 심슨가족 게임 +RSOE4Z = 솔리테르 & 마작 +RSOP4Z = 솔리테르 & 마작 +RSPE01 = Wii 스포츠 +RSPJ01 = Wii 스포츠 RSPK01 = Wii 스포츠 +RSPP01 = Wii 스포츠 +RSPW01 = Wii 스포츠 +RSQEAF = 위 스키 +RSQJAF = 패밀리 스키 +RSQPAF = 패밀리 스키 +RSRE8P = 소닉과 비밀의 링 +RSRJ8P = 소닉과 비밀의 링 +RSRP8P = 소닉과 비밀의 링 +RSSEH4 = 사무라이 쇼다운 엔솔로지 +RSSJH4 = 사무라이 스피리츠 6번의 승부 RSSK52 = 사무라이 스피리츠 6번의 승부 +RSSP7U = 사무라이 쇼다운 엔솔로지 +RSTE64 = 스타 워즈: 해방된 포스 +RSTJ52 = 스타 워즈: 해방된 포스 +RSTP64 = 스타 워즈: 해방된 포스 +RSUENR = 동계 스포츠: 파라다이스 섬 +RSUP41 = 스포츠 파티 +RSVE8P = 소닉 언리쉬드 +RSVJ8P = 소닉 세계 모험 +RSVP8P = 소닉 언리쉬드 +RSWE08 = 스파이 보르그스 +RSWP08 = 스파이 보르그스 +RSXE69 = SSX 블러 +RSXJ13 = SSX 블러 RSXK69 = SSX 블러 -RT8K69 = 타이거 우즈 PGA Tour 08 +RSXP69 = SSX 블러 +RSYE20 = 쇼타임 챔피언쉽 권투 +RSYP7J = 쇼타임 챔피언쉽 권투 +RSZJES = 설녀대선풍: 사유키와 코유키의 꽁꽁 대소동 +RSZPGT = 사유키의 전설 +RT2E20 = 나누와 실라의 대모험 +RT2P7J = 나누와 실라의 대모험 +RT3E54 = 락스타 게임즈 제공: 탁구 +RT3JEL = 락스타 게임즈 제공: 탁구 +RT3P54 = 락스타 게임즈 제공: 탁구 +RT4EAF = 테일즈 오브 심포니아: 라타토스크의 기사 +RT4JAF = 테일즈 오브 심포니아: 라타토스크의 기사 +RT4PAF = 테일즈 오브 심포니아: 라타토스크의 기사 +RT5E8P = 세가 슈퍼스타즈 테니스 +RT5P8P = 세가 슈퍼스타즈 테니스 +RT6FKM = 두갈: 마법의 회전목마 +RT6PKM = 두갈: 마법의 회전목마 +RT7E69 = 타이거 우즈 PGA 투어 07 +RT7F69 = 타이거 우즈 PGA 투어 07 +RT7P69 = 타이거 우즈 PGA 투어 07 +RT8E69 = 타이거 우즈 PGA 투어 08 +RT8J13 = 타이거 우즈 PGA 투어 골프 08 +RT8K69 = 타이거 우즈 PGA 투어 08 +RT8P69 = 타이거 우즈 PGA 투어 08 +RT9E52 = 토니 호크의 프로빙 그라운드 +RT9P52 = 토니 호크의 프로빙 그라운드 +RTAE41 = 톰 클랜시의 H.A.W.X. 2 +RTAP41 = 톰 클랜시의 H.A.W.X. 2 +RTBE52 = 라팔라의 낚시 프렌지 +RTBP52 = 라팔라의 낚시 프렌지 +RTCE41 = 톰 클랜시의 스플린터 셀: 더블 에이전트 +RTCP41 = 톰 클랜시의 스플린터 셀: 더블 에이전트 +RTDE6K = 원숭이 왕: 전설의 시작 +RTDJES = 신중화대선 ~마이클과 메이메이의 모험~ RTDK8M = 신중화대선 ~마이클과 메이메이의 모험~ -RTFK52 = 트랜스포머: 더 게임 -RTKK8M = 모두 함께~ 타코롱 +RTEE78 = 파우스 & 클라우스 : 애완동물 수의사 +RTEHMR = 실제 이야기들: 수의사 +RTEPFR = 나의 수의사 연습 +RTFE52 = 트랜스포머즈: 게임 +RTFJ52 = 트랜스포머즈: 게임 +RTFK52 = 트랜스포머즈: 더 게임 +RTFP52 = 트랜스포머즈: 게임 +RTFX52 = 트랜스포머즈: 게임 +RTFY52 = 트랜스포머즈: 게임 +RTGJ18 = 엄선 테이블 게임 Wii +RTHE52 = 토니 호크의 다운힐 잼 +RTHP52 = 토니 호크의 다운힐 잼 +RTIE8P = 와키: 스포츠의 세계 +RTIJ8P = 진기한 스포츠 +RTIP8P = 와키 - 스포츠의 세계 +RTJE68 = 스타 트랙: 정복 +RTJP68 = 스타 트랙: 정복 +RTKE5Z = 옥토매니아 +RTKJDQ = 모두 함께~☆ 타코롱 +RTKK8M = 모두 함께~☆ 타코롱 +RTLE18 = 낚시 마스터: 월드 투어 +RTLJ18 = 노려라! 낚시 마스터 - 세계에 도전편 +RTLP18 = 낚시 마스터: 월드 투어 +RTME41 = TMNT: 돌연변이 닌자 거북 +RTMP41 = TMNT: 돌연변이 닌자 거북 +RTNE41 = 천추: 그림자 암살자들 +RTNJCQ = 천추 4 +RTNP41 = 천추: 그림자 암살자들 +RTOJ8P = 428: 봉쇄된 시부야에서 +RTPP41 = 탑 트럼프 어드벤처 +RTQENR = 몬스터 트럭 오프로드 +RTQPUG = 몬스터 트럭 오프로드 +RTQXUG = 몬스터 트럭 오프로드 +RTRE18 = 낚시 마스터 +RTRJ18 = 노려라!! 낚시 마스터 +RTRP18 = 낚시 마스터 +RTSEVN = 말괄량이 삼총사! 전적으로 파티 +RTSP41 = 말괄량이 삼총사! 전적으로 파티 +RTTJAF = 다마고치의 후리후리 가극단! +RTUEJJ = 비밀 파일: 퉁구스카 +RTUFKM = 비밀 파일: 퉁구스카 +RTUPKM = 비밀 파일: 퉁구스카 +RTVE64 = 스릴빌: 오프 더 레일즈 +RTVP64 = 스릴빌: 오프 더 레일즈 +RTWE5D = TNA 임팩트! +RTWP5D = TNA 임팩트! +RTYP01 = Wii 체스 +RTZE08 = 잭 & 위키: 발바로스의 보물 모험 +RTZJ08 = 보물섬 Z 발바로스의 보물 RTZK08 = 잭 & 위키: 발바로스의 보물 +RTZP08 = 잭 & 위키: 발바로스의 보물 모험 +RU2E5Z = 동계 스포츠 2: 다음 도전 +RU2P5Z = 동계 스포츠 2: 다음 도전 +RU3E5Z = 하계 육상경기: 궁극의 도전 +RU4E41 = 나의 피트니스 코치 2: 운영 & 영양 +RU4P41 = 뉴유 피트니스 첫 개인 트레이너 +RU4X41 = 뉴유 피트니스 첫 개인 트레이너 +RU5E4Q = 디즈니: 공주들과 개구리 +RU5P4Q = 디즈니: 공주들과 개구리 +RU5V4Q = 디즈니: 공주들과 개구리 +RU5X4Q = 디즈니: 공주들과 개구리 +RU5Y4Q = 디즈니: 공주와 개구리 (리버보트 째즈 에디션) +RU6EHG = 프리 런닝 +RU6PHY = 프리 런닝 +RU7E5G = 박물관이 살아있다: 스미스소니언의 전투 - 비디오 게임 +RU7X5G = 박물관이 살아있다: 스미스소니언의 전투 - 비디오 게임 +RU8EFS = 배스 프로 샵스: 사냥 +RU9EGT = 나의 발레 스튜디오 +RU9PGT = 디바 걸즈: 디바 발레리나 +RUAE52 = 몬스터 잼: 도시 공격 +RUAP52 = 몬스터 잼: 도시 공격 +RUBEVN = 얼티밋 보드 게임 컬렉션 +RUBP7N = 얼티밋 보드 게임 컬렉션 +RUCE5Z = 동계 스포츠: 얼티밋 첼린지 +RUCPRT = 동계 스포츠 2008: 얼티밋 첼린지 +RUCXRT = 동계 스포츠 2008: 얼티밋 첼린지 +RUEE4Q = G-포스 +RUEP4Q = G-포스 +RUER4Q = G-포스 +RUEX4Q = G-포스 +RUEY4Q = G-포스 +RUFEMV = 룬 팩토리: 프론티어 +RUFJ99 = 룬 팩토리: 프론티어 +RUFP99 = 룬 팩토리: 프론티어 +RUGE7T = 소름: 호러랜드 +RUGP5G = 소름: 호러랜드 +RUHE52 = 바쿠간 배틀 브롤러즈 +RUHP52 = 바쿠간 배틀 브롤러즈 +RUHX52 = 바쿠간 배틀 브롤러즈 (토이저러스 에디션) +RUHZ52 = 바쿠간 배틀 브롤러즈 +RUIE4Q = 디즈니: 싱 잇 +RUIP4Q = 디즈니: 싱 잇 +RUIX4Q = 디즈니: 싱 잇 +RUKEGT = 롤링 스톤: 드럼왕 +RUKPGT = 위 락: 드럼왕 +RULE4Q = 얼티밋 밴드 +RULP4Q = 얼티밋 밴드 +RULR4Q = 얼티밋 밴드 +RUME5Z = 스키 & 샷 +RUMPFR = 하계 운동경기 +RUNJ0Q = 새로운 우뇌 키즈 Wii +RUOEPL = 다락방 외계인 +RUOPPL = 다락방 외계인 +RUPJC8 = 위닝 포스트 7 맥시멈 2008 +RUQD78 = 업 +RUQE78 = 업 +RUQI78 = 업 +RUQJJE = 칼 할아버지의 하늘을 나는 집 +RUQP78 = 업 +RUQS78 = 업 +RUQX78 = 업 +RUREPL = 당구 홀 프로 +RURPPL = 당구 홀 프로 +RUSE78 = 스폰지밥과 친구들: 운명의 물방울 RUSK78 = 스폰지밥과 친구들 +RUSP78 = 스폰지밥과 친구들: 운명의 물방울 +RUSX78 = 스폰지밥과 친구들: 운명의 물방울 +RUSY78 = 스폰지밥과 친구들: 운명의 물방울 +RUUE01 = 타운으로 놀러가요 동물의 숲 +RUUJ01 = 타운으로 놀러가요 동물의 숲 RUUK01 = 타운으로 놀러가요 동물의 숲 +RUUP01 = 타운으로 놀러가요 동물의 숲 +RUWJC8 = 위닝 포스트 월드 +RUXPUG = 어반 익스트림: 스트리트 레이지 +RUXXUG = 어반 익스트림: 스트리트 레이지 +RUYE41 = 노 모어★히어로즈 2: 혈투 +RUYJ99 = 노 모어★히어로즈 2: 혈투 +RUYP99 = 노 모어★히어로즈 2: 혈투 +RUZE7T = 얼티밋 아이 스파이 +RUZP5G = 얼티밋 아이 스파이 +RV2E5D = 게임 파티 2 +RV2P5D = 모어 게임 파티 +RV3P6N = 영리한 아이들: 소름끼치는 크롤리즈 +RV7SMR = 생존자 +RV8E20 = 비치 펀: 하계 도전 +RV8PRT = 비치 펀: 하계 도전 +RV9E78 = 아바타: 최후의 에어벤더 - 화염 속으로 +RV9P78 = 아바타: 앙의 전설 - 화염 속으로 +RVAE78 = 아바타: 최후의 에어벤더 - 불타는 대지 +RVAP78 = 아바타: 앙의 전설 - 불타는 대지 +RVBERS = 앨빈과 슈퍼밴드 +RVBPRS = 앨빈과 슈퍼밴드 +RVDPLG = 디아볼릭: 원죄 +RVEFMR = 알로, 슈티 +RVFE20 = 빅풋: 충돌 진로 +RVFP7J = 빅풋: 충돌 진로 +RVGE78 = 머브 그리핀의 십자말풀이 +RVGP78 = 마곳의 워드 브레인 +RVHP41 = 스크래블 인터렉티브: 2009 에디션 +RVIE4F = 바이오니클 히어로즈 +RVIP4F = 바이오니클 히어로즈 +RVJPFR = 소 블론드: 백 투 더 아일랜드 +RVKEXJ = 발할라 나이츠: 엘더 사가 +RVKJ99 = 발할라 나이츠: 엘더 사가 RVKKZA = 발할라 나이츠: 엘더 사가 +RVKP99 = 발할라 나이츠: 엘더 사가 +RVLPA4 = 락 레볼루션 +RVNE20 = 캘빈 터커스의 레드넥 잼보리 +RVNP7J = 캘빈 터커스의 레드넥 잼보리 +RVOEPL = 현기증 +RVOPPL = 현기증 +RVPEFS = 팝스타 기타 +RVPPFS = 팝스타 기타 +RVQE41 = 영화 게임들 +RVQP41 = 무비 스튜디오즈 파티 +RVREFS = 레벨 레이더즈: 작전명 나이트호크 +RVRPKG = 레벨 레이더즈: 작전명 나이트호크 +RVSE69 = 스케이트 잇 +RVSJ13 = 스케이트 잇 +RVSP69 = 스케이트 잇 +RVTFMR = 실제 이야기들: 수의학 +RVTPMR = 나의 애완동물 세상 +RVTXMR = 실제 이야기들: 수의학 +RVUE8P = 버추어 테니스 2009 +RVUP8P = 버추어 테니스 2009 +RVVE78 = 빅 비치 스포츠 +RVVP78 = 빅 비치 스포츠 +RVXFRT = RTL 바이애슬론 2009 +RVXPRT = RTL 바이애슬론 2009 +RVYD52 = 콜 오브 듀티: 월드 앳 워 +RVYE52 = 콜 오브 듀티: 월드 앳 워 RVYK52 = 콜 오브 듀티: 월드 앳 워 +RVYP52 = 콜 오브 듀티: 월드 앳 워 +RVYX52 = 콜 오브 듀티: 월드 앳 워 +RVYY52 = 콜 오브 듀티: 월드 앳 워 +RVZE52 = 몬스터들 vs. 외계인들 +RVZP52 = 몬스터들 vs. 외계인들 +RW3E4Q = 캐리비언의 해적: 세상의 끝에서 +RW3J4Q = 캐리비언의 해적: 세상의 끝에서 +RW3P4Q = 캐리비언의 해적: 세상의 끝에서 +RW4D41 = 내 단어 코치: 어휘 향상 +RW5F41 = 백만장자가되고 싶은 사람: 2 번째 에디션 +RW5P41 = 백만장자가되고 싶은 사람: 2 번째 에디션 +RW6PA4 = 댄스 댄스 레볼루션: Winx 클럽 +RW7E41 = 숀 화이트 스노우보딩: 로드 트립 - 타겟 리미티드 에디션 +RW8P41 = 이미진 챔피언 라이더 +RW9P78 = WWE 스맥다운 vs. Raw 2009 +RW9X78 = WWE 스맥다운 vs. Raw 2009 +RWAD78 = 월•E +RWAE78 = 월•E +RWAJ78 = 월•E RWAK78 = 월•E +RWAP78 = 월•E +RWAR78 = 월•E +RWAU78 = 월•E +RWAX78 = 월•E +RWAY78 = 월•E +RWAZ78 = 월•E +RWBENR = 카와사키 스노우 모빌 +RWBXUG = 카와사키 스노우 모빌 +RWCE4Z = 핀볼 명예의 전당: 윌리엄스 컬렉션 +RWCP6M = 윌리엄스 핀볼 클래식 +RWDE5G = 와일드 어스: 아프리칸 사파리 +RWDP5G = 와일드 어스: 아프리칸 사파리 +RWEEA4 = 프로 에볼루션 축구 2008 +RWEJA4 = 위닝 일레븐 플레이 메이커 2008 +RWEPA4 = 프로 에볼루션 축구 2008 +RWFH41 = 나의 단어 코치: 어휘 향상 +RWGE08 = 우리는 골프를 사랑해요! +RWGJ08 = 우리는 골프를 사랑해요! +RWGP08 = 우리는 골프를 사랑해요! +RWHP4F = 탑 트럼프: 닥터 후 +RWIE18 = 날개 섬 +RWIJ18 = 날개 섬 +RWIP18 = 날개 섬 +RWJENR = 워드종 파티 +RWKE5G = 쿠킹 마마: 월드 키친 +RWKPGT = 쿠킹 마마 2: 월드 키친 +RWLE01 = 와리오 랜드: 쉐이크 잇! +RWLJ01 = 와리오 랜드 쉐이크 RWLK01 = 와리오 랜드 쉐이킹 +RWLP01 = 와리오 랜드: 쉐이크 디멘젼 +RWME78 = 웜즈: 스페이스 오디티 +RWMP78 = 웜즈: 스페이스 오디티 +RWNF70 = 경고: 교통법규 +RWOE69 = 모노폴리 +RWOJ13 = 모노폴리 +RWOP69 = 모노폴리 +RWQPSP = WSC 리얼 08: 월드 스누커 챔피언쉽 +RWRE4F = 와키 레이스: 크래쉬 & 대쉬 +RWRP4F = 와키 레이스: 크래쉬 & 대쉬 +RWSE8P = 마리오와 소닉 베이징 올림픽 +RWSJ01 = 마리오와 소닉 베이징 올림픽 RWSK01 = 마리오와 소닉 베이징 올림픽 -RX9K69 = 니드포스피드 언더커버 +RWSP8P = 마리오와 소닉 베이징 올림픽 +RWTEG9 = 벤 10: 에일리언 포스 +RWTPG9 = 벤 10: 에일리언 포스 +RWUE52 = 엑스맨 탄생: 울버린 +RWUP52 = 엑스맨 탄생: 울버린 +RWUX52 = 엑스맨 탄생: 울버린 +RWWE78 = WWE 스맥다운 vs. Raw 2008 +RWWJ78 = WWE 스맥다운 vs. Raw 2008 +RWWP78 = WWE 스맥다운 vs. Raw 2008 +RWWX78 = WWE 스맥다운 vs. Raw 2008 +RWXES5 = 용기: 전사의 이야기 +RWXPS5 = 용기: 전사의 이야기 +RWYPHH = 런어웨이: 거북이의 꿈 +RWZE5G = 환상의 나라 놀이 공원 +RWZP5G = 환상의 나라 놀이 공원 +RWZX5G = 환상의 나라 놀이 공원 +RX2E70 = 나의 말과 나: 금메달을 위한 승마 +RX2P70 = 나의 말과 나 2 +RX3E01 = 익사이트보츠: 트릭 레이싱 +RX3J01 = 익사이트: 사나운 경주용 자동차 +RX4E4Z = 캐스퍼의 공포 학교: 으스스한 운동회 날 +RX4PMT = 캐스퍼의 공포 학교: 으스스한 운동회 날 +RX5E52 = 토니 호크: 라이드 +RX5P52 = 토니 호크: 라이드 +RX6E78 = 도전! FAT 제로 +RX6P78 = 도전! FAT 제로 +RX7JGD = 소령의 위엄있는 행진 +RX8JA4 = 실황 파워풀 프로 야구 넥스트 +RX9E69 = 니드 포 스피드: 언더커버 +RX9J13 = 니드 포 스피드: 언더커버 +RX9K69 = 니드 포 스피드: 언더커버 +RX9P69 = 니드 포 스피드: 언더커버 +RX9X69 = 니드 포 스피드: 언더커버 +RX9Y69 = 니드 포 스피드: 언더커버 +RXAE78 = WWE 스맥다운 vs. Raw 2010 +RXAP78 = WWE 스맥다운 vs. Raw 2010 +RXBE70 = 백야드 야구 '10 +RXCE4Z = 데이브 미라 BMX 도전 +RXCPGT = 데이브 미라 BMX 도전 +RXDD4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXDE4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXDJ4Q = 씽크 패스트: 버튼 빨리 누르기 퀴즈 +RXDP4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXDR4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXDX4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXDY4Q = 씽크 패스트: 얼티밋 트리비아 쇼다운 +RXEJDA = 메이저 Wii 완벽한 최종회 +RXFEVN = 연안의 타이쿤 +RXGE6K = 지온 큐브 +RXGP6K = 지온 큐브 +RXHF5D = 혼돈의 집 +RXIE52 = 트랜스포머즈: 패자의 역습 +RXIP52 = 트랜스포머즈: 패자의 역습 +RXJJDA = 인생 게임 Wii EX +RXKEGL = TV 쇼 킹 파티 +RXKFGL = TV 쇼 킹 파티 +RXKPGL = TV 쇼 킹 파티 +RXLE41 = 그레이스 애너토미: 비디오 게임 +RXLP41 = 그레이스 애너토미: 비디오 게임 +RXMJ8P = 미부리 & 테부리 +RXNEXS = 다시 낚았다: 리얼 모션 낚시 +RXNJJF = 배스 낚시 Wii 월드 토너먼트 +RXNPGT = 빅 캐치 배스 낚시 2 +RXPEXS = 낚았다!: 리얼 모션 낚시 +RXPJJF = 배스 낚시 Wii - 로쿠마루 전설 +RXPPGT = 빅 캐치 배스 낚시 +RXQEWR = 괴물들이 사는 나라 +RXQPWR = 괴물들이 사는 나라 +RXRERS = 작은 영웅 데스페로 +RXRPRS = 작은 영웅 데스페로 +RXRXRS = 작은 영웅 데스페로 +RXSPA4 = 댄싱 스테이지: 가장 인기있는 파티 +RXUE41 = 서핑 업 +RXUP41 = 서핑 업 +RXUX41 = 서핑 업 +RXVXWP = TV 7 게임: 크로스 워드 +RXWE20 = M&M의 해변 파티 +RXXE4Q = 스펙트로브스: 오리진스 +RXXJ4Q = 스펙트로브스: 오리진스 +RXXP4Q = 스펙트로브스: 오리진스 +RXYE4Z = 퍼즐 도전: 십자말풀이 외. +RXYP4Z = 퍼즐 도전: 십자말풀이 외. +RXZE52 = 카벨라의 위험한 사냥 2009 +RXZP52 = 카벨라의 위험한 모험 +RY2E41 = 레이맨 엽기토끼 2 +RY2J41 = 래빗츠 파티 리턴즈 RY2K41 = 래이맨 엽기토끼 2 +RY2P41 = 레이맨 엽기토끼 2 +RY2R41 = 레이맨 엽기토끼 2 +RY3E41 = 레이맨 엽기토끼 TV 파티 +RY3J41 = 래빗츠 파티 TV 파티 RY3K41 = 래이맨 엽기토끼 TV파티 +RY3P41 = 레이맨 엽기토끼 TV 파티 +RY4J8P = 뿌요 뿌요 7 +RY5E52 = 빅 리그 스포츠: 하계 +RY5P52 = 세계 챔피언쉽 스포츠: 하계 +RY6EA4 = 걸어봐! +RY6PA4 = 박자에 맞춰 발을 움직여봐 +RY7PHZ = 닌자 캡틴 +RY8EFS = 배스 프로 샵스: 스트라이크 +RY9E69 = 피파 09 올 플레이 +RYAJDA = 얏타맨 Wii 깜짝 깜짝 머신으로 맹 레이스다 코론 +RYBE69 = 붐 블록스: 배쉬 파티 +RYBP69 = 붐 블록스: 배쉬 파티 +RYDELT = 애완동물 친구들: 동물 의사 +RYDP6V = 애완동물 친구들: 동물 의사 +RYEEEB = 101 합 1 파티 메가믹스 +RYEPHZ = 101 합 1 파티 메가믹스 +RYGE9B = 라이가: 아르고스의 전사 +RYGJ9B = 아르고스의 전사 머슬 임팩트 +RYGP99 = 라이가: 아르고스의 전사 +RYHES5 = 루구: 뒤틀린 탑들 +RYHPS5 = 루구: 뒤틀린 탑들 +RYIE9B = 스프레이 +RYIPNK = 스프레이 +RYJPTV = 릴리피 공주의 마법 요정 +RYKEAF = 위 스키 & 스노우보드 +RYKJAF = 패밀리 스키: 월드 스키 & 스노우보드 RYKK01 = 패밀리 스키 & 스노보드 +RYKPAF = 패밀리 스키 & 스노우보드 +RYLDSV = 독일의 넥스트 탑 모델 +RYLPSV = 탑 모델 아카데미 +RYNE6U = 강인한 소년들: 숨겨진 도둑 +RYNP6V = 강인한 소년들: 숨겨진 도둑 +RYOEA4 = 유희왕! 5D: 휠리 브레이커즈 +RYOJA4 = 유희왕! 5D: 휠리 브레이커즈 +RYOPA4 = 유희왕! 5D: 휠리 브레이커즈 +RYQE69 = 트리비얼 퍼슈트 +RYQP69 = 트리비얼 퍼슈트 +RYQX69 = 트리비얼 퍼슈트 +RYRE41 = 유어 쉐이프 +RYRP41 = 유어 쉐이프 +RYTE4Z = PBR: 날개없는 추락 +RYVJMS = 일벨로Wii +RYWE01 = Wii로 다함께! 말랑말랑 두뇌교실 +RYWJ01 = Wii로 다함께! 말랑말랑 두뇌교실 RYWK01 = Wii로 다함께! 말랑말랑 두뇌교실 -RZDK01 = 젤다의 전설- 황혼의 공주 -RZPK01 = 링크의 사격트레이닝 -RZTK01 = 위 스포츠 리조트 -S7AKZA = 레고 배트맨 2 -SB4K01 = 갤럭시 어드벤쳐 투게더 +RYWP01 = Wii로 다함께! 말랑말랑 두뇌교실 +RYXE20 = 야마하 슈퍼크로스 +RYXP7J = 야마하 슈퍼크로스 +RYZE6U = 세계 파티 게임들 +RYZPTV = 플레이 월드 +RZ2JG9 = 심플 Wii 시리즈 볼륨 1: 모두의 카트 레이스 +RZ3JG9 = 심플 Wii 시리즈 볼륨 2: 모두의 배스 낚시대회 +RZ4JG9 = 심플 Wii 시리즈 볼륨 3: 놀면서 배우는 파티 카지노 +RZ5JG9 = 심플 Wii 시리즈 볼륨 4: 슈팅 액션 +RZ6JG9 = 심플 Wii 시리즈 볼륨 5: 블록 허물기 +RZ7JG9 = 심플 Wii 시리즈 볼륨 6: 와글 와글 컴뱃 +RZ8JG9 = 심플 2000 시리즈 Wii 볼륨 1: 테이블 게임 +RZ9EG9 = 패밀리 파티: 30 그레이트 게임즈 +RZ9JG9 = 심플 2000 시리즈 Wii 볼륨 2: 파티 게임 +RZ9PG9 = 패밀리 파티: 30 그레이트 게임즈 +RZAPTV = 성공적인 초등학교 파워 수학 +RZCE6K = 세인트 +RZDE01 = 젤다의 전설: 황혼의 공주 +RZDJ01 = 젤다의 전설: 황혼의 공주 +RZDK01 = 젤다의 전설: 황혼의 공주 +RZDP01 = 젤다의 전설: 황혼의 공주 +RZEE52 = 사이언스 파파 +RZEP52 = 사이언스 파파 +RZFPKM = 시크릿 파일 2: 퓨리타스 코르디스 +RZHE5G = 동물원 병원 +RZHP5G = 동물원 병원 +RZHX5G = 동물원 병원 +RZIE20 = 동계 스포츠 3: 위대한 토너먼트 +RZIPRT = 동계 스포츠 2010: 위대한 토너먼트 +RZJD69 = 데드 스페이스: 적출 +RZJE69 = 데드 스페이스: 적출 +RZJJ13 = 데드 스페이스: 적출 +RZJP69 = 데드 스페이스: 적출 +RZKE20 = 퍼즐 왕국 +RZKP7J = 퍼즐 왕국 +RZLE41 = 요리 대전 +RZLP41 = 쿡오프 파티 +RZNJ01 = 참격의 레긴레이브 +RZOE78 = 동물원 세상 +RZOP78 = 동물원 세상 +RZPE01 = 링크의 사격 트레이닝 +RZPJ01 = 링크의 사격 트레이닝 +RZPK01 = 링크의 사격 트레이닝 +RZPP01 = 링크의 사격 트레이닝 +RZREGT = 조로의 운명 +RZRPGT = 조로의 운명 +RZSEGJ = 스피드 존 +RZSP68 = 휠스핀 +RZTE01 = Wii 스포츠 리조트 +RZTJ01 = Wii 스포츠 리조트 +RZTK01 = Wii 스포츠 리조트 +RZTP01 = Wii 스포츠 리조트 +RZTW01 = Wii 스포츠 리조트 +RZUE4Z = 크레욜라 컬러풀한 여행 +RZYE41 = 내 단어 코치 +RZYF41 = 내 단어 코치: 어휘 향상 +RZYP41 = 내 단어 코치: 어휘 향상 +RZYS41 = 내 단어 코치: 어휘 향상 +RZZE8P = 매드월드 +RZZJEL = 매드월드 +RZZP8P = 매드월드 +S22JAF = 패밀리 피싱 +S22K01 = 패밀리 피싱 +S25JGD = 드래곤 퀘스트 25 컬렉션: 패미컴 & 슈퍼 패미컴 드래곤 퀘스트 I-II-III +S26PML = 2 합 1: 조랑말 친구들 2 + 나의 마구간: 말들과 함께 생활 +S2AEAF = 활동적인 생활: 탐험가 +S2AJAF = 다함께 모험! 패밀리 트레이너 +S2APAF = 패밀리 트레이너: 보물 모험 +S2BEPZ = 컨트리 댄스 2 +S2BPXT = 컨트리 댄스 2 +S2CE54 = 새로운 축제 게임들 +S2CP54 = 새로운 축제 유원지 게임들 +S2DPML = 댄스! 그것은 너의 무대야 +S2EE41 = ABBA: 유 캔 댄스 +S2EP41 = ABBA: 유 캔 댄스 +S2HE70 = 유령의 집 +S2HP70 = 유령의 집 +S2IE8P = 아이언맨 2 +S2IP8P = 아이언맨 2 +S2IZ8P = 아이언맨 2: 월마트 에디션 +S2LE01 = 포켓파크 2: 세상의 저편 +S2LJ01 = 포켓파크 2: 세상의 저편 +S2LP01 = 포켓파크 2: 세상의 저편 +S2ME69 = 매든 NFL 13 +S2OEFS = 배스 프로 샵스: 스트라이크 - 토너먼트 에디션 +S2PEA4 = 프로 에볼루션 싸커 2012 +S2PJA4 = 위닝 일레븐 플레이 메이커 2012 +S2PPA4 = 프로 에볼루션 싸커 2012 +S2PXA4 = 프로 에볼루션 싸커 2012 +S2PYA4 = 프로 에볼루션 싸커 2012 +S2RPNK = 리로드 +S2TJAF = 태고의 달인 Wii 도돈과 2대목! +S2UE41 = 저스트 댄스 2020 +S2UP41 = 저스트 댄스 2020 +S2VEG9 = 빅토리어스: 토킹 더 리드 +S2VPAF = 빅토리어스: 토킹 더 리드 +S2WE78 = WWE 올 스타즈 +S2WP78 = WWE 올 스타즈 +S2XE41 = 스머프 2 +S2XP41 = 스머프 2 +S2YE52 = 와이프아웃: 크리에이트 & 크래쉬 +S2ZE52 = 주주펫츠: 피처링 와일드 번치 +S2ZP52 = 주주펫츠: 피처링 와일드 번치 +S32DJW = 독일의 보이스: 당신을 원해요 +S32FJW = 보이스: 가장 아름다운 목소리 +S32PJW = 보이스 +S32SJW = 보이스: 너의 목소리를 원해 +S33DKM = 렛츠 싱 2017: 독일의 히츠! +S33FKM = 렛츠 싱 2017: 프랑스와 인터내셔널 히츠 +S33PKM = 렛츠 싱 2017 +S33SKM = 렛츠 싱 9: 스페인어 버전 +S34DKM = 렛츠 싱 2018: 독일 히츠! +S34FKM = 렛츠 싱 2018: 프랑스와 인터내셔널 히트 +S34PKM = 렛츠 싱 2018 +S34SKM = 렛츠 싱 10 +S3AE5G = 영화들의 공격 3D +S3APGT = 영화들의 공격 3D +S3BEWR = 배트맨: 용기와 대담 +S3BPWR = 배트맨: 용기와 대담 +S3CENR = 트리플 크라운 챔피언쉽 스노우보딩 +S3DE18 = 데카 스포츠 3 +S3DJ18 = 데카 스포르타 3 +S3DP18 = 스포츠 아일랜드 3 +S3EE78 = 바비 제트, 세트, 스타일! +S3EP78 = 바비 제트, 세트, 스타일! +S3FE69 = 피파 13 +S3FP69 = 피파 13 +S3FX69 = 피파 13 +S3GE20 = 빙하 3: 멜트다운 +S3GPXT = 빙하 3 +S3HJ08 = 전국 바사라 3 연회 +S3IEA4 = 프로 에볼루션 싸커 2013 +S3IPA4 = 프로 에볼루션 싸커 2013 +S3IXA4 = 프로 에볼루션 싸커 2013 +S3IYA4 = 프로 에볼루션 싸커 2013 +S3LPY1 = 앤드류 로이드 웨버 뮤지컬: 싱 앤 댄스 +S3ME69 = 심즈 3 +S3MP69 = 심즈 3 +S3PE4Q = 디즈니 공주: 나의 동화 모험 +S3PP4Q = 디즈니 공주: 나의 동화 모험 +S3PX4Q = 디즈니 공주: 나의 동화 모험 +S3RJMS = 트윙클 퀸 +S3SJ18 = 카라오케 조이사운드 Wii 슈퍼 DX: 혼자서 모든 노래를 마음껏! +S3TJAF = 태고의 달인 Wii 모두 함께 파티 ☆ 3대목! +S3WEG9 = 패밀리 파티: 30 그레이트 게임즈 윈터 펀 +S3WPG9 = 패밀리 파티: 30 그레이트 게임즈 윈터 펀 +S3ZE52 = 맨 인 블랙: 에일리언 크라이시스 +S3ZP52 = 맨 인 블랙: 에일리언 크라이시스 +S4MJGD = 드래곤 퀘스트 X - 자명종 다섯 종족 온라인 +S4SJGD = 드래곤 퀘스트 X - 잠자는 용사와 인도의 동지 온라인 +S59E01 = 사무라이 전사 3 +S59JC8 = 전국무쌍 3 +S59P01 = 사무라이 전사 3 +S5BETL = 백 투 더 퓨쳐: 게임 +S5BPKM = 백 투 더 퓨쳐: 게임 +S5DE41 = 저스트 댄스 디즈니 파티 2 +S5DP41 = 저스트 댄스 디즈니 파티 2 +S5EE41 = 저스트 댄스 2019 +S5EP41 = 저스트 댄스 2019 +S5KJAF = 태고의 달인 Wii 초호화판 +S5MEVZ = 몬스터 하이 : 학교의 새로운 구울 +S5MPVZ = 몬스터 하이 : 학교의 새로운 구울 +S5PPAU = PSA 월드 투어 스쿼시 +S5QJC8 = 전국무쌍 3 무쌍전 +S5RESZ = 램 레이싱 +S5RPNJ = 램 레이싱 +S5SJHF = 이나즈마 일레븐 Go 스트라이커즈 2013 +S5TEG9 = 벤 10: 옴니버스 +S5TPAF = 벤 10: 옴니버스 +S5WE20 = 50 경기내에 세계 일주 +S6BE4Q = 브레이브: 비디오 게임 +S6BP4Q = 브레이브: 비디오 게임 +S6BX4Q = 브레이브: 비디오 게임 +S6BY4Q = 브레이브: 비디오 게임 +S6IE78 = 디즈니 공주들: 매혹적인 이야기 책들 +S6IP78 = 디즈니 공주들: 매혹적인 이야기 책들 +S6RE52 = 주먹왕 랄프 +S6RP52 = 주먹왕 랄프 +S6TJGD = 드래곤 퀘스트 X (올 인 원 팩키지) +S72E01 = 커비의 꿈 컬렉션: 스페셜 에디션 +S72J01 = 별의 커비: 20 주년 스페셜 컬렉션 +S75E69 = 모노폴리 스트리츠 +S75P69 = 모노폴리 스트리츠 +S7AEWR = 레고 배트맨 2: DC 슈퍼 히어로즈 +S7AKWR = 레고 배트맨 2: DC 슈퍼 히어로즈 +S7AKZA = 레고 배트맨 2: DC 슈퍼 히어로즈 +S7APWR = 레고 배트맨 2: DC 슈퍼 히어로즈 +S7BE69 = 트리비얼 퍼슈트: 당신은 그것을 알고 내기 +S7BP69 = 트리비얼 퍼슈트: 캐주얼 +S7CJAF = 가면 라이더 클라이맥스 히어로즈 포제 +S7DE52 = 앵그리 버즈: 스타 워즈 +S7DP52 = 앵그리 버즈: 스타 워즈 +S7EE52 = 트랜스포머스: 얼티밋 배틀 에디션 +S7EP52 = 트랜스포머스: 얼티밋 배틀 에디션 +S7FE5G = 줌바 키즈: 얼티밋 줌바 댄스 파티 +S7FPGT = 줌바 키즈: 얼티밋 줌바 댄스 파티 +S7JPKM = 렛츠 싱 6 - 스페인어 버전 +S7KPKM = 렛츠 싱 2014 +S7LPKM = 렛츠 싱 @ 라디오 이탈리아 +S7SP41 = 스머프 파티 팩 +SA3E5G = 앨빈과 슈퍼밴드 3 +SA3P5G = 앨빈과 슈퍼밴드 3 +SA3XGT = 앨빈과 슈퍼밴드 3 +SA5E78 = 당신은 초등학교 5학년 보다 똑똑한가요? 개학 +SA6EG9 = 벤 10: 은하계 레이싱 +SA6PAF = 벤 10: 은하계 레이싱 +SA7ESZ = 구미 베어즈: 매지컬 메달리온 +SA8P52 = 어메이징 스파이더맨 +SA9D7K = 비비와 티나 큰 승마 축제 +SAAJA4 = 위닝 일레븐 플레이 메이커 2013 +SABENR = 외계인 몬스터 볼링 리그 +SABPJG = 외계인 몬스터 볼링 리그 +SACSVS = ACB 토탈 2010/2011 +SADE70 = 백야드 스포츠: 재미로 하는 강타자들 +SAFUHS = AFL: 호주 풋볼 리그 +SAGE41 = 어메이징 레이스 +SAHE69 = 하스브로: 패밀리 게임 나이트 펀 팩 +SAJE52 = 카벨라의 서바이벌: 카트마이의 그림자 +SAJP52 = 카벨라의 서바이벌: 카트마이의 그림자 +SAKENS = 사쿠라 대전: 안녕 사랑스런 그대여 +SAKPNS = 사쿠라 대전: 안녕 사랑스런 그대여 +SALE4Q = 이상한 나라 엘리스 +SALP4Q = 이상한 나라 엘리스 +SANEFS = 배스 프로 샵스: 사냥 - 트로피 대결 +SAOE78 = 몬스터 하이: 구울 스피릿 +SAOEVZ = 몬스터 하이: 구울 스피릿 +SAOP78 = 몬스터 하이: 구울 스피릿 +SAOXVZ = 몬스터 하이: 구울 스피릿 +SAQE5G = 할리 파스테르나크스의 헐리우드 워크아웃 +SARE4Z = 알라딘 매직 레이서 +SARPNK = 알라딘: 매직 레이서 +SASEWW = 꿈도 꾸지 마 +SATE6K = 척 이. 치즈의 슈퍼 컬렉션 +SAUJ8P = 뿌요 뿌요!! 20 주년 +SAVE5G = 앨빈과 슈퍼밴드 2 +SAVX5G = 앨빈과 슈퍼밴드 2 +SAWE52 = 앵그리 버즈 3 부작 +SAWP52 = 앵그리 버즈 3 부작 +SAXPFH = 맥스 & 매직 메이커 +SAYE20 = 부트 캠프 아카데미 +SAYP41 = 부트 캠프 아카데미 +SAZE52 = 어메이징 스파이더맨 +SAZP52 = 어메이징 스파이더맨 +SB2ES5 = 나의 아기 첫 걸음 +SB2PNP = 나의 아기 2: 나의 아기 성장 +SB3E08 = 전국 바사라: 사무라이 히어로즈 +SB3J08 = 전국 바사라 3 +SB3P08 = 전국 바사라: 사무라이 히어로즈 +SB4E01 = 슈퍼 마리오 갤럭시 2 +SB4J01 = 슈퍼 마리오 갤럭시 2 +SB4K01 = 슈퍼 마리오 Wii 2: 갤럭시 어드벤쳐 투게더 +SB4P01 = 슈퍼 마리오 갤럭시 2 +SB4W01 = 슈퍼 마리오 갤럭시 2 +SB6E52 = 바쿠간: 코어의 수비대 +SB6P52 = 바쿠간: 코어의 수비대 +SB7IVU = 플래닛 바스켓 2009/2010 +SB8EQH = 버거 봇 +SB9E78 = 바비: 손질하여 매력적인 강아지들 +SB9EVZ = 바비: 손질하여 매력적인 강아지들 +SB9P78 = 바비: 손질하여 매력적인 강아지들 +SB9X78 = 바비: 손질하여 매력적인 강아지들 +SBAJGD = 드래곤 퀘스트 몬스터즈: 배틀 로드 빅토리 +SBBE18 = 베이블레이드: 메탈 퓨전 - 전투 요새 +SBBJ18 = 메탈 베이블레이드 진검승부 스타디움 +SBBP18 = 베이블레이드: 메탈 퓨전 - 카운터 리온 +SBCJ2N = 빌리의 부트 캠프: Wii와 다이어트를 즐기세요! +SBDE08 = 레지던트 이블: 암흑 연대기 +SBDJ08 = 바이오하자드: 암흑 연대기 SBDK08 = 바이오 하자드: 다크사이드 크로니클즈 +SBDP08 = 레지던트 이블: 암흑 연대기 +SBEPSV = 버뮤다 삼각지대 +SBFE70 = 백야드 풋볼 '10 +SBHEFP = 레밍턴 위대한 미국의 새 사냥 +SBHPNK = 레밍턴 위대한 미국의 새 사냥 +SBIEVZ = 바쁜 가위 +SBIPVZ = 바쁜 가위 +SBJEG9 = 벤 10: 얼티밋 에일리언 - 우주의 파멸 +SBJPAF = 벤 10: 얼티밋 에일리언 - 우주의 파멸 +SBKEPZ = 브런즈윅 존 코스믹 볼링 +SBLE5G = 불가사의한 브로비 +SBLP5G = 불가사의한 브로비 +SBNEG9 = 벤 10: 에일리언 포스 - 빌객스의 공격 +SBNPG9 = 벤 10: 에일리언 포스 - 빌객스의 공격 +SBQE4Z = 빅 벅 헌터 프로 +SBREJJ = 렛츠 플레이 발레리나 +SBRPKM = 발레리나 +SBSEFP = 레밍턴 슈퍼 슬램 사냥: 북미 +SBSURN = 레밍턴 슈퍼 슬램 사냥: 북미 +SBVE78 = 스펀지 밥의 보팅 배쉬 +SBVP78 = 스펀지 밥의 보팅 배쉬 +SBVS78 = 스펀지 밥의 보팅 배쉬 +SBWE5G = 베이비시팅 마마 +SBWJRA = 베이비시팅 마마 +SBWPGT = 쿠킹 마마 월드: 베이비시팅 마마 +SBXEWR = 청혼: 비디오 게임 +SBYE41 = 브로드웨이 댄스 +SBYP41 = 브로드웨이 댄스 +SBZESZ = 버뮤다 삼각지대: 산호 보호 +SC2E8P = 컨듀잇 2 +SC2P8P = 컨듀잇 2 +SC4E64 = 레고 스타 워즈 III: 클론 전쟁 +SC4P64 = 레고 스타 워즈 III: 클론 전쟁 +SC5PGN = 도전하세요: 단어 퍼즐 +SC6PGN = 도전하세요: 두뇌 퍼즐 2 +SC7D52 = 콜 오브 듀티: 블랙 옵스 +SC7E52 = 콜 오브 듀티: 블랙 옵스 +SC7F52 = 콜 오브 듀티: 블랙 옵스 +SC7I52 = 콜 오브 듀티: 블랙 옵스 +SC7P52 = 콜 오브 듀티: 블랙 옵스 +SC7S52 = 콜 오브 듀티: 블랙 옵스 +SC7Z52 = 콜 오브 듀티: 블랙 옵스 +SC8E01 = Wii 플레이: 모션 +SC8J01 = Wii 리모콘 플러스 버라이어티 SC8K01 = Wii 리모컨플러스로 즐기는 버라이어티 게임 박스 +SC8P01 = Wii 플레이: 모션 +SC9P52 = 카벨라의 위대한 게임 사냥꾼 2010 +SCAE18 = 콜링: 검은 착신 +SCAJ18 = 콜링: 검은 착신 +SCAP18 = 콜링: 검은 착신 +SCBE5V = 싸이버바이크 싸이클링 스포츠 +SCBPNK = 싸이버바이크 싸이클링 스포츠 +SCDE52 = 카벨라의 위험한 사냥 2011 +SCDP52 = 카벨라의 위험한 사냥 2011 +SCEE6K = 척 이. 치즈의 파티 게임들 +SCFPNK = 코코토 축제 +SCGE20 = 캘빈 터커: 농장 동물 레이싱 토너먼트 +SCGPXT = 캘빈 터커: 농장 동물 레이싱 토너먼트 +SCHEQH = 캐나다 사냥 +SCIE41 = CSI: 치명적인 음모 +SCIP41 = CSI: 치명적인 음모 +SCJE4Q = 레고 캐리비언의 해적: 비디오 게임 +SCJP4Q = 레고 캐리비언의 해적: 비디오 게임 +SCKE6K = 척 이. 치즈의 스포츠 게임들 +SCMJAF = 가면 라이더 클라이맥스 히어로즈 오즈 +SCNEA4 = 장면? 트와일라잇 +SCNPA4 = 장면? 트와일라잇 +SCPE70 = 지네: 침략 +SCQDRV = 라브의 충격: 두 번째 일치 +SCREJH = 치킨 라이엇 +SCRPJH = 치킨 라이엇 +SCSE52 = 유람선: 휴가 게임들 +SCSPGR = 유람선 리조트 +SCTPNK = 코코토 서프라이즈 +SCUPFR = 크레이지 치킨: 축제 +SCWE41 = 골드 체육관: 댄스 운동 +SCWP41 = 나의 피트니스 코치: 댄스 운동 +SCXESZ = 쉐보레 카마로: 거친 질주 +SCXPNJ = 쉐보레 카마로: 거친 질주 +SCYE4Q = 카 2 +SCYP4Q = 카 2 +SCYR4Q = 카 2 +SCYX4Q = 카 2 +SCYY4Q = 카 2 +SCYZ4Q = 카 2 +SCZEMH = 크레이지 머신즈 +SCZPFR = 크레이지 머신즈 +SD2E41 = 저스트 댄스 2 +SD2J01 = 저스트 댄스 Wii SD2K41 = 저스트 댄스 2 +SD2P41 = 저스트 댄스 2 +SD2Y41 = 저스트 댄스 2: 베스트 바이 에디션 +SD3DSV = 건강 코치 +SD5PTV = 학습 성공 초등학생 독일어 +SD6PTV = 학습 성공 초등학생 영어 +SD7PTV = 학습 성공 초등학생 수학 +SD8DSV = 트로피카나에서의 나의 새로운 인생 모험 +SD9JAF = SD 건담: 가챠폰 워즈 +SDAE5G = 소녀들을 위한 대담한 게임 +SDBE78 = 더 블랍 2 +SDBP78 = 더 블랍 2 +SDDPML = 세기의 궁극 대결 +SDEE5G = 댄스 센세이션! +SDEPGT = 댄스 센세이션! +SDFE4Q = 디즈니 싱 잇: 패밀리 히츠 +SDFP4Q = 디즈니 싱 잇: 패밀리 히츠 +SDGE4Q = 디즈니 채널: 올 스타 파티 +SDGP4Q = 디즈니 채널: 올 스타 파티 +SDIE4Q = 디즈니 싱 잇: 파티 히츠 +SDIP4Q = 디즈니 싱 잇: 파티 히츠 +SDJJAF = SD 건담: G 제너레이션 월드 +SDLE78 = 두드의 빅 어드벤처 +SDLP78 = 두드의 빅 어드벤처 +SDMEG9 = 슈퍼배드: 게임 +SDMPAF = 슈퍼배드: 게임 +SDNE41 = 저스트 댄스 +SDNP41 = 저스트 댄스 +SDOPLR = 닥터 후: 지구 귀환 +SDPE54 = 도라의 위대한 생일 모험 +SDPP54 = 도라의 위대한 생일 모험 +SDQJGD = 드래곤 퀘스트 X 고대 용의 전승 온라인 +SDREYG = 맥시멈 레이싱: 드래그 & 스톡 레이서 +SDRPNG = 드래그 & 스톡 레이서 +SDSPNG = 위 댄스 +SDTPGN = PDC 월드 챔피언쉽 다트: 프로 투어 +SDUE41 = 스머프 댄스 파티 +SDUP41 = 스머프 댄스 파티 +SDUX41 = 스머프 댄스 파티 - 월마트 에디션 +SDVE41 = 드라이버: 샌프란시스코 +SDVP41 = 드라이버: 샌프란시스코 +SDWE18 = 로스트 인 쉐도우 +SDWJ18 = 그림자의 탑 +SDXE4Q = 디즈니 유니버스 +SDXP4Q = 디즈니 유니버스 +SDYEA4 = 댄스 댄스 레볼루션 +SDYPA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 4 +SDZE41 = 저스트 댄스 키즈 +SDZP41 = 댄스 주니어스 +SE2E69 = EA 스포츠 엑티브 2 +SE2P69 = EA 스포츠 엑티브 2 +SE3E41 = 저스트 댄스 2015 +SE3P41 = 저스트 댄스 2015 +SE8E41 = 저스트 댄스 2018 +SE8P41 = 저스트 댄스 2018 +SEAE69 = EA 스포츠 엑티브: 더 많은 운동들 +SEAJ13 = 개인 트레이너 Wii 6주 다이어트 프로그램 +SEAP69 = EA 스포츠 엑티브: 더 많은 운동들 +SECE69 = 창조 +SECP69 = 창조 +SEGE6U = 요가 +SEGP6V = 요가 +SEKJ99 = 제물의 밤 +SELE69 = 피파 11 +SELP69 = 피파 11 +SELX69 = 피파 11 +SEME4Q = 디즈니 에픽 미키 +SEMJ01 = 디즈니 에픽 미키: 미키 마우스와 마법의 붓 +SEMP4Q = 디즈니 에픽 미키 +SEMX4Q = 디즈니 에픽 미키 +SEMY4Q = 디즈니 에픽 미키 +SEMZ4Q = 디즈니 에픽 미키 +SENPZX = 엔클레이브: 황혼의 그림자 +SEPE41 = 블랙 아이드 피스: 익스피리언스 +SEPP41 = 블랙 아이드 피스: 익스피리언스 +SEPX41 = 블랙 아이드 피스: 익스피리언스 D1 에디션 +SEPZ41 = 블랙 아이드 피스 익스피리언스: 리미티드 에디션 +SERE4Q = 디즈니 에픽 미키 2: 2 개의 힘 +SERF4Q = 디즈니 에픽 미키 2: 2 개의 힘 +SERJ91 = 디즈니 에픽 미키 2: 2 개의 힘 +SERK8M = 디즈니 에픽 미키 2: 2 개의 힘 +SERP4Q = 디즈니 에픽 미키 2: 2 개의 힘 +SERV4Q = 디즈니 에픽 미키 2: 2 개의 힘 +SESEWR = 세서미 스트리트: 레디, 세트, 그로버! +SESPWR = 세서미 스트리트: 레디, 세트, 그로버! +SESUWR = 세서미 스트리트: 레디, 세트, 그로버! +SEUPEY = 레트로 시티 램페이지 DX +SEVPEY = 강탈: 하와이 +SEZJHF = 이나즈마 일레븐 스트라이커즈 2012 익스트림 +SF2P64 = 스타 워즈: 해방된 포스 II +SF4E20 = 플랫아웃 +SF4PXT = 플랫아웃 +SF5E41 = 핏 인 식스 +SF5J41 = 핏 인 식스: 몸을 단련하는 6 가지 요소 +SF5P41 = 나의 피트니스 코치: 클럽 +SF7E41 = 패밀리 Feud 2012 에디션 +SF8E01 = 동키 콩: 컨트리 리턴즈 +SF8J01 = 동키 콩 리턴즈 +SF8P01 = 동키 콩: 컨트리 리턴즈 +SFAE41 = 패밀리 퓨드 데케이드즈 +SFAJGD = 강철의 연금술사: 황혼의 소녀 +SFBE70 = 백야드 스포츠 풋볼: 루키 러쉬 +SFDEAF = 엑트브 라이프: 매지컬 카니발 +SFDJAF = 함께 놀아요! 드림 테마 파크 +SFDPAF = 패밀리 트레이너: 매지컬 카니발 +SFEPYF = 핏 뮤직 +SFGE69 = 하스브로: 패밀리 게임 나이트 4 - 게임 쇼 +SFGP69 = 하스브로: 패밀리 게임 나이트 4 - 게임 쇼 +SFHEFP = 아웃도어 액션 더블 팩 +SFIE01 = 미스터리 케이스 파일: 말그레이브 사건 +SFIP01 = 미스터리 케이스 파일: 말그레이브 사건 +SFKEG9 = 패밀리 파티: 피트니스 펀 +SFKPAF = 패밀리 파티: 피트니스 펀 +SFLDSV = 이스터 섬의 저주 +SFOEAF = 푸드 네트워크 : 쿡 오어 비 쿡드 +SFPPFR = 환상적인 축구 팬 파티 +SFQE8P = 캡틴 아메리카: 슈퍼 솔저 +SFQP8P = 캡틴 아메리카: 슈퍼 솔저 +SFRDRV = 핏 & 펀 +SFRPXT = 핏 & 펀 +SFSPGT = 올 라운드 헌터 +SFTE78 = 운명의 굴레 +SFTP78 = 운명의 굴레 +SFUE64 = 스타 워즈: 해방된 포스 II +SFVEXJ = 낚시 리조트 +SFWE69 = 2010 피파 월드컵 남아공 +SFWJ13 = 2010 피파 월드컵 남아공 SFWK69 = 2010 피파 월드컵 남아공 +SFWP69 = 2010 피파 월드컵 남아공 +SFWX69 = 2010 피파 월드컵 남아공 +SFWY69 = 2010 피파 월드컵 남아공 +SFWZ69 = 2010 피파 월드컵 남아공 +SFXPKM = X 팩터 +SFXXKM = X 팩터 +SFYEG9 = 패밀리 파티: 90 위대한 게임 파티 팩 +SFYPAF = 패밀리 파티: 90 위대한 게임 파티 팩 +SFZEPZ = 꿩들은 영원히: 윙슛터 +SFZPXT = 꿩들은 영원히 +SG2EFS = 크레이지 미니 골프 2 +SG2PUG = 크레이지 미니 골프 2 +SG2XUG = 크레이지 미니 골프 2 +SG2YFS = 크레이지 미니 골프 2 +SG3DSV = 독일 넥스트 탑 모델 2010 +SG5PSV = 패밀리 퀴즈 +SG6DSV = 갈릴레오 패밀리 퀴즈 +SG7E20 = 가필드 쇼: 우주 라자냐의 위협 +SG7PVL = 가필드 쇼: 우주 라자냐의 위협 +SG8EG9 = 요기 베어 +SG8PAF = 요기 베어: 비디오게임 +SG9EYC = 그렌림: 기즈모 +SGAE8P = 전설들의 토너먼트 +SGAP8P = 전설들의 토너먼트 +SGBE5G = 그렉 헤이스팅스 페인트볼 2 +SGBPGT = 그렉 헤이스팅스 페인트볼 2 +SGCE20 = 빙하 2 +SGDEJJ = 렛츠 플레이 가든 +SGDPKM = 플레이 가든즈 +SGEEG9 = 내셔널 지오그래픽 도전! 와일드 라이프 +SGEPLG = 내셔널 지오그래픽 퀴즈! 와일드 라이프 +SGHE41 = 톰 클랜시의 고스트 리콘 +SGHP41 = 톰 클랜시의 고스트 리콘 +SGIEA4 = GTI 클럽 슈퍼미니 페스타! +SGIJA4 = GTI 클럽 월드 시티 레이스 +SGIPA4 = GTI 클럽 슈퍼미니 페스타! +SGJDSV = 갈릴레오 미스테리: 미다스의 왕관 +SGJPSV = 미다스의 왕관 +SGKEC8 = 챔피언 기수: G1 기수 & 갤럽 레이서 +SGKJC8 = 챔피언 기수: 갤럽 레이서 & G1 기수 +SGKPC8 = 챔피언 기수: G1 기수 & 갤럽 레이서 +SGLEA4 = 고미티: 자연의 제왕! +SGLPA4 = 고미티: 자연의 제왕! +SGNE69 = 하스브로: 패밀리 게임 나이트 밸류 팩 +SGODKP = 미니 골프 리조트 +SGOETV = 미니 골프 리조트 +SGOPKP = 미니 골프 리조트 +SGPEYG = 맥시멈 레이싱: GP 클래식 레이싱 +SGPPNG = GP 클래식 레이싱 +SGQDSV = 독일의 넥스트 탑 모델 2011 +SGREGT = 그리스 +SGRPGT = 그리스 +SGSESZ = 패밀리 게임쇼 +SGSP7J = 패밀리 게임쇼 +SGTEFS = IMG 아카데미와 데이비드 리드베터 함께하는 나의 개인 골프 트레이너 +SGTPUG = IMG 아카데미와 데이비드 리드베터 함께하는 나의 개인 골프 트레이너 +SGUE4Q = 디즈니 길티 파티 +SGVEAF = 고 베케이션 +SGVJAF = 고 베케이션 +SGVPAF = 고 베케이션 +SGWD7K = 마녀 비비 +SGXE41 = 거대 공룡들의 전투: 다이너소어 스트라이크 +SGXP41 = 거대 공룡들의 전투: 다이너소어 스트라이크 +SGYESZ = 구미 베어즈 미니 골프 +SGYPNJ = 구미 베어즈 미니 골프 +SH2JMS = Hula Wii 즐겁게 훌라를 춤추자!! +SH4EFP = 집중포화: 아프가니스탄 +SH4PNK = 집중포화: 아프가니스탄 +SH5E69 = 헤리 포터와 죽음의 성물, 파트 2 +SH5P69 = 헤리 포터와 죽음의 성물, 파트 2 +SH6E52 = 카벨라의 위대한 게임 사냥꾼 2012 +SH6P52 = 카벨라의 위대한 게임 사냥꾼 2012 +SH7ESZ = 혼다 ATV 피버 +SH7PNJ = 혼다 ATV 피버 +SH8E52 = 카벨라의 모험 캠프 +SH8P52 = 카벨라의 모험 캠프 +SH9ESZ = 히스클리프: 분노의 질주 +SH9PNJ = 히스클리프: 분노의 질주 +SHBE69 = 하스브로: 패밀리 게임 나이트 3 +SHBP69 = 하스브로: 패밀리 게임 나이트 3 +SHDE52 = 드래곤 길들이기 +SHDP52 = 드래곤 길들이기 +SHEDRM = 농장 +SHFE20 = 농구 명예의 전당: 얼티밋 훕스 첼린지 +SHGDRM = 홀리데이 게임즈 +SHHE69 = 해리 포터와 죽음의 성물, 파트 1 +SHHP69 = 해리 포터와 죽음의 성물, 파트 1 +SHIJ2N = 쉐이프 복싱 2 Wii로 다이어트를 즐기세요! +SHKE20 = 헬로 키티 시즌 +SHKPNQ = 헬로 키티 시즌 +SHLPA4 = 사일런트 힐: 조각난 기억들 +SHMPLR = 호리드 헨리: 장난의 미션들 +SHNE41 = 숀 화이트 스케이트보딩 +SHNP41 = 숀 화이트 스케이트보딩 +SHOXKR = 휴고: 트롤 숲의 마법 +SHOYKR = 휴고: 트롤 숲의 마법 +SHPE5G = 우리 집 파티 +SHSE20 = 하이퍼 파이터즈 +SHSPXT = 하이퍼 파이터즈 +SHTE20 = 매슈스 활 사냥 +SHUE52 = 카벨라의 위험한 사냥 2011: 스페셜 에디션 +SHVE78 = 핫 휠즈: 트랙 어택 +SHVP78 = 핫 휠즈: 트랙 어택 +SHVX78 = 핫 휠즈: 트랙 어택 +SHWE41 = 헐리우드 스퀘어 +SHXEWR = 해피 피트 2 +SHXPWR = 해피 피트 2 +SHYE69 = EA 스포츠: NHL 슬랩샷 +SHYP69 = EA 스포츠: NHL 슬랩샷 +SHZENR = 할리 데이비슨: 로드 트립 +SI3E69 = 피파 12 +SI3P69 = 피파 12 +SI3X69 = 피파 12 +SIAE52 = 아이스 에이지: 대륙 이동 - 북극 게임들 +SIAI52 = 아이스 에이지: 대륙 이동 - 북극 게임들 +SIAP52 = 아이스 에이지 4: 대륙 이동 - 북극 게임들 +SIDE54 = 시드 마이어의 해적! +SIDP54 = 시드 마이어의 해적! +SIFESZ = Dr. 프랑켄슈타인의 섬 +SIFPNJ = Dr. 프랑켄슈타인의 섬 +SIHE4Z = 싱 4: 히츠 에디션 +SIIE8P = 마리오와 소닉 런던 올림픽 +SIIJ01 = 마리오와 소닉 런던 올림픽 SIIK01 = 마리오와 소닉 런던 올림픽 +SIIP8P = 마리오와 소닉 런던 올림픽 +SIJE52 = 아이칼리 2: 아이클릭하여 참여하세요! +SIJP52 = 아이칼리 2: 아이클릭하여 참여하세요! +SILE78 = 웜즈: 배틀 아일랜드 +SILP78 = 웜즈: 배틀 아일랜드 +SIME69 = 마이심즈 컬렉션 +SINPNG = 위 싱: 로비 윌리엄스 +SIPE7T = 아이 스파이 게임 팩 +SISENR = 이사벨라 공주: 마녀의 저주 +SISJ0Q = 정적 수축 & 가라데 운동: Wii에서 골반 피트 +SISPUH = 이사벨라 공주: 마녀의 저주 +SITPNG = 위 싱 독일 히츠 +SIUUNG = 위 싱 다운 언더 +SIXE41 = 드로썸! 태블릿 +SJ2EWR = 스쿠비-두! 와 으스스한 늪 +SJ2PWR = 스쿠비-두! 와 으스스한 늪 +SJ3JDA = 인생 게임: 해피 패밀리 +SJ3PNL = 꼬마 돼지 피글리의 모험! 카트 레이싱 +SJ5JDA = 인생게임 해피 패밀리 지역 소재 증량판 +SJ6E41 = 저스트 댄스 디즈니 파티 +SJ6P41 = 저스트 댄스 디즈니 파티 +SJ7E41 = 저스트 댄스 키즈 2014 +SJ7P41 = 저스트 댄스 키즈 2014 +SJ9E41 = 저스트 댄스 여름 파티 +SJ9P41 = 저스트 댄스 2: 추가 노래들 +SJAE5G = 죠스: 얼티잇 프레데터 +SJBE52 = 골든아이 007 +SJBJ01 = 골든아이 007 +SJBP52 = 골든아이 007 +SJCEZW = 제리 라이스 & 니투스 강아지 풋볼 +SJDE41 = 저스트 댄스 3 +SJDJ01 = 저스트 댄스 Wii 2 SJDK41 = 저스트 댄스 3 +SJDP41 = 저스트 댄스 3 +SJDX41 = 저스트 댄스 3 스페셜 에디션 +SJDY41 = 저스트 댄스 3: 베스트 바이 독점 에디션 +SJDZ41 = 저스트 댄스 3: 타켓 독점 에디션 +SJEEPK = 모험섬에서 점프스타 탈출 +SJFE4Z = 키드 핏 아일랜드 리조트 +SJFPGR = 주니어 피트니스 트레이너 +SJFXGR = 주니어 피트니스 트레이너 +SJGEPK = 점프스타트 겟 무빙 패밀리 피트니스 +SJHE41 = 저스트 댄스 그레이티스트 히트 +SJIEG9 = 질리안 마이클스 피트니스 울티메이텀 2011 +SJJEA4 = 지미 존스의 엔진과 관련된 모든 것 +SJKEPK = 점프스타 크레이지 카츠 +SJLEFS = 주니어 리그 스포츠 +SJLPXT = 주니어 리그 스포츠 +SJME5G = 질리안 마이클스 피트니스 울티메이텀 2010 +SJMPGT = 질리안 마이클스 피트니스 울티메이텀 2010 +SJNE41 = 저스트 댄스 2016 +SJNP41 = 저스트 댄스 2016 +SJOE41 = 저스트 댄스 2014 +SJOP41 = 저스트 댄스 2014 +SJPE78 = 위험! +SJQEPZ = 쥬얼 퀘스트 3 부작 +SJQPGR = 쥬얼 퀘스트 3 부작 +SJREA4 = 데프 잼 랩스타 +SJRPA4 = 데프 잼 랩스타 +SJRXA4 = 데프 잼 랩스타 +SJRYA4 = 데프 잼 랩스타 +SJRZA4 = 데프 잼 랩스타 +SJSEPK = 점프스타 애완동물 구조대 +SJTP41 = 저스트 댄스: 최고 +SJUE20 = 다이노 스트라이크 +SJUPXT = 다이노 스트라이크 +SJVE20 = 숀 존슨의 체조 +SJWJA4 = 위닝 일레븐 플레이 메이커 2010 푸른 사무라이의 도전 +SJXD41 = 저스트 댄스 4 스페셜 에디션 +SJXE41 = 저스트 댄스 4 +SJXP41 = 저스트 댄스 4 +SJZE41 = 저스트 댄스 키즈 2 +SJZP41 = 저스트 댄스 키즈 +SK3EEB = 트라우마 팀 +SK4E52 = 슈렉: 그후로 영원히 +SK4I52 = 슈렉: 그후로 영원히 +SK4P52 = 슈렉: 그후로 영원히 +SK5PY1 = 카일리의 노래와 춤 SK6KJD = 케이팝 댄스 페스티벌 -SMNK01 = 뉴 슈퍼 마리오브라더스 Wii +SK7PVZ = 디즈니 비올레타: 리듬 & 뮤직 +SK7XVZ = 디즈니 비올레타: 리듬 & 뮤직 +SK8D52 = 스카이랜더스: 트랩 팀 +SK8E52 = 스카이랜더스: 트랩 팀 +SK8I52 = 스카이랜더스: 트랩 팀 +SK8P52 = 스카이랜더스: 트랩 팀 +SK8V52 = 스카이랜더스: 트랩 팀 +SK8X52 = 스카이랜더스: 트랩 팀 +SKAEA4 = 카라오케 레볼루션 글리 +SKAPA4 = 카라오케 레볼루션 글리 +SKBEG9 = 키즈 밥 댄스 파티! +SKCE20 = 빅풋: 크러쉬 킹 +SKDJ18 = 가라오케 조이사운드 Wii 듀엣곡편 +SKEJ18 = 카라오케 조이사운드 Wii 엔카・가요곡전 +SKGEA4 = 카라오케 레볼루션 글리 볼륨 2 +SKGPA4 = 카라오케 레볼루션 글리 볼륨 2 +SKHJAF = 가면 라이더 슈퍼 클라이맥스 히어로즈 +SKJE78 = 당신은 잭을 모릅니다 +SKKPHY = 캡틴 모르간과 황금 거북 +SKKXHY = 캡틴 모르간과 황금 거북 +SKLDSV = K11 - 활동중인 감독관 +SKMJAF = 가면 라이더 클라이맥스 히어로즈 W +SKNE52 = 스카이랜더스: 슈퍼첼린저스 레이싱 +SKNP52 = 스카이랜더스: 슈퍼첼린저스 레이싱 +SKOEA4 = 카라오케 레볼루션 글리 볼륨 3 +SKOPA4 = 카라오케 레볼루션 글리 볼륨 3 +SKREG9 = 가면 라이더 용기사 +SKTE78 = 올 스타 카라테 +SKTP78 = 올 스타 카라테 +SKUE78 = 쿵푸 팬더 2 +SKUP78 = 쿵푸 팬더 2 +SKUZ78 = 쿵푸 팬더 2 +SKVE20 = 케빈 반 담의 위대한 배스 도전 +SKWPNK = 코코토 카트 레이서 2 +SKXE20 = 파이럿 블래스트 +SKXPFH = 파이럿 블래스트 +SKYE52 = 스카이랜더스: 거인들 +SKYP52 = 스카이랜더스: 거인들 +SKYX52 = 스카이랜더스: 거인들 +SKYY52 = 스카이랜더스: 거인들 +SKYZ52 = 스카이랜더스: 거인들 +SKZE52 = 드림웍스 슈퍼 스타 카트즈 +SKZP52 = 드림웍스 슈퍼 스타 카트즈 +SL2J01 = 령: 진홍의 나비 +SL2P01 = 령: 진홍의 나비 +SL3ENR = 용의 굴 3 부작 +SL4PAF = 로스 40 프린시팔레스 카라오케 파티 +SL5DKM = 렛츠 싱 2019: 독일 히츠! +SL5FKM = 렛츠 싱 2019: 프랑스 히츠 +SL6PGN = 에브리원 싱 +SL7DML = 2 합 1: 나의 애완동물 하우스 + 나의 애완동물 진료시간 +SLAE78 = 최후의 에어벤더 +SLAP78 = 최후의 에어벤더 +SLAX78 = 최후의 에어벤더: 스페셜 에디션 +SLAZ78 = 라스트 에어벤더: 토이저러스 스페셜 에디션 +SLCEGN = 일어나서 춤을 +SLCPGN = 일어나서 춤을 +SLDEYG = 렛츠 댄스 +SLDPLG = 멜 비와 함께하는 렛츠 댄스 +SLEE78 = 디팩 초프라의 릴라 +SLEP78 = 디팩 초프라의 릴라 +SLFPKM = 렛츠 싱 +SLFXKM = 렛츠 싱 5: 스페인어 버전 +SLGEYG = 렛츠 싱 2016 +SLGPKM = 렛츠 싱 2016 +SLHEWR = 레고 해리 포터: 5-7 년 +SLHPWR = 레고 해리 포터: 5-7 년 +SLIE52 = 리틀 리그 월드 시리즈 야구: 더블 플레이 +SLJPKM = 렛츠 싱 8: 스페인어 버전 +SLKPKM = 렛츠 싱 2016: 프랑스 히츠 +SLLEWW = 레슬링 AAA: 반지의 영웅 +SLMPWL = 로스 40 프린시팔레스 카라오케 파티 볼륨 2 +SLNP7M = 보이스 볼륨 3 +SLPP5D = 늑대의 정신 +SLREWR = 레고 반지의 제왕 +SLRPWR = 레고 반지의 제왕 +SLSEXJ = 마지막 이야기 +SLSJ01 = 마지막 이야기 +SLSP01 = 마지막 이야기 +SLTEJJ = 뉴유 피트니스 퍼스트 마인드 바디: 요가 및 필라테스 운동 +SLTPLG = 뉴유 피트니스 퍼스트 마인드 바디: 요가 및 필라테스 운동 +SLVP41 = 위 데어 +SLWE41 = 월리를 찾아라: 환상적인 여행 +SLYESZ = 비스틀리 +SLYPNJ = 비스틀리 +SM2E52 = 10 분 솔루션 +SM2P52 = 10 분 솔루션 +SM4E20 = 몬스터 트럭스 메이햄 +SM4PXT = 몬스터 트럭스: 울트라 메가 익스트림!!! +SM5EAF = 파워 레인저스 사무라이 +SM5PAF = 파워 레인저스 사무라이 +SM6PNK = 나의 바디 코치 2: 피트니스 & 댄스 +SM7E69 = 매든 NFL 12 +SM8D52 = 콜 오브 듀티: 현대 전쟁 3 +SM8E52 = 콜 오브 듀티: 현대 전쟁 3 +SM8F52 = 콜 오브 듀티: 현대 전쟁 3 +SM8I52 = 콜 오브 듀티: 현대 전쟁 3 +SM8P52 = 콜 오브 듀티: 현대 전쟁 3 +SM8S52 = 콜 오브 듀티: 현대 전쟁 3 +SM8X52 = 콜 오브 듀티: 현대 전쟁 3 +SM9E54 = 메이저 리그 야구 2K12 +SMAENR = 해병대: 현대 도시 전투 +SMAPGN = 해병대: 현대 도시 전투 +SMBE8P = 슈퍼 몽키 볼: 스텝 & 롤 +SMBJ8P = 슈퍼 몽키 볼 운동경기 +SMBP8P = 슈퍼 몽키 볼: 스텝 & 롤 +SMCENR = 행복한 성탄절 되세요 +SMCPXT = 행복한 성탄절 되세요 +SMEE69 = 매든 NFL 11 +SMFE4Q = 피니와 퍼브: 2차원을 넘어서 +SMFP4Q = 피니와 퍼브: 2차원을 넘어서 +SMGE78 = 메가마인드: 메가 팀 유나이트 +SMGP78 = 메가마인드: 메가 팀 유나이트 +SMHPNK = 마벨 슈퍼 히어로즈 3D: 그랜드마스터의 도전 +SMIE41 = 백만장자가 되고 싶은 사람 +SMJE52 = 몬스터 잼: 파괴의 길 +SMJP52 = 몬스터 잼: 파괴의 길 +SMKE4Z = 젬 스매셔즈 +SMLE54 = 메이저 리그 야구 2K10 +SMMJ0Q = 몸짱 다이어트 Wii: 정다연의 피규어로빅스 +SMNE01 = 뉴 슈퍼 마리오 브라더스 Wii +SMNJ01 = 뉴 슈퍼 마리오 브라더스 Wii +SMNK01 = 뉴 슈퍼 마리오 브라더스 Wii +SMNP01 = 뉴 슈퍼 마리오 브라더스 Wii +SMNW01 = 뉴 슈퍼 마리오 브라더스 Wii +SMOE41 = 마이클 잭슨: 익스피리언스 +SMOJ41 = 마이클 잭슨: 익스피리언스 +SMOP41 = 마이클 잭슨: 익스피리언스 +SMOX41 = 마이클 잭슨: 익스피리언스 - 월마트 에디션 +SMOY41 = 마이클 잭슨: 익스피리언스 - 스페셜 에디션 +SMPE69 = 모노폴리 컬렉션 +SMPP69 = 모노폴리 컬렉션 +SMRE78 = WWE 스맥다운 vs. Raw 2011 +SMRP78 = WWE 스맥다운 vs. Raw 2011 +SMSE78 = 마벨 슈퍼 히어로 스쿼드: 인피니티 건틀렛 +SMSP78 = 마벨 슈퍼 히어로 스쿼드: 인피니티 건틀렛 +SMTJ18 = 모모타로 전철 2010: 전국・유신의 영웅 대집합!의 권 +SMUJAF = 대괴수 배틀: 울트라 콜로세움 DX - 울트라 전사 대집결 +SMVE54 = 메이저 리그 야구 2K11 +SMWE4Z = 베어 그릴스의 인간과 자연의 대결 +SMYE20 = 사소한 도전 60초 +SMZE78 = 마벨 슈퍼 히어로 스쿼드: 코믹 컴뱃 +SMZP78 = 마벨 슈퍼 히어로 스쿼드: 코믹 컴뱃 +SN2E69 = 너프 N-스트라이크 더블 블래스트 번들 +SN3EYG = 맥시멈 레이싱: 랠리 레이서 +SN3PNG = 랠리 레이서 +SN4EDA = 나루토 질풍전: 드래곤 블레이드 연대기 +SN4JDA = 나루토 질풍전: 용인기 +SN4XGT = 나루토 질풍전: 드래곤 블레이드 연대기 +SN5EYG = 맥시멈 레이싱: 크래쉬 카 레이서 +SN5PNG = 크래쉬 카 레이서 +SN6EYG = 맥시멈 레이싱: 슈퍼 카츠 +SN6PNG = 슈퍼 카츠 +SN7EYG = 맥시멈 레이싱: 슈퍼 트럭 레이서 +SN7PNG = 슈퍼 트럭 레이서 +SN8EYG = 맥시멈 레이싱: 스프린트 카 +SN8PNG = 스프린트 카 +SN9E54 = 니켈로데온 핏 +SNAE52 = 카벨라의 북미 모험 2011 +SNBE41 = NCIS: 게임 +SNBP41 = NCIS: 게임 +SNCE8P = 소닉 컬러즈 +SNCJ8P = 소닉 컬러즈 +SNCP8P = 소닉 컬러즈 +SNDE20 = 딜 오어 노 딜: 스페셜 에디션 +SNEENR = 북미 사냥 엑스트라바간자 2 +SNEPXT = 북미 사냥 2: 엑스트라바간자 +SNFE69 = EA 스포츠 엑티브 NFL 트레이닝 캠프 +SNGEJJ = 멜 비와 함께하는 건강한 몸매 만들기 +SNGPLG = 멜 비와 함께하는 건강한 몸매 만들기 +SNHE69 = 니드 포 스피드: 추적 +SNHJ13 = 니드 포 스피드: 추적 +SNHP69 = 니드 포 스피드: 추적 +SNIE54 = 닉툰즈 MLB +SNJE69 = NBA 잼 +SNJP69 = NBA 잼 +SNKP54 = 니켈로데온 핏 +SNKX54 = 니켈로데온 핏 +SNLE54 = 니켈로데온 댄스 +SNLX54 = 니켈로데온 댄스 +SNMEAF = 남코 뮤지엄 메가믹스 +SNOPY1 = 지금! 그것이 내가 음악이라고 부르는 것: 춤 & 노래 +SNPE52 = 나스카 게임: 인사이드 라인 +SNQE7U = 내셔널 지오그래픽: 도전! +SNQPLG = 내셔널 지오그래픽: 도전! +SNRE52 = 나스카 언리쉬드 +SNSE52 = 나스카 2011: 게임 +SNTEXN = 넷플릭스 인스턴트 스트리밍 디스크 +SNUPJW = 해피 뉴런 아카데미 +SNVE69 = 니드 포 스피드: 도망 +SNVJ13 = 니드 포 스피드: 도망 +SNVP69 = 니드 포 스피드: 도망 +SNXJDA = 나루토 질풍전: 격투 닌자 대전! 스페셜 +SNYEVZ = 몬스터 하이: 13 개의 소원들 +SNYPVZ = 몬스터 하이: 13 개의 소원들 +SNZEVZ = 바비: 드림하우스 파티 +SNZPVZ = 바비: 드림하우스 파티 +SO3EE9 = 룬 팩토리: 운명의 흐름 +SO3J99 = 룬 팩토리: 대양 +SOAE52 = 카벨라의 사냥 수렵대 +SOBD7K = 비비 블록스베르크 2 +SOCE4Z = 데들리스트 캐치: 혼돈의 바다 +SODPYK = 탐험가와 다이아몬드 스카라브의 미스터리 +SOIEEB = 101 합 1 스포츠 파티 메가믹스 +SOIPHZ = 101 합 1 스포츠 파티 메가믹스 +SOJE41 = 레이맨 오리진즈 +SOJP41 = 레이맨 오리진즈 +SOKEA4 = 카라오케 조이사운드 +SOKJ18 = 카라오케 조이사운드 Wii DX +SOME01 = 리듬 천국 피버 +SOMJ01 = 리듬 세상 Wii SOMK01 = 리듬 세상 Wii -SOUK01 = 젤다의 전설 스카이워드 소드 +SOMP01 = 리듬 세상 Wii +SONDMR = 나의 첫 노래 +SONFMR = 나의 첫 노래 +SONPMR = 나의 첫 노래 +SORE4Z = 오레곤 트레일 +SOSEG9 = 터보: 슈퍼 스턴트 스쿼드 +SOSPAF = 터보: 슈퍼 스턴트 스쿼드 +SOTE52 = 와이프아웃: 게임 +SOUE01 = 젤다의 전설: 스카이워드 소드 +SOUJ01 = 젤다의 전설: 스카이워드 소드 +SOUK01 = 젤다의 전설: 스카이워드 소드 +SOUP01 = 젤다의 전설: 스카이워드 소드 +SP2E01 = Wii 스포츠 + Wii 스포츠 리조트 +SP2P01 = Wii 스포츠 + Wii 스포츠 리조트 +SP3E41 = $1,000,000 피라미드 +SP4PJW = 페탕크 마스터 +SP5E70 = 코레 갱: 지구 내부에서의 침입 +SP5PVV = 코레 갱: 지구 내부에서의 침입 +SP7EAF = 팩맨 파티 +SP7JAF = 팩맨 파티 +SP7PAF = 팩맨 파티 +SP8E78 = 마다가스카의 펭귄: 블로홀 박사의 반격! +SP8P78 = 마다가스카의 펭귄: 블로홀 박사의 반격! +SP9PJW = 키스를 위한 뿌까의 레이스 +SPAE5G = 해적 대모험 +SPBPGT = 스펠바운드 파티 +SPCPZS = 포코요 레이싱 +SPDE52 = 스파이더맨: 조각난 차원 +SPDP52 = 스파이더맨: 조각난 차원 +SPEE20 = 스피드 +SPEPXT = 스피드 +SPGPPN = 페파 피그: 펀 & 게임즈 +SPHPJW = 스파게티 웨스턴 슛터 +SPIE18 = 이런! 장난 파티 +SPIJ18 = 파티 게임 박스 100 +SPIP18 = 게임즈 아일랜드 +SPKXPV = 스프링데일 +SPMDRM = 마작 파티 +SPMPWP = 마작 파티 팩 +SPOPFR = 동계 스포츠 2011: 금메달을 향해 +SPPEFS = 파워 펀치 +SPQE7T = 나는 스파이: 으스스한 저택 +SPRE41 = 정의의 가치: 2010 에디션 +SPTJEB = 병원. 6 명의 의사 +SPUE20 = 렛츠 페인트 +SPVEA4 = 프로 에볼루션 싸커 2011 +SPVPA4 = 프로 에볼루션 싸커 2011 +SPVXA4 = 프로 에볼루션 싸커 2011 +SPVYA4 = 프로 에볼루션 싸커 2011 +SPWHZH = 스튜디오 100: 플레이 아일랜드 +SPXP41 = 페르시아 왕자: 망각의 모래 +SPYDSV = 예티스포츠: 펭귄 파티 섬 +SPZE5G = 파지 배달 소년 +SQ2EPZ = 컨트리 댄스 +SQ2PXT = 컨트리 댄스 +SQ3EPZ = 컨트리 댄스 +SQAE52 = 카벨라의 아프리카 모험 +SQBPXT = 큐브 +SQDE8P = 건블레이드 NY & LA 머신건: 아케이드 히트 팩 +SQDP8P = 건블레이드 NY & LA 머신건: 아케이드 히트 팩 +SQEENG = 위 싱 팝! +SQEPNG = 위 싱 팝! +SQFE5G = 피니와 퍼브: 멋진 물건에 대한 탐구 +SQFPGT = 피니와 퍼브: 멋진 물건에 대한 탐구 +SQIE4Q = 디즈니 인피니티 +SQIP4Q = 디즈니 인피니티 +SQIY4Q = 디즈니 인피니티 +SQKE5G = 마마의 2 팩 (WORLD KITCHEN/COOK OFF) +SQKK01 = 쿠킹 마마 2 팩 +SQLE4Z = 카툰 네트워크: 펀치 타임 익스플로전 XL +SQLPGN = 카툰 네트워크: 펀치 타임 익스플로전 XL +SQME52 = 스파이더맨: 엣지 오브 타임 +SQMP52 = 스파이더맨: 엣지 오브 타임 +SQPPX4 = 스피드 2 +SQQEVZ = 비행기: 소방구조대 +SQQPVZ = 비행기: 소방구조대 +SQRPNG = 위 싱 락! +SQTPML = 세기의 궁극적인 대결: 퀴즈 & 플레이! +SQUDX3 = 퀴즈 파티 +SQUFX3 = 퀴즈 파티 +SQUPX3 = 퀴즈 파티 +SQVE69 = 피파 15 +SQVP69 = 피파 15 - 레거시 에디션 +SQVX69 = 피파 15 - 레거시 에디션 +SQWE52 = 보이스: 당신을 원해요 +SR4E41 = 래이맨 엽기토끼: 시간 여행 +SR4J41 = 래이맨 엽기토끼: 시간 여행 +SR4P41 = 래이맨 엽기토끼: 시간 여행 +SR5E41 = 래이맨 엽기토끼: 파티 콜렉션 +SR5P41 = 래이맨 엽기토끼: 파티 콜렉션 +SR6EHG = 리더 래빗: 1 학년 +SR7EHG = 리더 래빗: 2 학년 +SR8EHG = 리더 래빗: 유아원 +SR9EHG = 리더 래빗: 유치원 +SRAJMS = 라지루기 노아 Wii +SRBPHS = 럭비 리그 3 +SRCE69 = 락 밴드: 컨트리 트랙 팩 2 +SREXNL = 리더 레빗 유아원 +SRFE52 = 라팔라 프로 배스 낚시 +SRFP52 = 라팔라 프로 배스 낚시 +SRGE69 = 랭고 +SRGP69 = 랭고 +SRIE78 = 리오 +SRIP78 = 리오 +SRJJAF = 슈퍼 전대 배틀: 레인저 크로스 +SRKEFP = 레밍턴 슈퍼 슬램 사냥: 알래스카 +SRKPNK = 레밍턴 위험한 동물들 +SRLXNL = 리더 래빗 유치원 +SRME18 = 룸즈: 메인 빌딩 +SRMJ18 = 룸즈: 이상하게 움직이는 방 +SRNE70 = 프로젝트 런웨이 +SRNP70 = 프로젝트 런웨이 +SROENS = 천공의 기사 로데아 +SROJQC = 천공의 기사 로데아 SROKZ5 = 천공의 기사 로데아 +SROPNS = 천공의 기사 로데아 +SRPE4Q = 디즈니 탱글드 +SRPP4Q = 디즈니 탱글드 +SRQE41 = 라켓 스포츠 +SRQP41 = 라켓 스포츠 파티 +SRRENR = 렉 룸 게임즈 +SRRPGN = 그레이트 파티 게임즈 +SRSE20 = 슈퍼 소닉 레이서 +SRSPXT = 슈퍼 소닉 레이서 +SRTXNL = 리더 래빗 1 학년 +SRUE4Z = 빨간 코 순록 루돌프 +SRVE41 = 정의의 가치: 수십 년 +SRWXNL = 리더 래빗 2 학년 +SRXE52 = 제너레이터 렉스: 섭리의 대리인 +SRXP52 = 제너레이터 렉스: 섭리의 대리인 +SRYEAF = 엑서비트: 체육관 수업 운동 +SRYJAF = 피트니스 파티 +SRYPAF = 엑서비트: 체육관 수업 운동 +SS2PFR = 하계 스포츠 2012: 정신을 느껴라 +SS3EWR = 세사미 스트리트: 엘모의 동물원 모험 +SS3PWR = 세사미 스트리트: 엘모의 동물원 모험 +SS3UWR = 세사미 스트리트: 엘모의 동물원 모험 +SS4EWR = 세사미 스트리트: 쿠키의 카운팅 카니발 +SS4UWR = 세사미 스트리트: 쿠키의 카운팅 카니발 +SS5ENR = 세티스패션 +SS6UHS = AFL 라이브: 올해의 게임 에디션 +SS7EFP = 레밍턴 슈퍼 슬램 헌팅: 아프리카 +SS7URN = 레밍턴 슈퍼 슬램 헌팅: 아프리카 +SS8E78 = 네모바지 스펀지밥 +SS8P78 = 네모바지 스펀지밥 +SS9JMS = 마일스톤 슈팅 컬렉션 2 +SSBE78 = 장화신은 고양이 +SSBP78 = 장화신은 고양이 +SSCDWR = 장면? 밝은 빛! 큰 화면! +SSCEPM = 장면? 밝은 빛! 큰 화면! +SSCFWR = 장면? 밝은 빛! 큰 화면! +SSCIWR = 장면? 밝은 빛! 큰 화면! +SSCPWR = 장면? 밝은 빛! 큰 화면! +SSCSWR = 장면? 밝은 빛! 큰 화면! +SSCXPM = 장면? 밝은 빛! 큰 화면! +SSDDRV = 라브의 충격 +SSEDNG = 위 싱 볼륨 2 +SSEPNG = 위 싱: 앙코르 +SSEVNG = 위 싱: 앙코르 +SSFPKM = 싱 4: 히츠 에디션 +SSGPNG = 위 싱 +SSHPHH = 셜록 홈즈: 은 귀걸이 +SSIENR = 윈터 블래스트: 9 스노우 & 아이스 게임즈 +SSJEJJ = 썸머 스타즈 2012 +SSJPKM = 썸머 스타즈 2012 +SSLENR = 내 사랑 말들: 기수의 천국 +SSLPKM = 안장 클럽 +SSMEYG = 미국 멘사 아카데미 +SSMPGD = 멘사 아카데미 +SSNEYG = 스나이퍼 엘리트 +SSNPHY = 스나이퍼 엘리트 +SSPE52 = 스카이랜더즈: 스파이로의 모험 +SSPJGD = 스카이랜더즈: 스파이로의 대모험 +SSPP52 = 스카이랜더즈: 스파이로의 모험 +SSPX52 = 스카이랜더즈: 스파이로의 모험 +SSPY52 = 스카이랜더즈: 스파이로의 모험 SSQE01 = 마리오 파티 9 SSQJ01 = 마리오 파티 9 SSQK01 = 마리오 파티 9 SSQP01 = 마리오 파티 9 -SUKK01 = 별의 커비 -SUPK01 = wii 파티 +SSQW01 = 마리오 파티 9 +SSRE20 = 와일드 웨스트 샷아웃 +SSRPXT = 와일드 웨스트 샷아웃 +SSSEWR = 세서미 스트리트: 엘모의 뮤직컬 몬스터피스 +SSTEG9 = 키드 어드벤처: 스카이 캡틴 +SSTPY5 = 스턴트 플라이어: 창공의 영웅 +SSUES5 = 초밥 고 라운드 +SSVE52 = 와이프아웃 3 +SSWDRM = 워터 스포츠 +SSWEPZ = 워터 스포츠 +SSWPGR = 워터 스포츠 +SSZE5G = 검 +ST3J01 = 키키 트릭 +ST4PNX = 토마스와 친구들: 기찻길 영웅 +ST4XNX = 토마스와 친구들: 기찻길 영웅 +ST5E52 = 트랜스포머즈: 싸이버트론 모험 +ST5P52 = 트랜스포머즈: 싸이버트론 모험 +ST6E78 = 도전! FAT 제로: 도전 +ST6P78 = 도전! FAT 제로: 도전 +ST7E01 = 포춘 스트리트 +ST7JGD = 이타다키 스트리트 +ST7P01 = 붐 스트리트 +ST9E52 = 탑 샷 아케이드 +STAE78 = 픽셔너리 +STAP78 = 픽셔너리 +STAU78 = 픽셔너리 +STDEFP = 재장전 +STEETR = 테트리스 파티 디럭스 +STEJ18 = 테트리스 파티 프리미엄 +STEPTR = 테트리스 파티 디럭스 +STFE52 = 트랜스포머즈: 프라임 +STFP52 = 트랜스포머즈 프라임: 게임 +STGJAF = 테일즈 오브 그레이세스 +STHE8P = 토르: 천둥의 신 +STHP8P = 토르: 천둥의 신 +STIFKM = 말썽꾸러기 띠떼프 +STJJAF = 태고의 달인 Wii 결정판 +STKE08 = 타츠노코 vs. 캡콤: 얼티밋 올 스타즈 +STKJ08 = 타츠노코 vs. 캡콤: 얼티밋 올 스타즈 +STKP08 = 타츠노코 vs. 캡콤: 얼티밋 올 스타즈 +STLE78 = 진실 또는 거짓말 +STLP78 = 진실 또는 거짓말 +STMEGN = 타이타닉 미스테리 +STMPKP = 타이타닉 미스테리 +STNE41 = 틴틴의 모험: 게임 +STNP41 = 틴틴의 모험: 유니콘의 비밀 +STOE4Q = 카 툰:메이터의 놀라운 이야기 +STOP4Q = 카 툰:메이터의 놀라운 이야기 +STOX4Q = 카 툰:메이터의 놀라운 이야기 +STPPML = 애완 동물 수의사: 해양 순찰 +STQJHF = 이나즈마 일레븐 스트라이커즈 +STQP01 = 이나즈마 일레븐 스트라이커즈 +STQX01 = 이나즈마 일레븐 스트라이커즈 +STRE4Q = 트론: 에볼루션 - 배틀 그리드즈 +STRP4Q = 트론: 에볼루션 - 배틀 그리드즈 +STRX4Q = 트론: 에볼루션 - 배틀 그리드즈 챔피온쉽 에디션 +STSE4Q = 토이 스토리 3 +STSP4Q = 토이 스토리 3 +STSR4Q = 토이 스토리 3 +STSX4Q = 토이 스토리 3 +STSY4Q = 토이 스토리 3 +STSZ4Q = 토이 스토리 3: 토이 박스 스페셜 에디션 +STTDRM = 숨겨진 미스테리들: 타이타닉 +STTE52 = 숨겨진 미스테리들: 타이타닉 +STTPGR = 숨겨진 미스테리들 타이타닉: 운명의 항해 비밀 +STTXGR = 숨겨진 미스테리들: 타이타닉 +STUPRN = 터보 트레인즈 +STVDSV = TV 토탈 이벤츠 +STWE69 = 타이거 우즈 PGA 투어 11 +STWP69 = 타이거 우즈 PGA 투어 11 +STXE69 = 타이거 우즈 PGA 투어 12: 마스터즈 +STXP69 = 타이거 우즈 PGA 투어 12: 마스터즈 +STYE52 = 토니 호크: 쉬레드 +STYP52 = 토니 호크: 쉬레드 +STZE52 = 트랜스포머즈: 달의 어둠 - 스텔스 포스 에디션 +STZP52 = 트랜스포머즈: 달의 어둠 - 스텔스 포스 에디션 +SU2E54 = 니켈로데온 댄스 2 +SU2P54 = 니켈로데온 댄스 2 +SU2X54 = 니켈로데온 댄스 2 +SU3DMR = 유 싱 2 +SU3FMR = 유 싱 2 +SU3HMR = 유 싱 2 +SU3PMR = 유 싱 2 +SU3SMR = 유 싱 2 +SU3UMR = 유 싱 2: 오스트레일리아 에디션 +SU4E78 = UFC 개인 트레이너: 얼티밋 피트니스 시스템 +SU4P78 = UFC 개인 트레이너: 얼티밋 피트니스 시스템 +SU5EVZ = 몬스터 하이: 스컬티밋 롤러 미로 +SU5PVZ = 몬스터 하이: 스컬티밋 롤러 미로 +SU6E5G = 줌바 피트니스 코어 +SU6P5G = 줌바 피트니스 코어 +SU6XGT = 줌바 피트니스 코어 +SU7EG9 = 가디언즈 +SU7PAF = 가디언즈 +SU8PNG = 위 싱: 독일 히츠 2 +SU9E4Q = 디즈니 비행기들 +SU9P4Q = 디즈니 비행기들 +SU9X4Q = 디즈니 비행기들 +SUKE01 = 커비의 드림랜드 귀환 +SUKJ01 = 별의 커비 Wii +SUKK01 = 별의 커비 Wii +SUKP01 = 커비의 모험 Wii +SUMJC8 = 위닝 포스트 월드 2010 +SUNEYG = 디어 드라이브 레전드즈 +SUOE41 = 힙합 댄스 익스피리언스 +SUOP41 = 힙합 댄스 익스피리언스 +SUPE01 = Wii 파티 +SUPJ01 = Wii 파티 +SUPK01 = Wii 파티 +SUPP01 = Wii 파티 +SUQENG = 위 싱: 영국 히츠 +SUQPNG = 위 싱: 영국 히츠 +SUREA4 = 댄스 댄스 레볼루션 II +SURPA4 = 댄스 댄스 레볼루션: 가장 인기있는 파티 5 +SUSFMR = 유 싱 조니 할리데이 +SUSPMR = 유 싱 걸즈 나이트 +SUTESZ = 옛날 옛적에 +SUUE78 = uDraw 스튜디오: 인스턴트 아티스트 +SUUP78 = uDraw 스튜디오: 인스턴트 아티스트 +SUVE52 = 카벨라의 위험한 사냥 2013 +SUVP52 = 카벨라의 위험한 사냥 2013 +SUWE78 = uDraw 스튜디오 +SUWP78 = uDraw 스튜디오 +SUXEA4 = 프로 에볼루션 싸커 2010 +SUXJA4 = 위닝 일레븐 플레이 메이커 2010 +SUXPA4 = 프로 에볼루션 싸커 2010 +SUXXA4 = 프로 에볼루션 싸커 2010 +SUXYA4 = 프로 에볼루션 싸커 2010 +SUYDRV = 라브의 충격: 세 번째 일치 +SUZD7K = 베냐민 블륌첸: 퇴뢰에에 동물원 +SV2E78 = 빅 비치 스포츠 2 +SV2P78 = 빅 비치 스포츠 2 +SV3EG9 = 마다가스카 3: 이번엔 서커스다! +SV3PAF = 마다가스카 3: 이번엔 서커스다! +SV4E8P = 버추어 테니스 4 +SV4P8P = 버추어 테니스 4 +SV5PRV = 독일의 보이스 볼륨 2 +SV6SRV = 보이스 +SV7EVZ = 마다가스카의 펭귄들 +SV7PVZ = 마다가스카의 펭귄들 +SVBE52 = 전함 +SVBP52 = 전함 +SVCEPZ = 빅 타임 러쉬: 댄스 파티 +SVCPXT = 빅 타임 러쉬: 댄스 파티 +SVDE52 = 네모바지 스펀지밥: 플랑크톤의 로봇 복수 +SVDP52 = 네모바지 스펀지밥: 플랑크톤의 로봇 복수 +SVEPAF = 드림웍스 - 크루즈 패밀리: 선사 시대 파티 & 가디언즈: 콤보 팩 +SVHE69 = 피파 14 - 레거시 에디션 +SVHP69 = 피파 14 - 레거시 에디션 +SVHX69 = 피파 14 - 레거시 에디션 +SVME01 = 슈퍼 마리오 올 스타즈 +SVMJ01 = 슈퍼 마리오 컬렉션 SVMK01 = 슈퍼 마리오 컬렉션 -HCRK = 젤다의 전설 스카이워드 소드데이터 복구 채널 +SVMP01 = 슈퍼 마리오 올 스타즈: 25 주년 에디션 +SVOEWW = 엘 차보 +SVPESZ = 베이거스 파티 +SVPPNJ = 베이거스 파티 +SVQEVZ = 바비와 자매들: 강아지 구조대 +SVQPVZ = 바비와 자매들: 강아지 구조대 +SVSPZX = 배틀 vs 체스 +SVTEXS = 비트 트립 컴플리트 +SVTP99 = 비트 트립 컴플리트 +SVUPRV = 독일의 보이스 +SVVEG9 = 크루즈 패밀리: 선사 시대 파티! +SVVPAF = 크루즈 패밀리: 선사 시대 파티! +SVWEQH = 베지 월드 +SVXE52 = 스카이랜더즈: 스왑 포스 +SVXF52 = 스카이랜더즈: 스왑 포스 +SVXI52 = 스카이랜더즈: 스왑 포스 +SVXP52 = 스카이랜더즈: 스왑 포스 +SVXX52 = 스카이랜더즈: 스왑 포스 +SVXY52 = 스카이랜더즈: 스왑 포스 +SVYEG9 = 벤 10: 옴니버스 2 +SVYPAF = 벤 10: 옴니버스 2 +SVZEVZ = 드래곤 길들이기 2 +SVZPVZ = 드래곤 길들이기 2 +SW2E52 = 와이프아웃 2 +SW3EJJ = 동계 스타들 +SW3PKM = 동계 스타들 +SW4JA4 = 위닝 일레븐 플레이 메이커 2011 +SW7EVN = 건슬링거즈 +SW7PNK = 서부의 영웅들 +SW8DNG = 위 싱 80년대 +SW8ENG = 위 싱 80년대 +SW8PNG = 위 싱 80년대 +SW9EVN = 위키드 몬스터즈 블래스트! +SW9PYT = 위키드 몬스터즈 블래스트! +SWAE52 = DJ 히어로 +SWAP52 = DJ 히어로 +SWBE52 = DJ 히어로 2 +SWBP52 = DJ 히어로 2 +SX2PNG = 정글 카트즈 +SX3EXJ = 판도라의 탑 +SX3J01 = 판도라의 탑: 너의 곁으로 돌아갈 때까지 +SX3P01 = 판도라의 탑 +SX4E01 = 제노블레이드 연대기 +SX4J01 = 제노블레이드 +SX4P01 = 제노블레이드 연대기 +SX5E4Z = 산타 클로스가 마을로 오고 있어! +SX6JAF = 프리큐어 올 스타즈 전원 집합 ☆ 렛츠 댄스! +SX7E52 = 돌연변이 닌자 거북 +SX7P52 = 돌연변이 닌자 거북 +SX8E52 = 엑스맨 데스티니 +SX8P52 = 엑스맨 데스티니 +SX9PRV = 보이스 볼륨 2 +SXAE52 = 기타 히어로: 월드 투어 +SXAP52 = 기타 히어로: 월드 투어 +SXBE52 = 기타 히어로: 메탈리카 +SXBP52 = 기타 히어로: 메탈리카 +SXCE52 = 기타 히어로: 스매쉬 히츠 +SXCP52 = 기타 히어로: 그레이티스트 히츠 +SXDE52 = 기타 히어로: 반 헤일렌 +SXDP52 = 기타 히어로: 반 헤일렌 +SXEE52 = 기타 히어로 5 +SXEP52 = 기타 히어로 5 +SXFE52 = 밴드 히어로 +SXFP52 = 밴드 히어로 +SXIE52 = 기타 히어로: 락의 전사 +SXIP52 = 기타 히어로: 락의 전사 +SY7PKM = 렛츠 싱 7 - 스페인 버전 +SY8PKM = 렛츠 싱 2015 +SZ2E5G = 줌바 피트니스 2 +SZ2P5G = 줌바 피트니스 2 +SZ2XGT = 줌바 피트니스 2 +SZ3E5G = 줌바 피트니스 월드 파티 +SZ3PGT = 줌바 피트니스 월드 파티 +SZ5E5G = 줌바 피트니스 +SZ5PGT = 줌바 피트니스 +SZ7E41 = 저스트 댄스 2017 +SZ7P41 = 저스트 댄스 2017 +SZAE69 = 락 밴드 2 +SZAP69 = 락 밴드 2 +SZBE69 = 락 밴드 3 +SZBP69 = 락 밴드 3 +AFRE01 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 8. +AISE41 = 저스트 댄스 엠버 +AMEE01 = 뉴 슈퍼 마리오 브라더스 Wii - 11 어메리칸 레볼루션 +AMNE01 = 어나더 슈퍼 마리오 브라더스 Wii +AMOR04 = 기타 히어로 III 커스텀: 하드코어 +APRP01 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 2. +APRP02 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 3. +APRP03 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 6. +APRP04 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 7. +APRP06 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 5. +APRP08 = 뉴 슈퍼 마리오 브라더스 Wii - ANDY AFRO의 커스텀 컬렉션 볼륨 1. +ASIE41 = 저스트 댄스 아시아 +ASMB01 = 어나더 슈퍼 마리오 브라더스 Wii +ATGE02 = ATG의 CT 팩 +BEPS01 = 기타 히어로 III 커스텀: 락 엔' 메탈 +BOWE01 = 뉴 슈퍼 마리오 브라더스 Wii - 17 쿠파의 최후의 승리 +C3BE52 = 기타 히어로 III 커스텀: Bossenator +C3FP52 = 키타 히어로 III 커스텀: Fonx #1 +C3KE52 = 기타 히어로 III 커스텀: 카일 에디션 #1 +C3ME52 = 기타 히어로 III 커스텀: 모던 락 +C3PP52 = 기타 히어로 III 커스텀: 모던 팝 & 락 +C4AEE9 = 하베스트 문: 마법의 멜로디 (무지개 버전) +C4GEE9 = 하베스트 문: 또 다른 자랑스러운 인생 +C80E52 = 기타 히어로 III 커스텀: 락 80 년대 +C80P52 = 기타 히어로 III 커스텀: GH I & 80 년대 +CANE52 = 기타 히어로 커스텀: 에어로스미스가 아니지만... +CBIEE9 = 하베스트 문: 프라이드 퍼레이드 +CCPE01 = 마리오 카트 Wii 커스텀: 마스터 레이스 +CEMU69 = 펀에뮤 +CFEE52 = 기타 히어로 III 커스텀: 마이클 잭슨 +CG1E52 = 기타 히어로 III 커스텀: 기타 히어로 +CG1P52 = 기타 히어로 III 커스텀: 기타 히어로 I +CG2E52 = 기타 히어로 III 커스텀: 기타 히어로 II +CG2EFL = 기타 히어로 III 커스텀: GH II +CG2P52 = 기타 히어로 III 커스텀: 기타 히어로 II +CG3ECS = 기타 히어로 III 커스텀: 클래식 에디션 +CG3PCS = 기타 히어로 III 커스텀: 클래식 에디션 +CGBE52 = 기타 히어로 III 커스텀: 락 밴드 +CGBP52 = 기타 히어로 III 커스텀: 락 밴드 +CGH370 = 기타 히어로 III 커스텀: 70 새로운 노래 +CGH3IM = 기타 히어로 III 커스텀: 아이언 메이든 +CGH3LM = 기타 히어로 III 커스텀: 음악의 전설 +CGH3ME = 기타 히어로 III 커스텀: 메탈리카 +CGH3NE = 기타 히어로 III 커스텀: 노스텔지어 에디션 +CGH3WD = 기타 히어로 III 커스텀: WD 커스텀 +CGHCE1 = 기타 히어로 III 커스텀: 에디션 커스텀 +CGHE52 = 기타 히어로 2K16 (커스텀) +CGHE87 = 기타 히어로 III 커스텀: 기타 히어로 I +CGHE88 = 기타 히어로 III 커스텀: 기타 히어로 II +CGHE89 = 기타 히어로 3: 마리오 +CGHE90 = 기타 히어로 3: 사우스 파크 에디션 +CGHE91 = 기타 히어로 3: 빨간 앨범 +CGHE92 = 기타 히어로 3: 파란 앨범 +CGHE93 = 기타 히어로 3: 쉐이크 래틀 앤 롤 +CGHE94 = 기타 히어로 III 커스텀: 화성은 기타가 필요해 +CGHE95 = 기타 히어로 III 커스텀: 락 밴드 +CGHE96 = 기타 히어로 III 커스텀: 락'엔'롤 메탈 +CGHE97 = 기타 히어로 3: 나는 법과 싸웠었어 +CGHE98 = 기타 히어로 3: 스위트 홈 앨라배마주 +CGHE99 = 기타 히어로 III 커스텀: 락 80 년대 +CGHECB = 기타 히어로 III 커스텀: CBT 에디션 +CGHEDC = 기타 히어로 III 커스텀: DLC 에디션 +CGHEDM = 기타 히어로 III 커스텀: 데이브모드 +CGHEMC = 기타 히어로 III 커스텀: 마이 케미컬 로맨스 +CGHENC = 기타 히어로 III 커스텀: N커스텀 +CGHEPH = 기타 히어로 III 커스텀: 꼭두각시 영웅 2 +CGHER2 = 기타 히어로 III 커스텀: 락 밴드 2 +CGHERF = 기타 히어로 III 커스텀: 락페스트 2010 +CGHJ52 = 기타 히어로 III 커스텀: Jumapa +CGHKY2 = 기타 히어로 III 커스텀: 카일 에디션 #2 +CGHPF2 = 기타 히어로 III 커스텀: Fonx #2 +CGHPF3 = 기타 히어로 III 커스텀: Fonx #3 +CGHPF4 = 기타 히어로 III 커스텀: Fonx #4 +CGHPF5 = 기타 히어로 III 커스텀: Fonx #5 +CGHPNT = 기타 히어로 III 커스텀: N토렌츠 에디션 +CGHRH2 = 기타 히어로 III 커스텀: 락 히츠 커스텀 v2 +CGHSKV = 기타 히어로 III 커스텀: 스타칠드런 & 네오즈 버전 +CGIE52 = 기타 히어로 III 커스텀: 아이언 메이든 +CGSP52 = 기타 히어로 III 커스텀: KuXu의 Spanisk 커스텀 +CGVECD = 기타 히어로 에어로스미스 커스텀: AC/DC 에디션 +CGVEM2 = 기타 히어로 에어로스미스 커스텀: 미니 콘서츠 에디션 2 +CGVEMC = 기타 히어로 에어로스미스 커스텀: 미니 콘서츠 에디션 +CGVEUV = 기타 히어로 에어로 스미스 커스텀: 얼티밋 비디오 게임 히어로 +CKBE88 = 마리오 카트 블랙 +CLAPSI = 싱잇스타: 클래식 +CMDE52 = 기타 히어로 III 커스텀: 메가데스 +CMKE01 = 마리오 카트 Wii 드래곤 로드 +CS0P00 = 스타싱: 발리우드 v2.0 +CS0PZZ = 스타싱: 팝 파트. I v2.0 +CS1P00 = 스타싱: 컨트리 v2.0 +CS1PZZ = 스타싱: 팝 파트. II v2.0 +CS2P00 = 스타싱: 플라시보 v2.0 +CS2PZZ = 스타싱: 80년대 볼륨 1 v2.0 +CS3P00 = 스타싱: 볼륨 1 v2.0 +CS3PZZ = 스타싱: 찬송가 v2.0 +CS4P00 = 스타싱: NRJ 뮤직 투어 v2.0 +CS4PZZ = 스타싱: 전설들 v2.0 +CS5P00 = 스타싱: '70년대 v2.3 +CS5PZZ = 스타싱 : 나의 제다이를 위한 노래들 v1.0 +CS6P00 = 스타싱: 달콤한 프랑스 v2.0 +CS6PZZ = 스타싱: 앰프드 파트. I v2.0 +CS7P00 = 스타싱: 레드 핫 칠리 페퍼즈 v1.0 +CS7PZZ = 스타싱: 앰프드 파트. II v2.0 +CS8P00 = 스타싱: 90년대 볼륨 1 v2.0 +CS8PZZ = 스타싱: 디스코-펑크 v1.0 +CS9P00 = 스타싱: 80년대 볼륨 2 v2.2 +CS9PZZ = 스타싱: 팝 히츠 9 v1.0 +CSAP00 = 스타싱: 80년대 볼륨 3 v2.2 +CSAPZZ = 스타싱: 골드맨 베스트 v1.0 +CSBP00 = 스타싱: 90년대 볼륨 2 v2.2 +CSCP00 = 스타싱: 마이클 잭슨 v2.2 +CSCPZZ = 스타싱: 핫티스트 히츠 v2.0 +CSDP00 = 스타싱: 락! 볼륨 2 v2.0 +CSDPZZ = 스타싱: 보이 밴드즈 vs. 걸 밴드즈 v2.0 +CSEP00 = 스타싱: 팝 히트 5 v2.0 +CSFP00 = 스타싱: 팝 히트 6 v2.0 +CSGP00 = 스타싱: 디즈니 마법 노래 v2.0 +CSHP00 = 스타싱: 볼륨 2 v1.0 +CSIP00 = 스타싱: 팝 히트 7 v2.0 +CSJP00 = 스타싱: 에이프-스키 파티 +CSKP00 = 스타싱: 아바 v1.1 +CSLP00 = 스타싱: 퀸 v2.0 +CSMP00 = 스타싱: 일렉트로-댄스플로어 볼륨 1 v2.0 +CSNP00 = 스타싱: 일렉트로-댄스플로어 볼륨 2 v2.0 +CSOP00 = 스타싱: 일렉트로-댄스플로어 볼륨 3 v2.0 +CSPP00 = 스타싱: 웹스터 홀 뉴욕 린킨 파트 라이브 v2.0 +CSQP00 = 스타싱: 뮤즈 v2.0 +CSRP00 = 스타싱: 인터내셔널 볼륨 3 v1.0 +CSSP00 = 스타싱: 에이프-스키 파티 2 v2.0 +CSTP00 = 스타싱: 디페쉬 모드 v2.0 +CSUP00 = 스타싱: 팝 히트 8 v2.0 +CSVP00 = 스타싱: 비틀즈 볼륨 1 v2.0 +CSWP00 = 스타싱: 락! 볼륨 3 v2.0 +CSXF00 = 스타싱: TV 크레딧 V2.1 +CSYP00 = 스타싱: 일렉트로-댄스플로어 볼륨 4 v2.0 +CSZP00 = 스타싱: 글리 볼륨 1 v2.1 +CT0P00 = 스타싱: 팝 파트. I v2.1 +CT1P00 = 스타싱: 팝 파트. II v2.1 +CT2P00 = 스타싱: 80년대 볼륨 1 v2.1 +CT3P00 = 스타싱: 찬송가 v2.1 +CT4P00 = 스타싱: 전설들 v2.1 +CT5P00 = 스타싱: 나의 제다이를 위한 노래들 v2.0 +CT6P00 = 스타싱: 앰프드 파트. I v2.1 +CT7P00 = 스타싱: 앰프드 파트. II v2.1 +CT8P00 = 스타싱: 디스코-펑크 v2.1 +CT9P00 = 스타싱: 팝 히트 9 v2.0 +CTAP00 = 스타싱: 골드맨 베스트 v2.0 +CTBP00 = 스타싱: 글리 볼륨 3 v1.0 +CTCP00 = 스타싱: 핫티스트 히츠 v2.0 +CTDP00 = 스타싱: 보이 밴드즈 Vs. 걸 밴드즈 v2.1 +CTEP00 = 스타싱: R&B v2.0 +CTFP00 = 스타싱: 락 발라드 v2.0 +CTGP00 = 스타싱: 테이크 댓 v2.0 +CTHP00 = 스타싱: 여름 파티 v2.0 +CTIP00 = 스타싱: 락! 파트. I v2.0 +CTJP00 = 스타싱: 락! 파트. II v2.0 +CTKP00 = 스타싱: 팝 히츠 v2.0 +CTLP00 = 스타싱: 브리트니 스피어스 v2.0 +CTMP00 = 스타싱: 샤키라 v1.2 +CTNP00 = 스타싱: 팝 히츠 10 v2.0 +CTOP00 = 스타싱: 비틀즈 볼륨 2 v2.1 +CTPP00 = 스타싱: 모타운 v2.0 +CTQP00 = 스타싱: 글리 볼륨 2 v1.0 +CTRP00 = 스타싱: 인터내셔널 볼륨 1 v1.0 +CTSP00 = 스타싱: 인터내셔널 볼륨 2 v1.0 +CTTP00 = 스타싱: 80년대 볼륨 4 v2.0 +CTUP00 = 스타싱 : 리한나 v2.0 +CTVP00 = 스타싱: 레이디 가가 v1.1 +CTWP00 = 스타싱: 90년대 볼륨 3 v1.0 +CTXP00 = 스타싱: 레트로 볼륨 1 v1.0 +CTYP00 = 스타싱: 레트로 볼륨 2 v1.0 +CTZP00 = 스타싱: 볼륨 3 v1.0 +CU0P00 = 스타싱: 레트로 볼륨 3 v1.0 +CU1P00 = 스타싱: 걸즈 v1.0 +CU2P00 = 스타싱 : 볼륨 4 v1.1 +CU3P00 = 스타싱 : 레트로 볼륨 4 v1.1 +CU4P00 = 스타싱 : 레트로 볼륨 5 v1.0 +CU5P00 = 스타싱: 인터내셔널 볼륨 4 v1.0 +CU6P00 = 스타싱 : 볼륨 5 v1.0 +CU7P00 = 스타싱 : 레트로 볼륨 6 v1.0 +CU8P00 = 스타싱: 볼륨 6 v1.0 +CU9P00 = 스타싱: 볼륨 7 v1.0 +CVLE38 = 마리오 카트: 승리의 레인 +CYWEE9 = 하베스트 문: 자랑스러운 인생 +DBSBT3 = 드래곤 볼 Z 격투 천하제일 무도회 3 라틴 버전 +DIYP01 = 뉴 슈퍼 마리오 브라더스 Wii 0-4 D.I.Y. +DKCP01 = 다키 카트 리보 +DKWE01 = 다키 카트 Wii 볼륨 1 +DKWE02 = 다키 카트 Wii 볼륨 2 +DKWE03 = 다키 카트 Wii 볼륨 3 +DKWE04 = 다키 카트 Wii 볼륨 4 +DLCE41 = 저스트 댄스 2015 올인원 +DLZEPW = 대난투 스매시 브라더스 X 불사조 날개 +DMKE01 = 마리오 카트 Wii 2 +DMSP4Q = 싱잇스타: 디즈니 베스트 +DOLL41 = 저스트 댄스 멜로디 +DQAJSC = 아쿠아리우스 야구: 한계, 그 앞에 (중국어 간체) +DRP22Q = 싱잇스타 독일 락-팝 볼륨 2 +DUAP01 = DU 슈퍼 마리오 브라더스: 애니버서리 에디션 +DUCE01 = 커스텀 마리오카트 Wii +DUDE01 = 뉴 슈퍼 마리오 브라더스 Wii 스코비-두! 핵 +ENDP01 = 뉴 슈퍼 마리오 브라더스 Wii 20 지금의 끝 +EVOP01 = 뉴 슈퍼 마리오 브라더스 Wii 0-5 에볼루션 +FC2E41 = 저스트 댄스 포커스 2 +FF4ENG = 페이탈 프레임 4: 월식의 가면 +G0050C = 포켓몬: 블루 버전 +G0060C = 포켓몬: 레드 버전 +G01E01 = 대난투 스매시 브라더스 DX: SD 리믹스 +G01J01 = 대난투 스매시 브라더스 DX: SD 리믹스 +G01P01 = 대난투 스매시 브라더스 DX: SD 리믹스 +G02E01 = 대난투 스매시 브라더스 DX: 20XX 트레이닝 팩 +G02J01 = 대난투 스매시 브라더스 DX: 20XX 트레이닝 팩 +G02P01 = 대난투 스매시 브라더스 DX: 20XX 트레이닝 팩 +G2MK01 = 메트로이드 프라임 2: 검은 메아리 +G4SK01 = 젤다의 전설: 4개의 검+ +GBIK08 = 바이오하자드 +GCDK08 = 바이오하자드 코드: 베로니카 완전판 +GEAK8P = 영원한 아카디아 전설 +GFEK01 = 파이어 엠블렘: 창염의 궤적 +GFZJ8P = F-제로 AX +GGPE01 = 마리오 카트 아케이드 GP +GGPE02 = 마리오 카트 아케이드 GP 2 +GGPJ02 = 마리오 카트 아케이드 GP 2 +GLMK01 = 루이지 맨션 +GLSE01 = 슈퍼 루이지 선샤인 +GM2EDX = 슈퍼 몽키 볼 디럭스 +GM8K01 = 메트로이드 프라임 +GMSE02 = 슈퍼 마리오 선샤인 멀티플레이어 +GMSK01 = 슈퍼 마리오 선샤인 +GTME01 = 대난투 스매시 브라더스 DX 트레이닝 모드 +GVS32E = 버추어 스트라이터 3 버전.2002 +GVS32J = 버추어 스트라이터 3 버전.2002 (트라이포스) +GVS45J = 버추어 스트라이커 4 +GVS46E = 버추어 스트라이커 4 버전.2006 +GVS46J = 버추어 스트라이커 4 버전.2006 +GVSJ9P = 버추어 스트라이커 4 버전.2006 +GX2E01 = 포켓몬 XG: 넥스트 제너레이션 +GXTE8P = 소닉 라이더즈 토너먼트 에디션 +GZ2K01 = 젤다의 전설: 황혼의 공주 +GZBEB2 = 금색의 갓슈벨: 고! 고! 마물 파이트!! +GZLK01 = 젤다의 전설: 바람의 지휘봉 +HBWE01 = 뉴 슈퍼 마리오 브라더스 Wii: 헬보이 에디션 +HSMP01 = 하더 슈퍼 마리오 브라더스 Wii +JF3E41 = 저스트 댄스 포커스 3 +JOUE01 = 뉴 슈퍼 마리오 브라더스 Wii 10 여행 +KHPE01 = 커비 에어 라이드 핵 팩 +KLSEXJ = 마지막 이야기 (NTSC-U, 일본어 오디오) +KMKE01 = 커스텀 마리오 카트 Wii +KMNE03 = 뉴어 슈퍼 마리오 브라더스 Wii +KMNE10 = 쿠파 컨트리 +KMNJ03 = 뉴어 슈퍼 마리오 브라더스 Wii +KMNP03 = 뉴어 슈퍼 마리오 브라더스 Wii +KMNP10 = 쿠파 컨트리 +L40P4Q = 싱 잇: 팝 히츠, 메인 40 +MDUE01 = 마리오 카트: 트랙 그랑프리 +MECPSI = 싱잇스타: 메카노 +METE01 = 뉴 슈퍼 메트로이드 브라더스 Wii +MG1E01 = 슈퍼 마리오 갤럭시 +MIJPSI = 싱잇스타 마이클 잭슨 +MILPSI = 잇 잇 스타: Miliki +MK7P41 = 마리오 카트 7 Wii +MKDE02 = 다키 카트 Wii +MKTE01 = 마리오 카트 Wii 테크닉 +MKWP01 = 슈퍼 마리오 카트 Wii +MMRE01 = D.U. 슈퍼 마리오 브라더스 2.1 매드니스 리턴즈 +MRRE01 = 뉴 슈퍼 마리오 브라더스 Wii 레트로 리믹스 +MRRP01 = 뉴 슈퍼 마리오 브라더스 Wii 레트로 리믹스 +NEWE01 = 뉴 슈퍼 마리오 브라더스 Wii 15 새로운 세계 +NMGE01 = 네오 마리오 갤럭시 +NMGP01 = 네오 마리오 갤럭시 +NMNP01 = 뉴어 슈퍼 마리오 브라더스 Wii +NRJ1FR = 스타싱: NRJ 뮤직 투어 v1.1 +NSMB02 = 뉴 슈퍼 마리오 브라더스 Wii 2 +NSSP01 = 뉴어 썸머 선 +NWRP01 = 뉴어 슈퍼 마리오 브라더스 Will +ONKELZ = 싱잇스타 뵈제 옹켈츠 PAL +OTFPSI = 싱 잇: Operación triunfo +PC5P01 = Wii 포인트 카드 +PDUE01 = 어나더 슈퍼 마리오 브라더스 Wii +PIKE25 = 피크민 251 +PMNEO1 = 뉴 올드 슈퍼 마리오 브라더스 +POPPSI = 싱잇스타 팝 +PPNE01 = 뉴 슈퍼 마리오 브라더스 Wii 2: 넥스트 레벨즈 +PPNP01 = 뉴 슈퍼 마리오 브라더스 Wii 2: 넥스트 레벨즈 +PRMEME = 슈퍼 스매시 브라더스 프로젝트 메메 6.9 +PROE01 = 뉴 슈퍼 마리오 브라더스 Wii 14 프로젝트 마리오 +PT1PSI = 싱잇스타 포르투갈 히츠 +PT2PSI = 싱잇 포루투갈 히츠 썸머 파티 +PT3PSI = 싱 잇 포루투갈 히츠: 설탕 딸기 +PUTA01 = 기타 히어로 III 커스텀: 록 히츠 +PWNP69 = Pwned 슈퍼 마리오 브라더스 Wii +R01PET = 싱잇스타 퀸 +R02PEA = 싱잇스타 락 발라드즈 +R14E41 = 저스트 댄스 메가 +R15POH = 싱잇 스타 라디오 105 +R24E01 = Wii로 즐기는 꼬마 로봇! +R4ZE01 = 령: 월식의 가면 +R4ZP01 = 령 제로: 월식의 가면 +R7FEUD = 파이널 판타지 우화집: 초코보의 던전 (언덥) +R8FJSC = 장인 레스토랑은 대성공! +R8PC01 = 슈퍼 페이퍼 마리오 +RADP01 = 뉴 슈퍼 마리오 브라더스 Wii 0-6 레이디언스 +RCCR78 = 기타 히어로 III 커스텀: 코히드 앤 캠브리아 +RCHC52 = 기타 히어로 III 커스텀: 기타 히어로 II +RCOC99 = 명탐정 코난: 추억의 환상 +RCTE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 스페인어 버전 베타 1 +RDCE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 스페인어 버전 베타 2 +RDPE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 스페인어 버전 베타 1 +RDSZ70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 +RDUE01 = DU 슈퍼 마리오 브라더스: 저 공주를 찾아서 +RDWE70 = 드래곤 볼 Z 격투 천하제일 무도회 3 버전! 라틴어 [감마][커스텀] +RDXE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 베타 3 +RDYE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 베타 3 업데이트 1 +RDZE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 +REBE70 = 드래곤 볼 Z 격투 천하제일 무도회 2: 알파 +RESE70 = 드래곤 볼 Z 부도 카이 텐카 이치 3 버전! 스페인의 +REVE64 = 레보 카트 64 +REYE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 베타 3 업데이트 2 +RFEK01 = 파이어 엠블렘 - 새벽의 여신 +RFEPUD = 파이어 엠블렘: 새벽의 여신 (언덥) +RFYE70 = 드래곤 볼 Z 격투 천하제일 무도회 3: 라틴어 버전 베타 3 업데이트 3 +RG0E52 = 기타 히어로 III 커스텀: 그린 데이 플러스 +RG1552 = 기타 히어로 III 커스텀: 위어드 알 얀코빅 +RG1E52 = 기타 히어로 III 커스텀: 리벤지 +RG2E52 = 기타 히어로 III 커스텀: 비틀즈 플러스 +RG3E52 = 기타 히어로 III 커스텀: 뮤즈 앤 러쉬 +RG4152 = 기타 히어로 III 커스텀: 썸 41 +RG4E52 = 기타 히어로 마야의 묵시록 +RG9E52 = 기타 히어로 III 커스텀: 아나키 +RGCM52 = 기타 히어로 III 커스텀: 메탈리카 +RGCS52 = 기타 히어로 III 커스텀: 클래식 에디션 +RGEK52 = 기타 히어로 III 커스텀: 슬립낫 +RGGE52 = 기타 히어로 III 커스텀: 락 더 게임즈 +RGHC20 = 기타 히어로 III 커스텀: 페일 에디션 +RGHC53 = 기타 히어로 III 뮤즈 +RGHE18 = 기타 히어로 2k18 +RGHE51 = 기타 히어로 III 커스텀: 아스페로 +RGHE60 = 기타 히어로 III 커스텀: WTF 커스텀 +RGHE61 = 기타 히어로 3: 나는 법과 싸웠었어 +RGHE62 = 기타 히어로 3: 스윗 홈 앨라배마주 +RGHE69 = 기타 히어로 III 커스텀: 메탈의 전설들 +RGHEMR = 기타 히어로 III 커스텀: 모던 락 +RGHI52 = 기타 히어로 III 커스텀: 침바 +RGHPOH = 싱잇스타 이탈리아 그레이티스트 히츠 +RGHPS2 = 기타 히어로 III 커스텀: J-뮤직 +RGHX52 = 기타 히어로 III 커스텀: 아니메의 알렉스 짱 +RGKE52 = 기타 히어로 III 커스텀: 콘 +RGRM52 = 기타 히어로 III 커스텀: 락 & 메탈 +RGVE99 = 기타 히어로 에어로스미스 커스텀: 에어로스미스는 아니지만... +RGXEFN = 기타 히어로 III 커스텀: 메테오 라스트 커스텀 +RGXM52 = 기타 히어로 III 커스텀: xMxExTxAxLx의 에디션 +RGZC52 = 기타 히어로 III 커스텀: 레드 제플린 +RGZE52 = 기타 히어로 III 커스텀: 쉬레드 에디션 +RHD222 = 하우스 오브 데드 2 +RHD333 = 하우스 오브 데드 3 +RHGH52 = 기타 히어로 III 커스텀: 랜덤히어로즈 +RI1POH = 싱잇스타 이탈리안 파티 +RI2POH = 싱잇스타 이탈리안 파티 볼륨 2 +RI3POH = 싱잇스타 이탈리안 탑.잇 +RJJG52 = 기타 히어로 III 커스텀: JJ-KwiK의 에디션 +RJUE41 = 저스트 댄스 차이나 +RK2EUD = 트라우마 센터: 새로운 피 (언덥) +RKDEUD = 트라우마 센터: 다른 의사의 진단 (언덥) +RL9ESD = 기타 히어로 린킨 파크 +RLIL78 = 기타 히어로 두 번째 커스텀 +RMCC01 = 마리오 카트 Wii +RMCE02 = Wiimms 마리오 카트 Wii 펀 2010-02.PAL +RMCE03 = Wiimms 마리오 카트 Wii 펀 2010-10.PAL +RMCE04 = Wiimms 마리오 카트 Wii 펀 2010-12.PAL +RMCE05 = Wiimms 마리오 카트 Wii 펀 2010-12.PAL +RMCE06 = Wiimms 마리오 카트 Wii 펀 2010-12.NTSC +RMCE07 = Wiimms 마리오 카트 Wii 레트로 2011-02.NTSC +RMCE08 = Wiimms 마리오 카트 Wii 펀 2011-03.NTSC +RMCE09 = Wiimms 마리오 카트 Wii 펀 2011-06.NTSC +RMCE10 = Wiimms 마리오 카트 Wii 펀 2011-07.NTSC +RMCE11 = Wiimms 마리오 카트 Wii 펀 2011-08.NTSC +RMCE12 = Wiimms 마리오 카트 Wii 펀 2011-11.NTSC +RMCE13 = Wiimms 마리오 카트 Wii 펀 2012-01.NTSC +RMCE14 = Wiimms 마리오 카트 Wii 리바이벌 2012-02.NTSC +RMCE15 = Wiimms 마리오 카트 Wii 부스트 2012-03.NTSC +RMCE16 = Wiimms 마리오 카트 Wii 펀 2012-05.NTSC +RMCE17 = Wiimms 마리오 카트 Wii 펀 2012-09.NTSC +RMCE18 = Wiimms 마리오 카트 Wii N64 2012-10.NTSC +RMCE19 = Wiimms 마리오 카트 Wii 펀 2012-12.NTSC +RMCE20 = Wiimms 마리오 카트 Wii 펀 2013-04.NTSC +RMCE21 = Wiimms 마리오 카트 Wii 펀 2013-09.NTSC +RMCE22 = Wiimms 마리오 카트 Wii 펀 2013-10.NTSC +RMCE23 = Wiimms 마리오 카트 Wii 펀 2014-01.NTSC +RMCE24 = Wiimms 마리오 카트 Wii 레트로 2014-02.NTSC +RMCE25 = Wiimms 마리오 카트 Wii 펀 2014-04.NTSC +RMCE26 = Wiimms 마리오 카트 Wii 펀 2014-11.NTSC +RMCE27 = Wiimms 마리오 카트 Wii 펀 2015-03.NTSC +RMCE28 = Wiimms 마리오 카트 Wii 레트로 2015-05.NTSC +RMCE29 = Wiimms 마리오 카트 Wii 펀 2015-08.NTSC +RMCE30 = Wiimms 마리오 카트 Wii 펀 2015-12.NTSC +RMCE31 = Wiimms 마리오 카트 Wii 펀 2016-02.NTSC +RMCE32 = Wiimms 마리오 카트 Wii 펀 2016-07.NTSC +RMCE33 = Wiimms 마리오 카트 Wii 펀 2016-10.미국 +RMCE34 = Wiimms 마리오 카트 Wii 펀 2017-05.미국 +RMCE35 = Wiimms 마리오 카트 Wii 펀 2017-12.미국 +RMCE36 = Wiimms 마리오 카트 Wii 펀 2018-03.미국 +RMCE37 = Wiimms 마리오 카트 Wii 펀 2018-06.미국 +RMCE38 = Wiimms 마리오 카트 Wii 펀 2018-09.미국 +RMCE3H = 3Hunts의 커스텀 트랙 팩 +RMCE40 = Wiimms 마리오 카트 Wii 펀 2019-03.미국 +RMCE41 = Wiimms 마리오 카트 Wii 펀 2019-06.미국 +RMCE42 = Wiimms 마리오 카트 Wii 펀 2019-10.미국 +RMCE43 = Wiimms 마리오 카트 Wii 펀 2020-02.미국 +RMCE44 = Wiimms 마리오 카트 Wii 펀 2020-06.미국 +RMCE45 = Wiimms 마리오 카트 Wii 펀 2020-12 +RMCE47 = Wiimms 마리오 카트 Wii 히스토리 2021-12.미국 +RMCE54 = 마리오 카트 크리스 디럭스 2 +RMCE64 = 피치 카트 8 +RMCE69 = 크리아 카트 Wii +RMCE70 = 스틱보이 카트 Wii +RMCE73 = 마리오 카트 어드벤처즈 +RMCE74 = 마리오 카트 어드벤처즈 +RMCE75 = 캠, 톰, 트로이의 CTGP 팩 +RMCE76 = 프로 CT 팩 +RMCE77 = Spy Kid의 CT 팩 +RMCE78 = 마리오 카트: 더블 대쉬!! Wii +RMCE7T = 큐버의 핵 팩 +RMCE81 = Spade의 커스텀 트랙 팩 +RMCE86 = 마리오 카트 크리스 3.500 CT +RMCE88 = 마리오 카트 크리스 디럭스 3.0 +RMCE89 = 마리오 카트 크리스 쿠인 +RMCE8X = 마리오 카트 Wii X DS +RMCE92 = 마리오 카트 WiiLH100의 커스텀 트랙 팩 +RMCE93 = 마리오 카트 Wii 핵 팩 +RMCE96 = 마리오 카트 6 +RMCE98 = 마리오 카트 Wii 어썸네스 +RMCE9R = 루키의 텍스처와 음악 팩 +RMCEA1 = 마리오 카트 어드벤처 +RMCEA2 = 마리오 카트 Wii 디럭스 -블루 에디션- +RMCEA3 = 마리오 카트 Wii 디럭스 -레드 에디션- +RMCEA4 = 마리오 카트 Wii 디럭스 -그린 에디션- +RMCEA5 = 알파의 트랙 믹스 +RMCEA8 = 마리오 카트 아케이드 JY +RMCEA9 = 마리오 카트 Wii - 더 탑 100 +RMCEB1 = 마리오 카트 Wii 2017 +RMCEB2 = 마리오 카트 Wii 2017 - 버전 2.0 +RMCEB4 = 마리오 카트 Wii 디럭스 +RMCEB6 = 마리오 카트 7 JY +RMCEB8 = 마리오 카트 매니아 +RMCECH = 크리스 카트 Wii +RMCECT = 마리오 카트 Wii CTGP 레볼루션 +RMCECY = CTGP 클래식 팩 +RMCED3 = 드라이쿠파 카트 Wii +RMCEDK = 다키 카트 Wii +RMCEF1 = 팬시의 CT 팩 +RMCEFE = 팬시의 CT 팩 - 엑스트라 에디션 +RMCEG2 = 마리오 카트 Wii CTGP 레볼루션 +RMCEG4 = Diddz' 갱 커스텀 트랙 팩 +RMCEG5 = 뉴 마리오 카트 Wii 64 +RMCEGP = 마리오 카트 Wii CTGP 레볼루션 +RMCEH8 = HD의 레트로 팩 +RMCEJ6 = JHFR CT 팩 +RMCEL1 = Luma의 CT 팩 +RMCEL9 = 마리오 카트 레가시 +RMCELG = 레거시 카트 Wii +RMCEM4 = 마리오 카트 슈퍼 서킷 Wii +RMCEM6 = 뉴 마리오 카트 7 +RMCEM9 = 뉴 마리오 카트: 더블 대쉬!! +RMCEMZ = 미지의 텍스처 팩 +RMCEO4 = 옵트팩 CT 팩 +RMCEPG = 펭귄 카트 Wii +RMCER9 = 로사 카트 Wii +RMCERB = 베어 카트 Wii +RMCEST = Skipper의 200Kmh 디스트리뷰션 +RMCET0 = TomB의 CT 팩 +RMCET6 = Man - O - Wii의 작은 즐겨찾기 팩 +RMCET7 = 캠, 톰, 트로이의 CT 팩 +RMCEU7 = 마리오 카트 Wii 울트라 팩 +RMCEVI = 빈티지 카트 Wii +RMCEVK = 바이올렛 카트 Wii +RMCEVY = 버라이어티 택 +RMCEW6 = 마리오 카트 Wii 얼티밋 +RMCEW8 = 와루이지 카트 Wii +RMCEWS = Wine의 CT 팩 +RMCEX4 = 마리오 카트 X +RMCEX5 = 마리오 카트 Wii - 배틀 르와이얄 +RMCEY8 = 이트 카트 Wii +RMCEY9 = Yosh의 트랙 팩 +RMCEYP = 요시 레이싱 리조트 플러스 +RMCEZ2 = ZPL의 트랙 컬랙션 +RMCEZ8 = 제프 카트 Wii +RMCEZC = 제프의 CT 팩 +RMCJ12 = Wiimms 마리오 카트 Wii 펀 2011-11.일본 +RMCJ30 = Wiimms 마리오 카트 Wii 펀 2015-12.일본 +RMCJ31 = Wiimms 마리오 카트 Wii 펀 2016-02.일본 +RMCJ32 = Wiimms 마리오 카트 Wii 펀 2016-07.일본 +RMCJ33 = Wiimms 마리오 카트 Wii 펀 2016-10.일본 +RMCJ34 = Wiimms 마리오 카트 Wii 펀 2017-05.일본 +RMCJ35 = Wiimms 마리오 카트 Wii 펀 2017-12.일본 +RMCJ36 = Wiimms 마리오 카트 Wii 펀 2018-03.일본 +RMCJ37 = Wiimms 마리오 카트 Wii 펀 2018-06.일본 +RMCJ38 = Wiimms 마리오 카트 Wii 펀 2018-09.일본 +RMCJ40 = Wiimms 마리오 카트 Wii 펀 2019-03.일본 +RMCJ41 = Wiimms 마리오 카트 Wii 펀 2019-06.일본 +RMCJ42 = Wiimms 마리오 카트 Wii 펀 2019-10.일본 +RMCJ43 = Wiimms 마리오 카트 Wii 펀 2020-02.일본 +RMCJ44 = Wiimms 마리오 카트 Wii 펀 2020-06.일본 +RMCJ48 = Wiimms 마리오 카트 Wii 펀 2022-05.일본 +RMCJ64 = 피치 카트 8 +RMCJ76 = 프로 CT 팩 +RMCJ86 = 마리오 카트 크리스 3.500 CT +RMCJ93 = 마리오 카트 Wii 핵 팩 +RMCJA1 = 마리오 카트 어드벤처즈 v0.8 +RMCJCT = 마리오 카트 Wii CTGP 레볼루션 +RMCJL1 = Luma의 CT 팩 +RMCJYP = 요시 레이싱 리조트 플러스 +RMCK41 = Wiimms 마리오 카트 Wii 펀 2019-06.한국 +RMCK42 = Wiimms 마리오 카트 Wii 펀 2019-10.한국 +RMCK43 = Wiimms 마리오 카트 Wii 펀 2020-02.한국 +RMCK44 = Wiimms 마리오 카트 Wii 펀 2020-06.한국 +RMCK45 = Wiimms 마리오 카트 Wii 펀 2020-12.한국 +RMCK46 = Wiimms 마리오 카트 Wii 펀 2021-09.한국 +RMCK47 = Wiimms 마리오 카트 Wii 히스토리 2021-12.한국 +RMCK48 = Wiimms 마리오 카트 Wii 펀 2022-05.한국 +RMCK49 = Wiimms 마리오 카트-펀 2022-11.한국 +RMCK86 = 마리오 카트 크리스 3.5 캐럿 +RMCKYP = 요시 레이싱 리조트 플러스 +RMCP02 = Wiimms 마리오 카트 Wii 펀 2010-02.유럽 +RMCP03 = Wiimms 마리오 카트 Wii 펀 2010-10.유럽 +RMCP04 = Wiimms 마리오 카트 Wii 펀 2010-12.유럽 +RMCP05 = 커스텀 마리오 카트 Wii +RMCP06 = Wiimms 마리오 카트 Wii 펀 2010-12.유럽 +RMCP07 = Wiimms 마리오 카트 Wii 펀 2011-02.유럽 +RMCP08 = Wiimms 마리오 카트 Wii 펀 2011-03.유럽 +RMCP09 = Wiimms 마리오 카트 Wii 펀 2011-06.유럽 +RMCP10 = Wiimms 마리오 카트 Wii 펀 2011-07.유럽 +RMCP11 = Wiimms 마리오 카트 Wii 펀 2011-08.유럽 +RMCP12 = Wiimms 마리오 카트 Wii 펀 2011-11.유럽 +RMCP13 = Wiimms 마리오 카트 Wii 펀 2012-01.유럽 +RMCP14 = Wiimms 마리오 카트 Wii 리바이벌 2012-02.유럽 +RMCP15 = Wiimms 마리오 카트 Wii 부스트 2012-03.유럽 +RMCP16 = Wiimms 마리오 카트 Wii 펀 2012-05.유럽 +RMCP17 = Wiimms 마리오 카트 Wii 펀 2012-09.유럽 +RMCP18 = Wiimms 마리오 카트 Wii 펀 N64 2012-10.유럽 +RMCP19 = Wiimms 마리오 카트 Wii 펀 2012-12.유럽 +RMCP20 = Wiimms 마리오 카트 Wii 펀 2013-04.유럽 +RMCP21 = Wiimms 마리오 카트 Wii 펀 2013-09.유럽 +RMCP22 = Wiimms 마리오 카트 Wii 펀 2013-10.유럽 +RMCP23 = Wiimms 마리오 카트 Wii 펀 2014-01.유럽 +RMCP24 = Wiimms 마리오 카트 Wii 레트로 2014-02.유럽 +RMCP25 = Wiimms 마리오 카트 Wii 펀 2014-04.유럽 +RMCP26 = Wiimms 마리오 카트 Wii 펀 2014-11.유럽 +RMCP27 = Wiimms 마리오 카트 Wii 펀 2015-03.유럽 +RMCP28 = Wiimms 마리오 카트 Wii 레트로 2015-05.유럽 +RMCP29 = Wiimms 마리오 카트 Wii 펀 2015-08.유럽 +RMCP30 = Wiimms 마리오 카트 Wii 펀 2015-12.유럽 +RMCP31 = Wiimms 마리오 카트 Wii 펀 2016-02.유럽 +RMCP32 = Wiimms 마리오 카트 Wii 펀 2016-07.유럽 +RMCP33 = Wiimms 마리오 카트 Wii 펀 2016-10.유럽 +RMCP34 = Wiimms 마리오 카트 Wii 펀 2017-05.유럽 +RMCP35 = Wiimms 마리오 카트 Wii 펀 2017-12.유럽 +RMCP36 = Wiimms 마리오 카트 Wii 펀 2018-03.유럽 +RMCP37 = Wiimms 마리오 카트 Wii 펀 2018-06.유럽 +RMCP38 = Wiimms 마리오 카트 Wii 펀 2018-09.유럽 +RMCP39 = Wiimms 마리오 카트 Wii 펀 2018-12.유럽 +RMCP40 = Wiimms 마리오 카트 Wii 펀 2019-03.유럽 +RMCP41 = Wiimms 마리오 카트 Wii 펀 2019-06.유럽 +RMCP42 = Wiimms 마리오 카트 Wii 펀 2019-10.유럽 +RMCP43 = Wiimms 마리오 카트 Wii 펀 2020-02.유럽 +RMCP44 = Wiimms 마리오 카트 Wii 펀 2020-06.유럽 +RMCP64 = 피치 카트 8 +RMCP76 = 프로 CT 팩 +RMCP86 = 마리오 카트 크리스 3.500CT +RMCP93 = 마리오 카트 Wii 핵 팩 +RMCPA1 = 마리오 카트 어드벤처 +RMCPCA = 마리오 카트 Wii (카탈루냐어 번역) +RMCPG2 = 마리오 카트 Wii CTGP 레볼루션 +RMCPGP = 마리오 카트 CTGP 레볼루션 +RMCPL1 = Luma의 CT 팩 +RMCPYP = 요시 레이싱 리조트 플러스 +RMGC01 = 슈퍼 마리오 갤럭시 +RMGE52 = 기타 히어로 III 커스텀: 메가데스 +RMGR01 = 슈퍼 마리오 갤럭시 +RMHC08 = 몬스터 헌터 3 (커스텀) +RMKE02 = 커스텀 카트 1 +RMMP52 = 기타 히어로 III 커스텀: 메탈 메이햄 +RNEEUD = 나루토 질풍전: 닌자 격돌 레볼루션 3 (언덥) +ROMESD = 몬스터 헌터 G (영어 패치) +RPJEUD = 아크 라이즈 판타지아 (언덥) +RQQE52 = 기타 히어로 III 커스텀 : 퀸 +RSBE02 = 슈퍼 스매시 브라더스 프로젝트 엠 레드 버전 +RSBE03 = 대난투 스매시 브라더스 X DX +RSBE04 = 슈퍼 스매시 브라더스 프로젝트 엠+ +RSBE05 = 슈퍼 스매시 브라더스 프로젝트 엠 Patt 에디션 +RSBE06 = Darkon360의 대난투 핵 팩 +RSBE07 = 슈퍼 스매시 브라더스 프로젝트 엠: Theytah의 커스텀 빌드 +RSBE08 = 말란 프로젝트 엠 3.6 +RSBE09 = Springboy64의 대난투 핵 팩 +RSBE10 = 대난투 Ying Yang 에디션 +RSBE11 = MGW 교수의 토너먼트 핵 팩 #1 +RSBE12 = MGW 교수의 토너먼트 핵 팩 #2 +RSBE13 = MGW 교수의 토너먼트 핵 팩 #3 +RSBE14 = 대난투 스매시 브라더스 X: 제우스 +RSBE15 = 대난투 스매시 브라더스 X 마이너스 뮤겐 +RSBE16 = 대난투 스매시 브라더스 X 쇼크 +RSBE17 = 대난투 스매시 브라더스 X 배틀필드 빌드 +RSBE18 = 슈퍼 스매시 브라더스 프로젝트 M: 토너먼트 핵 팩 +RSBE19 = 슈퍼 스매시 브라더스 프로젝트 M: 풀리 드레스드 에디션 +RSBE20 = Pikezer의 BrawlEx 팩 +RSBE21 = Calabrel의 커스텀 프로젝트 M 빌드 +RSBE22 = 프로젝트 M: Rage83의 컴페터티브 커스텀 빌드 +RSBE23 = 슈퍼 스매시 브라더스 프로젝트 M: 저스티스 빌드 +RSBE24 = 슈퍼 스매시 브라더스 3 +RSBE25 = 슈퍼 스매시 브라더스 레드 버전 +RSBE26 = 슈퍼 스매시 브라더스 실버 +RSBE27 = Springboy64의 대난투 스매시 브라더스 X 핵 팩 +RSBE28 = SuperYoshiStar의 슈퍼 스매시 브라더스 대난투 핵 팩 +RSBE29 = 슈퍼 스매시 브라더스 프로젝트 M: YoeiX 커스텀 빌드 +RSBE30 = 슈퍼 스매시 브라더스 프로젝트 M: Arko의 로디드 커스텀 빌드 +RSBE31 = 슈퍼 스매시 브라더스 프로젝트 M: Arko의 토너먼트 커스텀 빌드 +RSBE32 = 슈퍼 스매시 브라더스 프로젝트 M: Sempai의 빌드 +RSBE33 = 대난투 스매시 브라더스 X 음양 에디션 2: 규의 균형 +RSBE34 = 슈퍼 스매시 브라더스 프로젝트 U: 블루 버전 +RSBE35 = 대난투 스매시 브라더스 X 레거시: 프로젝트 M +RSBE36 = 슈퍼 스매시 브라더스 프로젝트 베스트 +RSBE37 = 슈퍼 스매시 브라더스 프로젝트 M: Psycho Ghost의 빌드 +RSBE38 = 슈퍼 스매시 시스터즈 제너레이션즈 2 +RSBE39 = 슈퍼 스매시 브라더스 울트라 프로젝트 M +RSBE40 = 슈퍼 스매시 브라더스 프로젝트 M: 라그나로크 에디션 +RSBE41 = 슈퍼 스매시 브라더스 프로젝트 M: Calabrel의 커스텀 빌드 +RSBE42 = 슈퍼 스매시 브라더스 프로젝트 M: RedX 애니메/게임 커스텀 빌드 +RSBE43 = 대난투 스매시 브라더스 X: MASTERLINKX의 커스텀 팩 +RSBE44 = 대난투 스매시 브라더스 X: 섀도우 버전 +RSBE45 = 대난투 스매시 브라더스 X: Shock44의 커스텀 빌드 +RSBE46 = 대난투 스매시 브라더스 X: DragonD101의 텍스쳐 팩 +RSBE47 = 대난투 스매시 브라더스 X: XChosen1의 텍스쳐 팩 +RSBE49 = 대난투 스매시 브라더스 X: 워터 블록 에디션 +RSBE50 = 슈퍼 스매시 브라더스 프로젝트 U: 울트라 버전 +RSBEAA = 마벨과 캡콤 vs 슈퍼 스매시 브라더스 +RSBEBB = 슈퍼 스매시 브라더스 균형잡힌 대난투 +RSBEBM = 대난투 스매시 브라더스 X 마이너스 +RSBEBP = 대난투 스매시 브라더스 X 플러스 +RSBEC3 = 슈퍼 스매시 브라더스 프로젝트 M 3.5 넷플레이 빌드 +RSBEDH = 대난투 스매시 브라더스 X 다크 홀/D.A.R.S. +RSBEDT = 슈퍼 스매시 브라더스 얼티밋 다크 피닉스: 토너먼트 에디션 +RSBEN1 = 슈퍼 스매시 브라더스 프로젝트 M +RSBEPM = 슈퍼 스매시 브라더스 프로젝트 M +RSBEPW = 슈퍼 스매시 브라더스 프로젝트 M Wi-Fi +RSBETE = 슈퍼 스매시 브라더스 레거시 TE +RSBEWM = 슈퍼 스매시 브라더스 프로젝트 M Wi-Fi +RSBEXP = 슈퍼 스매시 브라더스 레거시 XP +RSBP02 = Master4Robin의 대난투 스매시 브라더스 X 핵 팩 +RSFC99 = 무라마사: 데몬 블래이드 (커스텀) +RSJESD = 기타 히어로 III 커스텀: 시스템 오브 어 다운 +RSXX78 = 기타 히어로 라디오헤드 +RSYP06 = 대난투 스매시 브라더스 X: YF06의 모드 +RT4EUD = 테일즈 오브 심포니아: 라타토스크의 기사 언덥 +RTME70 = 드래곤 볼 Z 격투 천하제일 무도회 3 WII TSM +RU1P4Q = 디즈니 싱 잇: 싱 잇 스타 싱스타 1 +RU2P4Q = 디즈니 싱 잇: 싱 잇 스타 싱스타 2 +RUIGGD = 싱잇스타 너드. 80 년대 +RWDC52 = 기타 히어로 III 커스텀: WD 커스텀 +RWWE52 = 기타 히어로 III 커스텀 : WWE 더 히츠 +RXGC15 = 기타 히어로 III 커스텀: A7X (어벤지드 세븐폴드) +RYAJSC = 얏타맨 Wii 깜짝 깜짝 머신으로 맹 레이스다 코론 (중국어 간체) +RZDC01 = 젤다의 전설: 황혼의 공주 커스텀 +S02PES = 싱잇스타 90년대 +S12E41 = 저스트 댄스: 최고 2 +S18E41 = 저스트 댄스 피티드 2018 +S2PE41 = 저스트 댄스 2020 플러스 +S3EE41 = 저스트 댄스 2023 +S3UE41 = 저스트 댄스 스포트라이트 +S5UE41 = 저스트 댄스 무한 파티 +S68E41 = 저스트 댄스 2022 +S7EE41 = 저스트 댄스 2023 - Wii 에디션 +S80U3Q = 싱잇스타 얼티밋 80년대 +S85E41 = 저스트 댄스 2021 +S85P41 = 저스트 댄스 2021 +SAME01 = 뉴 슈퍼 마리오 브라더스 Wii 11 아메리칸 레볼루션 +SANE01 = 뉴 슈퍼 마리오 브라더스 Wii 파이브 스피카 에디션 +SANT3Q = 싱잇스타 찬송가 +SARP01 = 뉴 슈퍼 마리오 브라더스 Wii - 4 아르카디아 어너더 라이드 +SB3EUD = 전국 바사라: 사무라이 히어로즈 (언덥) +SB4C01 = 슈퍼 마리오 갤럭시 2 (커스텀) +SB4E02 = 네오 마리오 갤럭시 +SB4E03 = 슈퍼 마리오 갤럭시 +SB4E04 = 슈퍼 마리오 선샤인 갤럭시 +SB4E05 = 시즌 사이클 갤럭시 +SB4E25 = 슈퍼 마리오 갤럭시 2.5 +SB4J02 = 네오 마리오 갤럭시 +SB4J05 = 시즌 싸이클 갤럭시 +SB4P02 = 네오 마리오 갤럭시 +SB4P05 = 시즌 싸이클 갤럭시 +SBOD3Q = 싱잇스타 디즈니 베스트 +SBSE01 = 뉴 슈퍼 마리오 브라더스 Wii - 17 쿠파의 최후의 승리 +SBVG3Q = 싱잇스타 보이밴드즈 vs 걸밴드즈 +SBWC11 = 뉴 슈퍼 마리오 브라더스 3: 섀도우 쿠파의 분노 +SCLE01 = 클리프 슈퍼 마리오 브라더스 Wii +SCLJ01 = 클리프 슈퍼 마리오 브라더스 Wii +SCLP01 = 클리프 슈퍼 마리오 브라더스 Wii +SCTE01 = 검은 개구리의 저주 +SDAE01 = 스쿠비-두! 브라더스 어드벤처 +SDNP01 = 뉴 슈퍼 도도 브라더스 Wii +SDRP3Q = 싱잇스타 도일 락-팝 볼륨 1 +SDTH3Q = 싱잇스타 디 토텐 호젠 +SDUEO1 = DU 슈퍼 마리오 브라더스 : DU 에디션 +SDUPO1 = DU 슈퍼 마리오 브라더스 : DU 에디션 +SE1E41 = 저스트 댄스 이스트 +SEHE41 = 저스트 댄스 에픽 히츠 +SEOP01 = 뉴 슈퍼 마리오 브라더스 Wii 8 오메가 +SEOP4Q = 싱 잇: 스페인 팝의 황금기 +SFDE01 = 뉴 슈퍼 마리오 브라더스 Wii 9 미덕: 이번 가을 어둠 +SFRE01 = 슈퍼 마리오 브라더스 프로즌 에디션 +SFRJ01 = 슈퍼 마리오 브라더스 프로즌 에디션 +SFRP01 = 슈퍼 마리오 브라더스 프로즌 에디션 +SGI1CL = 싱잇 Clásicos +SGI1DB = 싱 잇: 애니메이션 +SGI1MC = 싱잇스타 메카노 +SGI1ML = 싱 잇 스타: Miliki +SGI1PT = 싱 잇: 파티 +SGI1RC = 싱 잇: 락스 2 +SGPTI1 = 싱 잇 파티 +SH5E41 = 저스트 댄스 하이퍼 +SHIE41 = 저스트 댄스 히츠 +SIABOH = 싱잇스타 플라시보 +SIBBHJ = 싱잇스타 컨트리 +SIESP1 = 싱 잇: 스페인 노래 +SIFPOH = 싱 4: 히츠 에디션 +SILP4Q = 싱 잇 라틴 +SIS1OH = 싱잇스타 볼륨 1 +SIS2OH = 싱잇스타 아바 +SIS3OH = 싱잇스타 썸머 파티 +SIS4OH = 싱잇스타 앰프드 +SIS5OH = 싱잇스타 팝 히츠 +SIS7OH = 잇잇스타 테이크 댓 +SIS80Q = 싱잇스타 얼티밋 80년대 +SIS80S = 싱잇스타: 80년대 볼륨 1 v1.2 +SIS90H = 싱잇스타 90년대 +SIS9OH = 싱잇스타 90년대 +SISACD = 스타싱 AC/DC +SISAOH = 싱잇스타 아프레스 스키 파티 +SISBOH = 싱잇스타 알'앤'비 +SISCOH = 싱잇스타 차트브레이커 +SISCS1 = 싱잇스타 차트서퍼 볼륨 1 +SISDAE = 싱잇스타 디 애어츠테 +SISDEM = 싱잇스타 디페쉬 모드 +SISDOH = 싱잇스타 더 돔 +SISHOH = 싱잇스타 가장 인기있는 히츠 +SISLIP = 싱잇스타 링킨 파크 v2.0 +SISLOH = 싱잇스타 전설들 +SISMEL = 스타싱 생일 축하해 멜라니 v1.1 +SISMJ1 = 스타싱 마이클 잭슨 v2.1 +SISMOH = 싱잇스타 마요르카섬 파티 +SISP10 = 싱잇스타 스튜디오100 +SISP12 = 스타싱 팝 히츠 1 & 2 v2.0 +SISP34 = 스타싱 팝 히츠 3 & 4 v2.0 +SISPBC = 싱잇스타 브리트니 vs 크리스티나 +SISPOH = 싱잇스타 파티 +SISPOP = 스타싱 팝 v1.1 +SISQ3Q = 싱잇스타 퀸 +SISR3Q = 싱잇스타 락! +SISREU = 스타싱 락! v1.1 +SISRP4 = 싱잇스타 락! +SISSOH = 싱잇스타 슐라거 +SISTDK = 싱잇스타 터키 파티 +SIXE01 = 뉴 슈퍼 마리오 브라더스 Wii 16 레버레이션즈 +SJEE41 = 저스트 댄스 2014 플러스 +SJME89 = 저스트 댄스 일본 +SK3EUD = 트라우마 팀 (언덥) +SL1E41 = 저스트 댄스 별빛 +SL2PUD = 령: 진홍의 나비 언덥 +SLBE01 = MLG 슈퍼 루이지 브라더스 Wii +SLBJ01 = MLG 슈퍼 루이지 브라더스 Wii +SLBP01 = MLG 슈퍼 루이지 브라더스 Wii +SLFE01 = 뉴 슈퍼 마리오 브라더스 3: 마지막 레벨들 +SLFP01 = 뉴 슈퍼 마리오 브라더스 3: 마지막 레벨들 +SLNE01 = 슈퍼 루이지 랜드 Wii +SM3E01 = 슈퍼 마리오 브라더스 3+ +SMD3OH = 싱잇스타 디즈니 매직 +SMIG3Q = 싱잇스타 독일 제작 +SMME02 = 슈퍼 마리오: 버섯 모험 플러스 - 겨울 달 +SMMP01 = 뉴 슈퍼 마리오 브라더스 Wii 앤디 아프로의 커스텀 컬렉션 볼륨 4 +SMMP02 = 슈퍼 마리오: 버섯 모험 플러스: 겨울 달 +SMNC01 = 뉴 슈퍼 마리오 브라더스 Wii +SMNE02 = 뉴 슈퍼 마리오 리메이크 +SMNE03 = 뉴어 슈퍼 마리오 브라더스 Wii +SMNE04 = 캐논 슈퍼 마리오 브라더스 Wii +SMNE05 = 어나더 슈퍼 마리오 브라더스 Wii +SMNE06 = 뉴어 썸머 선 +SMNE07 = 뉴어 홀리데이 스페셜 +SMNE08 = 에픽 슈퍼 쿠파 월드 +SMNE09 = 올드 슈퍼 마리오 브라더스 Wii +SMNE10 = 쿠파 컨트리 +SMNE11 = 뉴 슈퍼 마리오 브라더스 Wii 4 +SMNE12 = 어썸머 슈퍼 루이지 미니 +SMNE13 = 뉴이스트 슈퍼 마리오 브라더스 Wii +SMNE14 = 뉴 슈퍼 마리오 브라더스 Wii: 페인 코인즈 +SMNE15 = 뉴어 슈퍼 마리오 브라더스 7 +SMNE20 = 뉴 슈퍼 마리오 브라더스 H +SMNE23 = 뉴어 슈퍼 마리오 브라더스 Wii: 낙엽 +SMNE31 = 뉴 슈퍼 마리오 브라더스 Wii - 다른 세상 +SMNE32 = 얼티밋 슈퍼 루이지 Wii +SMNE34 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 +SMNE35 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 - 클래식 모드 +SMNE36 = 뉴 슈퍼 마리오 브라더스 Wii 핵 팩 +SMNE37 = 뉴 슈퍼 마리오 브라더스 Wii 드래곤 코스터 프렌지 +SMNE38 = 뉴 슈퍼 마리오 브라더스 Wii 지하 미로 +SMNE39 = 뉴어 슈퍼 마리오 브라더스 Wii: Antnee 레벨 팩 +SMNE40 = 뉴어 슈퍼 마리오 브라더스 Wii U +SMNE41 = 데빌 마리오 윈터 스페셜 +SMNE42 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 라이트 +SMNE44 = 고 고 마리오 +SMNE45 = Lemmy의 윈터 플레이스 +SMNE46 = 뉴 슈퍼 마리오 브라더스 Wii - 레벨의 생일 배치 +SMNE47 = 뉴 스페셜 로드 +SMNE48 = 트루 마리오 브라더스 +SMNE49 = 뉴 슈퍼 마리오 브라더스 Wii - MSMKW Wii 팩 +SMNE50 = 뉴 슈퍼 마리오 브라더스 Wii - 파워 타워 팩 +SMNE51 = 뉴 슈퍼 마리오 브라더스 Wii - 데포 레벨 팩 파트 1 +SMNE52 = 뉴 슈퍼 마리오 브라더스 Wii - 데포 레벨 팩 파트 2 +SMNE53 = 뉴 슈퍼 마리오 브라더스 Wii - 키드 에디션 +SMNE54 = 뉴 슈퍼 마리오 브라더스 Wii: 넥스트 레벨 2 +SMNE55 = 뉴 슈퍼 마리오 브라더스 Wii: 라바 모드 팩 +SMNE56 = 뉴 슈퍼 마리오 브라더스 Wii: 대포 레벨 팩 파트 3 +SMNE57 = 마리오의 대모험 +SMNE58 = 와리오의 동굴 +SMNE59 = 뉴 슈퍼 마리오 브라더스 Wii: Quenry17의 레벨 팩 +SMNE60 = 리믹스드 슈퍼 마리오 브라더스 Wii +SMNE61 = 뉴 슈퍼 썸머 버케이션 +SMNE62 = 뉴 슈퍼 쿠파 Wii +SMNE65 = 고스틀리 슈퍼 고스트 부 Wii +SMNE66 = 요시의 전설 +SMNE67 = Larsenv 슈퍼 마리오 컬렉션 +SMNE68 = 요시의 전설 DLC +SMNE69 = 리바이즈드 슈퍼 마리오 브라더스 Wii +SMNE90 = 커스텀 레벨의 전설 +SMNEAM = 어드벤처 슈퍼 마리오 브라더스 Wii +SMNELL = 뉴어 슈퍼 루이지 Wii +SMNELM = 뉴어 슈퍼 루이지 Wii: 검은 달 +SMNEMI = Midi의 슈퍼 마리오 브라더스 Wii: 그냥 작은 모험 +SMNERE = 레트로 마리오 브라더스 +SMNERV = RV루션 Wii +SMNESN = 뉴 슈퍼 마리오 브라더스 Wii H +SMNESS = 뉴 슈퍼 마리오 브라더스 7 +SMNEXD = 디럭스 슈퍼 마리오 브라더스 Wii +SMNEXR = 슈퍼 마리오 리믹스 +SMNEYE = 8Forrest의 슈퍼 마리오 브라더스 Wii +SMNEYL = 루이지의 슈퍼 요시 브라더스 +SMNEYM = 유 슈퍼 마리오 브라더스 미 썸머 스페셜 +SMNEZA = 뉴어 아포칼립스 +SMNEZC = 첼린징 슈퍼 마리오 브라더스 Wii: 버츄얼 스페셜 +SMNEZD = 데포 슈퍼 마리오 브라더스 Wii 2: 잃어버린 레벨 +SMNEZN = 마리오와 빛나는 블록 +SMNEZO = Ludwig의 호텔 +SMNEZP = 100 개의 구덩이 트라이얼즈 1-20 +SMNEZT = 캡틴 쿠파의 복수 +SMNEZU = 덕 테일즈 3 +SMNEZV = 릴리즈 슈퍼 마리오 브라더스 Wii +SMNEZW = 데포 슈퍼 마리오 브라더스 Wii +SMNEZY = 슈퍼 마리오 스카이랜드 +SMNJ02 = 어썸머 슈퍼 루이지 미니 +SMNJ03 = 뉴어 슈퍼 마리오 브라더스 Wii +SMNJ04 = 캐논 슈퍼 마리오 브라더스 Wii +SMNJ06 = 뉴어 썸머 선 +SMNJ07 = 뉴어 홀리데이 스페셜 +SMNJ08 = 에픽 슈퍼 쿠파 월드 +SMNJ10 = 쿠파 컨트리 +SMNJ11 = 뉴 슈퍼 마리오 브라더스 Wii 4 +SMNJ14 = 뉴 슈퍼 마리오 브라더스 Wii: 페인 코인즈 +SMNJ15 = 뉴어 슈퍼 마리오 브라더스 7 +SMNJ20 = 뉴 슈퍼 마리오 브라더스 H +SMNJ23 = 뉴어 슈퍼 마리오 브라더스 Wii: 낙엽 +SMNJ31 = 뉴 슈퍼 마리오 브라더스 Wii: 다른 세계 +SMNJ34 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 +SMNJ35 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 - 클래식 모드 +SMNJ36 = 뉴 슈퍼 마리오 브라더스 Wii 핵 팩 +SMNJ37 = 뉴 슈퍼 마리오 브라더스 Wii 드래곤 코스터 프렌지 +SMNJ38 = 뉴 슈퍼 마리오 브라더스 Wii 지하 미로 +SMNJ39 = 뉴어 슈퍼 마리오 브라더스 Wii: Antnee 레벨 팩 +SMNJ40 = 뉴어 슈퍼 마리오 브라더스 Wii U +SMNJ41 = 데빌 마리오 윈터 스페셜 +SMNJ42 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 라이트 +SMNJ44 = 고 고 마리오 +SMNJ45 = Lemmy의 윈터 플레이스 +SMNJ46 = 뉴 슈퍼 마리오 브라더스 Wii - 레벨의 생일 배치 +SMNJ47 = 뉴 스페셜 로드 +SMNJ48 = 트루 마리오 브라더스 +SMNJ49 = 뉴 슈퍼 마리오 브라더스 Wii: MSMKW 팩 +SMNJ50 = 뉴 슈퍼 마리오 브라더스 Wii: 파워 타워 팩 +SMNJ51 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 1 +SMNJ52 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 2 +SMNJ53 = 뉴 슈퍼 마리오 브라더스 Wii: 키드 에디션 +SMNJ54 = 뉴 슈퍼 마리오 브라더스 Wii: 넥스트 레벨 2 +SMNJ55 = 뉴 슈퍼 마리오 브라더스 Wii: 라바 모드 팩 +SMNJ56 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 3 +SMNJ57 = 마리오의 대모험 +SMNJ58 = 와리오의 동굴 +SMNJ59 = 뉴 슈퍼 마리오 브라더스 Wii: Quenry17의 레벨 팩 +SMNJ60 = 리믹스드 슈퍼 마리오 브라더스 Wii +SMNJ61 = 뉴 슈퍼 썸머 베케이션 +SMNJ62 = 뉴 슈퍼 쿠파 Wii +SMNJ65 = 고스틀리 슈퍼 고스트 부 Wii +SMNJ66 = 요시의 전설 +SMNJ67 = Larsenv 슈퍼 마리오 컬렉션 +SMNJ68 = 요시의 전설 DLC +SMNJLL = 뉴어 슈퍼 루이지 Wii +SMNJLM = 뉴어 슈퍼 루이지 Wii 검은 달 +SMNJMI = Midi의 슈퍼 마리오 브라더스 Wii: 그냥 작은 모험 +SMNJRE = 레트로 마리오 브라더스 +SMNJRV = RV루션 Wii +SMNJXD = 디럭스 슈퍼 마리오 브라더스 Wii +SMNJXR = 슈퍼 마리오 리믹스 +SMNJYE = 8Forrest의 슈퍼 마리오 브라더스 Wii +SMNJYL = 루이지의 슈퍼 요시 브라더스 +SMNJYM = 유 슈퍼 마리오 브라더스 미 썸머 스페셜 +SMNJZA = 뉴어 아포칼립스 +SMNJZC = 첼린징 슈퍼 마리오 브라더스 Wii: 버추얼 스페셜 +SMNJZD = 데포 슈퍼 마리오 브라더스 Wii 2: 잃어버린 레벨 +SMNJZN = 마리오와 빛나는 블록 +SMNJZO = Ludwig의 호텔 +SMNJZP = 100 개의 구덩이 트라이얼즈 1-20 +SMNJZT = 캡틴 쿠파의 복수 +SMNJZU = 덕 테일즈 3 +SMNJZV = 릴리즈 슈퍼 마리오 브라더스 Wii +SMNJZW = 데포 슈퍼 마리오 브라더스 Wii +SMNJZY = 슈퍼 마리오 스카이랜드 +SMNK03 = 뉴어 슈퍼 마리오 브라더스 Wii +SMNP02 = 어썸머 슈퍼 루이지 미니 +SMNP03 = 뉴어 슈퍼 마리오 브라더스 Wii +SMNP04 = 캐논 슈퍼 마리오 브라더스 Wii +SMNP05 = 어나더 슈퍼 마리오 브라더스 Wii +SMNP06 = 뉴어 썸머 선 +SMNP07 = 뉴어 홀리데이 스페셜 +SMNP08 = 에픽 슈퍼 쿠파 월드 +SMNP10 = 쿠파 컨트리 +SMNP11 = 뉴 슈퍼 마리오 브라더시 Wii 4 +SMNP12 = 어썸머 슈퍼 루이지 미니 +SMNP14 = 뉴 슈퍼 마리오 브라더스 Wii: 페인 코인즈 +SMNP15 = 뉴어 슈퍼 마리오 브라더스 7 +SMNP20 = 뉴 슈퍼 마리오 브라더스 H +SMNP23 = 뉴어 슈퍼 마리오 브라더스 Wii: 낙엽 +SMNP30 = 슈퍼 루이지 랜드 Wii +SMNP31 = 뉴 슈퍼 마리오 브라더스 Wii: 다른 세계 +SMNP34 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 +SMNP35 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 - 클래식 모드 +SMNP36 = 뉴 슈퍼 마리오 브라더스 Wii 핵 팩 +SMNP37 = 뉴 슈퍼 마리오 브라더스 Wii 드래곤 코스터 펜지 +SMNP38 = 뉴 슈퍼 마리오 브라더스 Wii 지하 미로 +SMNP39 = 뉴어 슈퍼 마리오 브라더스 Wii: Antnee 레벨 팩 +SMNP40 = 뉴어 슈퍼 마리오 브라더스 Wii U +SMNP41 = 데빌 마리오 윈터 스페셜 +SMNP42 = 뉴 슈퍼 마리오 브라더스 Wii: 요시 모드 라이트 +SMNP44 = 고 고 마리오 +SMNP45 = Lemmy의 겨울 궁전 +SMNP46 = 뉴 슈퍼 마리오 브라더스 Wii: 레벨의 생일 배치 +SMNP47 = 뉴 스페셜 로드 +SMNP48 = 트루 마리오 브라더스 +SMNP49 = 뉴 슈퍼 마리오 브라더스 Wii: MSMKW 팩 +SMNP50 = 뉴 슈퍼 마리오 브라더스 Wii: 파워 타워 팩 +SMNP51 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 1 +SMNP52 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 2 +SMNP53 = 뉴 슈퍼 마리오 브라더스 Wii: 키즈 에디션 +SMNP54 = 뉴 슈퍼 마리오 브라더스 Wii: 넥스트 레벨 2 +SMNP55 = 뉴 슈퍼 마리오 브라더스 Wii: 라바 모드 팩 +SMNP56 = 뉴 슈퍼 마리오 브라더스 Wii: 데포 레벨 팩 파트 3 +SMNP57 = 마리오의 대모험 +SMNP58 = 와리오의 동굴 +SMNP59 = 뉴 슈퍼 마리오 브라더스 Wii: Quenry17의 레벨 팩 +SMNP60 = 리믹스드 슈퍼 마리오 브라더스 Wii +SMNP61 = 뉴 슈퍼 썸머 베케이션 +SMNP62 = 뉴 슈퍼 Bowser Wii +SMNP65 = 고스틀리 슈퍼 고스트 부 Wii +SMNP66 = 요시의 전설 +SMNP67 = Larsenv 슈퍼 마리오 컬렉션 +SMNP68 = 요시의 전설 DLC +SMNP77 = 뉴 슈퍼 마리오 브라더스 Wii 아르카디아 +SMNPAF = 어게인 슈퍼 마리오 브라더스 Wii 프로즌 스페셜 +SMNPDU = DU 슈퍼 마리오 브라더스: 애니버서리 에디션 +SMNPLL = 뉴어 슈퍼 루이지 Wii +SMNPLM = 뉴어 슈퍼 루이지 Wii: 검은 달 +SMNPMI = Midi의 슈퍼 마리오 브라더스 Wii: 그냥 작은 모험 +SMNPO1 = 뉴 슈퍼 마리오 커스텀 에디션 +SMNPRE = 레트로 마리오 브라더스 +SMNPRV = RV루션 Wii +SMNPXD = 디럭스 슈퍼 마리오 브라더스 Wii +SMNPXR = 슈퍼 마리오 리믹스 +SMNPYE = 8Forrest의 슈퍼 마리오 브라더스 Wii +SMNPYL = 루이지의 슈퍼 요시 브라더스 +SMNPYM = 유 슈퍼 마리오 브라더스 미 썸머 스페셜 +SMNPZA = 뉴어 아포칼립스 +SMNPZC = 첼린징 슈퍼 마리오 브라더스 Wii: 버츄얼 스페셜 +SMNPZD = 데포 슈퍼 마리오 브라더스 Wii 2: 잃어버린 레벨 +SMNPZN = 마리오와 빛나는 블록 +SMNPZO = Ludwig의 호텔 +SMNPZP = 100 개의 구덩이 트라이얼즈 1-20 +SMNPZT = 캡틴 쿠파의 복수 +SMNPZU = 덕 테일즈 3 +SMNPZV = 릴리즈 슈퍼 마리오 브라더스 Wii +SMNPZW = 데포 슈퍼 마리오 브라더스 Wii +SMNPZY = 슈퍼 마리오 스카이랜드 +SMOT3Q = 싱잇스타 모타운 +SMPP01 = 뉴 슈퍼 마리오 브라더스 Wii 2: 또다른 P +SMRE01 = 뉴 슈퍼 마리오 브라더스 Wii: 슈퍼 마리오 브라더스 1 커스텀 +SMSE01 = 뉴 슈퍼 마리오 브라더스 Wii 12 선샤인 파라다이스 +SMVE01 = 슈퍼 마리오 베케이션 +SMVJ01 = 슈퍼 마리오 베케이션 +SMVP01 = 슈퍼 마리오 베케이션 +SMWE01 = 뉴어 슈퍼 마리오 월드 U +SMWJ01 = 뉴어 슈퍼 마리오 월드 U +SMWP01 = 뉴어 슈퍼 마리오 월드 U +SNBE66 = 새로운 슈퍼 마리오 브라더스 Wii 아포칼립스 +SNLE01 = 뉴 슈퍼 마리오 브라더스 Wii 0-2 넥스트 제너레이션 레벨 +SO3EUD = 룬 팩토리: 운명의 흐름 (언덥) +SOME02 = 리듬 천국 피버 리페인티드 +SP9P4Q = 싱잇 스타 팝 2009 +SPRE01 = 뉴 슈퍼 마리오 브라더스 Wii 14 프로젝트 마리오 +SRBP4Q = 싱잇스타: R&B +SRGP01 = 뉴 슈퍼 마리오 Bros Wii 2 레지 +SRHP01 = 뉴 슈퍼 마리오 브라더스 Wii 7 레트로 천국 +SRNP01 = 뉴 슈퍼 마리오 브라더스 Wii 레볼루션 +SRVP01 = 뉴 슈퍼 마리오 브라더스 레볼루션 +SSLPOH = 싱잇스타 레전드즈 +SSSE01 = 뉴 슈퍼 마리오 브라더스 Wii: 썸머 선 +ST8P75 = 싱잇스타 80 년대 +STAP75 = 싱잇스타 아프레 스키 히츠 +STCP75 = 싱잇스타 싱스타 +STDP75 = 싱잇스타 독일 락-팝 +STFE41 = 저스트 댄스 포커스 +STHP75 = 싱잇스타 가장 인기있는 히츠 +STPP75 = 싱잇스타 팝 히츠 +STQP75 = 싱잇스타 퀸 +STRP75 = 싱잇스타 락 발라드즈 +STSP75 = 싱잇스타 슐라거 +SU5E41 = 저스트 댄스 라이츠 +SURE01 = 뉴 슈퍼 마리오 브라더스 Wii 19 레저렉션 U +SV1E41 = 저스트 댄스: 언리미티드 파티 (볼륨 1) +SV2E41 = 저스트 댄스: 언리미티드 파티 (볼륨 2) +SV4E41 = 저스트 댄스 인피니티 파티 +SVMEBR = 뉴 슈퍼 마리오 올 스타즈 HD +SWBP01 = 뉴 슈퍼 마리오 브라더스 Wii 0 모든 것이 시작된 곳 +SX3PUD = 판도라의 탑 (언덥) +SXEF52 = 기타 히어로 III 커스텀: 메가데쓰 +SXFF52 = 기타 히어로 III 커스텀: 마이 케미컬 로맨스 +SZEE01 = 뉴 슈퍼 마리오 브라더스 Wii 13 섀도우 제로 이스케이프 +UUUE01 = 뉴 슈퍼 마리오 브라더스 Wii 19 레저렉션 U +VIPE01 = 뉴 슈퍼 마리오 브라더스 Wii 18 Vip 믹스 +WARE01 = DU 슈퍼 와리오 브라더스 +WFFF4I = 령: 월식의 가면 +WMXE01 = 매우 즐거운 Wii 뮤직 크리스마스 +WMXK01 = 매우 즐거운 Wii 뮤직 크리스마스 +XBKE52 = 기타 히어로 III 커스텀: 나의 카멜롯 총알 +XNWE52 = 기타 히어로 III 커스텀: 나이트위시 +XXXX02 = 마리오 카트 테크닉 +ZM7E52 = 콜 오브 듀티: 근대 전쟁 - 리플렉스 에디션 좀비 모드 +ZXFP52 = 기타 히어로 3 앙코르 +W22E = 플래닛 피쉬 +W24E = 2 패스트 4 흙의 정령들 +W24P = 2 패스트 4 흙의 정령들 +W2AE = 빅 배스 아케이드 +W2CE = 브레인 챌린지 +W2CJ = 브레인 챌린지 +W2CP = 브레인 챌린지 +W2FP = 피지오펀: 균형 훈련 +W2GD = 역전재판 2 (독일어 버전) +W2GE = 역전재판 2 +W2GF = 역전재판 2 +W2GI = 역전재판 2 +W2GJ = 역전재판 2 +W2GP = 역전재판 2 +W2GS = 역전재판 2 +W2IE = 피시 피시 +W2IP = 피시 피시 +W2JE = 저스트 잼: 라이브 뮤직 메이커 +W2KE = 렛츠 캐치 +W2KJ = 렛츠 캐치 +W2KP = 렛츠 캐치 +W2LE = 블룬즈 +W2LP = 블룬즈 +W2ME = 블래스터 마스터: 오버드라이브 +W2MP = 블래스터 마스터: 오버드라이브 +W2OE = 나의 수족관 2 +W2OJ = 블루 오아시스: +W2OP = 나의 수족관 2 +W2PP = 피지오펀: 골반 근육 훈련 +W2TE = 훈련 담당 하사관 마인드스트롱 +W2TJ = 귀신 트레이닝: 교관은 호랑이 중사 +W2TP = 브레인 카데츠 +W2YE = 파이어플레이싱 +W2YP = 화로 +W34J = @심플 시리즈 볼륨 4 밀실에서 탈출 +W3AE = 카르멘 센디에이고 수학여행: 빅 벤 강도 사건 +W3BE = 사커 바쉬 +W3BP = 사커 바쉬 +W3FE = 3D 픽셀 레이싱 +W3FP = 3D 픽셀 레이싱 +W3GD = 역전재판 3 +W3GE = 역전재판 3 +W3GF = 역전재판 3 +W3GI = 역전재판 3 +W3GJ = 역전재판 3 +W3GP = 역전재판 3 +W3GS = 역전재판 3 +W3JE = 트리플 점핑 스포츠 +W3KE = 스루스페이스 +W3KJ = 질주해서 빠져나가는 아나토우스 +W3KP = 스루스페이스: 하이 벨로시티 3D 퍼즐 +W3LE = 카르멘 샌디에이고 수학여행: 레이디 리버티 라케니 +W3ME = 삼총사: 모두를 위한 하나 +W3MP = 삼총사: 모두를 위한 하나 +W3PE = 트리플 던지기 스포츠 +W3RE = 트리플 달리기 스포츠 +W3SE = 트리플 사격 스포츠 +W3TE = 진주만 3 부작 - 1941: 레드 선 라이징 +W42J = 포춘: 별이 가득한 언덕 +W44E = 스트레스 해소: 분노의 날 +W44P = 스트레스 해소: 분노의 날 +W48E = 쉐도우플레이 +W4AE = 아케이드 스포츠 +W4AP = 아케이드 스포츠: 에어 하키, 볼링, 당구, 스누커 +W4KE = 디어 캡터 +W4KJ = 사슴 사냥 +W4OJ = 네모난 머리를 둥글게 하자 도전 +W4TE = 스페이스볼 레볼루션 +W4TP = 스페이스볼 레볼루션 +W54E = 5 스포츠 파티 +W54P = 5 스포츠 파티 +W5AE = 5 아케이드 젬즈 +W5AP = 5 아케이드 젬즈 +W5IE = 5 합 1 솔리테르 +W6BE = 에코 슈터: 플랜트 530 +W6BJ = 530 에코 슈터 +W6BP = 에코 슈터: 플랜트 530 +W72P = 독일어 3 학년을 성공적으로 배우기 +W73P = 독일어 4 학년을 성공적으로 배우기 +W74P = 독일어 5 학년을 성공적으로 배우기 +W7IP = 독일어 2 학년을 성공적으로 배우기 +W82J = 땅 따먹기 액션! 태합검지: 태엽 성의 수수께끼 +W8BP = 바벨 라이징 +W8CE = 비트 트립 코어 +W8CJ = 비트 트립 코어: 리듬 성인의 역습 +W8CP = 비트 트립 코어 +W8DJ = 뫼비우스 드라이브 +W8IJ = 81 다이버 Wii +W8LE = 벌룬 팝 페스티발 +W8PJ = 집에서∞쁘띠쁘띠 Wii +W8WE = 해피 홀리데이스: 할로윈 +W8WP = 해피 홀리데이스: 할로윈 +W8XE = 배틀 포커 +W9BE = 빅 타운 슈트 아웃 +W9BP = 빅 타운 슈트 +W9IE = 회피 공간 +W9IJ = 위험 공역 +W9LE = 크리스마스 클릭스! +W9RE = 해피 홀리데이스: 크리스마스 +W9RP = 해피 홀리데이스: 크리스마스 +W9UE = 크루즈 파티 +W9UP = 크루즈 파티 +WA2E = 마그네틱 트위스트 +WA2J = 모두의 퍼즈루프 +WA2P = 액션루프 트위스트 +WA4E = 와리오웨어: D.I.Y. 쇼케이스 +WA4J = 와리오웨어: D.I.Y. 쇼케이스 +WA4P = 와리오웨어: D.I.Y. 쇼케이스 +WA5E = 수학의 카르멘 샌디에고 모험 다이아몬드 섬 +WA7E = 토리바쉬 +WA7P = 토리바시: 완벽한 폭력 +WA8E = 아트 스타일 : 로토조아 +WA8J = 아트 스타일: 펜타 텐더클즈 +WA8P = 아트 스타일: 펜타 텐더클즈 +WAAE = 아야와 빛의 큐브 +WAAP = 아야와 빛의 큐브 +WABE = 균형의 예술 +WABP = 균형의 예술 +WACE = 아케이드 에센셜즈 +WACP = 아케이드 에센셜즈 +WAEE = 세계일주 +WAEP = 세계일주 +WAFE = 에어포트 매니아: 첫 비행 +WAFP = 에어포트 매니아: 첫 비행 +WAGE = 피노키오의 퍼즐 +WAHE = 참호 장군 +WAHP = 참호 장군 +WAIE = 101 합 1 익스플로시브 메가믹스 +WAIP = 101 합 1 익스플로시브 메가믹스 +WAJE = 모토히어로즈 +WAJP = 모토히어로즈 +WAKE = 카르멘 샌디에이고 수학여행: 무너지는 성당의 사례 +WALE = 아트 스타일: 라이트 트랙스 +WALJ = 아트 스타일: 라이트스트림 +WALP = 아트 스타일: 라이트 트랙스 +WAME = 카르멘 샌디에이고 수학 여행: 그레이트 게이트웨이 그랩 +WANE = 개미 국가 +WANP = 개미 국가 +WAOE = 배고픈 애벌레의 ABC +WAOJ = 배고픈 애벌레의 ABC +WAOP = 배고픈 애벌레의 ABC +WAQJ = 역만 Wii 이데 요스케의 건강 마작 +WARJ = 통신 대국 바둑 도장 2700 문 +WASJ = 통신 대국: 조기 장기 3 단 +WATE = 아스트로 버그즈 리벤지 +WAUJ = 통신 대국: 월드 체스 +WAYE = 그래도 아직 그것은 움직인다 +WAYP = 그래도 아직 그것은 움직인다 +WAZE = 놀라운 두뇌 기차 +WB2E = 스트롱 배드 에피소드 4: 나쁘고 강하지 3 +WB2P = 스트롱 배드 에피소드 4: 나쁘고 강하지 3 +WB3E = 스트롱 배드 에피소드 5: 8 비트는 충분해 +WB3P = 스트롱 배드 에피소드 5: 8 비트는 충분해 +WB4E = 와일드 웨스트 건즈 +WB4J = 와일드 웨스트 건즈 +WB4P = 와일드 웨스트 건즈 +WB5E = 블록 브레이커 디럭스 +WB5J = 블록 브레이커 디럭스 +WB5P = 블록 브레이커 디럭스 +WB6E = TV 쇼 킹 +WB6J = TV 쇼 킹 +WB6P = TV 쇼 킹 +WB7E = 심야의 당구 +WB7J = 하마루 당구 +WB7P = 심야의 당구 +WB8E = 심야의 볼링 +WB8J = 하마루 볼링 +WB8P = 심야의 볼링 +WBAJ = 폭탄 +WBBE = 스노우보드 라이엇 +WBBJ = 보드 전사 +WBBP = 스노우보드 라이엇 +WBDE = 두뇌 유출 +WBDP = 두뇌 유출 +WBEE = 퐁 토스: 프랫 파티 게임 +WBEP = 비어 퐁: 프랫 파티 게임 +WBFE = 비트 트립 페이트 +WBFP = 비트 트립 페이트 +WBGP = 뱅 어택 +WBHE = 블러드 비치 +WBHP = 블러드 비치 +WBIE = 보잉즈 +WBJE = 하베스트 문: 나의 작은 상점 +WBJJ = 목장 이야기 시리즈: 목장의 상점 +WBKE = 알카노이드 플러스! +WBKJ = 알카노이드 플러스! +WBKP = 알카노이드 플러스! +WBLE = 버블 보블 플러스! +WBLJ = 버블 보블 Wii +WBLP = 버블 보블 플러스! +WBME = 나의 포켓몬 목장 +WBMJ = 모두의 포켓몬 목장 +WBMP = 나의 포켓몬 목장 +WBNE = 분재 이발기 +WBNJ = 분재 이발기 +WBNP = 분재 이발기 +WBOE = 그라비트로닉스 +WBPE = 타일: 트위스트 '앤' 페인트 +WBPP = 타일: 트위스트 '앤' 페인트 +WBQE = 스타 솔져 R +WBQJ = 스타 솔져 R +WBQP = 스타 솔져 R +WBRP = 해적들: 꿈의 열쇠 +WBSE = 팝 +WBSJ = 팝 +WBSP = 팝 +WBVE = SPOGS 레이싱 +WBVP = SPOGS 레이싱 +WBWE = 생물 모으기 +WBWJ = 사쿠 사쿠 애니멀 패닉 +WBWP = 생물 모으기 +WBXE = 스트롱 배드 에피소드 1: 홈스타 유적 +WBXP = 스트롱 배드 에피소드 1: 홈스타 유적 +WBYE = 스트롱 배드 에피소드 2: 스트롱 배디아 - 더 프리 +WBYP = 스트롱 배드 에피소드 2: 스트롱 배디아 - 더 프리 +WBZE = 스트롱 배드 에피소드 3: 밴드 중에서 가장 나쁜 +WBZP = 스트롱 배드 에피소드 3: 밴드 중에서 가장 나쁜 +WC2E = 크리스탈 디펜더스 R2 +WC2J = 크리스탈 디펜더스 R2 +WC2P = 크리스탈 디펜더스 R2 +WC6E = 크로노스 트윈즈 DX +WC6P = 크로노스 트윈즈 DX +WC8J = 라인 어택 히어로즈 +WCHE = 체스 도전! +WCHP = 체스 도전 +WCIE = 크리스탈 디펜더즈 R1 +WCIJ = 크리스탈 디펜더즈 R1 +WCIP = 크리스탈 디펜더즈 R1 +WCJE = 코코토 플랫폼 점퍼 +WCJP = 코코토: 플랫폼 점퍼 +WCKE = 칙 칙 붐 +WCKJ = 칙 칙 붐 +WCKP = 칙 칙 붐 +WCLE = 닥 클락: 토스트 된 시간의 샌드위치 +WCNJ = 도쿄 시티의 밤 +WCOE = 코코토 낚시 마스터 +WCOP = 코코토 낚시 마스터 +WCPE = 콥터 크라이시스 +WCPP = 콥터 크라이시스 +WCRE = 축제 왕 +WCSE = 큐스포츠: 당구 레볼루션 +WCSJ = 큐 스포츠: Wi-Fi 대전 당구 +WCSP = 큐 스포츠: 스누커 vs 당구 +WCUE = 3-2-1, 래틀 배틀! +WCUJ = 뜨거운 12 게임: 살랑살랑 파티! +WCUP = 3-2-1, 래틀 배틀! +WCVE = 동굴 이야기 +WCVP = 동굴 이야기 +WCZE = 컬러즈 +WCZJ = 컬러즈 +WCZP = 컬러즈 +WD2J = 심플 Wii 시리즈 볼륨 2: 넘버 퍼즐 네오 +WD9E = 캐슬베니아 어드벤처 리버스 +WD9J = 드라큘라 전설 리버스 +WD9P = 캐슬베니아 어드벤처 리버스 +WDAJ = 다츠 Wii +WDBE = 더비 도그스 +WDBJ = 더비 도그 +WDDE = 디너 대쉬 +WDDJ = 디너 대쉬 +WDDP = 디너 대쉬 +WDEE = 마법의 운명 점성술 게임 +WDEP = 마법의 운명 점성술 게임 +WDFE = 당신의 성을 지켜라 +WDFP = 당신의 성을 지켜라 +WDHE = 아트 스타일: 로보헥스 +WDHJ = 아트 스타일: 다이얼헥스 +WDHP = 아트 스타일: 로보헥스 +WDIJ = 심플 Wii 시리즈 볼륨 1: 블록 쿠즈시 네오 +WDKE = 다트 레이지 +WDME = Dr. 마리오 온라인 Rx +WDMJ = Dr. 마리오 & 세균 박멸 +WDMP = Dr. 마리오 & 세균 박멸 +WDNJ = 징벌: 제국의 탄생 +WDOE = 드리프트 매니아 +WDOP = 드리프트 매니아 +WDPE = Dr. 마리오 온라인 Rx (친구 대전 체험판) +WDPJ = Dr. 마리오 온라인 Rx (친구 대전 체험판) +WDPP = Dr. 마리오 & 세균 버스터 (친구 대전 체험판) +WDRE = Mr. 드릴러 W +WDRJ = Mr. 드릴러 월드 +WDRP = Mr. 드릴러 W +WDSE = 드래곤 마스터 스펠 캐스터 +WDSP = 드래곤 마스터 스펠 캐스터 +WDVE = 부두 다이스 +WDVP = 부두 다이스 +WDXE = 다이아토믹 +WE6E = 나의 돌고래 +WE6J = 바다 농장: 돌고래와 나의 쇼타임 +WE9E = 에일리언 크러쉬 리턴즈 +WE9J = 에일리언 크러쉬 리턴즈 +WE9P = 에일리언 크러쉬 리턴즈 +WEDE = 엘도라도 더 사무라이 토스터 +WEME = 아하! 알았어! 탈출 게임 +WEMJ = 1 뉴크! 탈출 게임 *나의 집 편 +WEMP = 아하! 알았어! 탈출 게임 +WENE = TNT 레이서즈 +WENP = TNT 레이서즈 +WEQE = 평형 +WEQJ = 기울기 영혼 (균형 감각) +WEQP = 평형 +WERE = 나의 수족관 +WERJ = 블루 오아이스: 물고기의 치유 공간 +WERP = 나의 수족관 +WETE = 그림책 게임: 팝 업 퍼슈트 +WETJ = 놀 수 있는 그림책 +WETP = 그림책 게임: 팝 업 어드벤처 +WEVE = 바이러스 생존 +WEVJ = Peakvox 탈출 바이러스 +WEVP = 바이러스 생존 +WF2E = 파이널 판타지 크리스탈 연대기: 암흑 군주로서의 나의 인생 +WF2J = 파이널 판타지 크리스탈 연대기: 빛과 어둠의 공주님과 세계 정복의 탑 +WF2P = 파이널 판타지 크리스탈 연대기: 암흑 군주로서의 나의 인생 +WF3E = 패밀리 게임즈: 펜 & 페이퍼 에디션 +WF4E = 파이널 판타지 IV: 몇 년 후 +WF4J = 파이널 판타지 IV: 몇 년 후 - 달의 귀환 +WF4P = 파이널 판타지 IV: 몇 년 후 +WF5E = 패밀리 카드 게임즈 +WF5J = 오키라쿠 대부호 Wii +WF5P = 패밀리 카드 게임즈 +WF6E = 프로봇 +WFAE = 패스트 드로우 쇼다운 +WFAP = 패스트 드로우 쇼다운 +WFBE = 모래사장 +WFBJ = 해변에 성을 만들어 버립니다 와우! +WFBP = 모래사장 +WFCE = 파이널 판타지 크리스탈 연대기: 왕으로서의 나의 인생 +WFCJ = 파이널 판타지 크리스탈 연대기: 작은 임금님과 약속의 나라 +WFCP = 파이널 판타지 크리스탈 연대기: 왕으로서의 나의 인생 +WFDE = 수인 구조 +WFDP = 수인 구조 +WFEE = 페니모어 필모어 +WFFE = 펀! 펀! 미니골프 +WFFJ = 펀! 펀! 미니골프 +WFFP = 펀! 펀! 미니골프 +WFGE = 돌아온 프로거 +WFGJ = 돌아온 프로거 +WFHE = 비행 컨트롤 +WFHP = 비행 컨트롤 +WFIE = 릴 낚시 도전 +WFIJ = 피쉬 아이즈 도전 +WFIP = 릴 낚시 도전 +WFKE = 패밀리 고-카트 레이싱 +WFKJ = 오키라쿠 카트 Wii +WFLE = 플루이디티 +WFLP = 하이드로벤처 +WFME = 패밀리 & 프렌즈 파티 +WFMP = 패밀리 & 프렌즈 파티 +WFNE = 피쉬 탱크 +WFNP = 피쉬 탱크 +WFPJ = 번뜩이는 카드 배틀 메쿠루카 +WFQE = 프로거: 하이퍼 아케이드 에디션 +WFQP = 프로거: 하이퍼 아케이드 에디션 +WFRP = 돌아온 프로거 +WFSJ = 모두의 영화관 Wii +WFTE = 피쉬 에엠 올 +WFTP = 피쉬 에엠 올 +WFUE = 퍼리 레전드즈 +WFUP = 퍼리 레전드즈 +WFVE = 사커 업 +WFVP = 풋볼 업 +WFWE = 플라워 워크스 +WFWP = 플라워워크스: 폴리의 모험 +WFXE = 코시 파이어 +WFXP = 코시 파이어 +WFYE = 패밀리 게임즈: 펜 & 페이퍼 에디션 +WFYP = 패밀리 게임즈: 펜 & 페이퍼 에디션 +WG2J = 슈가 바니즈 Wii: 환영해요 바니즈 필드에 +WG4E = 고스트슬레이어 +WGAE = 고스트 매니아 +WGAP = 고스트 매니아 +WGDE = 그라디우스 리버스 +WGDJ = 그라디우스 리버스: 업데이티드 +WGDP = 그라디우스 리버스 +WGFP = 걸프렌드즈 포에버 매직 스케이트 +WGGE = 가브리엘의 고스틀리 그루브: 몬스터 믹스 +WGGJ = 우시미츠 몬스트루오 푸치: 이상한 대도시의 댄스 파티 +WGGP = 가브리엘의 고스틀리 그루브: 몬스터 믹스 +WGLE = 유전자 실험실 +WGMJ = 게임 사운드스테이션 +WGOE = 구의 세계 +WGOJ = 구의 세계 +WGOP = 구의 세계 +WGPE = 아쿠아스페이스 +WGPJ = 아쿠아 리빙: TV에서 바라 보는 물고기들 +WGPP = 젠쿠아리아: 버추얼 아쿠아리움 +WGSD = 역전재판 (독일어 버전) +WGSE = 역전재판 +WGSF = 역전재판 (프랑스어 버전) +WGSI = 역전재판 +WGSJ = 역전재판: 소생역전 +WGSP = 역전재판 +WGSS = 역전재판 (스페인어 버전) +WGTJ = 세계의 재미 파티 게임 +WGUJ = 에어로 기타 +WGVE = 그루빙 블록 +WGYE = 자이로스타 +WH3E = 홈 스위트 홈 +WH3P = 홈 스위트 홈 +WHBE = 휴버트 더 테디 베어: 윈터 게임즈 +WHEE = 헤라클레스: 전차 레이싱 +WHEP = 헤라클레스: 전차 레이싱 +WHFE = 헤비 파이어: 스페셜 오퍼레이션즈 +WHFP = 헤비 파이어: 스페셜 오퍼레이션즈 +WHHJ = 렛츠 전력 히치하이크!!!!!!!!! +WHOE = 하키 올스타 슛아웃 +WHPE = 섹시 포커 +WHPP = 섹시 포커 +WHPU = 섹시 포커 +WHRE = 헤론 스팀 머신 +WHRP = 헤론 스팀 머신 +WHUE = 유령 대저택 파티 +WHUJ = 유령 대저택 파티 +WHUP = 유령 대저택 파티 +WHVE = 고전압 : 핫 로드 쇼 +WHWE = 후프월드 +WHWP = 후프월드: 바스켓 대난투 +WHXE = 헬릭스 +WHXP = 헬릭스 +WHYE = 헤비 파이어: 블랙 암즈 +WHZE = 호라이즌 라이더즈 +WHZP = 호라이즌 라이더즈 +WIBE = 비토스+ +WICE = 닉스퀘스트: 킨드러드 스피리츠 +WICJ = 닉스퀘스트 +WICP = 닉스퀘스트: 킨드러드 스피리츠 +WIDE = 드라큘라: 언데드 각성 +WIDP = 드라큘라: 언데드 각성 +WIEE = 원숭이 섬의 이야기: 3 장 - 리바이어던의 둥지 +WIEP = 원숭이 섬의 이야기: 3 장 - 리바이어던의 둥지 +WIGE = 인커밍 +WIHE = 새와 놀기 +WIKJ = 아기 키위새의 모험 +WILE = 원숭이 섬의 이야기: 1 장 - 소리지르는 일각고래 내보내기 +WILP = 원숭이 섬의 이야기: 1 장 - 소리지르는 일각고래 내보내기 +WINE = 믿을 수 없는 미로 +WINJ = 직감! 균형★미로 +WINP = 믿으 수 없는 미로 +WIRE = 원숭이 섬의 이야기: 5 장 - 해적신의 부활 +WIRP = 원숭이 섬의 이야기: 5 장 - 해적신의 부활 +WISE = 원숭이 섬의 이야기: 2 장 - 스피너 케이의 포위 작전 +WISP = 원숭이 섬의 이야기: 2 장 - 스피너 케이의 포위 작전 +WITE = 아하! 찾았어요! 숨겨진 오브젝트 게임 +WITJ = 아아! 발견했어요! 아이템 찾기 게임 +WITP = 아하! 찾았어요! 숨겨진 오브젝트 게임 +WIUE = 인큐버스 +WIVE = 스페이스 인베이더즈 겟 이븐 +WIVJ = 스페이스 인베이더즈 겟 이븐 +WIVP = 스페이스 인베이더즈 겟 이븐 +WIYE = 원숭이 섬의 이야기: 4 장 - 가이브러시 삼나무의 재판과 집행 +WIYP = 원숭이 섬의 이야기: 4 장 - 가이브러시 삼나무의 재판과 집행 +WJ2J = 인생 게임: 행복한 발걸음 +WJAE = 잼 시티 롤러걸즈 +WJAP = 잼 시티 롤러걸즈 +WJCE = 젤리자동차 2 +WJEE = 제트 로켓 +WJEP = 제트 로켓 +WJFE = 흙의 정령들 +WJFP = 흙의 정령들 +WJGJ = 인생 게임 +WJKE = 주얼 키퍼즈: 이스터 섬 +WJKP = 주얼 키퍼즈: 이스터 섬 +WJPJ = 가위-바위-보 파티 파라다이스 +WJSE = 정글 스피드 +WJSP = 정글 스피드 +WJWE = 비쥬얼드 2 +WJWP = 비쥬얼드 2 +WK2J = 갓파군과 놀자: 갓파군의 즐거움인가? +WK3J = 갓파군과 놀자: 갓파군과 모리의 친구들 +WK9J = 다같이 놀자! 강아지와 데굴데굴 +WKBE = 너, 나, 큐브 +WKBJ = 너, 나, 입체 +WKBP = 너, 나, 큐브 +WKCE = 쿄토케이 +WKCP = 쿄토케이 +WKDE = 해적: 꿈의 열쇠 +WKEJ = 편리한 금연앱 Wii 금연과 의사가 가르치는 7 일에 종료하는 방법 +WKFE = 쿵푸 펑크: 모두 쿵푸 파이팅입니다! +WKFP = 쿵푸 펑크: 모두 쿵푸 파이팅입니다! +WKHE = 빅 카후나 파티 +WKIE = 화이트록 성의 미스터리 +WKIP = 화이트록 성의 미스터리 +WKJE = 카라오케 조이사운드 +WKKE = 파티 펀 파이럿 +WKKJ = 검은 수염 위기 일발 +WKKP = 팝 업 파이럿! +WKNJ = 한나라 시사 모두 와글 와글 한자 뇌 +WKPJ = 갓파군과 모리의 친구들 +WKQJ = 겐테이 TV! Wii 모두의 현지 퀴즈 배틀 +WKRP = 가라테 팬츠: 영광의 글러브 +WKTE = 혼두라 리버스 +WKTJ = 혼두라 리버스 +WKTP = 혼두라 리버스 +WKUJ = 다운타운 열혈 피구 +WKWE = 잃어버린 섬에서의 모험: 숨은 그림 찾기 게임 +WKWJ = 아이템 찾기 게임 +WKWP = 잃어버린 섬에서의 모험: 숨은 그림 찾기 게임 +WL2E = 타겟 토스 프로: 론 다츠 +WL5E = HB 아케이드 디스크 골프 +WL9E = 도자기를 만들자! +WLCE = 빙고 파티 디럭스 +WLCJ = 왁자지껄 빙고 디럭스 +WLCP = 빙고 파티 디럭스 +WLDJ = 나도 세계를 구하고 싶어: 배틀 토너먼트 +WLEE = 푸유스와 함께하는 학습: 에피소드 1 +WLEJ = 푸유스와 놀자: 에피소드 1 +WLEP = 푸유스와 함께하는 학습: 에피소드 1 +WLGE = HB 아케이드 카드즈 +WLIE = 리이트 +WLJJ = 나도 세계를 구하고 싶어: 배틀 토너먼트 +WLKJ = 리카짱 패션 하우스 +WLLE = 리틀 토너먼트 오버 욘더 +WLLP = 리틀 토너먼트 오버 욘더 +WLME = 라-뮬라나 +WLMJ = 라-뮬라나 +WLMP = 라-뮬라나 +WLNE = 푸유스와 함께하는 학습: 에피소드 2 +WLNP = 푸유스와 함께하는 학습: 에피소드 2 +WLOE = 바람을 찾아서: 멜로디아의 겨울 +WLOJ = 바람을 찾아서: 멜로디아의 겨울 +WLOP = 바람을 찾아서: 멜로디아의 겨울 +WLPE = 론포스 +WLPJ = 론포스 +WLPP = 론포스 +WLTE = 리트 +WLTJ = 어둠의 학교 +WLTP = 리트 +WLWE = 바람을 찾아서 +WLWJ = 바람을 찾아서 +WLWP = 바람을 찾아서 +WLXJ = 팔랑크스 +WLZE = 릴트 라인 +WLZP = 릴트 라인 +WM2E = 나의 작은 아기 +WM2P = 나의 작은 아기 +WM3E = 메닉 멍키 메이햄 +WM3P = 메닉 멍키 메이햄 +WM4E = 믹스 슈퍼스타 +WM4P = 믹스 슈퍼스타 +WM7E = 아니마: 죄인의 방주 +WM7P = 아니마: 죄인의 방주 +WM8E = 봄버맨 블래스트 +WM8J = Wi-Fi 8 인 배틀 봄버맨 +WM8P = 봄버맨 블래스트 +WM9E = 해피 해머린 +WM9J = 두드려라! 모구뽄 +WM9P = 해피 해머린 +WMAE = 자석 +WMAP = 자석 +WMBE = 마보쉬의 아케이드 +WMBJ = 형태의 게임: 동그라미 막대 사각형 +WMBP = 마보쉬: 세 가지 모양의 아케이드 +WMCE = 몬스테카 코랄: 몬스터즈 vs. 로봇츠 +WMCP = 몬스테카 코랄: 몬스터즈 vs. 로봇츠 +WMDE = 매드스톤 +WMGE = 마트 레이서 +WMHE = 마우스 하우스 +WMJE = 다이브: 메디아 제도의 비밀 +WMJP = 다이브: 메디아 제도의 비밀 +WMKE = 미어캣 이끌기 +WMKP = 미어캣 이끌기 +WMLE = 메이저 리그 이팅: 게임 +WMLJ = 메이저 리그 이팅: 게임 +WMME = 근육 행진곡 +WMMJ = 근육 행진곡 +WMMP = 근육 행진곡 +WMOE = 모찌모찌 +WMOJ = 모찌모찌 Q: 당신이 돌려서 구하는 퍼즐 +WMOP = 모찌모찌 +WMPJ = 말의 퍼즐 모지핏탄 Wii +WMRE = 모노크롬 레이싱 +WMRP = 모노크롬 레이싱 +WMSE = 마사지를 즐기세요! +WMSP = 마사지를 즐기세요! +WMWP = 미피 월드 +WMWX = 미피 월드 +WMXE = 맥스와 매직 마커 +WMXJ = 맥스와 매직 마커 +WMXP = 맥스와 매직 마커 +WMZP = 마작 +WN9E = 밀리터리 매드네스: 넥타리스 +WN9J = 넥타리스 +WN9P = 밀리터리 매드네스: 넥타리스 +WNAP = 자연으로 돌아가 +WNEE = 펭귄과 친구들: 이봐! 저건 내 물고기야! +WNEP = 펭귄과 친구들: 이봐! 저건 내 물고기야! +WNGE = 뱅 어택 +WNKE = 니키: 락 '엔' 볼 +WNKP = 니키: 락 '엔' 볼 +WNPJ = 스구스로 DUO 「뉴 펄서 R & V」 +WNSE = 뉴턴 vs 호드 +WNSP = 뉴턴 VS 호드 +WNVE = 네베스 플러스 +WNVJ = 하메코미 럭키 퍼즐 Wii 리턴 +WNVP = 네베스 플러스: 탄그램즈의 판테온 +WNWJ = 하메코미 럭키 퍼즐 Wii 리턴 +WO6E = 패밀리 해적 파티 +WO6J = 오키라쿠 주사위 놀이 Wii +WO6P = 패밀리 해적 파티 +WOAE = 패밀리 글라이드 하키 +WOAJ = 오키라쿠 에어 하키 Wii +WOAP = 패밀리 글라이드 하키 +WOBE = 아트 스타일: 오비엔트 +WOBJ = 아트 스타일: 오비탈 +WOBP = 아트 스타일: 오비엔트 +WODJ = 왕이다! +WOEJ = 그림 그리기 로직 +WOFE = 오버클로우 +WOGE = 패밀리 미니 골프 +WOGJ = 오키라쿠 퍼터 골프 Wii +WOGP = 패밀리 미니 골프 +WOKJ = 카라오케 조이사운드 Wii +WOLJ = 오델로 +WOMJ = 세계의 재미 파티 게임 2 +WOPE = 단어 검색 디럭스 +WOSE = 패밀리 슬롯 카 레이싱 +WOSJ = 오키라쿠 슬롯 카 레이싱 Wii +WOSP = 패밀리 슬롯 카 레이싱 +WOTE = 오버턴 +WOTJ = 오버턴 +WOTP = 오버턴: 메카 대전 +WOXJ = 오쓰! 운동 도장 +WOYE = 비트 보이!! +WOYJ = 비트 맨 +WOYP = 비트 보이!! +WOZJ = 유아 교육 텔레비 Wii: 아이우에 오무주 +WP2E = 포푸리 +WP2P = 포푸리 +WP3P = 진주만 3 부작 1941: 떠오르는 붉은 태양 +WP4E = 푸유스와 함께하는 학습: 에피소드 3 +WP4P = 푸유스와 함께하는 학습: 에피소드 3 +WP5J = 포코스카 레이싱 +WP6J = 저는 프라레일 운전사입니다: 신칸센&증기 기관차 편 +WP7E = 나의 천문대 +WP7J = 천문대 +WP7P = 나의 별이 빛나는 밤 +WP9J = 포커스 Wii +WPAJ = 포켓몬 불가사의 던전 간다! 폭풍의 모험단 +WPBE = 술집 다츠 +WPBP = 술집 다츠 +WPCE = 독 루이스의 펀치-아웃!! +WPDJ = 기묘한 여행!! 폴의 대모험 +WPFJ = 포켓몬 불가사의 던전 나아가라! 화염의 모험단 +WPGE = 스노우팩 파크 +WPGJ = 펭귄 라이프 +WPHJ = 포켓몬 불가사의 던전 노리자! 빛의 모험단 +WPIE = 핏 크루 패닉! +WPIJ = 핏 크루 패닉! +WPIP = 핏 크루 패닉! +WPJE = 뿌까의 키스 게임 +WPJP = 뿌까의 키스 게임 +WPKE = 텍사스 홀덤 포커 +WPKP = 텍사스 홀덤 포커 +WPLE = 행성 빠칭코 +WPNJ = 뽄쟌 +WPOJ = 폽플과 마법의 크레용 +WPPE = 패밀리 탁구 +WPPJ = 오키라쿠 탁구 +WPPP = 패밀리 탁구 +WPQE = 프로퇴테아 +WPQP = 프로퇴테아 +WPRE = 아트 스타일: 큐벨로 +WPRJ = 아트 스타일: 큐벨로 +WPRP = 아트 스타일: 큐벨로 +WPSE = 포켓몬 럼블 +WPSJ = 란센 포켓몬 스크램블 +WPSP = 포켓몬 럼블 +WPTJ = 환상 큐브 +WPUE = 버스트 어 무브 플러스! +WPUJ = 퍼즐 보글 Wii +WPUP = 퍼즐 보글 플러스! +WPVE = 베어즈워스 매너 이야기: 혼돈의 갈등 +WPVJ = 쿠마나게: 키이나가 싫어하는 푸른 보석 배틀 편 +WPVP = 베어즈워스 매너 이야기: 혼돈의 갈등 +WPWE = 퐁 토스 프로: 프랫 파티 게임즈 +WPXJ = 모두 뛰어! 펭귄 다이빙 후퍼 루퍼 +WPYE = 팔루리키오 +WPYP = 팔루리키오 +WPZE = 브루저 앤 스크래치 +WQ4J = 권투사 살랑살랑 권투 +WR2E = 래비즈 연구실 +WR2P = 래비즈 연구실 +WR4P = 러쉬 러쉬 랠리 레이싱 +WR5E = 레트로 시티 램페이지 +WR5P = 레트로 시티 램페이지 +WR9E = 메가맨 9 +WR9J = 록맨 9: 야망의 부활!! +WR9P = 메가맨 9 +WRBE = 로보칼립스: 비버 디펜스 +WRBP = 로보칼립스: 비버 디펜스 +WRDE = 단어 검색 +WRDP = 단어 검색 +WREE = 레이서즈 아일랜드즈: 크레이지 아레나즈 +WREP = 레이서즈 아일랜드즈: 크레이지 아레나즈 +WRFE = 릴 낚시 도전 II +WRFP = 릴 낚시 도전 II +WRGE = 글래디에이터의 분노 +WRGP = 글래디에이터의 분노 +WRIE = 레인보우 아일랜즈: 타워링 어드벤처! +WRIJ = 레인보우 아일랜즈: 타워링 어드벤처! +WRIP = 레인보우 아일랜즈: 타워링 어드벤처! +WRJE = 레이서즈 아일랜드즈: 크레이지 레이서즈 +WRJP = 레이서즈 아일랜드즈: 크레이지 레이서즈 +WRLE = 패스트 레이싱 리그 +WRLP = 패스트 레이싱 리그 +WRNJ = 비트 트립 런너 +WRPE = 로프 태우기 +WRQE = 디어 드라이브 레전드즈 +WRQP = 디어 드라이브 레전드즈 +WRRE = 로빈 후드: 리차드의 귀환 +WRRP = 로빈 후드: 리차드의 귀환 +WRSE = 스텝 업 +WRTE = 로복스 +WRUE = 비트 트립 런너 +WRUP = 비트 트립 런너 +WRXE = 메가맨 10 +WRXJ = 록맨 10: 우주에서의 위협!! +WRXP = 메가맨 10 +WRYE = 로복스 +WRYP = 로복스 +WS2J = 세계최강력성 장기 +WS3E = 실버 스타: 체스 +WS3J = 최강 실버 스타 체스 +WS4J = 최강 실버 스타 마작 +WS5J = 최강 실버 스타 오목 두기 +WS6E = 실버 스타: 리버시 +WS6J = 세계 최강 실버 스타 리버시 +WS7E = 판타지 슬롯츠: 어드벤처 슬롯츠 & 게임즈 +WS8J = 모두의 대전 퍼즐 상하이 Wii +WS9E = 스도쿠 도전! +WS9P = 스도쿠 도전! +WSAE = 온슬롯 +WSAJ = 매드섹타 +WSAP = 온슬롯 +WSBJ = 소서리 블레이드 +WSCJ = 아웃 오브 갤럭시: 은빛의 코시카 +WSEJ = 공주 아이 이야기 +WSGE = 팝 '에엠 드롭 '에엠 사메가메 +WSGJ = 사메가메 Wii +WSGP = 팝 뎀, 드롭 뎁 사메가메 +WSHE = 스톤키프: 조상의 뼈 +WSIJ = 세계 최강 실버 스타 쇼기 +WSJE = 스팟 더 디퍼런스! +WSJP = 스팟 더 디퍼런스! +WSLE = 매직 오벨리스크 +WSLJ = 섀도우 워커 +WSME = 먹고! 살찌우고! 싸구고! +WSMJ = 츠파리 대스모 Wii 방 +WSMP = 먹고! 살찌우고! 싸구고! +WSNE = 바람돌이 소닉 4 에피소드 I +WSNJ = 바람돌이 소닉 4: 에피소드 I +WSNP = 바람돌이 소닉 4 에피소드 I +WSRE = 스페이스 트랙 +WSSP = 솔리테르 +WSTJ = 천사의 솔리테르 +WSUE = 슈탄토: 에볼루션 메이헴 +WSUJ = 슈탄토: 과거편 +WSUP = 슈탄토: 에볼루션 메이헴 +WSWE = 검과 병사 +WSWP = 검과 병사 +WSXE = 스턴트 카즈 +WSXP = 스턴트 카즈 +WSYE = 달팽이 배달부 +WSZE = 스니지즈 +WSZP = 스니지즈 +WT2E = 타겟 토스: 프로 백스 +WT3E = 토메나 산너 +WT3J = 토메나 산너 Wii +WT3P = 토메나 산너 +WT8J = 튕겨라! 블록 러쉬 +WTBJ = 환상적인 탬버린 +WTDJ = 토미카 드라이브 +WTEE = 탄성 소년의 이야기: 미션 1 +WTEP = 탄성 소년의 이야기: 미션 1 +WTFE = 비트 트립 플럭스 +WTFP = 비트 트립 플럭스 +WTHJ = 쓴다! 움직인다! 붙잡는다! 선생님 Wii +WTIE = 티키 타워즈 +WTKE = TV 쇼 킹 2 +WTKP = TV 쇼 킹 2 +WTME = 모험도 +WTMJ = 타카하시 명인의 모험도 Wii +WTMP = 모험도: 시작 +WTNE = 패밀리 테니스 +WTNJ = 오키라쿠 테니스 Wii +WTPE = 테트리스 파티 +WTPJ = 테트리스 파티 +WTPP = 테트리스 파티 +WTRE = 비트 트립 비트 +WTRJ = 비트 트립 비트 +WTRP = 비트 트립 비트 +WTTE = 토키토리 +WTTP = 토키 토리 +WTUE = 말똥구리 2 +WTWP = 페니모어 필모어: 서부인 +WTXE = 텍사스 홀덤 토너먼트 +WTXP = 텍사스 홀덤 토너먼트 +WU2P = 성공적인 수학 3학년 +WU3P = 성공적인 수학 4학년 +WU4P = 성공적인 수학 5학년 +WUBE = 우봉고 +WUBP = 우봉고 +WUFE = 드롭 존: 언더 파이어 +WUHE = 울트라 핸드와 함께하는 그릴 오프! +WUHJ = Wii에서 울트라 핸드 +WUIP = 성공적인 수학 2학년 +WUKJ = 우뇌 키즈: 부담없는 우뇌 트레이닝 +WUNE = 우노 +WUNJ = 우노 +WUNP = 우노 +WURE = 어반닉스 +WURP = 어반닉스 +WVBE = 비트 트립 보이드 +WVBJ = 비트 트립 보이드 +WVBP = 비트 트립 보이드 +WVCE = V.I.P. 카지노: 블랙잭 +WVDJ = 유아 교육 TV Wii: 아이우에·오 짱 +WVFE = 바비 캐럿 포에버 +WVFP = 바비 캐럿 포에버 +WVIE = 바이올린 파라다이스 +WVIP = 바이올린 파라다이스 +WVKE = 수중 전투 +WVKJ = 뱅 뱅 키즈 +WVKP = 수중 전투 +WVOE = 락 '엔' 롤 클라이머 +WVOJ = 락 '엔' 롤 클라이머 +WVOP = 락 '엔' 롤 클라이머 +WVQE = 뱀파이어 크리스탈즈 +WVQP = 뱀파이어 크리스탈즈 +WVSE = 신 Vs 인간 +WVSP = 신 Vs 인간 +WVUP = Mr. 범블비 레이싱 챔피언 +WW2P = 월리를 찾아라 2 +WW3P = 월리를 찾아라 3 +WWAE = 워먼 택틱스 +WWIP = 월리를 찾아라 1 +WWLP = Dr. 프랑켄슈타인의 유언 +WWRE = 익사이트바이크: 월드 랠리 +WWRJ = 익사이트바이크: 월드 레이스 +WWRP = 익사이트바이크: 월드 첼린지 +WWTE = 버거타임 월드 투어 +WWTP = 버거타임 월드 투어 +WWXE = 페이퍼 워즈: 캐논 포드 +WWXP = 페이퍼 워즈: 캐논 포드 +WX2P = 3 학년 영어 학습 성공 +WX3P = 4 학년 영어 학습 성공 +WX4P = 5 학년 영어 학습 성공 +WXBE = 벤 10 에일리언 포스: 더 라이즈 오브 헥스 +WXBP = 벤 10 에일리언 포스: 더 라이즈 오브 헥스 +WXIP = 2 학년 영어 학습 성공 +WXME = 크리스마스 퍼즐 +WXPE = 페인트 스플래시! +WXPP = 페인트 스플래시 +WXRE = 릴 낚시 바다 도전 +WXRP = 릴 낚시 바다 도전 +WYIE = 전뇌탈출: 1 장 +WYIP = 전뇌탈출: 1 장 +WYKJ = 읽고 듣는 놀이 +WYME = 요미 요미 쿠킹 잼 +WYMP = 요미 요미 쿠킹 잼 +WYSE = 야드 세일 숨겨진 보물들: 서니빌 +WYSP = 야드 세일 숨겨진 보물들: 서니빌 +WZAE = 좀비 공격 +WZBP = 크리켓 도전 +WZGE = 동물원 디스크 골프 +WZHE = 나의 동물원 +WZHJ = 애니멀 라이프: 동물 교감 생활 +WZHP = 나의 동물원 +WZIE = 루빅의 퍼즐 갤럭시 러쉬 +WZIP = 루빅의 퍼즐 갤럭시: 러쉬 +WZJJ = @ 심플 시리즈 볼륨 5: 유도 +WZMJ = 심플 Wii 시리즈 볼륨 3: 마작 +WZPE = 원더랜드 좀비 패닉 +WZPJ = 원더랜드 좀비 +WZPP = 원더랜드 좀비 패닉 +WZZE = 베어즈워스 매너 이야기: 수수께끼 페이지 +WZZJ = 쿠마나게: 피이나가 좋아하는 붉은 캔디 퍼즐 편 +WZZP = 베어즈워스 매너 이야기: 수수께끼 페이지 +XH2E = 동굴 이야기 체험판 +XH2P = 동굴 이야기 체험판 +XH3E = 프로봇 체험판 +XH4E = 맥스와 매직 메이커 체험판 +XH4P = 맥스와 매직 메이커 체험판 +XH5E = 그래도 아직 그것은 움직인다 체험판 +XH5P = 그래도 아직 그것은 움직인다 체험판 +XH6E = 로복스 체험판 +XH6P = 로복스 체험판 +XH7E = 리트 체험판 +XH7P = 리트 체험판 +XH8E = 미어캣 이끌기 체험판 +XH8P = 미어캣 이끌기 체험판 +XH9P = 컬러Z 체험판 +XHAE = 포켓몬 럼블 체험판 +XHAP = 포켓몬 럼블 체험판 +XHCE = 파이널 판타지 크리스탈 연대기: 암흑 군주로서의 나의 인생 체험판 +XHCJ = 파이널 판타지 크리스탈 연대기: 빛과 어둠의 공주님과 세계 정복의 탑 +XHCP = 파이널 판타지 크리스탈 연대기: 암흑 군주로서의 나의 인생 +XHDE = 닉스퀘스트: 킨드러드 스피리츠 체험판 +XHDP = 닉스퀘스트: 킨드러드 스피리츠 체험판 +XHEE = 비트 트립 비트 체험판 +XHEJ = 비트 트립 비트 체험판 +XHEP = 비트 트립 비트 체험판 +XHFE = 구의 세계 체험판 +XHFJ = 구의 혹성 체험판 +XHFP = 구의 세계 체험판 +XHHJ = 포켓몬 불가사의 던전 노리자! 빛의 모험단 체험판 +XHIE = 플루이디티 +XHIP = 하이드로벤처 체험판 +XHJE = 스루스페이스 체험판 +XHJJ = 질주해서 빠져나가는 아나토우스 체험판 +XHJP = 스루스페이스 체험판 +XHKE = 다이브: 메디아 제도의 비밀 체험판 +XHKP = 다이브: 메디아 제도의 비밀 체험판 +XHLE = 제트 로켓 체험판 +XHLP = 제트 로켓 체험판 +XHME = 균형의 예술 체험판 +XHMP = 균형의 예술 체험판 +XHNP = 크로노스 트윈즈 DX 체험판 +XHOP = 균형의 예술 체험판 +XHQE = 좀비 패닉 체험판 +XHQP = 좀비 패닉 체험판 +XHRE = 퍼리 레전드즈 체험판 +XHRP = 퍼리 레전드즈 체험판 +XHVE = 비트 트립 코어 체험판 +XHVP = 비트 트립 코어 체험판 +XHWE = 비트 트립 보이드 체험판 +XHWP = 비트 트립 보이드 체험판 +XHXE = 비트 트립 런너 체험판 +XHXP = 비트 트립 런너 체험판 +XHYE = 비트 트립 페이트 체험판 +XHYP = 비트 트립 페이트 체험판 +XHZE = 크로노스 트윈즈 DX 체험판 +XHZP = 크로노스 트윈즈 DX 체험판 +XI2E = 쿄토케이 체험판 +XI2P = 쿄토케이 체험판 +XI7E = 리이트 체험판 +XI8E = 잼 시티 체험판 +XI8P = 잼 시티 체험판 +XIAE = 릴트 라인 체험판 +XIAP = 릴트 라인 체험판 +XIBE = 피쉬 에엠 올 체험판 +XIBP = 피쉬 에엠 올 체험판 +XICE = 신 vs 인간 체험판 +XICP = 신 vs 인간 체험판 +XIDE = 레이서즈 아일랜드즈: 크레이지 레이서즈 체험판 +XIDP = 레이서즈 아일랜드즈: 크레이지 레이서즈 체험판 +XIEE = 칙 칙 붐 체험판 +XIEJ = 치킨 배틀! 칙 칙 붐 체험판 +XIEP = 칙 칙 붐 체험판 +XIGE = 어반닉스 체험판 +XIGP = 어반닉스 체험판 +XIHE = 글라디에이터 체험판 +XIHP = 글라디에이터 체험판 +XIJE = 패스트 레이싱 리그 체험판 +XIJP = 패스트 레이싱 리그 체험판 +XIKE = 몬스테카 코랄 체험판 +XIKP = 몬스테카 코랄 체험판 +XIMP = 후프월드: 바스켓 대난투 체험판 +XINE = 푸유스와 함께하는 학습 에피소드 1 체험판 +XINP = 푸유스와 함께하는 학습 에피소드 1 체험판 +XIOE = 푸유스와 함께하는 학습 에피소드 2 체험판 +XIOP = 푸유스와 함께하는 학습 에피소드 2 체험판 +XIPE = 푸유스와 함께하는 학습 에피소드 3 체험판 +XIPP = 푸유스와 함께하는 학습 에피소드 3 체험판 +XIQE = 다트 레이지 체험판 +XIRE = 통 토스 프로 체험판 +XISE = 비트 트립 플럭스 체험판 +XISP = 비트 트립 플럭스 체험판 +XITE = 패스트 드로우 체험판 +XITP = 패스트 드로우 체험판 +XIUE = 사커 바쉬 체험판 +XIUP = 사커 바쉬 체험판 +XIVE = 믹스 슈퍼스타 체험판 +XIVP = 믹스 슈퍼스타 체험판 +XIWE = 호라이즌 라이더즈 체험판 +XIZE = 3D 픽셀 레이싱 체험판 +XIZP = 3D 픽셀 레이싱 체험판 +XJDE = 모토히어로즈 체험판 +XJDP = 모토히어로즈 체험판 +XJEE = 아야와 빛의 큐브 체험판 +XJEP = 아야와 빛의 큐브 체험판 +XJFP = 아니마: 죄인의 방주 체험판 +XJGE = 흙의 정령들 체험판 +XJGP = 흙의 정령들 체험판 +XJHE = 페인트 스플래쉬 체험판 +XJHP = 페인트 스플래쉬 체험판 +XJIE = 2 패스트 4 흙의 정령들 체험판 +XJIP = 2 패스트 4 흙의 정령들 체험판 +XJJE = 뱀파이어 크리스탈즈 체험판 +XJJP = 뱀파이어 크리스탈즈 체험판 +XJSE = 카라오케 조이사운드 체험판 +XJSP = 카라오케 조이사운드 Wii 체험판 +FA2J = 엑시리온 +FA3J = 포메이션 Z +FA4J = 데빌 월드 +FA4P = 데빌 월드 +FA5J = 파이어 엠블렘: 암흑룡과 빛의 검 +FA6E = 동키 콩 Jr.의 산수 놀이 +FA6J = 동키 콩 Jr.의 산수 놀이 +FA6P = 동키 콩 Jr.의 산수 놀이 +FA7E = 요시 +FA7J = 요시의 알 +FA7P = 마리오 & 요시 +FA7T = 요시 +FA8E = 커비의 모험 +FA8F = 커비의 모험 +FA8J = 별의 커비: 꿈의 샘 이야기 +FA8P = 커비의 모험 +FA8T = 별의 커비: 꿈의 샘 이야기 +FA9E = 젤다 II: 링크의 모험 +FA9J = 젤다의 전설 2: 링크의 모험 +FA9P = 젤다 II: 링크의 모험 +FAAE = 동키 콩 +FAAJ = 동키 콩 +FAAP = 동키 콩 +FAAT = 동키 콩 +FABE = 동키 콩 Jr. +FABJ = 동키 콩 Jr. +FABP = 동키 콩 Jr. +FACE = 핀볼 +FACJ = 핀볼 +FACP = 핀볼 +FADJ = 오목 +FAFE = 마리오 브라더스 +FAFJ = 마리오 브라더스 +FAFP = 마리오 브라더스 +FAFQ = 마리오 브라더스 +FAGE = 슈퍼 마리오 브라더스 +FAGJ = 슈퍼 마리오 브라더스 +FAGP = 슈퍼 마리오 브라더스 +FAGQ = 슈퍼 마리오 브라더스 +FAHE = 테니스 +FAHJ = 테니스 +FAHP = 테니스 +FAIE = 축구 +FAIJ = 축구 +FAIP = 축구 +FAJE = 아이스 하키 +FAJJ = 아이스 하키 +FAJP = 아이스 하키 +FAKE = 젤다의 전설 +FAKJ = 젤다의 전설 +FAKP = 젤다의 전설 +FAKT = 젤다의 전설 +FALE = 야구 +FALJ = 야구 +FALP = 야구 +FAME = 와리오의 숲 +FAMJ = 와리오의 숲 +FAMP = 와리오의 숲 +FANE = 도시의 챔피언 +FANJ = 도시의 챔피언 +FANP = 도시의 챔피언 +FANT = 도시의 챔피언 +FAOE = 솔로몬의 열쇠 +FAOJ = 솔로몬의 열쇠 +FAOP = 솔로몬의 열쇠 +FAPE = NES 오픈 토너먼트 골프 +FAPJ = 마리오 오픈 골프 +FAPP = NES 오픈 토너먼트 골프 +FAPT = NES 오픈 토너먼트 골프 +FAQJ = 닌자 자자마루군 +FAQL = 닌자 자자마루군 +FAQN = 닌자 자자마루군 +FARE = 그라디우스 +FARJ = 그라디우스 +FARP = 그라디우스 +FASE = 제비우스 +FASJ = 제비우스 +FASP = 제비우스 +FAST = 제비우스 +FATE = 그림자의 전설 +FATJ = 그림자의 전설 +FAVE = 테크모 보울 +FAVJ = 테크모 보울 +FAWE = 엘리베이터 액션 +FAWJ = 엘리베이터 액션 +FAXE = 팩맨 +FAXJ = 팩맨 +FAXP = 팩맨 +FAXT = 팩맨 +FAYJ = 잇키 +FAZJ = 필드 컴뱃 +FAZQ = 다운타운 열혈행진곡: 나아가라 대운동회 +FB2J = 슈퍼 마리오 브라더스 2 +FB2L = 슈퍼 마리오 브라더스: 잃어버린 레벨들 +FB2N = 슈퍼 마리오 브라더스: 잃어버린 레벨들 +FB3J = 왈큐레의 모험: 시간의 열쇠 전설 +FB4E = 루나 당구 +FB4J = 루나 볼 +FB4P = 루나 당구 +FB5E = 자낙 +FB5J = 자낙 +FB6J = 최전선 +FB7J = 너츠 & 밀크 +FB8J = 도전자 +FB9J = 푸얀 +FBAJ = 스매시 탁구 +FBAL = 스매시 탁구 +FBBE = 매치 라이더 +FBBJ = 매치 라이더 +FBBP = 매치 라이더 +FBCE = 익사이트 바이크 +FBCJ = 익사이트 바이크 +FBCP = 익사이트 바이크 +FBDE = 키드 이카루스 +FBDJ = 빛의 신화: 파르테나의 거울 +FBDP = 키드 이카루스 +FBEE = 아이스 클라이머 +FBEJ = 아이스 클라이머 +FBEP = 아이스 클라이머 +FBHE = 캐슬베니아 +FBHJ = 악마성 드라큘라 +FBHP = 캐슬베니아 +FBIE = 펀치 아웃!! +FBIJ = 펀치 아웃!! +FBIP = 펀치 아웃!! +FBJE = 마이트 봄 잭 +FBJJ = 마이트 봄 잭 +FBJP = 마이트 봄 잭 +FBKE = 돌연변이 닌자 거북 +FBKJ = 돌연변이 닌자 거북 +FBKP = 돌연변이 닌자 거북 +FBLE = 로드 런너 +FBLJ = 로드 런너 +FBLM = 로드 런너 +FBNE = 닌자 가이덴 +FBNJ = 닌자 용검전 +FBNM = 닌자 가이덴 +FBOJ = 그라디우스 II +FBQJ = 드루아가의 탑 +FBRE = 갤러그 +FBRJ = 갤러그 +FBRP = 갤러그 +FBRT = 갤러그 +FBSE = 미론의 비밀 성 +FBSJ = 미궁조국: 미론의 대모험 +FBSM = 미론의 비밀 성 +FBUE = 로로의 모험 +FBUJ = 로로의 모험 +FBUP = 로로의 모험 +FBUT = 로로의 모험 +FBVJ = 츠파리 대스모 +FBWJ = 조이 메카 파이트 +FBWQ = 조이 메카 파이트 +FBXJ = 패미컴 대전 +FBYE = 슈퍼 마리오 브라더스 2 +FBYJ = 슈퍼 마리오 USA +FBYP = 슈퍼 마리오 브라더스 2 +FBYQ = 슈퍼 마리오 USA +FBZE = 메트로이드 +FBZJ = 메트로이드 +FBZP = 메트로이드 +FC2J = 반숙 영웅 +FC3E = 버블 보글 +FC3J = 버블 보글 +FC3P = 버블 보글 +FC3T = 버블 보글 +FC4J = 체크'엔 팝 +FC5J = 힘내라 고에몬! 꼭두각시 여행길 +FC6E = 스타트로픽스 +FC6J = 스타트로픽스 +FC6P = 스타트로픽스 +FC7E = NES 플레이 액션 풋볼 +FC7J = NES 플레이 액션 풋볼 +FC8E = 캐슬베니아 II: 사이몬의 퀘스트 +FC8J = 드라큘라 II: 저주의 봉인 +FC8P = 캐슬베니아 II: 사이몬의 퀘스트 +FC9J = 메탈 슬레이더 글로리 +FCAE = 스타 솔져 +FCAJ = 스타 솔져 +FCEJ = 에스퍼 드림 +FCFJ = 이얼 쿵푸 +FCGJ = 트윈비 +FCHJ = 플로피 +FCIJ = 고기동전두 메카볼가드 2 +FCJJ = SD 건담 월드: 가챠폰 전사 2 - 캡슐 전기 +FCNJ = 남극대탐험 +FCNQ = 남극 탐험 +FCOJ = 배틀 시티 +FCPE = 벌룬 파이트 +FCPJ = 벌룬 파이트 +FCPP = 벌룬 파이트 +FCQE = 닌자 외전 II: 혼돈의 암흑검 +FCQJ = 닌자 외전 II +FCRE = 모험도 +FCRJ = 타카하시 명인의 모험도 +FCRP = 모험도 +FCRT = 허드슨의 모험도 +FCSE = 슈퍼 C +FCSJ = 슈퍼 혼두라 +FCSP = 프로보텍터 II: 악의 세력의 귀환 +FCTE = 메가맨 +FCTJ = 록맨 +FCTP = 메가맨 +FCUE = 배구 +FCUJ = 배구 +FCUP = 배구 +FCVE = 레킹 크루 +FCVJ = 레킹 크루 +FCVP = 레킹 크루 +FCWE = 슈퍼 마리오 브라더스 3 +FCWJ = 슈퍼 마리오 브라더스 3 +FCWP = 슈퍼 마리오 브라더스 3 +FCWQ = 슈퍼 마리오 브라더스 3 +FCYE = 요시의 쿠키 +FCYJ = 요시의 쿠키 +FCYP = 요시의 쿠키 +FCYT = 요시의 쿠키 +FCZE = 왕의 기사 +FCZJ = 왕의 기사 +FD2E = 더블 드래곤 +FD2J = 더블 드래곤 +FD2P = 더블 드래곤 +FD3J = 열혈 고교 피구부 축구편 +FD3Q = 열혈 고교 피구부 축구편 +FD6E = 로로의 모험 2 +FD6P = 로로의 모험 2 +FD7E = 메가맨 3 +FD7J = 록맨 3: Dr. 와일리의 최후!? +FD7P = 메가맨 3 +FDAE = 스펠런커 +FDAJ = 스펠런커 +FDAM = 스펠런커 +FDBJ = 패미컴 옛날 이야기: 신 귀신의 섬 - 후편 +FDCJ = 스타 러스터 +FDEJ = 마피 +FDFE = 만루 +FDFJ = 불타라!! 프로 야구 +FDGE = 마계촌 +FDGJ = 마계촌 +FDGP = 마계촌 +FDIJ = 보코크카 대전 +FDLE = 닌자 외전 III: 최후의 고대 선박 +FDLJ = 닌자 외전 III: 황천의 방주 +FDNE = 메가맨 2 +FDNJ = 록맨 2 +FDNP = 메가맨 2 +FDOE = 작전명 늑대 +FDOJ = 작전명 늑대 +FDOP = 작전명 늑대 +FDPE = 강철의 블래이드 +FDPP = 강철의 블래이드 +FDQE = 더블 드리블 +FDQP = 더블 드리블 +FDRP = 스케이트냐 죽음이냐 +FDSJ = 패미컴 탐정 클럽: 사라진 후계자 (후편) +FDTE = 열혈경파 +FDTJ = 열혈경파 +FDUE = 열혈고교 돗지볼부 +FDUJ = 열혈고교 돗지볼부 +FDVE = 다운타운 - 열혈물어 +FDVJ = 다운타운 - 열혈물어 +FDVP = 다운타운 - 열혈물어 +FDVQ = 다운타운 - 열혈물어 +FDWJ = 다운타운 스페셜 - 열혈 시대극: 쿠니오군의 시대극이야 전원 집합! +FDXJ = 패미컴 탐정 클럽 파트 II: 뒷 편에 선 소녀 (후편) +FDYJ = 파이어 엠블렘 외전 +FDZJ = 다운타운 열혈 행진곡 - 그대로 가라 대운동회 +FDZQ = 다운타운 열혈 행진곡 - 그대로 가라 대운동회 +FE5J = 울화통구슬 던지는 칸타로우의 동해도오십삼차 +FE6J = 닌자군: 마성의 모험 +FE7J = 닌자군: 아수라의 장 +FE8J = 타케시의 도전장 +FE9J = 가라 가라! 열혈 하키부: 미끄러지고 넘어지고 대난투 +FECE = 스카이 키드 +FECJ = 스카이 키드 +FEDJ = 디그 더그 +FEDL = 디그 더그 +FEDN = 디그 더그 +FEEJ = 탐정 진구지 사부로: 신주쿠 중앙공원 살인사건 +FEFJ = 탐정 진구지 사부로 2: 요코하마 항 연속 살인사건 +FEGJ = 탐정 진구지 시부로: 위험한 2 인 +FEHJ = 탐정 진구지 사부로: 시간 가는대로... +FEIE = 시티 커넥션 +FEIJ = 시티 커넥션 +FEIP = 시티 커넥션 +FEJJ = 수수께끼의 무라사메 성 +FELJ = 트랜스포머즈: 호송 미스테리 +FEMJ = 바이오 미라클 나는 우파 +FEML = 바이오 미라클 나는 우파 +FEMN = 바이오 미라클 나는 우파 +FENE = 라이프 포스 +FENJ = 사라만다 +FEOJ = 조이드즈: 묵시록 +FEPJ = 월풍마전 +FEQE = 캐슬베니아 III: 드라큘라의 저주 +FEQJ = 악마성 전설 +FEQP = 캐슬베니아 III: 드라큘라의 저주 +FERE = 조다의 복수: 스타트로픽스 2 +FERJ = 조다의 복수 +FERM = 스타트로픽스 II: 조다의 복수 +FERP = 조다의 복수: 스타트로픽스 II +FESE = 빙글 빙글 랜드 +FESJ = 빙글 빙글 랜드 +FESP = 빙글 빙글 랜드 +FEUE = 동키 콩 3 +FEUJ = 동키 콩 3 +FEUP = 동키 콩 3 +FEVJ = 아틀란티스의 수수께끼 +FEWJ = 드래곤 버스터 +FEXJ = 와간 랜드 +FF2J = 스고로 퀘스트: 주사위의 전사들 +FF4E = 버거타임 +FF4J = 버거타임 +FF5E = 더블 드래곤: 복수 +FF5J = 더블 드래곤 2: 복수 +FF5P = 더블 드래곤 II: 복수 +FF6J = 힘내라 고에몽 2 +FF7J = 힘내라 고에몽 외전: 사라진 황금 담뱃대 +FFAE = 파이널 판타지 +FFAJ = 파이널 판타지 +FFAM = 파이널 판타지 +FFBJ = 파이널 판타지 II +FFDE = 깜짝 열혈 신기록! 머나먼 금메달 +FFDJ = 깜짝 열혈 신기록! 머나먼 금메달 +FFEE = 불가사의한 브로비: 블로볼로니아의 문제 +FFEP = 불가사의한 브로비: 블로볼로니아의 문제 +FFFJ = 파이널 판타지 III +FFGJ = SD 건담 월드: 가챠폰 전사 - 스크램블 워즈 +FFJJ = 메탈 맥스 +FFKJ = 챔피언쉽 로드 런너 +FFLE = 샐러드 왕국의 토마토 공주 +FFLJ = 샐러드 왕국의 토마토 공주 +FFME = 블래스터 마스터 +FFMJ = 초혹성전기: 메타파이트 +FFMP = 블래스터 마스터 +FFNE = 메가맨 4 +FFNJ = 록맨 4: 새로운 야망!! +FFNP = 메가맨 4 +FFOJ = 가자 트윈비: 시나몬 박사를 구해라! +FFPB = 유포리아: 더 사가 +FFPJ = 푸루 푸루 파크 +FFPP = 유포리아: 더 사가 +FFQE = 닌자의 그림자 +FFQM = 닌자의 그림자 +FFRE = 팩서너두 +FFRJ = 팩서너두 +FFRP = 팩서너두 +FFTJ = 바이너리 랜드 +FFUE = 모험도 2 +FFUJ = 타카하시 명인의 모험도 II +FFUP = 모험도 2 +FFVM = S.C.A.T.: 특수 인공두뇌학 공격 팀 +FFVP = S.C.A.T.: 특수 인공두뇌학 공격 팀 +FFWP = 동키 콩: 오리지널 에디션 +FFXJ = 25 주년 슈퍼 마리오 브라더스 +FFXP = 슈퍼 마리오 브라더스: 25 주년 한정판 +FFYE = 메가맨 5 +FFYJ = 록맨 5: 블루스의 함정!? +FFYP = 메가맨 5 +FFZJ = 세크로스 +FFZY = 혼두라 +FJOR = 쿵푸 +FMCA = 구니스 +JA2J = 진 여신전생 +JA3J = 카마이타치의 밤 +JA4E = 초마계촌 +JA4J = 초마계촌 +JA5J = 헤라클레스의 영광 III: 신들의 침묵 +JA6E = 좀비들이 내 이웃들을 먹었다 +JA6J = 좀비들이 내 이웃들을 먹었다 +JA6P = 좀비들 +JA7D = 액트레이저 +JA7E = 액트레이저 +JA7F = 액트레이저 +JA7J = 액트레이저 +JA7P = 액트레이저 +JA8E = 파이널 파이트 +JA8J = 파이널 파이트 +JA8P = 파이널 파이트 +JAAE = 슈퍼 마리오 월드 +JAAJ = 슈퍼 마리오 월드 +JAAP = 슈퍼 마리오 월드 +JAAQ = 슈퍼 마리오 월드 +JAAT = 슈퍼 마리오 월드 +JABJ = 마리오의 슈퍼 피크로스 +JABL = 마리오의 슈퍼 피크로스 +JACE = 에프-제로 +JACJ = 에프-제로 +JACP = 에프-제로 +JACT = 에프-제로 +JADD = 젤다의 전설: 신들의 트라이포스 +JADE = 젤다의 전설: 신들의 트라이포스 +JADF = 젤다의 전설: 신들의 트라이포스 +JADJ = 젤다의 전설: 신들의 트라이포스 +JADP = 젤다의 전설: 신들의 트라이포스 +JADT = 젤다의 전설: 신들의 트라이포스 +JAEE = 동키 콩 컨트리 +JAEJ = 슈퍼 동키 콩 +JAEP = 동키 콩 컨트리 +JAET = 동키 콩 컨트리 +JAFD = 심시티 +JAFE = 심시티 +JAFF = 심시티 +JAFJ = 심시티 +JAFP = 심시티 +JAGJ = 파이어 엠블렘: 문장의 비밀 +JAHE = 알타입 III: 더 서드 라이트닝 +JAHJ = 알타입 III: 더 서드 라이트닝 +JAHP = 알타입 III: 더 서드 라이트닝 +JAHQ = R-Type III: The Third Lightning +JAIE = 슈퍼 케슬베니아 IV +JAIJ = 악마성 드라큘라 +JAIP = 슈퍼 캐슬베니아 IV +JAJE = 스트리트 파이터 II: 더 월드 워리어 +JAJJ = 스트리트 파이터 II +JAJP = 스트리트 파이터 II: 더 월드 워리어 +JALE = 콘트라 3: 에일리언 워즈 +JALJ = 혼두라 스피리츠 +JALP = 슈퍼 프로보텍터: 에일리언 레벨즈 +JALT = 콘트라 3: 에일리언 워즈 +JAME = 그라디우스 III +JAMJ = 그라디우스 III +JAMM = 그라디우스 III +JAMT = 그라디우스 III +JAPJ = 파이어 엠블렘: 성전의 계보 +JAUJ = 패미컴 문고: 시작의 숲 +JAVE = 슈퍼 메트로이드 +JAVJ = 슈퍼 메트로이드 +JAVP = 슈퍼 메트로이드 +JAVT = 슈퍼 메트로이드 +JAWE = 삼국지 IV: 적벽대전 +JAWJ = 삼국지 IV: 적벽대전 +JAZD = 힘내라 고에몽: 유키 공주 구출 두루마리 +JAZE = 힘내라 고에몽: 유키 공주 구출 두루마리 +JAZJ = 힘내라 고에몽: 유키 공주 구출 두루마리 +JAZP = 힘내라 고에몽: 유키 공주 구출 두루마리 +JB3D = 하베스트 문 +JB3E = 하베스트 문 +JB3J = 하베스트 문 +JB3P = 하베스트 문 +JB5J = 슈퍼 굿슨 오요요 +JB6J = 트레져 헌터 G +JB7J = 프론트 미션: 건 하자드 +JB9J = 학교에서 있었던 무서운 이야기 +JBAE = 메탈 마린즈 +JBAJ = 밀리티아 +JBBE = 슈퍼 스트리트 파이터 II: 새로운 도전자들 +JBBJ = 슈퍼 스트리트 파이터 II: 새로운 도전자들 +JBBP = 슈퍼 스트리트 파이터 II: 새로운 도전자들 +JBCE = 커비의 드림 코스 +JBCJ = 커비 볼 +JBCP = 커비의 드림 코스 +JBCT = 커비의 드림 코스 +JBDD = 동키 콩 컨트리 2: 디디의 콩 퀘스트 +JBDE = 동키 콩 컨트리 2: 디디의 콩 퀘스트 +JBDJ = 슈퍼 동키 콩 2: 딕시 & 디디 +JBDP = 동키 콩 컨트리 2: 디디의 콩 퀘스트 +JBDT = 동키 콩 컨트리 2: 디디의 콩 퀘스트 +JBEJ = 매지컬 드롭 +JBFJ = 제절초 +JBGJ = 이상한 던젼: 풍래의 시렌 +JBHJ = 헤라클레스의 영광 IV: 신들의 선물 +JBIE = 스트리트 파이터 II 터보: 하이퍼 파이팅 +JBIJ = 스트리트 파이터 II 터보: 하이퍼 파이팅 +JBIP = 스트리트 파이터 II 터보: 하이퍼 파이팅 +JBKE = 브레스 오브 파이어 II: 사명의 아이 +JBKJ = 브레스 오브 파이어 II: 사명의 아이 +JBKP = 브레스 오브 파이어 II: 사명의 아이 +JBLE = 팩 어택 +JBLJ = 코스모 갱 더 퍼즐 +JBLP = 팩 어택 +JBNE = 다리우스 트윈 +JBNJ = 다리우스 트윈 +JBOJ = 패널로 퐁 +JBOQ = 패널로 퐁 +JBPE = 동키 콩 컨트리 3: 딕시의 이중 문제 +JBPJ = 슈퍼 동키 콩 3: 수수께끼의 크레미스 섬 +JBPP = 동키 콩 컨트리 3: 딕시의 이중 문제 +JBQE = 카비의 아발란체 +JBQJ = 슈~퍼~ 뿌요뿌요 +JBQP = 커비의 고스트 트랩 +JBRE = 베가스 스테이크즈 +JBRJ = 베가스 스테이크즈 +JBRP = 베가스 스테이크즈 +JBSE = 엑슬레이 +JBSJ = 엑슬레이 +JBSP = 엑슬레이 +JBTE = 슈퍼 터리칸 +JBTJ = 슈퍼 터리칸 +JBTP = 슈퍼 터리칸 +JBUE = 슈퍼 터리칸 2 +JBUJ = 슈퍼 터리칸 2 +JBVJ = 데어 랑그랏사 +JBWE = 싸이버네이터 +JBWJ = 중장기병 발켄 +JBWP = 싸이버네이터 +JBWT = 싸이버네이터 +JBYE = 슈퍼 알타입 +JBYJ = 슈퍼 알타입 +JBYP = 슈퍼 알타입 +JBYT = 슈퍼 알-타입 +JC2J = 태합입지전 +JC3J = 바하무트 라군 +JC4E = 인디아니 존스 위대한 모험 +JC4J = 인디아니 존스 위대한 모험 +JC4P = 인디아니 존스 위대한 모험 +JC5J = 로맨싱 사가 +JC6J = 로맨싱 사가 2 +JC7E = 컴뱃트라이브즈 +JC7J = 컴뱃트라이브즈 +JC8E = 파이널 판타지 II +JC8J = 파이널 판타지 IV +JC8M = 파이널 판타지 II +JC8P = 파이널 판타지 2 +JC9J = 파이널 판타지 V +JCAJ = 도-레-미 판타지: 리론의 두근두근 대모험 +JCAL = 도-레-미 판타지: 리론의 두근두근 대모험 +JCAN = 도-레-미 판타지: 리론의 두근두근 대모험 +JCBE = 슈퍼 마리오 RPG: 일곱 별들의 전설 +JCBJ = 슈퍼 마리오 RPG +JCBM = 슈퍼 마리오 RPG: 일곱 별들의 전설 +JCCE = 커비 슈퍼 스타 +JCCJ = 별의 커비 슈퍼 디럭스 +JCCP = 커비의 펀 팩 +JCDE = 커비의 드림 랜드 3 +JCDJ = 별의 커비 3 +JCDM = 커비의 드림 랜드 3 +JCEJ = 파이어 엠블렘: 트라키아 776 +JCGJ = 힘내라 고에몽 2: 기천열 장군 마기네스 +JCHJ = 힘내라 고에몽 3 +JCIJ = 패미컴 탐정 클럽 파트 II: 뒷 편에 선 소녀 +JCJE = 슈퍼 펀치 아웃!! +JCJJ = 슈퍼 펀치 아웃!! +JCJP = 슈퍼 펀치 아웃!! +JCKE = 스페이스 인베이더스: 오리지널 게임 +JCKJ = 스페이스 인베이더스: 오리지널 게임 +JCKP = 스페이스 인베이더스: 오리지널 게임 +JCLD = 성검전설 +JCLE = 성검전설 +JCLF = 성검전설 +JCLJ = 성검전설 2 +JCLP = 성검전설 +JCMJ = 슈퍼 와간 랜드 +JCNE = 페르시아 왕자 +JCNJ = 페르시아 왕자 +JCNP = 페르시아 왕자 +JCTE = 오우거 배틀: 검은 여왕의 진군 +JCTJ = 전설의 오우거 배틀: 검은 여왕의 진군 +JCTM = 오우거 배틀: 검은 여왕의 진군 +JCUJ = 택틱스 오우거: 함께 손을 맞잡자 +JCVE = 파일럿윙스 +JCVJ = 파일럿윙스 +JCVP = 파일럿윙스 +JCWE = 슈퍼 마리오 카트 +JCWJ = 슈퍼 마리오 카트 +JCWP = 슈퍼 마리오 카트 +JCXE = 노부나가의 야망 +JCXJ = 슈퍼 노부가나의 야망: 전국판 +JCYE = 대항해시대 +JCYJ = 대항해시대 II +JCZE = 징기스칸 II: 회색 늑대의 무리 +JCZJ = 슈퍼 푸른 늑대와 흰 암사슴: 원조비사 +JD2J = 미소녀 작사 수치-파이 +JD3E = 슈퍼 지구방위군 +JD3J = 슈퍼 지구방위군 +JD3P = 슈퍼 지구방위군 +JD4E = 라이벌 터프! +JD4J = 러싱 비트 +JD4P = 라이벌 터프! +JD5E = 브롤 브라더즈 +JD5J = 러싱 비트 란: 복제 도시 +JD5P = 브롤 브라더즈 +JD6E = 이그니션 팩터 +JD6J = 파이어 파이팅 +JD6M = 이그니션 팩터 +JD7E = 슈퍼 모험도 +JD7J = 타카하시 명인의 대모험도 +JD7P = 슈퍼 모험도 +JD8E = 슈퍼 모험도 II +JD8J = 타카하시 명인의 대모험도 II +JD8P = 슈퍼 모험도 II +JD9E = 슈퍼 봉크 +JD9J = 초원인 +JD9M = 슈퍼 봉크 +JDAE = 파이널 판타지 III +JDAJ = 파이널 판타지 VI +JDAM = 파이널 판타지 III +JDAP = 파이널 판타지 III +JDBE = 슈퍼 봄버맨 3 +JDCE = 스트리트 파이터 알파 2 +JDCJ = 스트리트 파이터 2 알파 +JDCP = 스트리트 파이터 알파 2 +JDDE = 파이널 파이트 2 +JDDJ = 파이널 파이트 2 +JDDP = 파이널 파이트 2 +JDEE = 파이널 파이트 3 +JDEJ = 파이널 파이트 터프 +JDEP = 파이널 파이트 3 +JDFJ = 스테 팔고군 +JDHJ = 슈퍼 패미컴 대전 +JDIE = 슈퍼 스타 워즈 +JDIJ = 슈퍼 스타 워즈 +JDIP = 슈퍼 스타 워즈 +JDJE = 슈퍼 스타 워즈: 제국의 역습 +JDJJ = 슈퍼 스타 워즈: 제국의 역습 +JDJP = 슈퍼 스타 워즈: 제국의 역습 +JDKJ = 메탈 맥스 2 +JDLE = 슈퍼 스타 워즈: 제다이의 귀환 +JDLJ = 슈퍼 스타 워즈: 제다이의 귀환 +JDLP = 슈퍼 스타 워즈: 제다이의 귀환 +JDMJ = 커비의 반짝반짝 키즈 +JDNE = 구울 패트롤 +JDNJ = 구울 패트롤 +JDNP = 구울 패트롤 +JDOJ = 헤이세이 신・귀신의 섬 전편 +JDPJ = 헤이세이 신・귀신의 섬 후편 +JDQJ = 로맨싱 사가 3 +JDRJ = 클락 타워 +JDSJ = 진 여신 전생 II +JDTJ = 진 여신 전생 이프... +JDUJ = 알버트 오딧세이 +JDVE = 와일드 건즈 +JDVJ = 와일드 건즈 +JDVP = 와일드 건즈 +JDWE = 에어로 더 아크로뱃 +JDWJ = 에어로 더 아크로뱃 +JDWP = 에어로 더 아크로뱃 +JDXE = 에어로 더 아크로뱃 2 +JDXJ = 에어로 더 아크로뱃 2 +JDXP = 에어로 더 아크로뱃 2 +JDYJ = 루드라의 비보 +JDZD = 미스틱 퀘스트 레전드 +JDZE = 파이널 판타지 미스틱 퀘스트 +JDZF = 미스틱 퀘스트 레전드 +JDZJ = 파이널 판타지 USA: 미스틱 퀘스트 +JDZP = 미스틱 퀘스트 레전드 +JEAE = 나츠미 챔피언쉽 레슬링 +JEAJ = 나츠미 챔피언쉽 레슬링 +JEAM = 나츠미 챔피언쉽 레슬링 +JEAP = 나츠미 챔피언쉽 레슬링 +JEBE = 메가맨 X +JEBJ = 록맨 X +JEBP = 메가맨 X +JECE = 크로노 트리거 +JECJ = 크로노 트리거 +JECM = 크로노 트리거 +JECP = 크로노 트리거 +JEDJ = 쿠니오군의 닷지볼이야 전원집합! +JEEJ = 마신 전생 +JEFJ = 마신 전생 II: 스파이럴 네메시스 +JEGJ = 호열사일족 +JEHE = 메가맨 X2 +JEHJ = 록맨 X2 +JEHP = 메가맨 X2 +JEIJ = 메탈 맥스 리턴즈 +JEJJ = 그믐 - 츠키코모리 +JEKJ = 구약 여신전생: 여신전생 I・II +NA3E = 봄버맨 히어로 +NA3J = 봄버맨 히어로 +NA3P = 봄버맨 히어로 +NAAE = 슈퍼 마리오 64 +NAAJ = 슈퍼 마리오 64 +NAAP = 슈퍼 마리오 64 +NABE = 마리오 카트 64 +NABJ = 마리오 카트 64 +NABP = 마리오 카트 64 +NABT = 마리오 카트 64 +NACE = 젤다의 전설: 시간의 오카리나 +NACJ = 젤다의 전설: 시간의 오카리나 +NACP = 젤다의 전설: 시간의 오카리나 +NADE = 스타 폭스 64 +NADJ = 스타 폭스 64 +NADP = 스타 폭스 64 +NADT = 스타 폭스 64 +NAEE = 페이퍼 마리오 +NAEJ = 마리오 이야기 +NAEP = 페이퍼 마리오 +NAFE = 에프-제로 X +NAFJ = 에프-제로 X +NAFP = 에프-제로 X +NAGJ = 에어로게이지 +NAHE = 요시의 이야기 +NAHJ = 요시의 이야기 +NAHP = 요시의 이야기 +NAIE = 웨이브 레이스 64 +NAIJ = 웨이브 레이스 64: 카와사키 제트 스키 +NAIP = 웨이브 레이스 64 +NAJ8 = 젤다의 전설: 시간의 오카리나 (스페인어 번역) +NAJJ = 죄와 벌 +NAJL = 죄와 벌 +NAJN = 죄와 벌 +NAKD = 포켓몬 스냅 +NAKE = 포켓몬 스냅 +NAKF = 포켓몬 스냅 +NAKI = 포켓몬 스냅 +NAKJ = 포켓몬 스냅 +NAKP = 포켓몬 스냅 +NAKS = 포켓몬 스냅 +NALE = 슈퍼 대단투 브라더스 +NALJ = 닌텐도 올 스타 대난투 스매쉬 브라더스 +NALP = 슈퍼 대난투 브라더스 +NAME = 별의 커비 64: 크리스탈 조각들 +NAMJ = 별의 커비 64 +NAMP = 별의 커비 64: 크리스탈 조각들 +NAMT = 별의 커비 64: 크리스탈 조각들 +NAND = 포켓몬 퍼즐 리그 +NANE = 포켓몬 퍼즐 리그 +NANF = 포켓몬 퍼즐 리그 +NANJ = 포켓몬 퍼즐 리그 +NANP = 포켓몬 퍼즐 리그 +NAOE = 1080° 스노우보딩 +NAOJ = 1080° 스노우보딩 +NAOP = 1080° 스노우보딩 +NAOT = 1080° 스노우보딩 +NAPJ = 커스텀 로보 V2 +NARE = 젤다의 전설: 뮤주라의 가면 +NARJ = 젤다의 전설: 뮤주라의 가면 +NARP = 젤다의 전설: 뮤주라의 가면 +NASE = 크루즌 USA +NASJ = 크루즌 USA +NASP = 크루즌 USA +NATE = 마리오 테니스 +NATJ = 마리오 테니스 64 +NATP = 마리오 테니스 +NAUE = 마리오 골프 +NAUJ = 마리오 골프 64 +NAUP = 마리오 골프 +NAYE = 오우거 배틀 64: 경건한 사람 +NAYJ = 오우거 배틀 64: 경건한 사람 +NAYM = 오우거 배틀 64: 경건한 사람 +NAZE = 마리오 파티 2 +NAZJ = 마리오 파티 2 +NAZP = 마리오 파티 2 +NEEA = 젤다의 전설: 시간의 오카리나 마스터 퀘스트 +NTLC = 슈퍼 마리오 64 멀티플레이어 +NZXM = 슈퍼 마리오 64 멀티플레이어 +LAAJ = 북두의 권 +LABE = 판타지 존 +LABJ = 판타지 존 +LABP = 판타지 존 +LACE = 원더 보이 +LACJ = 슈퍼 원더 보이 +LACP = 원더 보이 +LADE = 판타지 스타 +LADJ = 판타지 스타 +LADP = 판타지 스타 +LAEE = 미라클 월드 알렉스 키드 +LAEJ = 미라클 월드 알렉스 키드 +LAEP = 미라클 월드 알렉스 키드 +LAFJ = 아수라 +LAFN = 시크릿 코만도 +LAFP = 시크릿 커맨드 +LAGE = 바람돌이 소닉 +LAGJ = 바람돌이 소닉 +LAGP = 바람돌이 소닉 +LAHE = 스페이스 해리어 +LAHJ = 스페이스 해리어 +LAHP = 스페이스 해리어 +LAIE = 엔듀로 레이서 +LAIJ = 엔듀로 레이서 +LAIP = 엔듀로 레이서 +LAJE = 바람돌이 소닉 2 +LAJJ = 바람돌이 소닉 2 +LAJP = 바람돌이 소닉 2 +LAKE = 몬스터 랜드 원더 보이 +LAKJ = 슈퍼 원더 보이: 몬스터 월드 +LAKP = 몬스터 랜드 원더 보이 +LALE = 판타지 존 II: 오파오파의 눈물 +LALJ = 판타지 존 II: 오파오파의 눈물 +LALP = 판타지 존 II: 오파오파의 눈물 +LAME = 소닉 카오스 +LAMJ = 소닉 카오스 +LAMP = 소닉 카오스 +LANE = 알렉스 키드: 잃어버린 별 +LANJ = 알렉스 키드: 잃어버린 별 +LANP = 알렉스 키드: 잃어버린 별 +LAOE = 알타입 +LAOJ = 알타입 +LAOP = 알타입 +LAPE = 원더 보이 III: 용의 함정 +LAPP = 원더 보이 III: 용의 함정 +LAQE = 알렉스 키드: 시노비 월드 +LAQP = 알렉스 키드: 시노비 월드 +MA2J = 다이나 브라더즈 +MA3E = 뿌요 뿌요 2 +MA3J = 뿌요 뿌요 썬 +MA3L = 뿌요 뿌요 2 +MA4J = 바하무트 전기 +MA5J = 영웅을 빌려줘 +MA6E = 스트리츠 오브 레이지 2 +MA6J = 베어 너클 II: 사투로의 진혼가 +MA6P = 스트리츠 오브 레이지 2 +MA7E = 샤이닝 인 더 다크니스 +MA7J = 샤이닝 앤 더 다크니스 +MA7P = 샤이닝 인 더 다크니스 +MA8E = 에코: 시간의 조수 +MA8J = 에코 더 돌핀 2 +MA8P = 에코: 시간의 조수 +MA9J = 하이브리드 프론트 +MAAE = 수왕기 +MAAJ = 수왕기 +MAAP = 수왕기 +MABE = 칼럼즈 +MABJ = 칼럼즈 +MABP = 칼럼즈 +MACE = 닥터 로보트닉의 민 빈 머신 +MACJ = 뿌요 뿌요 +MACP = 닥터 로보트닉의 민 빈 머신 +MADE = 에코 더 돌핀 +MADJ = 에코 더 돌핀 +MADP = 에코 더 돌핀 +MAEE = 황금 도끼 +MAEJ = 황금 도끼 +MAEP = 황금 도끼 +MAFE = 건스타 히어로즈 +MAFJ = 건스타 히어로즈 +MAFP = 건스타 히어로즈 +MAGE = 리스타 +MAGJ = 리스타 +MAGP = 리스타 +MAHE = 바람돌이 소닉 +MAHJ = 바람돌이 소닉 +MAHP = 바람돌이 소닉 +MAIE = 스페이스 해리어 II +MAIJ = 스페이스 해리어 II +MAIP = 스페이스 해리어 II +MAJE = 홀이와 뚱이 +MAJJ = 홀이와 뚱이 +MAJP = 홀이와 뚱이 +MAKE = 쉐도우 댄서: 시노비의 비밀 +MAKJ = 쉐도우 댄서: 시노비의 비밀 +MAKP = 쉐도우 댄서: 시노비의 비밀 +MALE = 보난자 브라더스 +MALJ = 보난자 브라더스 +MALP = 보난자 브라더스 +MAME = 버밀리온의 검 +MAMJ = 버밀리온 +MAMP = 버밀리온의 검 +MANE = 게인 그라운드 +MANJ = 게인 그라운드 +MANP = 게인 그라운드 +MAOE = 바이오 해저드 배틀 +MAOJ = 크라잉: 아생명전쟁 +MAOP = 바이오 해저드 배틀 +MAPE = 코믹스 존 +MAPJ = 코믹스 존 +MAPP = 코믹스 존 +MAQE = 스트리츠 오브 레이지 +MAQJ = 베어 너클: 분노의 철권 +MAQP = 스트리츠 오브 레이지 +MARE = 오아시스 저편에 +MARJ = 토르의 이야기: 빛을 계승하는 자 +MARP = 토르의 이야기 +MASE = 벡터맨 +MASJ = 벡터맨 +MASP = 벡터맨 +MATE = 소닉 스핀볼 +MATJ = 소닉 스핀볼 +MATP = 소닉 스핀볼 +MAUJ = 퍼즐 & 액션: 단트-알 +MAVE = 몬스터 월드 원더 보이 +MAVJ = 원더 보이 V: 몬스터 월드 III +MAVP = 몬스터 월드 원더 보이 +MAWE = 버추어 파이터 2 +MAWJ = 버추어 파이터 2 +MAWP = 버추어 파이터 2 +MAXE = 알렉스 키드: 천공마성 +MAXJ = 알렉스 키드: 천공마성 +MAXP = 알렉스 키드: 천공마성 +MAYE = 에일리언 스톰 +MAYJ = 에일리언 스톰 +MAYP = 에일리언 스톰 +MAZE = 홀이와 뚱이 +MAZP = 홀이와 뚱이 +MB2J = 랑그릿사 +MB3E = 몬스터 월드 IV +MB3J = 몬스터 월드 IV +MB3L = 몬스터 월드 IV +MB4J = 파티 퀴즈 메가 Q +MB5J = 랑그릿사 II +MB6E = 샤이닝 포스 II: 고대의 봉인 +MB6J = 샤이닝 포스 II: 고대의 봉인 +MB6P = 샤이닝 포스 II: 고대의 봉인 +MB7E = 메가 터리칸 +MB7P = 메가 터리칸 +MB8E = 판타시 스타 II - 돌아오지 않을 시간의 끝에서 +MB8J = 판타시 스타 II - 돌아오지 않을 시간의 끝에서 +MB8P = 판타시 스타 II - 돌아오지 않을 시간의 끝에서 +MB9J = 페펭가 펭고 +MBAJ = 펄스맨 +MBAL = 펄스맨 +MBAN = 펄스맨 +MBBE = 바람돌이 소닉 2 +MBBJ = 바람돌이 소닉 2 +MBBP = 바람돌이 소닉 2 +MBCE = 키드 카멜레온 +MBCJ = 카멜레온 키드 +MBCP = 키드 카멜레온 +MBDE = 황금 도끼 II +MBDJ = 황금 도끼 II +MBDP = 황금 도끼 II +MBEE = 샤이닝 포스: 신들의 유산 +MBEJ = 샤이닝 포스: 신들의 유산 +MBEP = 샤이닝 포스: 신들의 유산 +MBFE = 시노비 III: 닌자 마스터의 귀환 +MBFJ = 슈퍼 솔저 II +MBFP = 시노비 III: 닌자 마스터의 귀환 +MBGE = 다이나마이트 헤디 +MBGJ = 다이나마이트 헤디 +MBGP = 다이나마이트 헤디 +MBHJ = 퍼즐 & 액션: 이치단트-알 +MBIE = 랜드스토커: 황제의 보물 +MBIJ = 랜드스토커: 황제의 보물 +MBIP = 랜드스토커: 황제의 보물 +MBJE = 마계촌 +MBJJ = 대마계촌 +MBJP = 마계촌 +MBKJ = 크랙 다운 +MBKP = 크랙 다운 +MBLJ = ESWAT: 사이버 폴리스 +MBLP = ESWAT: 포위당한 도시 +MBME = 바람돌이 소닉 3 +MBMJ = 바람돌이 소닉 3 +MBMP = 바람돌이 소닉 3 +MBNJ = 체르노브 +MBOE = 황금 도끼 III +MBOJ = 황금 도끼 III +MBOP = 황금 도끼 III +MBPE = 슈퍼 썬더 블래이드 +MBPJ = 슈퍼 썬더 블래이드 +MBPP = 슈퍼 썬더 블래이드 +MBQE = 스트리츠 오브 레이지 3 +MBQJ = 베어 너클 III +MBQP = 스트리츠 오브 레이지 3 +MBRE = 롤링 썬더 2 +MBRJ = 롤링 썬더 2 +MBRP = 롤링 썬더 2 +MBSJ = 다이나 브라더즈 2 스페셜 +MBTE = 에일리언 솔저 +MBTJ = 에일리언 솔저 +MBTP = 에일리언 솔저 +MBUE = 소닉 3D: 블래스트 +MBUJ = 소닉 3D: 블래스트 +MBUP = 소닉 3D: 플릭키즈 아일랜드 +MBVJ = 중장기병 레이노스 +MBWE = 칼럼즈 III: 칼럼즈의 복수 +MBWJ = 칼럼즈 III: 대결! 칼럼즈 월드 +MBWM = 칼럼즈 III: 칼럼즈의 복수 +MBXE = 에코 주니어 +MBXJ = 에코 주니어 +MBXM = 에코 주니어 +MBYE = 라이트 크루세이더 +MBYJ = 라이트 크루세이더 +MBYP = 라이트 크루세이더 +MBZE = 영원한 챔피언들 +MBZJ = 영원한 챔피언들 +MBZP = 영원한 챔피언들 +MC2E = 어스웜 짐 2 +MC2J = 어스웜 짐 2 +MC2P = 어스웜 짐 2 +MC3E = 슈퍼 스트리트 파이터 II: 새로운 도전자들 +MC3J = 슈퍼 스트리트 파이터 2: 새로운 도전자들 +MC3P = 슈퍼 스트리트 파이터 II: 새로운 도전자들 +MC4E = 스트라이더 +MC4J = 스트라이더 비룡 +MC4P = 스트라이더 +MCAJ = 그레이 랜서 +MCAL = 그레이 랜서 +MCAN = 그레이 랜서 +MCBE = 파워볼 +MCBJ = 레슬볼 +MCCE = 판타지 스타 III: 시간의 계승자 +MCCJ = 시간의 계승자: 판타지 스타 III +MCCP = 시간의 계승자 +MCDE = 소닉과 너클즈 +MCDJ = 소닉과 너클즈 +MCDP = 소닉과 너클즈 +MCEJ = 슈퍼 판타지 존 +MCEN = 슈퍼 판타지 존 +MCEP = 슈퍼 판타지 존 +MCFJ = 페리오스 +MCGE = 잃어버린 세계 +MCGJ = 잃어버린 세계 +MCGP = 잃어버린 세계 +MCHE = 무자 알레스트 +MCHJ = 무자 알레스트 +MCHM = 무자 알레스트 +MCIJ = 지노그 +MCJE = 스플래터하우스 2 +MCJJ = 스플래터하우스 파트 2 +MCJP = 스플래터하우스 2 +MCKE = 판타지 스타 IV: 천년기의 끝에 +MCKJ = 판타지 스타 IV: 천년기의 끝에 +MCKP = 판타지 스타 IV: 천년기의 끝에 +MCLE = 스트리트 파이터 II': 스페셜 챔피언 에디션 +MCLJ = 스트리트 파이터 II' 플러스: 챔피언 에디션 +MCLP = 스트리트 파이터 II’: 스페셜 챔피언 에디션 +MCMJ = 로드 모나크: 최후의 전투 전설 +MCNJ = 북두의 권: 세기말 구세주 전설 +MCOJ = 소서리안 +MCPE = 어스웜 짐 +MCPJ = 어스웜 짐 +MCPP = 어스웜 짐 +MCQE = 부거맨: 픽 앤 플릭 어드벤처 +MCQP = 부거맨: 픽 앤 플릭 어드벤처 +MCRE = 전장의 랑: MERCS +MCRJ = 전장의 이리 II +MCRP = 전장의 랑: MERCS +MCSJ = 원더보이 III: 몬스터 레어 +MCSN = 원더보이 III: 몬스터 레어 +MCSP = 원더보이 III: 몬스터 레어 +MCTE = 클레이 파이터 +MCTP = 클레이 파이터 +MCUJ = 드래곤 슬레이어: 영웅전설 +MCVE = 피트폴: 메이안 어드벤처 +MCVJ = 피트폴: 메이안 어드벤처 +MCVP = 피트폴: 메이안 어드벤처 +MCWE = 갤럭시 포스 II +MCWJ = 갤럭시 포스 II +MCWP = 갤럭시 포스 II +MCXJ = 드래곤 슬레이어: 영웅전설 +MCYE = 시노비의 복수 +MCYJ = 슈퍼 시노비 +MCYP = 시노비의 복수 +MCZE = 상하이 II: 용의 눈 +MCZP = 상하이 II: 용의 눈 +PA2J = 열혈고교 돗지볼 부: CD 축구 편 +PA3J = 사라만다 +PA4J = 파라솔 스타즈 +PA6E = 블러디 울프 +PA6J = 불량배 전투 부대: 블러디 울프 +PA6P = 블러디 울프 +PA7E = 에일리언 크러쉬 +PA7J = 에일리언 크러쉬 +PA7P = 에일리언 크러쉬 +PA8E = 오다인 +PA8J = 오다인 +PA9E = 스플래터하우스 +PA9J = 스플래터하우스 +PA9P = 스플래터하우스 +PAAE = 봄버맨 '93 +PAAP = 봄버맨 '93 +PABE = 봉크의 모험 +PABJ = PC 원인 +PABP = 봉크의 모험 +PACE = 던전 탐험가 +PACJ = 던전 탐험가 +PACP = 던전 탐험가 +PADE = 알타입 +PADJ = 알타입 I +PADP = 알타입 +PAEE = 슈퍼 스타 솔져 +PAEJ = 슈퍼 스타 솔져 +PAEP = 슈퍼 스타 솔져 +PAFE = 승리의 질주 +PAFJ = 승리의 질주: 영광의 13,000KM +PAFP = 승리의 질주 +PAGJ = 봄버맨 '94 +PAGL = 봄버맨 '94 +PAGN = 봄버맨 '94 +PAHE = 배틀 로드 런너 +PAHJ = 배틀 로드 런너 +PAHP = 배틀 로드 런너 +PAIE = 신 모험도 +PAIJ = 타카하시 명인의 신 모험도 +PAIP = 신 모험도 +PAJJ = 사성검 네크로맨서 +PAKE = 용의 저주 +PAKJ = 모험도 +PAKP = 용의 저주 +PALE = 솔져 블레이드 +PALJ = 솔져 블레이드 +PALP = 솔져 블레이드 +PAME = 뉴토피아 +PAMJ = 뉴토피아: 프레이의 장 +PAMP = 뉴토피아 +PANE = 밀리터리 매드니스 +PANJ = 넥타리스 +PANP = 밀리터리 매드니스 +PAOJ = 파이널 솔져 +PAOL = 파이널 솔져 +PAON = 파이널 솔져 +PAPJ = 알타입 II +PAQJ = 그라디우스 +PARJ = 나왔다! 트윈비 +PARL = 나왔다! 트윈비 +PARN = 나왔다! 트윈비 +PASJ = 카다쉬 +PATJ = 기기괴계 +PAUJ = 개조정인 슈비빅맨 +PAVE = 비질란테 +PAVJ = 비질란테 +PAVP = 비질란테 +PAWE = 갤러그 '90 +PAWJ = 갤러그 '88 +PAWP = 갤러그 '90 +PAYJ = 왈큐레의 전설 +PAZJ = 원평토마전 +PB2E = 뉴토피아 II +PB2J = 뉴토피아 II +PB2P = 뉴토피아 II +PB3E = 데빌 크러쉬 +PB3J = 데빌 크래쉬 +PB3P = 데빌 크러쉬 +PB5J = 닌자 용검전 +PB6E = 크레이터메이즈 +PB6P = 크레이터메이즈 +PB7J = 전국 마작 +PB8E = 블레이징 레이저즈 +PB8J = 블레이징 레이저즈 +PB8P = 블레이징 레이저즈 +PB9E = 월드 스포츠 대회 +PB9J = 파워 스포츠 +PB9P = 월드 스포츠 대회 +PBAE = 드래곤 스피릿 +PBAJ = 드래곤 스피릿 +PBAP = 드래곤 스피릿 +PBCJ = 원더-모모 +PBDE = 더블 던전즈 +PBDJ = 더블 던전즈 +PBDP = 더블 던전즈 +PBEE = 모터 로더 +PBEJ = 모터 로더 +PBEP = 모터 로더 +PBFJ = 파이어 프로레슬링: 콤비네이션 태그 +PBHE = 봉크의 복수 +PBHJ = PC 원인 2 +PBHP = 봉크의 복수 +PBIE = 봉크 3: 봉크의 대모험 +PBIJ = PC 원인 3 +PBIP = 봉크 III: 봉크의 대모험 +PBJE = 사무라이 고스트 +PBJJ = 원평 토마전: 제 2권 +PBJP = 사무라이 고스트 +PBME = 영웅 톤마의 전설 +PBMJ = 영웅 톤마의 전설 +PBMP = 영웅 톤마의 전설 +PBNE = 닌자 스피릿 +PBNJ = 최후의 인도: 닌자 스피릿 +PBNP = 닌자 스피릿 +PBSE = 츄만푸 +PBSJ = 비 볼 +PBSP = 츄만푸 +PBTE = 차이나 워리어 +PBTJ = 쿵푸 +PBTP = 차이나 워리어 +PBUE = 브라보맨 +PBUJ = 초절륜인 브라보맨 +PBVJ = 벤케이 외전 +PBWE = 에어 종크 +PBWJ = PC 전인: 펑킥 사이보그스 +PBWP = 에어 종크 +PBXE = 쇼크맨 +PBXJ = 개조정인 슈비빅맨 2: 새로운 적 +PBXP = 쇼크맨 +PBYJ = 아웃 라이브 +PBZE = 제이.제이. & 제프 +PBZP = 제이.제이. & 제프 +PC2E = 체이스 H.Q. +PC2J = 체이스 H.Q. +PC2P = 체이스 H.Q. +PC3J = 다리우스 플러스 +PC4J = 스페이스 인베이더즈: 부활의 날 +PC5J = 드래곤 세이버 +PC6J = 파이널 블래스터 +PC7J = 미즈바쿠 대모험 +PC8J = 닌자워리어즈 +PC9J = 뉴질랜드 이야기 +PCAE = 사일런트 디버거즈 +PCAJ = 사일런트 디버거즈 +PCAP = 사일런트 디버거즈 +PCBE = 데드 문 +PCBJ = 데드 문: 달 세계의 악몽 +PCBP = 데드 문 +PCCJ = 마계팔견전 샤다 +PCDJ = 장하다! 게이트 볼 +PCEE = 파워 골프 +PCEJ = 파워 골프 +PCEP = 파워 골프 +PCHE = 드랍 오프 +PCHJ = 드랍 락 이봐 이봐 +PCHP = 드랍 오프 +PCJJ = 오버라이드 +PCKJ = 가이 프레임 +PCMJ = Mr. 헬리의 대모험 +PCNJ = 승리 샷 +PCOE = 싸이코시스 +PCOJ = 파라노이아 +PCOP = 싸이코시스 +PCPJ = 파워 일레븐 +PCQJ = 싸이코 체이서 +PCRJ = 브레이크 인 +PCRL = 브레이크 인 +PCRN = 브레이크 인 +PCSJ = 디지털 챔프: 전투 복싱 +PCSL = 디지털 챔프: 전투 복싱 +PCSN = 디지털 챔프: 전투 복싱 +PCTJ = 파워 테니스 +PCUJ = 파이어 프로레슬링 2 번째 시합 +PCVE = 월드 클래스 야구 +PCVP = 월드 클래스 야구 +PCWJ = 이미지 파이트 +PCXJ = 파워 리그 IV +PCYJ = 왈라비!! 토끼 나라의 캥거루 레이스 +PDAJ = 열혈고교 피구부® PC 번외편 +PDCJ = 대마계촌 +PDDJ = 볼피드 +PDEJ = S.C.I.: 특수 범죄 수사 +PDFJ = 지옥순례 +PDGJ = 파이어 프로레슬링 3: 레전드 바우트 +PDHJ = 라스탄 사가 II +PDIJ = 챔피언 레슬러® +PDJJ = 스트리트 파이터 II': 챔피언 에디션 +PDJL = 스트리트 파이터 II': 챔피언 에디션 +PDJN = 스트리트 파이터 II: 챔피언 에디션 +QA2J = 열혈고교 피구부: CD 축구편 +QA3E = 심어스: 살아있는 지구 +QA3J = 심어스 +QA3P = 심어스: 살아있는 지구 +QA4J = 슈퍼 다리우스 II +QA5J = 스페이스 인베이더즈: 오리지널 게임 +QA6J = 슈퍼 다리우스 +QA7J = 제나두의 전설: 바람의 전설 제나두 +QA8J = 스프리건 마크 2 +QA9J = 바람의 전설: 제나두 II +QAAE = 슈퍼 에어 종크 +QAAJ = CD 전인: 로커빌리 천국 +QAAP = 슈퍼 에어 종크 +QABE = 이스 북 I & II +QABJ = 이스 I + II +QABP = 이스 북 I & II +QACJ = 초형귀 +QACL = 초형귀 +QACN = 초형귀 +QADJ = 그라디우스 II: 고퍼의 야망 +QADL = 그라디우스 II: 고퍼의 야망 +QADN = 그라디우스 II: 고퍼의 야망 +QAEJ = A 열차로 가자 III +QAFE = 왕가의 영웅 +QAFJ = 초영웅전설: 왕가의 영웅 +QAFP = 왕가의 영웅 +QAGE = 천둥의 문 +QAGJ = 천둥의 문 +QAGP = 천둥의 문 +QAHJ = 강의 낚시꾼 자연파 +QAJJ = 이미지 파이트 II +QAKJ = 애·초형귀 +QALJ = 아틀라스: 르네상스 보이저 +QANJ = 네오 넥타리스 +QAOJ = 던전 탐험가 II +QAPJ = 악마성 드라큘라 X: 피의 윤회 +QAPL = 캐슬베이나: 피의 윤회 +QAPN = 캐슬베이나: 피의 윤회 +QAPP = 캐슬베이나: 피의 윤회 +QAQJ = 드래곤 슬레이어: 영웅전설 +QARJ = 블러드 기어 +QASE = 천둥의 제왕 +QASJ = 천둥의 바람 +QASP = 천둥의 제왕 +QATE = 폭동지대 +QATJ = 늑대의 문장 +QATP = 폭동지대 +QAUE = 몬스터 레어 +QAUJ = 원더 보이 III: 몬스터 레어 +QAUP = 몬스터 레어 +QAVJ = 봄버맨: 패닉 봄버 +QAWJ = 스타 파로저 +QAWL = 스타 파로저 +QAWN = 스타 파로저 +QAXJ = 마셜 챔피언 +QAYJ = 정령전사 스프리건 +QAZJ = 영광은 너에게: 고교야구 전국대회 +QBAJ = 엘 디스 +QBBE = 파이팅 스트리트 +QBBJ = 파이팅 스트리트 +QBBP = 파이팅 스트리트 +SP4V = 캐슬베니아: 피의 윤회 +EA2E = 메탈 슬러그 2 +EA2J = 메탈 슬러그 2 +EA2P = 메탈 슬러그 2 +EA3J = 갤럭시 파이트: 유니버설 워리어즈 +EA4E = 사무라이 쇼다운 III +EA4J = 사무라이 스피리츠 참홍랑무쌍검 +EA4P = 사무라이 쇼다운 III +EA5E = 아랑전설 3: 마지막 영광의 길 +EA5J = 아랑전설 3: 마지막 영광의 길 +EA5P = 아랑전설 3: 마지막 영광의 길 +EA6E = 킹 오브 파이터즈 '96 +EA6J = 킹 오브 파이터즈 '96 +EA6P = 킹 오브 파이터즈 '96 +EA7E = 사무라이 쇼다운 IV: 아마쿠사의 복수 +EA7J = 사무라이 스피리츠 아마쿠사 강림 +EA7P = 사무라이 쇼다운 IV: 아마쿠사 복수 +EA8E = 아이언클래드 +EA8J = 아이언클래드: 초철 브리킹거 +EA8M = 아이언클래드: 초철 브리킹거 +EA9J = 와쿠 와쿠 7 +EAAE = 아랑전설 +EAAJ = 아랑전설: 숙명의 싸움 +EAAP = 아랑전설 +EABE = 월드 히어로즈 +EABJ = 월드 히어로즈 +EABP = 월드 히어로즈 +EACE = 매지션 로드 +EACJ = 매지션 로드 +EACP = 매지션 로드 +EADE = 용호의 권 +EADJ = 용호의 권 +EADP = 용호의 권 +EAEE = 사무라이 쇼다운 +EAEJ = 진 사무라이 스피리츠: 하오마루 지옥편 +EAEP = 사무라이 쇼다운 +EAFE = 블루의 여행 +EAFJ = 라기 +EAFP = 블루의 여행 +EAGE = 킹 오브 파이터즈 '94 +EAGJ = 킹 오브 파이터즈 '94 +EAGP = 킹 오브 파이터즈 '94 +EAHE = 야구 스타즈 2 +EAHJ = 야구 스타즈 2 +EAHP = 야구 스타즈 2 +EAIE = 탑 헌터 +EAIJ = 탑 헌터 +EAIP = 탑 헌터 +EAJE = 메탈 슬러그 +EAJJ = 메탈 슬러그 +EAJP = 메탈 슬러그 +EAKE = 버닝 파이트 +EAKJ = 버닝 파이트 +EAKP = 버닝 파이트 +EALE = 용호의 권 2 +EALJ = 용호의 권 2 +EALP = 용호의 권 2 +EAME = 닌자 컴뱃 +EAMJ = 닌자 컴뱃 +EAMP = 닌자 컴뱃 +EANE = 아랑전설 2 +EANJ = 아랑전설 2: 새로운 싸움 +EANP = 아랑전설 2 +EAOE = 킹 오브 몬스터즈 +EAOJ = 킹 오브 몬스터즈 +EAOP = 킹 오브 몬스터즈 +EAPE = 닌자 코만도 +EAPJ = 닌자 코만도 +EAPP = 닌자 코만도 +EAQE = 월드 히어로즈 2 +EAQJ = 월드 히어로즈 2 +EAQP = 월드 히어로즈 2 +EARE = 네오 터프 마스터즈 +EARJ = 네오 터프 마스터즈 +EARP = 네오 터프 마스터즈 +EASE = 사무라이 쇼다운 2 +EASJ = 진 사무라이 스피리츠: 하오마루 지옥편 +EASP = 사무라이 쇼다운 II +EATE = 월드 히어로즈 2 제트 +EATJ = 월드 히어로즈 2 제트 +EATP = 월드 히어로즈 2 제트 +EAUJ = 트윙클 스타 스프라이츠 +EAVE = 킹 오브 파이터즈 '95 +EAVJ = 킹 오브 파이터즈 ’95 +EAVP = 킹 오브 파이터즈 ’95 +EAWE = 아랑전설 스페셜 +EAWJ = 아랑전설 스페셜 +EAWP = 아랑전설 스페셜 +EAYJ = 킹 오브 몬스터즈 2 +EAZE = 월드 히어로즈 퍼펙트 +EAZJ = 월드 히어로즈 퍼펙트 +EAZP = 월드 히어로즈 퍼펙트 +EB2E = 리얼 바우트 아랑전설 스페셜 +EB2J = 리얼 바우트 아랑전설 스페셜 +EB2P = 리얼 바우트 아랑전설 스페셜 +EB3J = 축구 난투 +EB4J = 아소 II: 마지막 수호자 +EB5E = 월화의 검사 +EB5J = 월화의 검사 +EB5P = 월화의 검사 +EB6E = 메탈 슬러그 3 +EB6J = 메탈 슬러그 3 +EB6P = 메탈 슬러그 3 +EB7J = 슈퍼 스파이 +EB8E = 쇼크 트루퍼즈 +EB8J = 쇼크 트루퍼즈 +EB8P = 쇼크 트루퍼즈 +EB9J = 펄스타 +EBAE = 매지컬 드롭 II +EBAJ = 매지컬 드롭 2 +EBAP = 매지컬 드롭 II +EBBE = 파이터즈 히스토리 다이너마이트 +EBBJ = 파이터의 히스토리 다이너마이트 +EBBP = 카르노브의 복수 +EBCJ = 플라잉 파워 디스크 +EBDE = 매지컬 드롭 III +EBDJ = 매지컬 드롭 III +EBDP = 매지컬 드롭 3 +EBEE = 스트리트 슬램 +EBEJ = 덩크 드림 +EBEP = 스트리트 후프 +EBFE = 스핀 마스터 +EBFJ = 미라클 어드벤처 +EBFP = 스핀 마스터 +EBGE = 킹 오브 파이터즈 '97 +EBGJ = 킹 오브 파이터즈 '97 +EBGP = 킹 오브 파이터즈 '97 +EBKJ = 최후의 수단 +EBLJ = 통쾌 간간 행진곡 +EBMJ = 파이어 수플렉스 +EBNJ = 풍운 묵시록: 격투창조 +EBOJ = 풍운 슈퍼 태그 배틀 +EBPJ = 리그 볼링 +EBQE = 닌자 마스터즈 +EBQJ = 닌자 마스터즈: 패왕인법첩 +EBQP = 닌자 마스터즈 +EBRJ = 조이 조이 키드 +EBSE = 용호의 권 3: 전사의 길 +EBSJ = 용호의 권 외전 +EBSP = 용호의 권 3: 전사의 길 +EBTJ = 크로스드 소드즈 +EBUE = 2020 슈퍼 야구 +EBUJ = 슈퍼 야구 2020 +EBUP = 2020 슈퍼 야구 +EBVJ = 신황권 +EBWE = 전국전승 +EBWJ = 전국전승 +EBWP = 전국전승 +EBXE = 전국전승 2 +EBXJ = 전국전승 2 +EBXP = 전국전승 2 +EBZE = 리얼 바우트 아랑전설 +EBZJ = 리얼 바우트 아랑전설 +EBZP = 리얼 바우트 아랑전설 +ECAE = 리얼 바우트 아랑전설 2: 새로 온 참가자들 +ECAJ = 리얼 바우트 아랑전설 2: 새로 온 참가자들 +ECAP = 리얼 바우트 아랑전설 2: 새로 온 참가자들 +ECCE = 메탈 슬러그 X +ECCJ = 메탈 슬러그 X +ECCP = 메탈 슬러그 X +ECDJ = 경마 우승자: G1 완전 제패로 가는 길 +ECEE = 월하의 검사 2 +ECEJ = 막말낭만 제 2막: 월화의 검사 +ECEP = 월하의 검사 2 +ECFJ = 블레이징 스타 +ECGE = 쇼크 트루퍼스: 세컨드 스쿼드 +ECGJ = 쇼크 트루퍼스: 세컨드 스쿼드 +ECGP = 쇼크 트루퍼스: 세컨드 스쿼드 +ECHE = 킹 오브 파이터즈 '98 +ECHJ = 킹 오브 파이터즈 '98 +ECHP = 킹 오브 파이터즈 '98 +ECIE = 메탈 슬러그 4 +ECIJ = 킹 오브 파이터즈 '99 +ECIP = 메탈 슬러그 4 +ECJE = 킹 오브 파이터즈 '99 +ECJJ = 킹 오브 파이터즈 '99 +ECJP = 킹 오브 파이터즈 '99 +ECKE = 남-1975 +ECKJ = 남-1975 +ECKP = 남-1975 +ECLJ = 스테이크즈 위너 2 +ECMJ = 득점왕: 불꽃의 리베로 +ECNE = 전국전승 3 +ECNJ = 전국전승 2001 +ECNP = 전국전승 3 +E53E = 블랙 타이거 +E53J = 블랙 드래곤 +E53P = 블랙 타이거 +E54E = 마계촌 +E54J = 마계촌 +E54P = 마계촌 +E55E = 코만도 +E55J = 전장의 이리 +E55P = 코만도 +E56E = 엑시드 엑시스 +E56J = 엑시드 엑시스 +E56P = 엑시드 엑시스 +E57E = 손손 +E57J = 손손 +E57P = 손손 +E58J = 미스터 도! +E59J = 공수도 +E5AJ = 이키 +E5BJ = 상하이 +E5VJ = 레니게이드 +E5WE = 몬스터 랜드 원더 보이 +E5WJ = 몬스터 랜드 원더 보이 +E5WP = 몬스터 랜드 원더 보이 +E5XJ = 뿌요 뿌요 썬 +E5YJ = 뿌요 뿌요 +E5ZE = 슈퍼 행-온 +E5ZJ = 슈퍼 행-온 +E5ZP = 슈퍼 행-온 +E62E = 스페이스 헤리어 +E62J = 스페이스 헤리어 +E62P = 스페이스 헤리어 +E63E = 시노비 +E63J = 시노비 +E63P = 시노비 +E64J = 롤링 썬더 2 +E65J = 발키리의 전설 +E66J = 오다인 +E67J = 디그 더그 +E68J = 갤러그 +E69J = 바라듀크 +E6AJ = 문 크레스타 +E6BJ = 크레이지 클라이머 +E6CJ = 롬퍼즈 +E6DJ = 토이 팝 +E6EJ = 리블 라블 +E6FJ = 갤럭시안 +E6GJ = 남코 퀘스터 +E6HJ = 페이스 오프 +E6IJ = 탱크 포스 +E6JJ = 폭돌기총정: 바라듀크 II +E6KJ = 초절륜인: 베라보맨 +E6LJ = 메르헨 메이즈 +E6ME = 테크모 볼 +E6MJ = 테크모 볼 +E6NE = 솔로몬의 열쇠 +E6NJ = 솔로몬의 열쇠 +E6NP = 솔로몬의 열쇠 +E6OJ = 봄 잭 아케이드 +E6PE = 닌자 외전 +E6PJ = 닌자 용검전 아케이드 +E6PP = 닌자 외전 +E6QE = 아르고스의 전사 +E6QJ = 아르고스의 전사 +E6QP = 아르고스의 전사 +E6SJ = 뉴 랠리-X +E6VE = 잭슨 +E6VJ = 잭슨 +E6VP = 잭슨 +E6WE = 황금 도끼 +E6WJ = 황금 도끼 +E6WP = 황금 도끼 +E6XE = 수왕기 +E6XJ = 수왕기 +E6XP = 수왕기 +E6YJ = 스페이스 인베이더즈 +E6ZE = 스타 포스 +E6ZJ = 스타 포스 +E6ZP = 스타 포스 +E72J = 스타블레이드 +E73E = 마피 +E73J = 마피 +E73P = 마피 +E74J = 코스모 갱 더 퍼즐 +E75J = 원평토마전 +E76J = 에메랄디아 +E77J = 이슈타르의 부활 +E78J = 솔바로우 +E79E = 가플러스 +E79J = 가플러스 +E79P = 가플러스 +E7AJ = 그로브다 +E7BJ = 디그 더그 II +E7CJ = 보스코니안 +E7EJ = 드래곤 버스터 +E7FJ = 드래곤 세이버 +E7GJ = 드래곤 스피릿 +E7HJ = 제비우스 +E7IJ = 최고의 시간 +E7JJ = 너클 헤드즈 +E7KJ = 팩-매니아 +E7LJ = 코스모 갱 더 비디오 +E7MJ = 페리오스 +E7NJ = 롤링 썬더 +E7OJ = 버닝 포스 +E7PJ = 마벨 랜드 +E7QJ = 갤러그 '88 +E7RJ = 원더 모모 +E7SJ = 어설트 +E7TJ = 호핑 마피 +E7UJ = 스플래터하우스 +E7VJ = 사이버 슬레드 +E7WJ = 뉴먼 육상경기 +E7XJ = 요괴 여행기 +E7YJ = 스카이 키드 +E7ZE = 드루아가의 탑 +E7ZJ = 드루아가의 탑 +E7ZP = 드루아가의 탑 +C93E = 마지막 닌자 2 +C93P = 마지막 닌자 2 +C94E = 타워 토플러 +C94P = 네불루스 +C95P = 불가능한 임무 +C96E = 하계 경기들 II +C96P = 하계 경기들 2 +C97E = 캘리포니아 게임즈 +C97P = 캘리포니아 게임즈 +C98P = 파라드로이드 +C99P = 우리디움 +C9EP = 동계 경기들 +C9GP = 몬스터랜드 메이헴 +C9HE = 볼더 대쉬 +C9HP = 볼더 대쉬 +C9IE = 싸이버노이드 +C9IP = 싸이버노이드 +C9ME = 핏스톱 II +C9MJ = 핏스톱 2 +C9MP = 핏스톱 II +C9PP = 마지막 닌자 3 +C9QP = 점프맨 +C9RP = 인터내셔널 카라테 + +C9XE = 마지막 닌자 +C9XJ = 마지막 닌자 +C9XP = 마지막 닌자 +C9YE = 인터내셔널 카라테 +C9YJ = 인터내셔널 카라테 +C9YP = 인터내셔널 카라테 +C9ZP = 월드 게임즈 +XAAJ = 에기 +XABJ = 알레스트 +XADJ = 이얼 쿵푸 2 +XAEJ = 스페이스 맨보우 +XAFJ = 메탈 기어 +XAGJ = 로드 파이터 +XAHJ = 펭귄 어드벤처: 꿈대륙 +XAIJ = 쿼스 +XAKJ = 파로디우스 - 타코는 지구를 구한다 +XALJ = 혼두라 +XAMJ = 나이트메어: 마성전설 +XANJ = 그라디우스 2 +XAOJ = 고퍼의 야망: 에피소드 II +XAPJ = 메탈 기어 2: 솔리드 스네이크 +XAQJ = 사라만다 +HAAA = 사진 채널 +HABA = Wii 쇼핑 채널 +HABK = Wii 쇼핑 채널 +HACA = Mii 채널 +HACK = Mii 채널 +HADE = 인터넷 채널 +HADJ = 인터넷 채널 +HADP = 인터넷 채널 +HAFA = 날씨 채널 +HAFE = 날씨 채널 +HAFJ = 날씨 채널 +HAFP = 날씨 채널 +HAGA = 뉴스 채널 +HAGE = 뉴스 채널 +HAGJ = 뉴스 채널 +HAGP = 뉴스 채널 +HAJE = 모두의 투표 채널 +HAJJ = 모두의 투표 채널 +HAJP = 모두의 투표 채널 +HAKE = 최종 사용자 라이선스 동의 +HAKJ = 최종 사용자 라이선스 동의 +HAKK = 최종 사용자 라이선스 동의 +HAKP = 최종 사용자 라이선스 동의 +HALE = 지역 선택 +HALJ = 지역 선택 +HALK = 지역 선택 +HALP = 지역 선택 +HAPE = Mii 컨테스트 채널 +HAPJ = Mii 컨테스트 채널 +HAPP = Mii 컨테스트 채널 +HATE = 닌텐도 채널 +HATJ = 닌텐도 채널 +HATP = 닌텐도 채널 +HAVJ = 운세 채널 +HAVK = 운세 채널 +HAVP = 즐거운 하루 운세 채널 +HAWE = 메트로이드 프라임 3 프리뷰 +HAWP = 메트로이드 프라임 3 프리뷰 +HAYA = 사진 채널 +HAYK = 사진 채널 +HBNJ = Wii 텔레비전의 친구 채널 G 가이드 +HC2D = 와치에버 +HC3J = USB 메모리 복구 프로그램 +HC4E = 크런치롤 +HC4P = 크런치롤 +HCAJ = 밴드 브라더스 DX 스피커 채널 +HCAP = 밴드 라이브와 함께하는 잼 +HCBJ = 사진 채널 1.0 복구 프로그램 +HCCJ = 개인 데이터 설정 +HCDJ = 디지탈 카메라 프린트 채널 +HCFE = Wi 스피크 채널 +HCFJ = Wi 스피크 채널 +HCFK = Wii 스피크 채널 +HCFP = Wi 스피크 채널 +HCGE = Wii + 인터넷 +HCGJ = Wii + 인터넷 +HCGP = Wii + 인터넷 +HCGX = Wii + 인터넷 +HCHJ = 배달 채널 +HCIJ = Wii 사이 +HCJP = BBC iPlayer 채널 +HCLE = 넷플릭스 +HCLP = 넷플릭스 +HCMP = 커비 TV 채널 +HCQE = 훌루 플러스 +HCQJ = 훌루 +HCRE = 젤다의 전설 스카이워드 소드 데이터 복구 채널 +HCRJ = 젤다의 전설 스카이워드 소드 데이터 복구 채널 +HCRK = 젤다의 전설 스카이워드 소드 데이터 복구 채널 +HCRP = 젤다의 전설 스카이워드 소드 데이터 복구 채널 +HCSE = Wii U 전송 도구 +HCSJ = Wii U 전송 도구 +HCSP = Wii U 전송 도구 +HCTE = Wii 시스템 전송 +HCTJ = Wii 시스템 전송 +HCTP = Wii 시스템 전송 +HCUE = Wii 메뉴 전자 매뉴얼 +HCUJ = Wii 메뉴 전자 매뉴얼 +HCUP = Wii 메뉴 전자 매뉴얼 +HCVA = Wii U 메뉴 +HCWE = 아마존 인스턴트 비디오 +HCWP = 아마존 인스턴트 비디오 +HCXE = 유튜브 +HCXJ = 유튜브 +HCXP = 유튜브 +HCYE = Wii 메뉴 매뉴얼 (Wii 미니) +HCYJ = Wii U 본체 업데이트 복구 프로그램 +HCYP = Wii 메뉴 매뉴얼 (미니 Wii) +HFNJ = Wii 핏 바디 체크 채널 +RFNE = Wii 핏 채널 +RFNJ = Wii 핏 채널 +RFNK = Wii 핏 채널 +RFNP = Wii 핏 채널 +RFNW = Wii 핏 채널 +RFPE = Wii 핏 플러스 채널 +RFPJ = Wii 핏 플러스 채널 +RFPP = Wii 핏 플러스 채널 +RFPW = Wii 핏 플러스 채널 +RGWE = 레비즈 채널 +RGWJ = 레비즈 채널 +RGWP = 레비즈 채널 +RGWX = 레비즈 채널 +RMCE = 마리오 카트 채널 +RMCJ = 마리오 카트 채널 +RMCK = 마리오 카트 채널 +RMCP = 마리오 카트 채널 +D01A = Wiimmfi 패처 +D02A = 엔진02 +D03A = 브레인슬러그 Wii +D05A = 배쉬 더 캐슬 +D06A = 비트 스트리머 +D07A = 블리스터볼 +D08A = 블랍 워즈: 메탈 블랍 솔리드 +D09A = 블로비 발리 2 Wii +D0AA = M플레어어 Wii 유튜브 +D0BA = M플레이어 Wii +D0CA = 오카리나 +D0DA = M플레이어 디비들립 에디션 +D0EA = Rodries의 M플레이어 Wii +D0FA = 사인체크 +D0GA = GC부트 +D0HA = 멤뷰 +D0IA = IOS 체크 +D0KA = WiiB서버 +D0LA = LibWii게임로드 +D0MA = Wii리더 +D0OA = Move the Pussy 체험판 +D0PA = Wii랙스 미니트로 +D0QA = 피션 엔진 프로젝트 +D0RA = GRRLIB 4.0 체험판 +D0SA = OSDM-바 +D0TA = 홈브류 메뉴 체험판 +D0UA = LibMii 예제 +D0VA = 스케리 체험판 +D0WA = 스타필드 체험판 +D0XA = 와이어3D 체험판 +D0YA = 썸싱 +D0ZA = GRRLIB 4.3.0 홍보 소개 +D10A = cIOS픽스 +D11A = ASCII 퐁 +D12A = 부스카Wii나스 +D13A = C-도그스 SDL +D14A = Dr. Creep의 성 +D15A = Wii 샵 & IOS51 설치 프로그램 +D16A = 지네 +D17A = 코브라 아케이드 +D18A = 덤프 에스프레소 OTP +D1LA = 블.라.인.드 +D1PA = 1비트 인베이더즈 +D1RA = 미니멀런처 +D21A = X로어 +D22A = cIOS222 설치 프로그램 +D24A = 24 점 +D2AA = Wii 치명적인 코브라 +D2BA = 점프 앤 범프 +D2CA = 위플로우 어드밴스드 +D2DA = 박스2D 볼즈 +D2EA = WiiFlow 구성 시작 +D2GA = WAD 배치 설치 프로그램 +D2ZA = 콘솔 슛터 +D33A = 타임 프랙 2D +D36A = cIOS36 설치 프로그램 +D37A = Wii커넥트 +D38A = cIOS38 설치 프로그램 +D39A = Ctr Gts 다코타코 에디션 +D3DA = 타임 프랙 3D +D3JA = NDS로드 +D3KA = 버튼 테스터 +D3LA = 부트Mii 부터 +D3MA = 커스텀 낸드 로더 +D3OA = cIOS USB 2 설치 프로그램 +D3WA = 워헤드즈: 초토 +D40A = 루이지와 미스터리 섬 +D42A = 아리안B +D43A = Wii 버츄얼 재규어 +D46A = 뉴오 이스케이프 +D4KA = 알레프 오온 +D4NA = 디스크 덤퍼 +D4PA = DVD 덤퍼 +D4SA = USB 로더 GUI FX +D51A = IOS51 업데이트 +D52A = c부트252 +D54A = cIOS 패치mii 설치 프로그램 +D55A = PID 추출기 +D56A = 쇼핑 채널 픽서 +D58A = 프릴로더 핵스덴 에디션 +D59A = 언타이틀드프로젝트 +D5AA = 알라미 +D5BA = Wii폰트 +D5CA = c로더 +D5FA = 텍스티드 모드 +D5HA = 타이틀 리스터 +D5JA = 타이디 업 +D5LA = 스위치투sneek +D5RA = 보토닝 +D60A = 얼티밋 USB 로더 +D61A = 샌드 트랩스 엑스트라 레벨즈 +D62A = 뉴오 퍼즐 +D63A = 3D 미로 +D64A = Wii64 에뮬레이터 +D65A = 일시적 벡터 +D66A = 시크릿 마료 크로니클즈 +D68A = 그들은 죽지 않는다 2 +D69A = IOS60 설치 프로그램 +D6AA = 푸시로더 +D6BA = 업데이터세이프 +D6DA = 세이브게임 매니저 모드 +D6EA = Sneek FS 덤퍼 +D6FA = 애니타이틀 딜리터 모드 +D6HA = 애니타이틀 딜리터 모드 DB +D6IA = DVD 정보 +D6KA = 애니타이틀 딜리터 DB +D6MA = 바나나 세이브즈 +D6OA = DOP 샵 +D6QA = 부트Mii 체커 +D6TA = Mii플레이어 +D70A = 던전 크롤 스톤 수프 +D71A = 버섯 왕국의 공포 +D79A = 뉴오 디펜스 +D7AA = 액션 리플레이 로더 +D7DA = 데판브류 +D7GA = 채널 로더 +D7KA = 로크SD +D7LA = 럼블러 +D7MA = 이즈 와드 +D7OA = 복원 매니저 +D7QA = 리부트 +D7SA = 차일드프루프 USB 로더 +D7TA = 파워 Mii 오프 +D7VA = 파워 오프 +D7WA = 망자의 수도원 +D7XA = 누가사 +D7YA = 저항기 +D81A = 뉴오 애스트로이즈 +D82A = 한국어 디스크 지원하는 cIOS 패치mii 설치 프로그램 +D83A = Wii MFE 포트 +D84A = 갬블 +D85A = Wii E듀크32 +D86A = 파이어wii +D87A = 똑딱똑딱 보트 레이스 +D88A = 콰지88 +D89A = 위모트 LED 플래셔 +D8AA = 프론트 SD ELF 로더 +D8BA = 게임큐브 홈브류 런처 +D8CA = Wii센드 +D8DA = 메뉴 +D8EA = 게코 로더 +D8FA = 쉘 +D8JA = 계산기 +D8QA = 브릭 OS +D8RA = 로또 +D8SA = 브레인f**k +D8UA = TCP로더 +D8VA = 스노트48 +D8WA = Wii60 +D8XA = 올 인 원 에뮤로더 +D8YA = 스위스로더 +D8ZA = 똑딱똑딱 좀비 슛터 +D93A = Wii레이트래커 +D94A = 노웨어 +D95A = 렌더Mii +D96A = Wii모션데모 +D97A = 파이어 +D98A = 인스톨Mii +D99A = 시스템 채널즈 업데이터 +D9BA = 정보 +D9CA = cIOS USB2 설치 프로그램 +D9FA = 덤프 +D9GA = Wad 생성기 +D9IA = SNES9xGX 채널 설치 프로그램 +D9KA = 텍스트리드 +D9LA = 포워더 +DA1A = 라디안워즈 +DA2A = 월석: 힘든 낮의 밤 +DA3A = Wii치 +DA6A = 오톰메티 +DA7A = 천문학 +DA8A = 비어 벨리 빌 3 그릴리렌 +DA9A = 아흐퉁 Wii 커브 +DAAA = Wii넷퍼즐 +DAHA = 아씨오 핵스 +DAMA = 메가코드다운로더 +DAPA = 지도 만들기 +DARA = 애니리전 체인저 +DASA = 아스피린 +DATA = 애니타이틀 딜리터 +DATD = 애니타이틀 딜리터 +DAVA = 어보이드댄스 +DAWA = 아뷰즈 Wii +DB0A = 스피팃츠 +DB2A = 매드 봄버 +DB3A = 스퀘어즈 +DB7A = 블랙스 대쉬 +DB9A = 로비 +DBAA = 활낚시 액션 +DBBA = 밸런스 보드 도구 +DBCA = 부트미 구성 에디터 +DBDA = 블루덤프 +DBGA = 블래스트가이 +DBIA = 부트 잇 +DBLA = 블루MSX-wii +DBMA = 부트IOS +DBPA = 밸런스 보드 프로 +DBRA = Wii브라우저 +DBSA = 대난투스탯츠 +DBTA = 볼트 쓰로워 +DBUA = 버튼캐스트 +DBWA = 리버스mii +DBXA = 비니악스 2 +DC6A = 프로도 (C64-network.org) +DC7A = 계산 +DCAA = Wii카지노 +DCBA = 케스케이드비니쓰 +DCCA = 크리스마스카운트다운 +DCDA = cIOS 다운그레이더 +DCEA = 치트 매니저 +DCFA = 커버플로더 +DCHA = Wii채터 +DCIA = cIOS 설치 프로그램 +DCLA = Configurable USB 로더 +DCNA = 낸드크린 +DCOA = 커넥트Mii +DCPA = 스플래터 캐슬 +DCRA = 코스모라켓티 +DCSA = Cert.sys 추출기 +DCTA = 크리스마스-타입 어드벤처 타임 +DCUA = cIOS 삭제 프로그램 +DCVA = Wii콜에엠 +DCWA = WiiMC 채널 설치 프로그램 +DCXA = 코믹스채널 +DCYA = 실린더 닷지 +DD2A = 더블 대쉬 Wii +DD3A = 다리오 +DD9A = 던전들 +DDAA = 다크콥 +DDBA = 도스박스 Wii +DDCA = d2x cIOS 설치 프로그램 +DDDA = 디스크 드라이브 라이터 +DDEA = Wii모더 +DDFA = 디펜딩구인 +DDHA = 홈브류 디스크 런처 +DDLA = 디스크 로더 +DDMA = 드래곤미디어 플레이어 +DDRA = Wii 중복 채널 제거기 +DDVA = 데볼류션 +DDWA = DOP Mii Wii브류 에디션 +DE2A = 더블다운 +DE5A = 픽투그리드 +DE7A = 커맨더 킨 +DE9A = Wii 배쉬 +DEAA = 헤드트래킹 체험판 +DEBA = 퐁 브레이커 +DEDA = 텍스티드 +DEEA = 이이이익 이이이이익 후우우우우욱 +DEFA = 퓨즈 +DEHA = 체스 +DEME = 펀에뮤 +DEPA = 팩맨 +DERA = 일롱게이티드 렙타일 +DETA = M플레이어 TT +DEWA = Wii 전시 +DF0A = 미니 FS도구상자 +DF3A = 브릭아웃 +DF4A = 스타 캐칭 +DF5A = 섬광등 알람 시계 +DF6A = Wii 퀴즈 +DF7A = 샤노와르 +DF8A = 트라이너리 +DF9A = 청크 뭉크 +DFBA = Fs브라우저 +DFEA = 플립에엠 +DFFA = 심플 FS 덤퍼 +DFGA = 스매싱! +DFIA = Fceugx 채널 설치 프로그램 +DFLA = 스타폴 +DFMA = 에프마이라이프 +DFRA = 프리지마그넷츠 +DFSA = FS도구상자 +DFUA = 퓨즈 +DG3A = 기디 3 +DG7A = Wii펭 +DG8A = 아부심벨 디럭스 +DG9A = 가르나트론 +DGBA = 지엑스박스 +DGCA = 게임큐브 백업 런처 +DGEA = 게코OS +DGFA = 기타즈 온 파이어 +DGGA = 릭의 모험 +DGIA = 그라비티 +DGKA = 프로젝트GMC +DGPA = 제네시스 플러스 +DGSA = 슈팅 갤러리 +DGWA = 굿바이 월드 +DGXA = Gx지오 +DH7A = 하모니의 나이트메어 +DH9A = 예언 +DHBA = 홈브류 브라우저 +DHCA = 영웅 도시 +DHDA = Hid테스트 +DHEA = 헬륨 보이 +DHFA = 홈브류 필터 +DHGA = 휴고-GX +DHHA = H헥센 +DHIA = 핵Mii 설치 프로그램 +DHLA = 헬리 +DHMA = 차리오맨 +DHSA = 홈브류 소터 +DHTA = 하타리 +DHWA = 우리는 어디에도 없다 +DI5A = 탱크스 +DI7A = 엑시튼즈이 +DI8A = IOS58 설치 프로그램 +DI9A = 버라지 +DIBA = 바이너리 쿠리어즈 리볼트 +DICA = 큐빅 +DIEA = 이지IOS +DIGA = 카테고리 +DIMA = 인스펙트Mii +DINA = Mii 설치 프로그램 +DIRA = 아이어닝 메이든 +DISA = Wii 슈퍼소닉 +DITA = IOS236 설치 프로그램 +DIXA = cIOSx 설치 프로그램 +DJAA = 아케이드 직소 +DJCA = 젤리자동차 Wii +DJFA = 조이플로우 +DJJA = 점핑 잭 +DJQA = 쥬얼 퀘스트 +DJWA = Wii 시스템 메뉴 +DK1A = 카라오키 +DK3A = 스케치 파이트 +DK4A = 드로잉 박스 +DK6A = 킹 오브 파이터즈: 용기의 불꽃 +DK7A = 어스크트리스 +DKBA = RPG 베이커 +DKCA = 틱 톡 자동차 레이스 +DKDA = 다크큐브 +DKHA = 가타카나와 히라가나 연습 +DKKA = 한국어키 +DKOA = 코모퐁 +DKPA = 키즈페인트 +DKTA = 태고 +DKWA = 쿠러쉬 +DL3A = 밸리언 +DL4A = 엘페어스 +DL5A = 게임로드 +DL7A = 랩클론 +DLBA = 나의 작은 공 +DLCA = 댄스 클론 +DLDA = 데빌록 +DLEA = 프리로더 +DLFA = 라이프Mii +DLGA = 그라비티 글라이더 +DLIA = WiiMod 라이트 +DLLA = 롤리코포칼립스 +DLMA = 로드Mii +DLNA = 랜더 +DLOA = 라이트아웃 +DLPA = 로판 +DLTA = 레벨툴 +DLUA = Wii런처 +DLXA = 리눅스 설치 프로그램 +DM0A = 폼 +DM5A = 미사일 커맨드 +DM7A = 매치즈 +DM9A = 체크리전 +DMAA = 마메 Wii +DMBA = 멀티부트 +DMCA = 클린립 모드 +DMDA = Wii모드 +DMEA = Mii 추출기 +DMFA = Wii메드나펜 +DMGA = 마이티 채널 +DMHA = 나노메카즈 +DMIA = DIOS MIOS 부스터 +DMJA = 마작 Wii +DMLA = 마이티 로더 +DMMA = 마이메뮤이파이 +DMNA = 매직 넘버 +DMOA = cMIOS 설치 프로그램 +DMPA = M플레이어 CE +DMRA = MIOS 패처 +DMSA = 셧Mii리붓 +DMTA = 메트로놈 +DMUA = 멀티 모드 매니저 +DMWA = 웨이크Mii업 +DN0A = 댓아더 +DN7A = 에일리언 브리드 +DN9A = 포인트 & 클릭 없음 +DNAA = N카드 +DNCA = 네오CD-Wii +DNDA = 닌텐돈트 +DNEA = 그라비티 +DNGA = 네오감마 런처 +DNHA = 헤딩스 +DNIA = 부긴 +DNKA = 네코 프로젝트 II +DNMA = 뉴오 모델 뷰어 +DNNA = 세이브 설치 프로그램 +DNPA = 네오팝Wii +DNRA = 뉴오 런너 +DNSA = 뉴오 슛터 +DNTA = 네오탱크스 +DNWA = 노웰 +DO3A = 3.O +DO5A = 행성 하이블리 +DO6A = 미니 MP3 플레이어 +DOCA = 코드 다운로더 +DOEA = 쇼테스트 +DOGA = 가리우스의 미로 Wii +DOHA = 고옥탄 +DOIA = 네오감마 IOS 스위처 +DOMA = 몰 +DONA = 오프라인 네트워크 에이블러 +DOOA = 둠 +DOPA = 파워체크 +DORA = 리부터 +DOTA = 오픈TTD +DP0A = 스타플릿 +DP1A = 이탈리안 파킹 +DP2A = 퐁2 +DP3A = 잉크폴리 +DP4A = 피럿츠 +DP5A = 픽스 +DP6A = IOS36 패처 +DP7A = 대난투+ Updatifier +DP8A = 영원 +DP9A = 외계인 퍼즐 Wii +DPAA = Wii페인트볼 +DPBA = 프리부터gui +DPCA = 체로포베 +DPEA = 원그래프 +DPFA = 피윅투그리드 +DPGA = 핑거즈 +DPIA = vWii용 패치된 IOS 80 설치 프로그램 +DPJA = 프로젝트 M 런처 +DPKA = 싸이스코 +DPLA = 프릴로더 +DPMA = 뮤직 페인터 +DPNA = RPG 파인애플 아포칼립스 +DPOA = 포스트로더 +DPPA = 프로젝트 패닉 +DPRA = 플라즈마라켓티 +DPSA = 플레이스탯츠 +DPTA = 2.5 +DPVA = 팻트뷰Wii +DPWA = 핌프 마이 Wii +DQ6A = 라이트 +DQ7A = 퀘이크 +DQ8A = 루아프Wii +DQBA = 성경 퀴즈 +DQWA = 퀘이크GX +DR0A = 로코반 +DR1A = Wii 화이트보드 +DR3A = 데쓰 스타 런 +DR4A = 락 종이 가위 +DR5A = 브릭스 +DR6A = 리더 +DR7A = 락블루멧 +DR8A = 오퍼레이션 +DR9A = 픽셀플롯 +DRAA = 레트로아크-Wii +DRBA = 락 밴드 2 WAD 설치 프로그램 +DRCA = Wii크로스 +DRDA = 드로mii +DREA = Wii레시피 +DRFA = 라디오피드즈 +DRGA = 레지 덤퍼 +DRIA = 클린립 +DRKA = 로봇파인드스키튼 +DRMA = Mr. 시트웰 +DROA = 슬라임롤 +DRPA = 마르코스 로페즈 파트 II +DRRA = 립퍼 +DRSA = 레드스퀘어 +DRTA = 테트리스 커스텀 +DRUA = 라디오피드즈 업데이터 +DRVA = 리지듀얼vm +DRWA = 윈터맨 +DRZA = 제레이스 +DS0A = 슛Mii +DS1A = 또 다른 가위 바위 보 +DS2A = 스윙볼2 +DS3A = 세네트 +DS4A = 사 +DS5A = 스네이크2 +DS6A = 스코거 +DS7A = 스윙 볼 +DS8A = 스케이프 +DS9A = 소해정 +DSAA = 스키즘 트래커 +DSBA = 스페이스버블 +DSCA = 소프트칩 +DSDA = 슈퍼덤프 +DSEA = 설정 에디터 GUI +DSFA = 스시피 +DSGA = 세이브게임 매니저 +DSHA = 시스체크 핵스덴 에디션 +DSIA = 심프 IOS 패처 +DSKA = 삭드림즈 +DSLA = Wii 스텔라 +DSMA = 세가 마스터 시스템 플러스 +DSOA = 버뮤다 신드롬 Wii +DSPA = 슈퍼 스타 슛터 +DSRA = Wii스트로브 +DSTA = Wii 솔리테르 +DSUA = 슈퍼 마리오 대전 +DSVA = 스컴VM +DSWA = 슈퍼툭스 Wii +DSXA = 슈퍼 픽셀 점퍼 +DT0A = 타워 디펜스 +DT1A = 순무 +DT2A = 매칭 카드즈 +DT3A = 비체조스 +DT4A = 스두쿠 +DT5A = 포커 +DT6A = 시몬 +DT7A = 그들은 죽지 않는다 +DTAA = Wii-택-토 +DTCA = 카탁토닉 +DTDA = 디센트 +DTEA = 탑에디트 +DTFA = 트라이포스 +DTHA = 헤러틱 +DTIA = Wii트리스 +DTJA = 트로잔 +DTKA = 틱 톡 탱크 파이트 +DTLA = 테일테일 +DTMA = 테트로미노스 +DTNA = 터널 +DTOA = 통 +DTPA = 페인타운 +DTRA = 트루챠 버그 복원기 +DTSA = 사막 버스 +DTTA = 토드트리스 +DTWA = Wii트위트 +DTXA = 텍스트트리스 +DU0A = 덤프mii낸드 +DU7A = 우노 +DU8A = 리얼Wnd +DU9A = 하모니움 +DUBA = 멀티부 +DUDA = 오리 사냥 +DUGA = 기타 펀 +DUIA = 체스UI +DULA = USB 로더 GX +DUNA = 유네임 +DUSA = 부트오파라모드USB +DUTG = DU 태그 채널 +DUWA = Waninkoko의 USB 로더 +DV0A = 프리로더 핵 제거 +DV3A = DVD 브라우저 +DV9A = 센서Mii +DVDA = cIOS DVD 덤퍼 +DVGA = 비디오 게임 +DVHA = 공간 공포 +DVIA = Vbagx 채널 설치 프로그램 +DVLA = 배달원 비기로스 +DVOA = 벡터로이드즈 +DVPA = 프로그레시브 스위치 +DVSA = 게임큐브 세이버 +DVXA = 벡트렉스Wii +DW1A = 인튜이트워즈 +DW5A = 마렐 +DW6A = Wii크래프트 +DW7A = 레이브와일드 +DWAA = Wii애플 +DWBA = Wii츄얼보이 +DWCA = WiiFlow 채널 설치 프로그램 +DWDA = WiiFlow 배너 다운로더 +DWEA = Wii어스 +DWFA = Wii플로우 +DWHA = Wii핸디SDL +DWJA = 쥬얼 +DWKA = Wii브레이커 +DWLA = Wii-리눅스 +DWMA = WAD 매니저 +DWNA = 은완캣 +DWPA = Wii피직스 +DWRA = Wii라디오 +DWTA = Wii투카 +DWUA = 우프 +DWWA = 윈터즈 엔드 +DWXA = Wii엑스플로러 +DX3A = 미드웨이 스페이스 인베이더스 에뮬레이터 +DX4A = 대난투 DX 런처 +DX5A = MP3+G 플레이어 +DX6A = 빌드 블록스 +DX8A = 헥센 +DX9A = 샌드 트랩스 +DXBA = Wii X 볼 +DXEA = SD익스플로러 +DXHA = 텍사스 홀덤 포커 +DXIA = 픽셀레이터 +DXNA = 부트넷픽스 +DXQA = 쿼드랙스 +DXSA = 세이브 추출기 +DXTA = 더 론 픽셀 +DXXA = 헥스사곤 +DXZA = 메가제우스 +DY5A = 다크콥 라이트 +DY6A = 리퀴드 워즈 +DY9A = 테트위스 +DYAA = 스야코소반 +DYBA = 야바우즈 +DYCA = 테트리사이클 +DYEA = 이필렙시 +DYGA = 요그 +DYHA = 하이프노 블래스트 +DYIA = 칩퍼 +DYOA = 장난감 대전 +DYPA = 퐁유어Wii +DYSA = 빛나는 빨강 탱크 +DYTA = 뉴오 도쿄 +DYUA = UFO 레이서 +DYWA = 야츠wii +DYYA = 시스템 설정 대체 도구 +DZ0A = 이젝트 +DZ7A = 세임게임 +DZ9A = 티터 토처 +DZIA = 집 +DZPA = 퍼즈시온 +DZQA = 퀴즈 +DZRA = 레이저워 +DZSA = 스지고이 +DZYA = 스네이크 2 +DZZA = 오픈째즈 +FCEU = FCE 울트라 GX +HWFL = 핵위플로우 +JODI = 홈브류 채널 +LULZ = 홈브류 채널 +MAUI = 백업 홈브류 채널 +OHBC = 홈브류 채널 +PXWE = 프로젝트 X: 사랑의 묘약 참사 +RIIV = 리볼루션 +RMCX = 마리오 카트 Wii CTGP 레볼루션 채널 +SEGA = 제네시스 플러스 GX +SMGX = 세이브게임 매니저 GX +ULFW = u로더 +VBGX = 비주얼 보이 어드밴스 GX +WMH1 = 머더 1+2+3 +WPSX = 플레이스테이션 (PSX) 에뮬레이터 +301E01 = 게임큐브 서비스 디스크 +D23J01 = 게임 대회 우승 기념: 특제 스매시 브라더스 DX 영화 디스크 +D24J01 = 스매시 브라더스 DX 이벤트 디스크 +D28J01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 4월 +D29J01 = 월간 닌텐도 샵 체험판 - 2002년 5월 +D32J01 = 월간 닌텐도 샵 체험판 - 2002년 6월 +D33J01 = 월간 닌텐도 샵 체험판 - 2002년 7월 +D34J01 = 월간 닌텐도 샵 체험판 - 2002년 7월 +D38J01 = 월간 닌텐도 샵 체험판 - 2002년 9월 +D39J01 = 매장 게임 데모 디스크 2002년 10월 +D42J01 = 매장 게임 체험판 디스크 2002년 11월 +D43E01 = 젤다의 전설: 시간의 오카리나 / 마스터 퀘스트 +D43J01 = 젤다의 전설: 시간의 오카리나 GC +D43P01 = 젤다의 전설: 시간의 오카리나 / 마스터 퀘스트 +D43U01 = 젤다의 전설: 시간의 오카리나 (보너스 디스크) +D43W01 = 젤다의 전설: 시간의 오카리나 / 마스터 퀘스트 +D46J01 = 월간 닌텐도 매장 체험판 2003년 1월 1일 +D4BE08 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 35 +D4BP01 = 레지던트 이블 4: 보너스 디스크 +D4BU01 = 레지던트 이블 4: 보너스 디스크 +D53J01 = 닌텐도 게임큐브 소프트 e 카탈로그 2003・봄 +D55J01 = 인터렉티브 디스크 카탈로그 하계 2003년 +D56E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 35 +D56J01 = 포켓몬 채널 (보너스 디스크) +D57E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 34 +D58E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 33 +D59E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 32 +D62E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 31 +D63E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 30 +D64E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 29 +D65E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 28 +D66E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 27 +D66JAF = 바텐 카이토스: 끝나지 않은 날개와 잃어버린 바다 - 특별 체험 디스크 +D67E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 26 +D67J01 = 월간 닌텐도 샵 체험판 - 2003년 12월 +D68E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 25 +D68J01 = 월간 닌텐도 샵 체험판 - 2004년 1월 +D69E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 24 +D72E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 23 +D73E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 22 +D74E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 21 +D75E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 20 +D76E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 19 +D77E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 18 +D77P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2006년 4월 +D78E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 17 +D78J01 = 월간 닌텐도 샵 체험판 - 2004년 5월 +D78P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2005년 10월 +D79E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 16 +D79P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2005년 5월 +D82E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 15 +D82J01 = 월간 닌텐도 샵 체험판 - 2004년 7월 +D82P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2005년 4월 +D83E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 14 +D83P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2005년 2월 +D84E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 13 +D84P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2004년 11월 +D85E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 12 +D85P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2004년 7월 +D86E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 11 +D86J01 = 월간 닌텐도 매장 데모 2004 년 10 월호 +D86P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2004년 5월 +D87E01 = 게임큐브 프리뷰 디스크 +D87P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2004년 3월 +D88E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 10 +D88P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2003년 11월 +D89E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 9 +D89J01 = 클럽 닌텐도 오리지널 e 카탈로그 2004 +D89P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2003년 9월 +D92E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 8 +D92P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2003년 7월 +D93E01 = 인터랙티브 멀티 게임 체험판 디스크 - 버전 7 +D93P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2003년 4월 +D94P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2003년 2월 +D95P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 12월 +DALJ01 = 대난투 스매시 브라더스 DX 체험판 +DBIJ08 = 바이오하자드: 영화 체험판 디스크 +DBJJ08 = 바이오하자드: 스페셜 에디션 체험판 +DBZJ08 = 바이오하자드 제로: 트라이얼 에디션 +DCEP41 = 톰 클랜시의 스플린터 셀 체험판 +DEZP8P = 빌리 해처와 거대한 알 체험판 +DGAJB2 = 기동전사 건담 - 전사들의 궤적 스페셜 디스크 +DLSE64 = 스타 워즈: 로그 스쿼드론 III: 반란군 스트라이크: 리미티드 에디션 보너스 디스크 체험판 +DLSP64 = 스타 워즈: 로그 스쿼드론 III: 반란군 스트라이크: 리미티드 에디션 보너스 디스크 체험판 +DM2J8P = 슈퍼 몽키 볼 2 체험판 +DNUEDA = 나루토 닌자 격돌 2 체험판 +DPIJ01 = 피크민 체험판 +DPNP08 = P.N.03 체험판 +DPOJ8P = 판타지 스타 온라인 에피소드 I & II 트라이얼 에디션 체험판 +DPSJ8P = 판타지 스타 온라인 에피소드 III: C.A.R.D. 레볼루션 체험판 +DR2JCQ = 룬 II: 코르텐 열쇠의 비밀 체험판 +DRSEAF = 소울칼리버 II 체험판 +DSWJ13 = 스타 워즈: 로그 스쿼드론 II 체험판 +DTLX01 = 액션 리플레이 +DVJP08 = 뷰티풀 조 홍보 체험판 +G2BE5G = 검은 상처 +G2BP7D = 검은 상처 +G2CD52 = 진정한 범죄: 뉴욕 도시 +G2CE52 = 진정한 범죄: 뉴욕 도시 +G2CP52 = 진정한 범죄: 뉴욕 도시 +G2CX52 = 진정한 범죄: 뉴욕 도시 +G2DJB2 = 디지몬 배틀 연대기 +G2FD78 = 탁 2: 꿈의 주주 +G2FE78 = 탁 2: 꿈의 주주 +G2FF78 = 탁 2: 꿈의 주주 +G2FP78 = 탁 2: 꿈의 주주 +G2GJB2 = 기동전사 건담: 건담 vs. Z 건담 +G2ME01 = 메트로이드 프라임 2: 메아리 +G2MJ01 = 메트로이드 프라임 2: 검은 메아리들 +G2MP01 = 메트로이드 프라임 2: 메아리 +G2NJ13 = 니드 포 스피트: 언더그라운드 2 +G2OE41 = 페르시아 왕자: 전사의 길 +G2OP41 = 페르시아 왕자: 전사의 길 +G2PE6U = 정령들과 주문들 +G2RE52 = 슈렉 슈퍼 슬램 +G2SJGE = 식신의 성 II +G2TE52 = 토니 호크의 언더그라운드 2 +G2TP52 = 토니 호크의 언더그라운드 2 +G2VE08 = 뷰티풀 죠 2 +G2VJ08 = 뷰티풀 조 2: 검은 필름의 수수께끼 +G2VP08 = 뷰티풀 조 2 +G2XE8P = 소닉 젬즈 컬렉션 +G2XJ8P = 소닉 젬즈 컬렉션 +G2XP8P = 소닉 젬즈 컬렉션 +G3AD69 = 반지의 제왕: 제 3 지대 +G3AE69 = 반지의 제왕: 제 3 지대 +G3AF69 = 반지의 제왕: 제 3 지대 +G3AJ13 = 반지의 제왕: 제 3 지대 +G3AP69 = 반지의 제왕: 제 3 지대 +G3AS69 = 반지의 제왕: 제 3 지대 +G3BE9G = 시리어스 샘: 넥스트 인카운터 +G3BP9G = 시리어스 샘: 넥스트 인카운터 +G3DE6L = 카르멘 산디에고: 도난당한 드럼의 비밀 +G3DP6L = 카르멘 산디에고: 도난당한 드럼의 비밀 +G3DX6L = 카르멘 산디에고: 도난당한 드럼의 비밀 +G3EE51 = XGIII: 익스트림 G 레이싱 +G3EJB0 = 익스트림 G 3 +G3FD69 = 타임스플리터즈: 퓨쳐 퍼펙트 +G3FE69 = 타임스플리터즈: 퓨쳐 퍼펙트 +G3FF69 = 타임스플리터즈: 퓨쳐 퍼펙트 +G3FP69 = 타임스플리터즈: 퓨쳐 퍼펙트 +G3FS69 = 타임스플리터즈: 퓨쳐 퍼펙트 +G3JEAF = 호기심 많은 조지 +G3LE8P = 슈퍼 몽키 볼 어드벤처 +G3LP8P = 슈퍼 몽키 볼 어드벤처 +G3ME41 = 톰 클랜시의 모든 두려움의 합 +G3MP41 = 모든 두려움의 합 +G3NJDA = 나루토: 격투 닌자 대전! 3 +G3QEA4 = 닌자 거북이 3: 뮤턴트 나이트메어 +G3RD52 = 슈렉 2 +G3RE52 = 슈렉 2 +G3RF52 = 슈렉 2 +G3RM52 = 슈렉 2 +G3RP52 = 슈렉 2 +G3SE41 = 버스트 어 무브 3000 +G3SJC0 = 슈퍼 퍼즐 보글 올 스타즈 +G3SWC0 = 슈퍼 퍼즐 보글 올 스타즈 +G3TJ8P = 더비 레이싱 3: 경주마를 만들자! +G3VE69 = NBA 스트리트 볼륨 3 +G3VJ13 = NBA 스트리트 V3: 마리오 덩크 +G3VP69 = NBA 스트리트 볼륨 3 +G3XE52 = 엑스맨: 최후의 전쟁 +G3XP52 = 엑스맨: 최후의 전쟁 +G3YP52 = 슈렉 슈퍼 슬램 +G3YX52 = 슈렉 슈퍼 슬램 +G3YY52 = 슈렉 슈퍼 슬램 +G4AEE9 = 하베스트 문: 매지컬 멜로디 +G4AJ99 = 목장 이야기: 행복의 시 +G4BD08 = 레지던트 이블 4 +G4BE08 = 레지던트 이블 4 +G4BJ08 = 바이오하자드 4 +G4BP08 = 레지던트 이블 4 +G4CE54 = 챨리와 초코렛 공장 +G4CP54 = 챨리와 초코렛 공장 +G4FD69 = 피파 07 +G4FE69 = 피파 07 +G4FF69 = 피파 07 +G4FP69 = 피파 07 +G4GEE9 = 하베스트 문: 또다른 놀라운 인생 +G4GJ99 = 목장 이야기: 소녀들를 위한 원더풀 라이프 +G4IE52 = 슈렉 스매쉬 엔' 크래쉬 레이싱 +G4IP52 = 슈렉 스매쉬 엔' 크래쉬 레이싱 +G4ME69 = 심즈: 세상 밖으로 +G4MP69 = 심즈: 세상 밖으로 +G4NJDA = 나루토: 격투 닌자 대전! 4 +G4OE69 = 심즈 2 : 애완동물 +G4OP69 = 심즈 2 : 애완동물 +G4PJ13 = 심즈 +G4QE01 = 슈퍼 마리오 스트라이커즈 +G4QJ01 = 슈퍼 마리오 스트라이커즈 +G4QP01 = 마리오 스매시 축구 +G4SE01 = 젤다의 전설: 4개의 검 +G4SJ01 = 젤다의 전설: 4개의 검+ +G4SP01 = 젤다의 전설: 4개의 검 +G4WJ99 = 목장 이야기: 세상을 위한 행복의 시 +G4ZE69 = 심즈 2 +G4ZP69 = 심즈 2 +G5BE4Z = 스트라이크 포스 볼링 +G5DE78 = 스쿠비-두! 언마스크드! +G5DP78 = 스쿠비-두! 언마스크드! +G5NEAF = 남코 뮤지엄 50주년 +G5NP69 = 남코 뮤지엄 50주년 +G5SE7D = 스파이로: 영웅의 꼬리 +G5SP7D = 스파이로: 영웅의 꼬리 +G5TE69 = 타이거 우즈 PGA 투어 2005 +G5TP69 = 타이거 우즈 PGA 투어 2005 +G62E54 = 메이저 리그 야구 2k6 +G63E41 = 톰 클랜시의 레인보우 식스 3 +G63P41 = 톰 클랜시의 레인보우 식스 3 +G6FD69 = 2006 피파 월드컵 +G6FE69 = 2006 피파 월드컵 +G6FF69 = 2006 피파 월드컵 +G6FP69 = 2006 피파 월드컵 +G6ME69 = 매든 NFL 06 +G6MP69 = 매든 NFL 06 +G6NE69 = NBA 라이브 06 +G6NP69 = NBA 라이브 06 +G6QE08 = 메가맨 기념 컬렉션 +G6SE7D = 스파이로의 전설: 새로운 시작 +G6SP7D = 스파이로의 전설: 새로운 시작 +G6TE5G = 틴 타이탄즈 +G6TP78 = 틴 타이탄즈 +G6WE69 = 타이거 우즈 PGA 투어 06 +G6WP69 = 타이거 우즈 PGA 투어 06 +G7ME69 = 매든 NFL 07 +G89EAF = 팩 맨 월드 랠리 +G8FE8P = 버추어 퀘스트 +G8FJ8P = 버추어 파이터 사이버 제너레이션 +G8ME01 = 페이퍼 마리오: 천년의 문 +G8MJ01 = 페이퍼 마리오 RPG +G8MK01 = 페이퍼 마리오 - 천년의 문 +G8MP01 = 페이퍼 마리오: 천년의 문 +G8OJ18 = 무적 코털 보보보 탈출!! 하지케 로얄 +G8SJAF = 배틀 스타디움 D.O.N +G8WE01 = 배탤리언 워즈 +G8WJ01 = 돌격!! 패미컴 워즈 +G8WP01 = 배탤리언 워즈 +G94E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 8월 +G95E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 7월 +G96E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 6월 +G96P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 11월 +G97E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 3월 +G97P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 9월 +G97U01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 9월 +G98E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 1월 +G98P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 5월 +G99E01 = 인터랙티브 멀티 게임 체험판 디스크 - 2001년 10월 +G99P01 = 인터랙티브 멀티 게임 체험판 디스크 - 2002년 3월 +G9BEE9 = 마크 데이비스 프로 배스 도전 +G9KJCM = 실황 파워풀 프로 야구 9 결정판 +G9RD7D = 크래쉬 태그 팀 레이싱 +G9RE7D = 크래쉬 태그 팀 레이싱 +G9RF7D = 크래쉬 태그 팀 레이싱 +G9RH7D = 크래쉬 태그 팀 레이싱 +G9RP7D = 크래쉬 태그 팀 레이싱 +G9SE8P = 소닉 히어로즈 +G9SJ8P = 소닉 히어로즈 +G9SP8P = 소닉 히어로즈 +G9TD52 = 샤크 +G9TE52 = 샤크 +G9TF52 = 샤크 +G9TI52 = 샤크 +G9TJC0 = 샤크 +G9TP52 = 샤크 +GA2E51 = 올-스타 야구 2002 +GA3E51 = 올-스타 야구 2003 +GA3J51 = 올-스타 야구 2003 +GA4E51 = 올-스타 야구 2004 +GA7E70 = 백야드 스포츠 야구 2007 +GAAJ08 = 디즈니의 미키&미니 트릭 & 체이스 +GABEAF = 금색의 갓슈벨!! 격전! 최강의 마물들 +GABJB2 = 금색의 갓슈벨: 고! 고! 마물 파이트!! +GACE5H = 아미맨: 공중전 엘리트 미션즈 +GAEJ01 = 동물의 숲 e+ +GAFE01 = 동물의 숲 +GAFJ01 = 동물의 숲 + +GAFP01 = 동물의 숲 +GAFU01 = 동물의 숲 +GAGP70 = 아스테릭스와 오벨릭스 XXL +GAHEGG = 에이리언 호미니드 +GAKE5D = 미드웨이 아케이드 보물 +GALE01 = 대난투 스매시 브라더스 DX +GALJ01 = 대난투 스매시 브라더스 DX +GALP01 = 대난투 스매시 브라더스 DX +GAME5H = 아미맨: 사지 전쟁 +GANE7U = 애니매니악스: 위대한 에드거 사냥 +GANP7U = 애니매니악스: 위대한 에드거 사냥 +GAPE52 = 아메리칸 초퍼 2: 풀 스로틀 +GAQE6S = 아쿠아맨: 아틀란티스 전투 +GARE5H = 아미맨: RTS +GASJ8P = 소닉 어드벤처 디럭스 +GATE51 = ATV 쿼드 파워 레이싱 2 +GATP51 = ATV 쿼드 파워 레이싱 2 +GAUE08 = 아우토 모델리스타 +GAUJ08 = 아우토 모델리스타 U.S.-턴 +GAVE78 = 아바타: 최후의 에어벤더 +GAVY78 = 아바타: 앙의 전설 +GAXE5D = 앤트 불리 +GAYE5D = 미드웨이 아케이드 보물 2 +GAZD69 = 해리 포터와 아즈카반의 죄수 +GAZE69 = 해리 포터와 아즈카반의 죄수 +GAZF69 = 해리 포터와 아즈카반의 죄수 +GAZH69 = 해리 포터와 아즈카반의 죄수 +GAZI69 = 해리 포터와 아즈카반의 죄수 +GAZJ13 = 해리 포터와 아즈카반의 죄수 +GAZM69 = 해리 포터와 아즈카반의 죄수 +GAZP69 = 해리 포터와 아즈카반의 죄수 +GAZS69 = 해리 포터와 아즈카반의 죄수 +GB2J18 = 봄버맨 랜드 2 - 게임 사상 최대 규모의 테마파크 +GB4E51 = 번아웃 2: 탄착점 +GB4P51 = 번아웃 2: 탄착점 +GBDE5G = 블러드레인 +GBDF7D = 블러드레인 +GBDP7D = 블러드레인 +GBDS7D = 블러드레인 +GBFE70 = 백야드 풋볼 +GBGE5G = 봄버맨 제너레이션 +GBGJ18 = 봄버맨 제너레이션 +GBGP7D = 봄버맨 제너레이션 +GBHDC8 = 미스틱 히어로즈 +GBHEC8 = 미스틱 히어로즈 +GBHFC8 = 미스틱 히어로즈 +GBHJC8 = 배틀봉신 +GBHPC8 = 미스틱 히어로즈 +GBIE08 = 레지던트 이블 +GBIJ08 = 바이오하자드 +GBIP08 = 레지던트 이블 +GBKE70 = 백야드 야구 +GBLE52 = 블러디 로어: 프라이멀 퓨리 +GBLP52 = 블러디 로어: 프라이멀 퓨리 +GBME7F = 배트맨: 검은 내일 +GBMJ28 = 배트맨: 검은 내일 +GBMP7F = 배트맨: 검은 내일 +GBNJC0 = 워리어 블레이드: 라스탄 vs 바바리안 편 +GBOE51 = 번아웃 +GBOP51 = 번아웃 +GBPJCM = 야구 2003 배틀 볼 파크 선언 퍼펙트 플레이 프로 야구 +GBQE78 = 로켓 파워: 해변 도적단 +GBQP78 = 로켓 파워: 해변 도적단 +GBRJ18 = 블러디 로어 익스트림 +GBSE8P = 비치 스파이커즈: 버추어 비치 발리볼 +GBSJ8P = 비치 스파이커즈 +GBSP8P = 비치 스파이커즈: 버추어 비치 발리볼 +GBTE70 = 베이블레이드 V포스: 슈퍼 토너먼트 배틀 +GBTJA7 = 폭전슈트 베이블레이드 2002 열투! 마그네틱 배틀!! +GBTP70 = 베이블레이드 V포스: 슈퍼 토너먼트 배틀 +GBVE41 = 배트맨: 복수 +GBVP41 = 배트맨: 복수 +GBWD64 = 스타 워즈 현상금 사냥꾼 +GBWE64 = 스타 워즈 현상금 사냥꾼 +GBWF64 = 스타 워즈 현상금 사냥꾼 +GBWI64 = 스타 워즈 현상금 사냥꾼 +GBWP64 = 스타 워즈 현상금 사냥꾼 +GBWS64 = 스타 워즈 현상금 사냥꾼 +GBXE51 = 데이브 미라 프리스타일 BMX 2 +GBXP51 = 데이브 미라 프리스타일 BMX 2 +GBYE0A = 슈퍼 버블 팝 +GBZE08 = 레지던트 이블 제로 +GBZJ08 = 바이오하자드 제로 +GBZP08 = 레지던트 이블 제로 +GC2E9G = 컨플릭트: 사막 폭풍 2 - 바그다드 귀환 +GC2P75 = 컨플릭트: 사막 폭풍 2 - 바그다드 귀환 +GC3D78 = 스쿠비-두! 미스터리 메이햄 +GC3E78 = 스쿠비-두! 미스터리 메이햄 +GC3F78 = 스쿠비-두! 미스터리 메이햄 +GC3P78 = 스쿠비-두! 미스터리 메이햄 +GC4JBN = 신세기 GPX 사이버 포뮬러: 진화의 길 +GC5PNK = 코코토: 카트 레이서 +GC6E01 = 포켓몬 콜로세움 +GC6J01 = 포켓몬 콜로세움 +GC6P01 = 포켓몬 콜로세움 +GC7PNK = 코코토 플랫폼 점퍼 +GC8JA4 = 크래쉬 밴디쿳: 폭주! 니트로 카트 +GC9P6S = 코난 +GCAE5H = 큐빅스: 모두를 위한 로봇 대결 +GCBE7D = 크래쉬 밴디쿳: 마왕의 부활 +GCBJA4 = 크래쉬 밴디쿳 4: 작렬! 마신 파워 +GCBP7D = 크래쉬 밴디쿳: 마왕의 부활 +GCCE01 = 파이널 판타지 크리스탈 연대기 +GCCJ01 = 파이널 판타지 크리스탈 연대기 +GCCJGC = 파이널 판타지 크리스탈 연대기 +GCCP01 = 파이널 판타지 크리스탈 연대기 +GCDE08 = 레지던트 이블 코드: 베로니카 X +GCDJ08 = 바이오하자드 코드: 베로니카 완전판 +GCDP08 = 레지던트 이블 코드: 베로니카 X +GCEE41 = 톰 클랜시의 스플린터 셀 +GCEP41 = 톰 클랜시의 스플린터 셀 +GCFE9G = 컨플릭트: 사막 폭풍 +GCFP75 = 컨플릭트: 사막 폭풍 +GCGE41 = 미녀 삼총사 +GCGP41 = 미녀 삼총사 +GCHE78 = WWE 크러시 아워 +GCHP78 = WWE 크러시 아워 +GCIE69 = 심즈 +GCIP69 = 심즈 +GCJE41 = 톰 클랜시의 스플린터 셀: 카오스 이론 +GCJP41 = 톰 클랜시의 스플린터 셀: 카오스 이론 +GCLE69 = 셀 데미지 +GCLP69 = 셀 데미지 +GCMJA4 = 근육짱 뿅: 근육섬의 결전 +GCNE7D = 크래쉬 니트로 카트 +GCNP7D = 크래쉬 니트로 카트 +GCOD52 = 콜 오브 듀티: 영광의 시간 +GCOE52 = 콜 오브 듀티: 영광의 시간 +GCOF52 = 콜 오브 듀티: 영광의 시간 +GCOP52 = 콜 오브 듀티: 영광의 시간 +GCPE6S = 캐스퍼: 스피릿 디멘션 +GCPP6S = 캐스퍼: 스피릿 디멘션 +GCQD7D = 버피와 뱀파이어: 필사의 혈투 +GCQE7D = 버피와 뱀파이어: 필사의 혈투 +GCQF7D = 버피와 뱀파이어: 필사의 혈투 +GCQP7D = 버피와 뱀파이어: 필사의 혈투 +GCSEAF = 스트리트 레이싱 신디케이트 +GCSPAF = 스트리트 레이싱 신디케이트 +GCTE51 = 크레이지 택시 +GCTJ8P = 크레이지 택시 +GCTP51 = 크레이지 택시 +GCUE69 = NCAA 풋볼 2005 +GCVEEB = 큐비보어: 적자생존 +GCWJBL = 마법의 호박: 앤과 그렉의 대모험 +GCWP6X = 캐슬윈 +GCZE69 = 캣우먼 +GCZP69 = 캣우먼 +GD4E6S = 다이노토피아: 선스톤 오디세이 +GD5JB2 = 드래곤 드라이브: D-마스터즈 샷 +GD6EB2 = 디지몬 럼블 아레나 2 +GD6P70 = 디지몬 럼블 아레나 2 +GD7E70 = 드래곤 볼 Z - 격투 천하제일 무도회 +GD7PB2 = 드래곤 볼 Z: 격투 천하제일 무도회 +GD9E69 = 드롬 레이서즈 +GD9P69 = 드롬 레이서즈 +GDAJE5 = 도라에몽 모두 놀자! 미니도라랜드 +GDBJ01 = 동물방장 +GDCE51 = 스피드 킹스 +GDCP51 = 스피드 킹스 +GDDE41 = 디즈니의 도날드 덕: 고인 퀙커즈 +GDDP41 = 디즈니의 도날드 덕: 퀙 어택 +GDED71 = 발더스 게이트: 검은 동맹 +GDEE71 = 발더스 게이트: 검은 동맹 +GDEF71 = 발더스 게이트: 검은 동맹 +GDEP71 = 발더스 게이트: 검은 동맹 +GDFE5D = 디펜더 +GDFP5D = 디펜더: 전인류를 위하여 +GDGE7H = 용의 굴 3D: 굴로 돌아가기 +GDGP78 = 용의 굴 3D 스페셜 에디션 +GDIE7D = 다이하드: 벤데타 +GDIP7D = 다이하드: 벤데타 +GDIX7D = 다이하드: 벤데타 +GDIY7D = 다이하드: 벤데타 +GDJEB2 = 디지몬 월드 4 +GDJJB2 = 디지몬 월드 X +GDKEA4 = 디즈니 스포츠: 축구 +GDKJA4 = 디즈니 스포츠: 축구 +GDKPA4 = 디즈니 스포츠: 축구 +GDLEA4 = 디즈니 스포츠: 농구 +GDLJA4 = 디즈니 스포츠: 농구 +GDLPA4 = 디즈니 스포츠: 농구 +GDME01 = 디즈니 미키 마우스 마법의 거울 +GDMJ01 = 디즈니 미키 마우스의 이상한 거울 +GDMP01 = 디즈니 미키 마우스 마법의 거울 +GDNJE8 = 도카폰 DX: 살아갈 세상은 귀신 투성이 +GDOP41 = 디즈니 도날드 덕 PK +GDPJAF = Mr. 드릴러: 드릴 랜드 +GDQE7L = 다큰드 스카이 +GDQP6S = 다큰드 스카이 +GDREAF = 현행범 +GDRP69 = 현행범 +GDSE78 = 어두운 정상 +GDSP78 = 어두운 정상 +GDTE69 = 데프 잼 언더그라운드 파이팅 +GDTP69 = 데프 잼 언더그라운드 파이팅 +GDUJA7 = 듀얼 마스터즈 열투! 배틀 아레나 +GDVE6L = 드리븐 +GDVP6L = 드리븐 +GDWEA4 = 디즈니 스포츠: 풋볼 +GDWJA4 = 디즈니 스포츠: 미식 축구 +GDXEA4 = 디즈니 스포츠: 스케이트보딩 +GDXJA4 = 디즈니 스포츠: 스케이트보딩 +GDXPA4 = 디즈니 스포츠: 스케이트보딩 +GE3E5D = 미드웨이 아케이드 보물 3 +GE4E7D = 4x4 에보 2 +GE5EA4 = 돌연변이 닌자 거북: 뮤턴트 멀리 +GE6JA4 = 영세명인 VI +GE9E5D = 에드, 에드 엔 에디: 더 미스-에드벤쳐스 +GEAE8P = 아르카디아의 하늘 전설 +GEAJ8P = 영원한 아르카디아 전설 +GEAP8P = 아카디아의 하늘 전설 +GEBEA4 = 에볼루션 스노우보딩 +GEBPA4 = 에볼루션 스노우보딩 +GEDE01 = 이터널 다크니스: 세인티의 레퀴엠 +GEDJ01 = 이터널 다크니스: 초대받은 13인 +GEDP01 = 이터널 다크니스: 세인티의 레퀴엠 +GEDW01 = 이터널 다크니스: 세인티의 레퀴엠 +GEGJ8P = 빌리 해쳐의 대모험: 거대한 알 +GEJJCM = 실황 파워풀 프로 야구 11 초결정판 +GEME7F = 에그 매니아: 에그스트림 매드니스 +GEMJ28 = 에그 매니아: 잡고! 돌려! 돗슨 퍼즐! +GEND69 = 제임스 본드 007: 에브리씽 오어 낫씽 +GENE69 = 007: 에브리씽 오어 낫씽 +GENF69 = 제임스 본드 007: 에브리씽 오어 낫씽 +GENJ13 = 007: 에브리씽 오어 낫씽 +GENP69 = 제임스 본드 007: 에브리씽 오어 낫씽 +GENS69 = 제임스 본드 007: 에브리씽 오어 낫씽 +GEOE08 = 캡콤 vs. SNK 2 EO +GEOJ08 = 캡콤 vs. SNK 2 EO: 밀리오네이어 파이팅 2001 +GEOP08 = 캡콤 vs. SNK 2 EO: 밀리오네이어 파이팅 2001 +GESEA4 = 에볼루션 스케이트보딩 +GESJA4 = 에볼루션 스케이트보딩 +GESPA4 = 에볼루션 스케이트보딩 +GEVJ0M = 신기세계 에볼루시아 +GEWE41 = 에볼루션 월드즈 +GEWP41 = 에볼루션 월드즈 +GEXE52 = 디즈니 익스트림 스케이드 어드벤처 +GEXP52 = 디즈니 익스트림 스케이드 어드벤처 +GEXX52 = 디즈니 익스트림 스케이드 어드벤처 +GEXY52 = 디즈니 익스트림 스케이드 어드벤처 +GEYE69 = 파이트 나이트 라운드 2 +GEYJ13 = 파이트 나이트 라운드 2 +GEYP69 = 파이트 나이트 라운드 2 +GEZE8P = 빌리 해쳐와 거대한 알 +GEZP8P = 빌리 해쳐와 거대한 알 +GF4D52 = 판타스틱 4 +GF4E52 = 판타스틱 4 +GF4F52 = 판타스틱 4 +GF4H52 = 판타스틱 4 +GF4I52 = 판타스틱 4 +GF4P52 = 판타스틱 4 +GF4S52 = 판타스틱 4 +GF5D69 = 피파 축구 2005 +GF5E69 = 피파 축구 2005 +GF5F69 = 피파 축구 2005 +GF5H69 = 피파 축구 2005 +GF5I69 = 피파 축구 2005 +GF5P69 = 피파 축구 2005 +GF5S69 = 피파 축구 2005 +GF6D69 = 피파 06 +GF6E69 = 피파 축구 06 +GF6F69 = 피파 06 +GF6H69 = 피파 06 +GF6I69 = 피파 06 +GF6P69 = 피파 06 +GF6S69 = 피파 06 +GF7E01 = 스타폭스 어설트 +GF7J01 = 스타폭스 어설트 +GF7P01 = 스타폭스 어설트 +GF8E69 = 피파 스트리트 +GF8P69 = 피파 스트리트 +GFAD69 = 피파 축구 2003 +GFAE69 = 피파 축구 2003 +GFAF69 = 피파 축구 2003 +GFAI69 = 피파 축구 2003 +GFAJ13 = 피파 유럽 축구 2003 +GFAP69 = 피파 축구 2003 +GFAS69 = 피파 축구 2003 +GFBE5D = 파이어블레이드 +GFBP5D = 파이어블레이드 +GFCP69 = F1 경력 도전 +GFDD69 = 프리덤 파이터즈 +GFDE69 = 프리덤 파이터즈 +GFDF69 = 프리덤 파이터즈 +GFDP69 = 프리덤 파이터즈 +GFEE01 = 파이어 엠블렘: 창염의 궤적 +GFEJ01 = 파이어 엠블렘: 창염의 궤적 +GFEP01 = 파이어 엠블렘: 창염의 궤적 +GFFE5D = 프리키 플라이어즈 +GFGEA4 = 프로거 비욘드 +GFGJA4 = 프로거 +GFGPA4 = 프로거 비욘드 +GFHP6V = 지옥에서 온 이웃 +GFIE69 = 2002 피파 월드컵 +GFIJ13 = 2002 피파 월드컵 +GFKE69 = 프릭스타일 +GFKP69 = 프릭스타일 +GFMJAF = 패밀리 스타디움 2003 +GFNJG2 = 니모를 찾아서 +GFOE78 = 티미의 못말리는 수호천사: 그림자 대결 +GFPEA4 = 개구리: 고대 그림자 +GFQEA4 = 개구리의 모험: 구조대 +GFSE69 = 피파 축구 2002 +GFSJ13 = 피파 월드컵으로 가는 피파 축구 2002 +GFSP69 = 2002 피파 월드컵 +GFSX69 = 2002 피파 월드컵 +GFTE01 = 마리오 골프: 토드스툴 투어 +GFTJ01 = 마리오 골프: 패밀리 투어 +GFTP01 = 마리오 골프: 토드스툴 투어 +GFUE4Z = 퓨처 택틱스: 봉기 +GFUP6V = 퓨처 택틱스: 봉기 +GFVE5D = NFL 블리츠 프로 +GFWE78 = 티미의 못말리는 수호천사: 규칙 위반 +GFXE5D = 프리스타일 메탈 X +GFYE69 = 피파 스트리트 2 +GFYP69 = 피파 스트리트 2 +GFZE01 = F-제로 GX +GFZJ01 = F-제로 GX +GFZP01 = F-제로 GX +GG2E4Z = 트리거 맨 +GG4E08 = 갓챠 포스 +GG4J08 = 갓챠 포스 +GG4P08 = 갓챠 포스 +GG5E52 = 카벨라의 위대한 게임 사냥꾼 2005 +GGAJB2 = 기동전사 건담: 전사들의 궤적 +GGCE0A = 고블린 커맨더: 언리쉬드 호드 +GGCP0A = 고블린 커맨더: 언리쉬드 호드 +GGEE41 = 선과 악을 넘어 +GGEP41 = 선과 악을 넘어 +GGEX41 = 선과 악을 넘어 +GGEY41 = 선과 악을 넘어 +GGFJ01 = 기프트피아 +GGIJ13 = 골든아이 다크 에이전트 +GGKJB2 = 금색의 갓슈벨!! 우정 태그 배틀 풀 파워 +GGNE5D = 빌리와 맨디의 무시무시한 모험 +GGPJAF = SD 건담 가챠폰 워즈 +GGPJB2 = SD 건담 가챠폰 워즈 +GGRD41 = 톰 클랜시의 고스트 리콘 +GGRE41 = 톰 클랜시의 고스트 리콘 +GGRP41 = 톰 클랜시의 고스트 리콘 +GGSEA4 = 메탈 기어 솔리드: 트윈 스네이크즈 +GGSJA4 = 메탈 기어 솔리드: 트윈 스네이크즈 +GGSPA4 = 메탈 기어 솔리드: 트윈 스네이크즈 +GGTE01 = 꼬마 로봇! +GGTJ01 = 꼬마 로봇! +GGTP01 = 꼬마 로봇! +GGVD78 = 보글보글 스폰지밥 +GGVE78 = 보글보글 스폰지밥 +GGVP78 = 보글보글 스폰지밥 +GGYE41 = 톰 클랜시의 고스트 리콘 2 +GGYP41 = 톰 클랜시의 고스트 리콘 2 +GGZE52 = 마다가스카: 왜 비추고 난리야 +GGZH52 = 마다가스카: 왜 비추고 난리야 +GGZI52 = 마다가스카: 왜 비추고 난리야 +GGZJB2 = 마다가스카: 왜 비추고 난리야 +GGZP52 = 마다가스카: 왜 비추고 난리야 +GGZS52 = 마다가스카: 왜 비추고 난리야 +GGZX52 = 마다가스카: 왜 비추고 난리야 +GH2E69 = 니드 포 스피드: 맹열한 추적 2 +GH2P69 = 니드 포 스피드: 맹열한 추적 2 +GH4D69 = 해리 포터와 불의 잔 +GH4E69 = 해리 포터와 불의 잔 +GH4F69 = 해리 포터와 불의 잔 +GH4H69 = 해리 포터와 불의 잔 +GH4I69 = 해리 포터와 불의 잔 +GH4J13 = 해리 포터와 불의 잔 +GH4M69 = 해리 포터와 불의 잔 +GH4P69 = 해리 포터와 불의 잔 +GH4S69 = 해리 포터와 불의 잔 +GH5D52 = 헷지 +GH5E52 = 헷지 +GH5F52 = 헷지 +GH5P52 = 헷지 +GH6EAF = 헬로 키티: 롤러 구조대 +GH6P7N = 헬로 키티: 롤러 구조대 +GH7E5D = 해피 피트 +GH9P52 = 토니 호크의 아메리칸 웨이스트랜드 +GHAE08 = 레지던트 이블 2 +GHAJ08 = 바이오하자드 2 +GHAP08 = 레지던트 이블 2 +GHBE7D = 호빗 +GHBP7D = 호빗 +GHCD4Q = 치킨 리틀 +GHCE4Q = 치킨 리틀 +GHCF4Q = 치킨 리틀 +GHCJG9 = 치킨 리틀 +GHCP4Q = 치킨 리틀 +GHEJ91 = 홈랜드 +GHFE4Z = 핀볼 명예의 전당: 고틀리프 컬렉션 +GHGEEB = 고! 고! 하이퍼그라인드 +GHKD7D = 헐크 +GHKE7D = 헐크 +GHKF7D = 헐크 +GHKP7D = 헐크 +GHKS7D = 헐크 +GHLE69 = 해리 포터와 마법사의 돌 +GHLJ13 = 해리 포터와 마법사의 돌 +GHLP69 = 해리 포터와 마법사의 돌 +GHLX69 = 해리 포터와 마법사의 돌 +GHLY69 = 해리 포터와 마법사의 돌 +GHLZ69 = 해리 포터와 마법사의 돌 +GHMD4F = 히트맨 2: 침묵의 암살자 +GHME4F = 히트맨 2: 침묵의 암살자 +GHMF4F = 히트맨 2: 침묵의 암살자 +GHMP4F = 히트맨 2: 침묵의 암살자 +GHNE71 = 헌터: 심판의 날 +GHNX71 = 헌터: 심판의 날 +GHPE52 = 스트리트 훕스 +GHQE7D = 심슨 가족: 히트 앤 런 +GHQP7D = 심슨 가족: 히트 앤 런 +GHRE78 = 핫 휠즈: 월드 레이스 +GHRP78 = 핫 휠즈: 월드 레이스 +GHSE69 = 해리 포터와 비밀의 방 +GHSJ13 = 해리 포터와 비밀의 방 +GHSP69 = 해리 포터와 비밀의 방 +GHSX69 = 해리 포터와 비밀의 방 +GHSY69 = 해리 포터와 비밀의 방 +GHTJA4 = 히카루의 바둑 3 +GHUE7D = 인크레더블 헐크: 얼티밋 디스트럭션 +GHUF7D = 인크레더블 헐크: 얼티밋 디스트럭션 +GHUP7D = 인크레더블 헐크: 얼티밋 디스트럭션 +GHVE08 = 디즈니의 숨바꼭질 +GHVP08 = 디즈니의 숨바꼭질 +GHWE78 = 핫 휠즈: 벨로시티 X +GHWP78 = 핫 휠즈: 벨로시티 X +GHYE6S = 헌티드 맨션 +GHZE5D = NHL 히츠 프로 +GI2J18 = 모모타로 전철 12 (서일본 편도 있어요!) +GIAE7D = 아이스 에이지 2: 멜트다운 +GIAP7D = 아이스 에이지 2: 멜트다운 +GIBE4F = 이탈리안 잡 +GIBP4F = 이탈리안 잡 +GICD78 = 인크레더블 +GICE78 = 인크레더블 +GICF78 = 인크레더블 +GICH78 = 인크레더블 +GICJG9 = 인크레더블 +GICP78 = 인크레더블 +GIFJDQ = 제너레이션 오브 카오스 익시드: 어둠의 황녀 로제 +GIGJ8P = 블리치 GC 황혼에 대면하는 사신 +GIHD78 = 스쿠비-두! 100 개의 공포의 밤 +GIHE78 = 스쿠비-두! 100 개의 공포의 밤 +GIHF78 = 스쿠비-두! 100 개의 공포의 밤 +GIHP78 = 스쿠비-두! 100 개의 공포의 밤 +GIIJ18 = 모모타로 전철 11 (블랙 봄비 출현!의 권) +GIJEFP = 스페이스 레이더즈 +GIJJC0 = 스페이스 레이더즈 GIJKC0 = 스페이스 레이더스 +GIKE70 = 이카루가 +GIKJ70 = 이카루가 +GIKP70 = 이카루가 +GILE51 = 어그레시브 인라인 +GILP51 = 어그레시브 인라인 +GINE69 = 배트맨 비긴즈 +GINX69 = 배트맨 비긴즈 +GIOJCM = 실황 파워풀 프로 야구 10 초결정판 2003 메모리얼 +GIPEAF = 소년 점프의 원피스: 해적 카니발 +GIPJB2 = 소년 점프의 원피스: 해적 카니발 +GIQE78 = 인크레더블: 언더마이너의 침공 +GIQJ8P = 인크레더블: 강적 언더마이너의 등장 +GIQX78 = 인크레더블: 언더마이너의 침공 +GIQY78 = 인크레더블: 언더마이너의 침공 +GISE36 = 투시력 +GISP36 = 투시력 +GITE01 = 가이스트 +GITP01 = 가이스트 +GIVE4Z = 인텔리비전 라이브즈 +GIZE52 = 타이 더 태즈메이니언 타이거 3: 퀸칸의 밤 +GJ2JCM = 실황 월드 사커 2002 +GJ2PA4 = 인터내셔널 슈퍼스타 축구 2 +GJ3PA4 = 인터내셔널 슈퍼스타 축구 3 +GJBE18 = 봄버맨 제타즈 +GJBE5G = 봄버맨 제타즈 +GJBJ18 = 봄버맨 제타즈 +GJCE8P = 사무라이 잭: 아쿠의 그림자 +GJCP8P = 사무라이 잭: 아쿠의 그림자 +GJDE5S = 져지 드레드: 드레드 vs. 죽음 +GJDX7D = 져지 드레드: 드레드 vs. 죽음 +GJDY7D = 져지 드레드: 드레드 vs. 죽음 +GJFE78 = 천재 소년 지미 뉴트론 제트 퓨전 +GJFP78 = 천재 소년 지미 뉴트론 제트 퓨전 +GJKD52 = 스타 워즈 제다이 기사 II: 제다이 방랑자 +GJKE52 = 스타 워즈 제다이 기사 II: 제다이 방랑자 +GJKF52 = 스타 워즈 제다이 기사 II: 제다이 방랑자 +GJKP52 = 스타 워즈 제다이 기사 II: 제다이 방랑자 +GJND78 = 천재 소년 지미 뉴트론 +GJNE78 = 천재 소년 지미 뉴트론 +GJNP78 = 천재 소년 지미 뉴트론 +GJPJCM = 실황 파워풀 프로 야구 11 +GJSJ18 = 허드슨 셀렉션 Vol. 2: 스타 솔져 +GJUD78 = 원시소년 탁과 마법사 주주 +GJUE78 = 원시소년 탁과 마법사 주주 +GJUF78 = 원시소년 탁과 마법사 주주 +GJUP78 = 원시소년 탁과 마법사 주주 +GJWE78 = 탁: 위대한 주주의 도전 +GJWP78 = 탁: 위대한 주주의 도전 +GJXE51 = 벡스 +GJXP51 = 벡스 +GJYE78 = 천재 소년 지미 뉴트론: 트윙키의 습격 +GJYP78 = 천재 소년 지미 뉴트론: 트윙키의 습격 +GJZE52 = 시월드 어드벤처 파크스: 샤무의 깊은 바다 모험 +GJZP52 = 시월드 어드벤처 파크스: 샤무의 깊은 바다 모험 +GK2D52 = 스파이더맨 2 +GK2E52 = 스파이더맨 2 +GK2F52 = 스파이더맨 2 +GK2I52 = 스파이더맨 2 +GK2P52 = 스파이더맨 2 +GK4E01 = 바텐 카이토스 오리진즈 +GK4J01 = 바텐 카이토스 II: 시작의 날개와 신들의 사자 +GK5E78 = 몬스터 하우스 +GK5P78 = 몬스터 하우스 +GK5X78 = 몬스터 하우스 +GK6JA4 = 고로케! 밴 왕의 위기를 구하라 +GK7E08 = 킬러7 +GK7J08 = 킬러7 +GK7P08 = 킬러7 +GK9EA4 = 카라오케 레볼루션 파티 +GKAE8P = 어메이징 아일랜드 +GKAJ8P = 괴수의 섬: 어메이징 아일랜드 +GKBEAF = 바텐 카이토스: 영원한 날개와 잃어버린 바다 +GKBJAF = 바텐 카이토스: 끝나지 않는 날개와 잃어버린 바다 +GKBPAF = 바텐 카이토스: 영원한 날개와 잃어버린 바다 +GKDJ01 = 거인 도신 +GKDP01 = 거인 도신 +GKEJA4 = 실황 파워풀 프로 야구 12 결정판 +GKFEGG = 카오스 필드 +GKFJ8P = 카오스 필드 익스팬디드 +GKFJMS = 카오스 필드 익스팬디드 +GKGE01 = 동키 콩가 +GKGJ01 = 동키 콩가 +GKGP01 = 동키 콩가 +GKHEA4 = 아서 왕 +GKHPA4 = 아서 왕 +GKJD78 = 카 +GKJE78 = 카 +GKJF78 = 카 +GKJH78 = 카 +GKJJ78 = 카 +GKJP78 = 카 +GKJS78 = 카 +GKKE69 = 녹아웃 킹 2003 +GKKP69 = 녹아웃 킹 2003 +GKLD69 = 반지의 제왕: 왕의 귀환 +GKLE69 = 반지의 제왕: 왕의 귀환 +GKLF69 = 반지의 제왕: 왕의 귀환 +GKLI69 = 반지의 제왕: 왕의 귀환 +GKLJ13 = 반지의 제왕: 왕의 귀환 +GKLP69 = 반지의 제왕: 왕의 귀환 +GKLS69 = 반지의 제왕: 왕의 귀환 +GKME41 = 페르시아 왕자: 두개의 왕좌 +GKMP41 = 페르시아 왕자: 두개의 왕좌 +GKNEB2 = 근육맨 2 세: 신세대 초인 VS 전설 초인 +GKNJB2 = 근육맨 2 세: 신세대 초인 VS 전설 초인 +GKOE70 = 카오 캥거루: 라운드 2 +GKOP6V = 카오 캥거루: 라운드 2 +GKPJA4 = 실황 파워풀 프로 야구 12 +GKQJ01 = 쿠루링 스쿼스! +GKREB2 = 개굴개굴 왕 +GKRJB2 = 개굴개굴 왕 DX +GKRPB2 = 개굴개굴 왕 +GKSE52 = 켈리 슬레이터의 프로 서퍼 +GKSP52 = 켈리 슬레이터의 프로 서퍼 +GKSX52 = 켈리 슬레이터의 프로 서퍼 +GKTJA4 = 캡틴 츠바사: 황금 세대의 도전 +GKUE9G = 스케일러 +GKWJ18 = 드림믹스 TV 월드 파이터즈 +GKXJE7 = 극・마작 DXII: 제 4회 몬도21 컵 +GKYE01 = 커비 에어 라이드 +GKYJ01 = 커비의 에어 라이드 +GKYP01 = 커비 에어 라이드 +GKZD54 = 코드네임: 키즈 넥스트 도어 - 오퍼레이션: 비디오게임 +GKZE9G = 코드네임: 키즈 넥스트 도어 - 오퍼레이션: 비디오게임 +GKZP54 = 코드네임: 키즈 넥스트 도어 - 오퍼레이션: 비디오게임 +GL2E51 = 레슬링의 전설들 2 +GL2P51 = 레슬링의 전설들 II +GL3JE8 = 루팡 3세: 바다로 사라진 보물 +GL5E4F = 레고 스타 워즈: 비디오 게임 +GL5P4F = 레고 스타 워즈: 비디오 게임 +GL5X4F = 레고 스타 워즈: 비디오 게임 +GL7E64 = 레고 스타 워즈 II: 오리지널 3 부작 +GL7P64 = 레고 스타 워즈 II: 오리지널 3 부작 +GL8D4F = 라라 크로프트 툼 레이더: 전설 +GL8E4F = 라라 크로프트 툼 레이더: 전설 +GL8F4F = 라라 크로프트 툼 레이더: 전설 +GL8P4F = 라라 크로프트 툼 레이더: 전설 +GLBE8P = 홈런왕 +GLCD52 = 레모니 스니켓의 위험한 대결 +GLCE52 = 레모니 스니켓의 위험한 대결 +GLCF52 = 레모니 스니켓의 위험한 대결 +GLCP52 = 레모니 스니켓의 위험한 대결 +GLCS52 = 레모니 스니켓의 위험한 대결 +GLEE08 = 레지던트 이블 3: 네메시스 +GLEJ08 = 바이오하자드 3: 최후의 탈출 +GLEP08 = 레지던트 이블 3: 네메시스 +GLGP41 = 라르고 윈치: 위협을 받고 있는 제국 +GLHEG9 = 플러쉬 +GLHPG9 = 플러쉬 +GLIJA7 = 스페셜 인생 게임 +GLJJMS = 라지루기 제네릭 +GLLE78 = 라따뚜이 +GLLF78 = 라따뚜이 +GLME01 = 루이지 맨션 +GLMJ01 = 루이지 맨션 +GLMP01 = 루이지 맨션 +GLNE69 = 루니 툰즈: 백 인 액션 +GLNP69 = 루니 툰즈: 백 인 액션 +GLOD69 = 반지의 제왕: 두 개의 탑 +GLOE69 = 반지의 제왕: 두 개의 탑 +GLOF69 = 반지의 제왕: 두 개의 탑 +GLOI69 = 반지의 제왕: 두 개의 탑 +GLOJ13 = 반지의 제왕: 두 개의 탑 +GLOP69 = 반지의 제왕: 두 개의 탑 +GLOS69 = 반지의 제왕: 두 개의 탑 +GLQE41 = 톰 클랜시의 레인보우 식스: 제재 +GLQP41 = 톰 클랜시의 레인보우 식스: 제재 +GLRD64 = 스타워즈 로그 스쿼드론 III: 반란군 스트라이크 +GLRE64 = 스타워즈 로그 스쿼드론 III: 반란군 스트라이크 +GLRF64 = 스타워즈 로그 스쿼드론 III: 반란군 스트라이크 +GLRP64 = 스타워즈 로그 스쿼드론 III: 반란군 스트라이크 +GLSD64 = 글라디우스 +GLSE64 = 글라디우스 +GLSF64 = 글라디우스 +GLSP64 = 글라디우스 +GLUE7U = 로터스 도전 +GLVD4Q = 나니아 연대기: 사자, 마녀, 그리고 옷장 +GLVE4Q = 나니아 연대기: 사자, 마녀, 그리고 옷장 +GLVF4Q = 나니아 연대기: 사자, 마녀, 그리고 옷장 +GLVP4Q = 나니아 연대기: 사자, 마녀, 그리고 옷장 +GLWE51 = 레슬링의 전설들 +GLWP51 = 레슬링의 전설들 +GLXJ29 = 골퍼의 전설 +GLYE69 = NBA 라이브 2005 +GLYP69 = NBA 라이브 2005 +GLZD69 = 007 위기일발 +GLZE69 = 007 위기일발 +GLZF69 = 007 위기일발 +GLZP69 = 007 위기일발 +GM2E8P = 슈퍼 몽키 볼 2 +GM2J8P = 슈퍼 몽키 볼 2 +GM2P8P = 슈퍼 몽키 볼 2 +GM3E69 = 매든 NFL 2003 +GM3P69 = 매든 NFL 2003 +GM4E01 = 마리오 카트: 더블 대쉬!! +GM4J01 = 마리오 카트: 더블 대쉬!! +GM4P01 = 마리오 카트: 더블 대쉬!! +GM5D7D = 메탈 암즈: 시스템 글리치 +GM5E7D = 메탈 암즈: 시스템 글리치 +GM5F7D = 메탈 암즈: 시스템 글리치 +GM5P7D = 메탈 암즈: 시스템 글리치 +GM6EE9 = 메다보츠 인피니티 +GM6JE9 = 메다롯트 브레이브 +GM6PE9 = 메다보츠 인피니티 +GM8E01 = 메트로이드 프라임 +GM8J01 = 메트로이드 프라임 +GM8P01 = 메트로이드 프라임 +GM9E6S = 머펫 파티 크루즈 +GMAE51 = 올슨 자매: 16번째 생일에 운전 면허를 받았습니다 +GMAP51 = 올슨 자매: 16번째 생일에 운전 면허를 받았습니다 +GMBE8P = 슈퍼 몽키 볼 +GMBJ8P = 슈퍼 몽키 볼 +GMBP8P = 슈퍼 몽키 볼 +GMDE69 = 매든 NFL 2002 +GMEE70 = 맨 인 블랙 II: 에일리언 이스케이프 +GMEP70 = 맨 인 블랙 II: 에일리언 이스케이프 +GMFD69 = 메달 오브 아너: 전선 +GMFE69 = 메달 오브 아너: 전선 +GMFF69 = 메달 오브 아너: 전선 +GMFI69 = 메달 오브 아너: 전선 +GMFP69 = 메달 오브 아너: 전선 +GMFS69 = 메달 오브 아너: 전선 +GMHE52 = 맷 호프먼의 프로 BMX 2 +GMHP52 = 맷 호프먼의 프로 BMX 2 +GMIE70 = 미션 임파서블: 작전명 서마 +GMIJ70 = 미션 임파서블: 오퍼레이션 서마 +GMIP70 = 미션 임파서블: 오퍼레이션 서마 +GMJE41 = 몬스터 잼: 최대 파괴 +GMJP41 = 몬스터 잼: 최대 파괴 +GMKD5D = 모탈 컴뱃: 치명적인 동맹 +GMKE5D = 모탈 컴뱃: 치명적인 동맹 +GMKP5D = 모탈 컴뱃: 치명적인 동맹 +GMLEA4 = ESPN MLS 연장전 2002 +GMNE78 = 몬스터 주식회사: 공포의 섬 +GMNP78 = 몬스터 주식회사: 공포의 섬 +GMOP70 = 마이크로 머신즈 +GMPE01 = 마리오 파티 4 +GMPJ01 = 마리오 파티 4 +GMPP01 = 마리오 파티 4 +GMPW01 = 마리오 파티 4 +GMQE70 = 모노폴리 파티 +GMQP70 = 모노폴리 파티 +GMRE70 = 빅 에어 프리스타일 +GMRP70 = 빅 에어 프리스타일 +GMSE01 = 슈퍼 마리오 선샤인 +GMSJ01 = 슈퍼 마리오 선샤인 +GMSP01 = 슈퍼 마리오 선샤인 +GMTE69 = 디즈니 파티 +GMTJ18 = 디즈니의 마법 공원 +GMTP69 = 디즈니 파티 +GMUE5D = Dr. 무토 +GMWD52 = 마이너리티 리포트: 에브리바디 런즈 +GMWE52 = 마이너리티 리포트: 에브리바디 런즈 +GMWF52 = 마이너리티 리포트: 에브리바디 런즈 +GMWP52 = 마이너리티 리포트: 에브리바디 런즈 +GMXE70 = 엔터 더 매트릭스 +GMXJB2 = 엔터 더 매트릭스 +GMXP70 = 엔터 더 매트릭스 +GMYJ8P = 격투 프로 야구 미즈시마 신지 올 스타즈 VS 프로 야구 +GMZE41 = 몬스터 4x4: 메탈 마스터 +GN2E70 = 나스카: 데이토나의 먼지 +GN3E5D = NHL 히츠 2003 +GN3P5D = NHL 히츠 2003 +GN4E69 = 나스카 2005: 체이스 퍼더컵 +GN7E69 = NFL 스트리트 2 +GN7P69 = NFL 스트리트 2 +GN8E69 = NBA 라이브 2004 +GN8P69 = NBA 라이브 2004 +GN9E70 = 니켈로데온 파티 블래스트 +GNAE8P = NCAA 대학 풋볼 2K3 +GNBE01 = NBA 코트사이드 2002 +GNBJ01 = NBA 코트사이드 2002 +GNBP01 = NBA 코트사이드 2002 +GNCE69 = 나스카 썬더 2003 +GNDD69 = 니드 포 스피드: 언더그라운드 +GNDE69 = 니드 포 스피드: 언더그라운드 +GNDF69 = 니드 포 스피드: 언더그라운드 +GNDJ13 = 니드 포 스피드: 언더그라운드 +GNDP69 = 니드 포 스피드: 언더그라운드 +GNED78 = 니모를 찾아서 +GNEE78 = 니모를 찾아서 +GNEF78 = 니모를 찾아서 +GNEP78 = 니모를 찾아서 +GNES78 = 니모를 찾아서 +GNFE5D = NFL 블리츠 2002 +GNGE69 = NCAA 풋볼 2003 +GNHE5d = NHL 히츠 2002 +GNHP5D = NHL 히츠 2002 +GNIEA4 = 돌연변이 닌자 거북 2: 배틀 넥서스 +GNIPA4 = 돌연변이 닌자 거북 2: 배틀 넥서스 +GNJEAF = 아이-닌자 +GNKE8P = NCAA 대학 농구 2K3 +GNLE69 = NBA 라이브 2003 +GNLP69 = NBA 라이브 2003 +GNMEAF = 남코 뮤지엄 +GNNE69 = NFL 스트리트 +GNNP69 = NFL 스트리트 +GNOE78 = 닉툰즈 유나이트! +GNOX78 = 네모바지 스펀지밥 & 친구들: 유나이트! +GNPP70 = 니켈로데온 파티 블래스트 +GNQE69 = 매든 NFL 2005 +GNQP69 = 매든 NFL 2005 +GNREDA = 나루토: 격투 닌자 대전! +GNRJDA = 나루토: 격투 닌자 대전! +GNSE69 = NBA 스트리트 +GNSJ13 = NBA 스트리트 +GNUEDA = 나루토 - 격투 닌자 대전! 2 +GNUJDA = 나루토 - 격투 닌자 대전! 2 +GNUPDA = 나루토: 격투 닌자 대전! 유럽 버전 +GNWE69 = 데프 잼: 파이트 포 뉴욕 +GNWP69 = 데프 잼: 파이트 포 뉴욕 +GNXE69 = NCAA 풋볼 2004 +GNZE69 = NBA 스트리트 Vol.2 +GNZP69 = NBA 스트리트 Vol.2 +GO2D4F = 블러드 오멘 2: 케인의 유산 +GO2E4F = 블러드 오멘 2: 케인의 유산 +GO2F4F = 블러드 오멘 2: 케인의 유산 +GO2P4F = 블러드 오멘 2: 케인의 유산 +GO3E5D = NFL 블리츠 2003 +GO7D69 = 제임스 본드 007: 나이트파이어 +GO7E69 = 제임스 본드 007: 나이트파이어 +GO7F69 = 제임스 본드 007: 나이트파이어 +GO7P69 = 제임스 본드 007: 나이트파이어 +GO7S69 = 제임스 본드 007: 나이트파이어 +GOAE52 = 카벨라의 야외 모험 +GOBE4Z = 나쁜 녀석들: 마이애미 급습 +GOBP7N = 나쁜 녀석들 2 +GOCE5D = 로드킬 +GODJGA = 시코쿠 순례 체험게임 순례자: 믿음의 도장 (아와국 편) +GOFE7L = 무법 골프 +GOFP6S = 무법 골프 +GOGJB2 = 원피스: 그랜드 배틀! 3 +GOME01 = 마리오 파워 테니스 +GOMJ01 = 마리오 테니스 GC +GOMP01 = 마리오 파워 테니스 +GOND69 = 메달 오브 아너: 유러피언 어썰트 +GONE69 = 메달 오브 아너: 유러피언 어썰트 +GONF69 = 메달 오브 아너: 유러피언 어썰트 +GONJ13 = 메달 오브 아너: 유럽 강습 +GONP69 = 메달 오브 아너: 유러피언 어썰트 +GOOE01 = 오다마 +GOOJ01 = 대옥 +GOOP01 = 오다마 +GOPEB2 = 소년 점프 원피스: 그랜드 배틀 +GOPJB2 = 원피스 그랜드 배틀! 러쉬 +GOQE82 = 원피스: 그랜드 어드벤처 +GOQEAF = 소년 점프 원피스: 그랜드 어드벤처 +GOSE41 = 오픈 시즌 +GOSP41 = 오픈 시즌 +GOSX41 = 오픈 시즌 +GOTJB2 = TV 애니메이션: 원피스 트레저 배틀! +GOUPNK = 코코토 놀이공원 +GOWD69 = 니드 포 스피드: 지명 수배 +GOWE69 = 니드 포 스피드: 지명 수배 +GOWF69 = 니드 포 스피드: 지명 수배 +GOWJ13 = 니드 포 스피드: 지명 수배 +GOWP69 = 니드 포 스피드: 지명 수배 +GOYD69 = 골든아이: 로그 에이전트 +GOYE69 = 골든아이: 로그 에이전트 +GOYF69 = 골든아이: 로그 에이전트 +GOYP69 = 골든아이: 로그 에이전트 +GOYS69 = 골든아이: 로그 에이전트 +GP2EAF = 팩맨 월드 2 +GP2P69 = 팩맨 월드 2 +GP3E78 = 폴라 익스프레스 +GP3P78 = 폴라 익스프레스 +GP4J18 = 허드슨 셀렉션 볼륨 3 PC 원인 +GP5E01 = 마리오 파티 5 +GP5J01 = 마리오 파티 5 +GP5P01 = 마리오 파티 5 +GP5W01 = 마리오 파티 5 +GP6E01 = 마리오 파티 6 +GP6J01 = 마리오 파티 6 +GP6P01 = 마리오 파티 6 +GP7E01 = 마리오 파티 7 +GP7J01 = 마리오 파티 7 +GP7P01 = 마리오 파티 7 +GP8EAF = 팩맨 월드 3 +GP8P69 = 팩맨 월드 3 +GP9E7F = 로그 옵스 +GP9J28 = 로그 옵스 +GP9P7F = 로그 옵스 +GPAE01 = 포켓몬 채널 +GPAJ01 = 포켓몬 채널: 피카츄와 함께! +GPAP01 = 포켓몬 채널 +GPAU01 = 포켓몬 채널 +GPDE51 = 다카르 2: 월드 얼티밋 랠리 +GPDP51 = 다카르 2: 월드 얼티밋 랠리 +GPEJ2Q = 풀 엣지 +GPHD52 = 피트폴: 잃어버린 원정대 +GPHE52 = 피트폴: 잃어버린 원정대 +GPHF52 = 피트폴: 잃어버린 원정대 +GPHP52 = 피트폴: 잃어버린 원정대 +GPIE01 = 피크민 +GPIJ01 = 피크민 +GPIP01 = 피크민 +GPJJCM = 실황 파워풀 프로 야구 10 +GPKE41 = 디즈니의 PK: 그림자 밖으로 +GPLD9G = 피글렛의 빅 게임 +GPLE9G = 피글렛의 빅 게임 +GPLF9G = 피글렛의 빅 게임 +GPLP9G = 피글렛의 빅 게임 +GPMEAF = 팩맨 피버 +GPOE8P = 판타지 스타 온라인 에피소드 I & II +GPOJ8P = 판타지 스타 온라인 에피소드 1 & 2 +GPOP8P = 판타지 스타 온라인 에피소드 I & II +GPPJCM = 실황 파워풀 프로 야구 9 +GPQE6L = 파워퍼프 걸즈: 릴리쉬 램페이지 +GPQP6L = 파워퍼프 걸즈: 릴리쉬 램페이지 +GPRE7U = 당구 파라다이스 +GPRP7U = 당구 파라다이스 +GPSE8P = 판타지 스타 온라인 에피소드 III: 카드 레볼루션 +GPSJ8P = 판타지 스타 온라인 에피소드 III: 카드 레볼루션 +GPSP8P = 판타지 스타 온라인 에피소드 III: 카드 레볼루션 +GPTE41 = 페르시아 왕자: 시간의 모래 +GPTP41 = 페르시아 왕자: 시간의 모래 +GPUE8P = 뿌요 팝 피버 +GPUP8P = 뿌요 팝 피버 +GPVE01 = 피크민 2 +GPVJ01 = 피크민 2 +GPVP01 = 피크민 2 +GPWEAF = 스폰: 아마겟돈 +GPWP69 = 스폰: 아마겟돈 +GPXE01 = 모켓몬 박스: 루비 & 사파이어 +GPXJ01 = 모켓몬 박스: 루비 & 사파이어 +GPXP01 = 모켓몬 박스: 루비 & 사파이어 +GPYJ8P = 뿌요 팝 피버 +GPZJ01 = 닌텐도 퍼즐 컬렉션 +GQ4D78 = 네모바지 스펀지밥: 좌충우돌 대모험 +GQ4E78 = 네모바지 스펀지밥: 좌충우돌 대모험 +GQ4F78 = 네모바지 스펀지밥: 좌충우돌 대모험 +GQ4H78 = 네모바지 스펀지밥: 좌충우돌 대모험 +GQ4P78 = 네모바지 스펀지밥: 좌충우돌 대모험 +GQ8E69 = 매든 NFL 08 +GQAJA7 = 초로 Q! +GQBE51 = NFL 쿼터백 클럽 2002 +GQCD52 = 콜 오브 듀티 2: 빅 레드 원 +GQCE52 = 콜 오브 듀티 2: 빅 레드 원 +GQCF52 = 콜 오브 듀티 2: 빅 레드 원 +GQCI52 = 콜 오브 듀티 2: 빅 레드 원 +GQCP52 = 콜 오브 듀티 2: 빅 레드 원 +GQCS52 = 콜 오브 듀티 2: 빅 레드 원 +GQFFFK = 프랭클린: 깜짝 생일 +GQLE9G = 탐험가 도라: 보라색 행성으로의 여행 +GQLP54 = 탐험가 도라: 보라색 행성으로의 여행 +GQNE5D = 모탈 컴뱃: 디셉션 +GQPE78 = 네모바지 스펀지밥: 비키니 시티의 전쟁 +GQPP78 = 네모바지 스펀지밥: 비키니 시티의 전쟁 +GQQD78 = 보글보글 스폰지밥: 레디, 액션! +GQQE78 = 보글보글 스폰지밥: 레디, 액션! +GQQF78 = 보글보글 스폰지밥: 레디, 액션! +GQQH78 = 보글보글 스폰지밥: 레디, 액션! +GQQP78 = 보글보글 스폰지밥: 레디, 액션! +GQRJ18 = 허드슨 셀렉션 볼륨 1: 큐빅 로드 런너 +GQSDAF = 테일즈 오브 심포니아 +GQSEAF = 테일즈 오브 심포니아 +GQSFAF = 테일즈 오브 심포니아 +GQSIAF = 테일즈 오브 심포니아 +GQSPAF = 테일즈 오브 심포니아 +GQSSAF = 테일즈 오브 심포니아 +GQTE4Q = 로빈슨을 만나다 +GQWE69 = 해리포터: 퀴디치 월드컵 +GQWJ13 = 해리포터: 퀴디치 월드컵 +GQWP69 = 해리포터: 퀴디치 월드컵 +GQWX69 = 해리포터: 퀴디치 월드컵 +GQXE69 = 매든 NFL 2004 +GQXP69 = 매든 NFL 2004 +GQZJ01 = 전설의 퀴즈왕 결정전 +GR2E52 = 잃어버린 왕국들 2 +GR2JCQ = 룬 2: 코르텐 열쇠의 비밀 +GR2P52 = 잃어버린 왕국들 2 +GR3E5D = 레드 카드 2003 +GR4EMZ = MC 그루브즈 댄스 크레이즈 +GR4PMZ = MC 그루브즈 댄스 크레이즈 +GR5J1K = 로보캅: 새로운 위기 +GR6D78 = 브라츠: 락 엔젤즈 +GR6E78 = 브라츠: 락 엔젤즈 +GR6F78 = 브라츠: 락 엔젤즈 +GR6P78 = 브라츠: 락 엔젤즈 +GR8D69 = 메달 오브 아너: 라이징 선 +GR8E69 = 메달 오브 아너: 라이징 선 +GR8F69 = 메달 오브 아너: 라이징 선 +GR8P69 = 메달 오브 아너: 라이징 선 +GR9E6L = 화염의 지배 +GR9P6L = 화염의 지배 +GRAE5Z = 랠리 챔피언쉽 +GRAP75 = 랠리 챔피언쉽 +GRBE6S = 로보테크: 배틀크라이 +GRBP6S = 로보테크: 배틀크라이 +GRDP5D = 레드카드 +GREE08 = 메가맨 네트워크 트랜스미션 +GREJ08 = 록맨 에그제 트랜스미션 +GREP08 = 메가맨 네트워크 트랜스미션 +GRFD78 = 레드 팩션 II +GRFE78 = 레드 팩션 II +GRFF78 = 레드 팩션 II +GRFP78 = 레드 팩션 II +GRHE41 = 레이맨 3: 후드럼 하복 +GRHP41 = 레이맨 3: 후드럼 하복 +GRJEAF = R: 레이싱 에볼루션 +GRJJAF = R 레이싱 에볼루션 +GRJP69 = R: 레이싱 +GRKE41 = 록키 +GRKP7G = 록키 +GRLE41 = 프로 랠리 +GRLP41 = 프로 랠리 +GRMJDA = 모노폴리: 노려라!! 백만장자 인생 +GRNE52 = 잃어버린 왕국들 +GRNJCQ = 룬 +GRNP52 = 잃어버린 왕국들 +GROE5Z = 로드 트립: 아케이드 에디션 +GROP7J = 가젯 레이서즈 +GRQE41 = 시티 레이서 +GRRE78 = 러그래츠: 로얄 랜섬 +GRRF78 = 러그래츠: 로얄 랜섬 +GRRP78 = 러그래츠: 로얄 랜섬 +GRSEAF = 소울칼리버 II +GRSJAF = 소울칼리버 II +GRSPAF = 소울칼리버 II +GRUE78 = 파워 레인져스 다이노 썬더 +GRUF78 = 파워 레인져스 다이노 썬더 +GRUP78 = 파워 레인져스 다이노 썬더 +GRVEA4 = 레이브 마스터 +GRVJA4 = 그루브 어드벤처 레이브: 파이팅 라이브 +GRWJD9 = 슈퍼 로봇 대전 GC +GRYE41 = 레이맨 아레나 +GRZJ13 = 메달 오브 아너: 라이징 선 +GS2D78 = 소환사: 여신 환생 +GS2E78 = 소환사: 여신 환생 +GS2F78 = 소환사: 여신 환생 +GS2P78 = 소환사: 여신 환생 +GS3E51 = SX 슈퍼스타 +GS3P51 = SX 슈퍼스타즈 +GS7E5D = MLB 슬러그페스트 2004 +GS8E7D = 스파이로: 잠자리 진입 +GS8P7D = 스파이로: 잠자리 진입 +GS9E6S = 슈렉 엑스트라 라지 +GS9P6S = 슈렉 엑스트라 라지 +GSAE01 = 스타 폭스 어드벤처즈 +GSAJ01 = 스타 폭스 어드벤처즈 +GSAP01 = 스타 폭스 어드벤처즈 +GSBJ8P = 소닉 어드벤처: 배틀 +GSCE51 = 제레미 맥그래스 슈퍼크로스 월드 +GSCP51 = 제레미 맥그래스 슈퍼크로스 월드 +GSDEAF = 스매싱 드라이브 +GSEJB2 = 샤먼 킹: 소울 파이트 +GSGE5D = MLB 슬러그페스트 2003 +GSHE5D = 스파이헌터 +GSHP5D = 스파이헌터 +GSKE7D = 스콜피온 킹: 아카드의 부활 +GSKP7D = 스콜피온 킹: 아카드의 부활 +GSMD52 = 스파이더맨 +GSME52 = 스파이더맨: 영화 +GSMF52 = 스파이더맨 +GSMJ08 = 스파이더맨: 영화 +GSMP52 = 스파이더맨 +GSNE8P = 소닉 어드벤처 2: 배틀 +GSNP8P = 소닉 어드벤처 2: 배틀 +GSOE8P = 소닉 메가 컬렉션 +GSOJ8P = 소닉 메가 컬렉션 +GSOP8P = 소닉 메가 컬렉션 +GSPE69 = 심슨 가족: 로드 레이지 +GSPP69 = 심슨 가족: 로드 레이지 +GSQE78 = 네모바지 스펀지밥: 플라잉 더치맨의 복수 +GSQP78 = 네모바지 스펀지밥: 플라잉 더치맨의 복수 +GSRE7S = 밀수업자의 질주: 전장 +GSRP7S = 밀수업자의 질주: 전장 +GSSE8P = 세가 축구 슬램 +GSSJ8P = 세가 축구 슬램 +GSSP8P = 세가 축구 슬램 +GSTE69 = SSX 트릭키 +GSTJ13 = SSX 트릭키 +GSTP69 = SSX 트릭키 +GSUE70 = 슈퍼맨: 아포콜립스의 그림자 +GSUP70 = 슈퍼맨: 아포콜립스의 그림자 +GSVE78 = MX 슈퍼플라이 피쳐링 리키 카마이클 +GSVP78 = MX 슈퍼플라이 피쳐링 리키 카마이클 +GSWD64 = 스타 워즈 로그 리더: 로그 스쿼드론 II +GSWE64 = 스타 워즈 로그 스쿼드론 II: 로그 리더 +GSWF64 = 스타 워즈 로그 스쿼드론 II: 로그 리더 +GSWI64 = 스타 워즈 로그 스쿼드론 II: 로그 리더 +GSWJ13 = 스타 워즈 로그 스쿼드론 II +GSWP64 = 스타 워즈 로그 스쿼드론 II: 로그 리더 +GSWS64 = 스타 워즈 로그 리더: 로그 스쿼드론 II +GSXD64 = 스타 워즈: 클론 전쟁 +GSXE64 = 스타 워즈: 클론 전쟁 +GSXF64 = 스타 워즈: 클론 전쟁 +GSXI64 = 스타 워즈: 클론 전쟁 +GSXJ13 = 스타 워즈: 클론 전쟁 +GSXP64 = 스타 워즈: 클론 전쟁 +GSXS64 = 스타 워즈: 클론 전쟁 +GSYE6S = 슈렉: 슈퍼 파티 +GSYP6S = 슈렉: 슈퍼 파티 +GSZP41 = 스피드 챌린지: 자크 빌르너브 레이싱 비전 +GT2J18 = 천외마경 II 만환 +GT3D52 = 토니 호크의 프로 스케이터 3 +GT3E52 = 토니 호크의 프로 스케이터 3 +GT3F52 = 토니 호크의 프로 스케이터 3 +GT3J52 = 토니 호크의 프로 스케이터 3 +GT3P52 = 토니 호크의 프로 스케이터 3 +GT4D52 = 토니 호크의 프로 스케이터 4 +GT4E52 = 토니 호크의 프로 스케이터 4 +GT4F52 = 토니 호크의 프로 스케이터 4 +GT4P52 = 토니 호크의 프로 스케이터 4 +GT5E7N = 스타스키와 허치 +GT5P7N = 스타스키와 허치 +GT6E70 = 터미네이터 3: 구원 +GT6J70 = 터미네이터 3: 구원 +GT6P70 = 터미네이터 3: 구원 +GT7E41 = 톰 클랜시의 스플린터 셀: 판도라 투모로우 +GT7P41 = 톰 클랜시의 스플린터 셀: 판도라 투모로우 +GT7X41 = 톰 클랜시의 스플린터 셀: 판도라 투모로우 +GT8E78 = 빅 무타 트럭커즈 +GT8P7N = 빅 무타 트럭커즈 +GTAE5S = 탑 앵글러: 리얼 배스 낚시 +GTAP5S = 탑 앵글러: 리얼 배스 낚시 +GTBJC0 = NHK 천재 비트군: 그라몬 배틀 +GTCJBL = GT 큐브 +GTDE52 = 토니 호크의 언더그라운드 +GTDP52 = 토니 호크의 언더그라운드 +GTEE01 = 1080° 애벌랜츠 +GTEJ01 = 1080° 은빛 폭풍 +GTEP01 = 1080° 애벌랜츠 +GTFEA4 = 돌연변이 닌자 거북 +GTFPA4 = 돌연변이 닌자 거북 +GTGE60 = 탑 건: 교전 지역 +GTGJ1K = 탑 건: 하늘의 에이스 +GTGP60 = 탑 건: 교전 지역 +GTHJD9 = 자전거 영웅 +GTIE69 = 타이거 우즈 PGA 투어 2003 +GTIP69 = 타이거 우즈 PGA 투어 2003 +GTJE5L = 수염 전쟁 톰과 제리 +GTKD51 = 튜록 에볼루션 +GTKE51 = 튜록 에볼루션 +GTKP51 = 튜록 에볼루션 +GTLE52 = 진정한 범죄: LA의 거리들 +GTLP52 = 진정한 범죄: LA의 거리들 +GTLX52 = 진정한 범죄: LA의 거리들 +GTMJDA = 무쯔와 유유자적 +GTNJ18 = 허드슨 셀렉션 볼륨 4 타카하시 명인의 모험도 +GTOJAF = 테일즈 오브 심포니아 +GTPP6S = 성전 기사단: 지옥의 성전 +GTQE6S = 톤카: 구조 순찰대 +GTRE78 = 테트리스 월드 +GTRJ8N = 테트리스 월드 +GTRP78 = 테트리스 월드 +GTSE4F = 타임스플리터즈 2 +GTSP4F = 타임스플리터즈 2 +GTUE8G = 튜브 슬라이더: 퓨처 포뮬라 챔피언쉽 +GTVE70 = 트랜스월드 서프: 다음 파도 +GTWE70 = 타즈 원티드 +GTWP70 = 타즈 원티드 +GTYE69 = 타이 더 태즈메이니언 타이거 +GTYP69 = 타이 더 태즈메이니언 타이거 +GTZE41 = 타잔 언테임드 +GTZP41 = 타잔 프리라이드 +GU2D78 = 2 합 1: 인크레더블 / 니모를 찾아서 +GU2F78 = 2 합 1: 인크레더블 / 니모를 찾아서 +GU3D78 = 2 합 1: 보글보글 스폰지 밥 / 탁 2: 꿈의 주주 +GU3X78 = 2 합 1: 보글보글 스폰지 밥 / 탁 2: 꿈의 주주 +GU4Y78 = 2 합 1: 보글보글 스폰지 밥 / 비키니 시티의 전쟁 +GU6E78 = 닉툰즈: 화산섬 전쟁 +GUBE69 = 도시의 심즈 +GUBJ13 = 도시의 심즈 +GUBP69 = 도시의 심즈 +GUCD69 = UEFA 챔피언즈 리그 2004-2005 +GUCF69 = UEFA 챔피언즈 리그 2004-2005 +GUCP69 = UEFA 챔피언즈 리그 2004-2005 +GUFE4Z = 얼티밋 파이팅 챔피언쉽 스로우다운 +GUFJ08 = UFC2 탭아웃 파이널 스펙 +GUFP4Z = UFC: 스로우다운 +GUGD69 = 니드 포 스피드: 언더그라운드 2 +GUGE69 = 니드 포 스피드: 언더그라운드 2 +GUGF69 = 니드 포 스피드: 언더그라운드 2 +GUGP69 = 니드 포 스피드: 언더그라운드 2 +GUMD52 = 건 +GUME52 = 건 +GUMP52 = 건 +GUNE5D = 건틀렛: 검은 유산 +GUNP5D = 건틀렛: 검은 유산 +GUPE8P = 섀도우 더 헤지혹 +GUPJ8P = 섀도우 더 헤지혹 +GUPP8P = 섀도우 더 헤지혹 +GUSE7F = 유니버설 스튜디오즈 테마 파크 어드벤처 +GUSJ28 = 유니버설 스튜디오즈 재팬 어드벤처 +GUSP7F = 유니버설 스튜디오즈 테마 파크 어드벤처 +GUTD52 = 얼티밋 스파이더맨 +GUTE52 = 얼티밋 스파이더맨 +GUTF52 = 얼티밋 스파이더맨 +GUTI52 = 얼티밋 스파이더맨 +GUTJC0 = 얼티밋 스파이더맨 +GUTP52 = 얼티밋 스파이더맨 +GUTS52 = 얼티밋 스파이더맨 +GUVE51 = 프리스타일 스트리트 싸커 +GUVP51 = 어반 프리스타일 축구 +GUZE41 = 배트맨: 신주의 부활 +GUZP41 = 배트맨: 신주의 부활 +GV3J70 = V-랠리 3 +GV3P70 = V-랠리 3 +GV4E69 = MVP 야구 2005 +GVCE08 = 뷰티풀 조: 레드 핫 럼블 +GVCJ08 = 뷰티풀 조: 배틀 카니발 +GVCP08 = 뷰티풀 조: 레드 핫 럼블 +GVDE78 = 브라츠 포에버 다이아몬드즈 +GVDP78 = 브라츠 포에버 다이아몬드즈 +GVFJ08 = 뷰티풀 조 리바이블 +GVHE4F = 바이오니클 히어로즈 +GVJE08 = 뷰티풀 죠 +GVJJ08 = 뷰티풀 조 +GVJP08 = 뷰티풀 조 +GVKE52 = 카벨라의 위험한 사냥 2 +GVLD69 = 마벨 네메시스: 불완전한 자들의 부활 +GVLE69 = 마벨 네메시스: 불완전한 자들의 부활 +GVLF69 = 마벨 네메시스: 불완전한 자들의 부활 +GVLP69 = 마벨 네메시스: 불완전한 자들의 부활 +GVMP41 = 슈퍼 버스트-어-무브 올 스타즈 +GVOE69 = 바이오니클 +GVOP69 = 바이오니클 +GVPE69 = MVP 야구 2004 +GVRE7H = 그루브라이더 슬롯 카 썬더 +GVS45E = 버추어 스트라이커 4 +GVSE8P = 버추어 스트라이커 2002 +GVSJ8P = 버추어 스트라이커 3 버전.2002 +GVSP8P = 버추어 스트라이커 3 버전.2002 +GVWJDQ = 학원도시 바라노와르 로제스 +GW2E78 = WWE 심판의 날 2 +GW2P78 = WWE 심판의 날 2 +GW3E78 = WWE 레슬매니아 X8 +GW3JG2 = WWE 레슬매니아 X8 +GW3P78 = WWE 레슬매니아 X8 +GW4E69 = 타이거 우즈 PGA 투어 2004 +GW4P69 = 타이거 우즈 PGA 투어 2004 +GW5D69 = 니드 포 스피드: 카본 +GW5E69 = 니드 포 스피드: 카본 +GW5F69 = 니드 포 스피드: 카본 +GW5P69 = 니드 포 스피드: 카본 +GW6JEM = 위닝 일레븐 6 파이널 에볼루션 +GW7D69 = 제임스 본드 007 에이전트 언더 파이어 +GW7E69 = 제임스 본드 007 에이전트 언더 파이어 +GW7F69 = 제임스 본드 007 에이전트 언더 파이어 +GW7P69 = 제임스 본드 007 에이전트 언더 파이어 +GW8E52 = 포커 월드 시리즈 +GW9E78 = WWE 레슬매니아 XIX +GW9JG2 = WWE 레슬매니아 XIX +GW9P78 = WWE 레슬매니아 XIX +GWAD8P = 스파르탄: 토탈 워리어 +GWAE8P = 스파르탄: 토탈 워리어 +GWAF8P = 스파르탄: 토탈 워리어 +GWAP8P = 스파르탄: 토탈 워리어 +GWBE41 = 웜즈 블래스트 +GWBP41 = 웜즈 블래스트 +GWDP6S = 월드 레이싱 +GWEE51 = 18 휠러: 어메리칸 프로 트러커 +GWEJB0 = 18 휠러: 어메리칸 프로 트러커 +GWEP8P = 18 휠러: 어메리칸 프로 트러커 +GWGE4F = 왁자지껄 골프 +GWGJ4F = 왁자지껄 골프 +GWGP4F = 왁자지껄 골프 +GWHE41 = 곰돌이 푸의 좌충우돌 모험 +GWHP41 = 곰돌이 푸의 좌충우돌 모험 +GWJE52 = 토니 호크의 아메리칸 웨이스트랜드 +GWKE41 = 피터 잭슨의 킹 콩: 영화의 공식 게임 +GWKP41 = 피터 잭슨의 킹 콩: 영화의 공식 게임 +GWLE6L = 월리스와 그로밋: 프로젝트 동물원 +GWLP6L = 월리스와 그로밋: 프로젝트 동물원 +GWLX6L = 월리스와 그로밋: 프로젝트 동물원 +GWME51 = 웜즈 3D +GWMP8P = 웜즈 3D +GWPE78 = WWE 심판의 날 +GWPJG2 = WWE 심판의 날 +GWPP78 = WWE 심판의 날 +GWQE52 = 렉크레스: 야쿠자 미션즈 +GWQP52 = 렉크레스: 야쿠자 미션즈 +GWRE01 = 웨이브 레이스: 푸른 폭풍 +GWRJ01 = 웨이브 레이스: 푸른 폭풍 +GWRP01 = 웨이브 레이스: 푸른 폭풍 +GWSEA4 = ESPN 인터내셔널 동계 스포츠 2002 +GWSJA4 = 하이퍼 스포츠 2002 동계 +GWSPA4 = ESPN 인터내셔널 동계 스포츠 +GWTEA4 = WTA 프로 테니스 +GWTJA4 = WTA 투어 테니스 프로 에볼루션 +GWTPA4 = 프로 테니스 WTA 투어 +GWUE7D = 소용돌이 여행 +GWUP7D = 소용돌이 여행 +GWVE52 = 엑스맨 2: 울버린의 복수 +GWVP52 = 엑스맨 2: 울버린의 복수 +GWVX52 = 엑스맨 2: 울버린의 복수 +GWWE01 = 와리오 월드 +GWWJ01 = 와리오 월드 +GWWP01 = 와리오 월드 +GWXJ13 = 스타워즈 로그 스쿼드론 III: 반란군 스트라이크 +GWYE41 = 톰 클랜시의 스플린터 셀: 더블 에이전트 +GWYX41 = 톰 클랜시의 스플린터 셀: 더블 에이전트 +GWZE01 = 댄스 댄스 레볼루션: 마리오 믹스 +GWZJ01 = 마리오와 함께하는 댄스 댄스 레볼루션 +GWZP01 = 댄싱 스테이지 마리오 믹스 +GX2D52 = 엑스맨 레전드즈 II: 아포칼립스의 부활 +GX2E52 = 엑스맨 레전드즈 II: 아포칼립스의 부활 +GX2P52 = 엑스맨 레전드즈 II: 아포칼립스의 부활 +GX2S52 = 엑스맨 레전드즈 II: 아포칼립스의 부활 +GXAE51 = XGRA 익스트림 G 레이싱 협회 +GXAP51 = XGRA 익스트림 G 레이싱 협회 +GXCE01 = 커스텀 로보 +GXCJ01 = 커스텀 로보: 배틀 레볼루션 +GXEE8P = 소닉 라이더즈 +GXEJ8P = 소닉 라이더즈 +GXEP8P = 소닉 라이더즈 +GXFD69 = 피파 축구 2004 +GXFE69 = 피파 축구 2004 +GXFF69 = 피파 축구 2004 +GXFI69 = 피파 축구 2004 +GXFP69 = 피파 축구 2004 +GXFS69 = 피파 축구 2004 +GXGE08 = 메가맨 X 컬렉션 +GXLE52 = 엑스맨 레전드즈 +GXLP52 = 엑스맨 레전드즈 +GXLX52 = 엑스맨 레전드즈 +GXME52 = 엑스맨: 넥스트 디멘젼 +GXMP52 = 엑스맨: 넥스트 디멘젼 +GXNE5D = 램페이지: 토탈 디스트럭션 +GXOE69 = SSX 온 투어 +GXOJ13 = 마리오와 함께하는 SSX 온 투어 +GXOP69 = SSX 온 투어 +GXOX69 = SSX 온 투어 +GXPE78 = 스핑크스와 저주받은 미이라 +GXPP78 = 스핑크스와 저주받은 미이라 +GXQF41 = 택시 3 +GXRE08 = 메가맨 X: 커맨드 미션 +GXRJ08 = 록맨 X: 커맨드 미션 +GXRP08 = 메가맨 X: 커맨드 미션 +GXSE8P = 소닉 어드벤처 DX: 감독판 +GXSP8P = 소닉 어드벤처 DX: 디렉터 컷 +GXUE41 = 서핑 업 +GXXE01 = 포켓몬 XD: 어둠의 선풍 다크 루기아 +GXXJ01 = 포켓몬 XD: 어둠의 선풍 다크 루기아 +GXXP01 = 포켓몬 XD: 어둠의 선풍 다크 루기아 +GY2E01 = 동키 콩가 2 +GY2J01 = 동키 콩가 2 히트 송 퍼레이드 +GY2P01 = 동키 콩가 2 +GY3J01 = 동키 콩가 3 뷔페! 봄맞이 50곡 +GYAD78 = 신나는 동물농장 +GYAE78 = 신나는 동물농장 +GYAP78 = 신나는 동물농장 +GYAX78 = 신나는 동물농장 +GYBE01 = 동키 콩: 정글 비트 +GYBJ01 = 동키 콩 정글 비트 +GYBP01 = 동키 콩: 정글 비트 +GYFEA4 = 유희왕! 허구에 갇힌 왕국 +GYFJA4 = 유희왕! 허구에 갇힌 왕국 +GYFPA4 = 유희왕! 허구에 갇힌 왕국 +GYKEB2 = 금색의 갓슈!! 우정 태그 배틀 2 +GYKJB2 = 금색의 갓슈!! 우정 태그 배틀 2 +GYMJA4 = 실황 파워풀 메이저 리그 +GYQE01 = 마리오 슈퍼스타즈 야구 +GYQJ01 = 슈퍼 마리오 스테이디움 기적의 야구 +GYQP01 = 마리오 슈퍼스타즈 야구 +GYRE41 = 돌연변이 닌자 거북 +GYRP41 = 돌연변이 닌자 거북 +GYTE69 = 타이 더 태즈메이니언 타이거 2: 부쉬 구조대 +GYTP69 = 타이 더 태즈메이니언 타이거 2: 부쉬 구조대 +GYWDE9 = 하베스트 문: 멋진 인생 +GYWEE9 = 하베스트 문: 멋진 인생 +GYWJ99 = 목장 이야기: 멋진 인생 +GYWPE9 = 하베스트 문: 멋진 인생 +GZ2E01 = 젤다의 전설: 황혼의 공주 +GZ2J01 = 젤다의 전설: 황혼의 공주 +GZ2P01 = 젤다의 전설: 황혼의 공주 +GZ3E70 = 드래곤 볼 Z: 격투 천하제일 무도회 2 +GZ3PB2 = 드래곤 볼 Z: 격투 천하제일 무도회 2 +GZBJB2 = 드래곤 볼 Z +GZCE51 = 주큐브 +GZCJB0 = 주큐브 +GZCP51 = 주큐브 +GZDE70 = 고질라: 괴수대난투 +GZDJ70 = 고질라: 괴수대난투 +GZDP70 = 고질라: 괴수대난투 +GZEE70 = 드래곤 볼 Z: 사가스 +GZFJBP = 격추전기 - 제로 파이터 +GZHJDA = 조이드 풀 메탈 크래쉬 +GZLE01 = 젤다의 전설: 바람의 택트 +GZLJ01 = 젤다의 전설: 바람의 지휘봉 +GZLP01 = 젤다의 전설: 바람의 택트 +GZMP7D = 버트 어글리 마틴즈: 줌 오어 둠 +GZOJDA = 조이드 vs. +GZPE70 = 재퍼: 사악한 귀뚜라미! +GZPP70 = 재퍼: 사악한 귀뚜라미! +GZQE7D = 로봇 +GZQJ7D = 로봇 +GZQP7D = 로봇 +GZSE70 = 조이드 전투 전설들 +GZSJDA = 조이드 vs. II +GZVJDA = 조이드 vs. III +GZWE01 = 와리오 웨어 Inc.: 메가 파티 게임$! +GZWJ01 = 모여라!! 메이드 인 와리오 +GZWP01 = 와리오 웨어 Inc.: 메가 파티 게임$! +P2ME01 = 메트로이드 프라임 2: 메아리 (보너스 디스크) +P4BJ08 = 바이오하자드 4 체험판 +PC6E01 = 포켓몬 콜로세움 보너스 디스크 +PCKJ01 = 포켓몬 콜로세움: 확장 디스크 (보너스 디스크) +PCSJ01 = 포켓몬 콜로세움 보너스 디스크 +PD5JB2 = 드래곤 드라이브: D-마스터즈 샷 (애니메 디스크) +PGPJB2 = SD 건담 가챠폰 워즈 체험판 +PGSJ01 = 메탈 기어 솔리드 - 트윈 스네이크즈 - 스페셜 디스크 +PHEJ91 = 홈랜드 테스트 디스크 +PKBJ01 = 드루아가의 탑 +PM4E01 = 마리오 카트: 더블 대쉬!! 보너스 디스크 +PNRJ01 = 나루토 컬렉션 체험판 +PRJE01 = 팩맨 vs. +PRJJ01 = 팩맨 vs. +PRJP01 = 팩맨 vs. +PZLE01 = 젤다의 전설: 컬렉터즈 에디션 +PZLJ01 = 젤다 컬렉션 +PZLP01 = 젤다의 전설: 컬렉터즈 에디션 +UGPE01 = 게임 보이 플레이어 +UGPJ01 = 게임 보이 플레이어 +UGPP01 = 게임 보이 플레이어 diff --git a/Data/Sys/wiitdb-nl.txt b/Data/Sys/wiitdb-nl.txt index 6431e2365008..639b2c2de9a7 100644 --- a/Data/Sys/wiitdb-nl.txt +++ b/Data/Sys/wiitdb-nl.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: NL_unique version: 20191106234309) +TITLES = https://www.gametdb.com (type: Wii language: NL_unique version: 20230727194218) R23P52 = Barbie en De Drie Musketiers R25PWR = LEGO Harry Potter: Jaren 1-4 R27X54 = Dora redt het Land van Kristal @@ -12,11 +12,11 @@ R42P69 = De Sims 2: Op een Onbewoond Eiland R4CP69 = Simcity Creator R4EP01 = Endless Ocean 2: Een zee vol avontuur R4PP69 = De Sims 2: Huisdieren -R55F41 = Weekend Miljonairs R55P41 = Weekend Miljonairs 1e Editie R5FP41 = Academy of Champions R5PP69 = Harry Potter en de Orde van de Feniks R5PX69 = Harry Potter en de Orde van de Feniks +R5XJ13 = MySims Agents R6XP69 = Hasbro: Familie Spellen Avond 2 R72P5G = Cake Mania: In The Mix! R7YFMR = Peking Express @@ -65,7 +65,6 @@ RHNP70 = My Horse and Me RHZP41 = Horsez: Plezier op de manege RI2P4Q = High School Musical: Sing It! RIGP54 = Go, Diego, Go! Het Grote Dinosaurus Avontuur -RIPPAF = One Piece Unlimited Cruise 1 - The Treasure Beneath the Waves RIQPUJ = Dansen op het ijs RJ9HMN = Think: Train je Brein RJDPKM = Mijn Dierenkliniek @@ -76,7 +75,7 @@ RL2HMN = Paard & Pony: Mijn Paardenstal RL2PFR = Paard & Pony: Mijn Paardenstal RL7P69 = Littlest Pet Shop: Vrienden RLHP52 = Little League World Series Baseball -RLLP70 = Go West!: Een Lucky Luke Avontuur! +RLLP70 = Go West! Een Lucky Luke Avontuur! RLNFMR = Expeditie Robinson RLNHMR = Expeditie Robinson RLNIMR = Expeditie Robinson @@ -89,7 +88,6 @@ RNNP4Q = De Kronieken van Narnia: Prins Caspian RNNX4Q = De Kronieken van Narnia: Prins Caspian RNNY4Q = De Kronieken van Narnia: Prins Caspian RNOP01 = Another Code: R - A Journey Into Lost Memories -RNSP69 = Need for Speed: Carbon RO7P7D = De Legende van Spyro: De Eeuwige Nacht RO8P7D = De Legende van Spyro: De Opkomst van een Draak ROEPGT = Honden Hotel @@ -107,7 +105,6 @@ RQPP52 = cabela's big game hunter 2009 RQWPG9 = Puzzle Quest - Challenge of the Warlords RQXP70 = Asterix en de Olympische Spelen RRCP52 = Barbie Paardenavonturen: Het Paardrijkamp -RRHXUJ = In Mary Kings Riding School 2 RRMP69 = Hasbro Familie Spellen Avond RRMX69 = Hasbro: Familie Spellen Avond RRQP52 = Shrek - Crazy Party Games @@ -198,12 +195,143 @@ STOP4Q = Cars Toon: Takel's Sterke Verhalen STYP52 = Tony Hawk : Shred SVDP52 = SpongeBob Squarepants: Plankton's Robotic Revenge SVMP01 = Super Mario All-Stars : 25th Anniversary Edition +SVQEVZ = Barbie En Haar Zusjes In Het Grote Puppy Avontuur SVQPVZ = Barbie En Haar Zusjes In Het Grote Puppy Avontuur SVZPVZ = Hoe Tem Je Een Draak 2 CG1P52 = Guitar Hero III Custom : Guitar Hero I +RMCPCA = Mario Kart Wii (Catalaanse vertaling) +W2FP = Physiofun - Balance Training +W2GP = Phoenix Wright Ace Attorney: Justice for All +W2MP = Blaster Master: Overdrive +W2PP = Physiofun: Pelvic Floor Training +W3GP = Phoenix Wright Ace Attorney: Trials and Tribulations +W3KP = ThruSpace: High Velocity 3D Puzzle +W3MP = The Three Musketeers: One for all +W44P = Stop Stress: A Day of Fury +W4AP = Arcade Sports: Air Hockey, Bowling, Pool, Snooker +W6BP = Eco-Shooter: Plant 530 +W72P = Successfully Learning German Year 3 +W73P = Successfully Learning German Year 4 +W74P = Successfully Learning German Year 5 +W7IP = Successfully Learning German Year 2 +W8CP = Bit.Trip Core +W8WP = Happy Holidays: Halloween +W9BP = Big Town Shoot +W9RP = Happy Holidays: Christmas +WA4P = WarioWare: Do It Yourself - Showcase +WA7P = Toribash Violence Perfected +WA8P = Art Style: Penta Tentacles +WAEP = Around the world +WAFP = Airport Mania: First Flight +WAHP = Trenches: Generals +WALP = Art Style: light trax +WAOP = The Very Hungry Caterpillar´s ABC +WB2P = Strong Bad Episode 4: Dangeresque 3 +WB3P = Strong Bad Episode 5: 8-bit is Enough +WBEP = Beer Pong: Frat Party Games +WBFP = Bit.Trip Fate +WBGP = Bang Attack +WBPP = PLÄTTCHEN - twist 'n' paint +WBRP = Pirates: The Key of Dreams +WBXP = Strong Bad Episode 1: Homestar Ruiner +WBYP = Strong Bad Episode 2: Strong Badia - The Free +WBZP = Strong Bad Episode 3: Baddest of the Bands +WCHP = Chess Challenge +WCJP = Cocoto: Platform Jumper +WCKP = chick chick BOOM +WCSP = CueSports: Snooker vs Billiards +WD9P = Castlevania: The Adventure ReBirth +WDEP = Magic Destiny Astrological Games +WDFP = Defend your Castle +WDHP = Art Style: ROTOHEX +WDPP = Dr. Mario & Germ Buster (Friend Battle Demo) +WEMP = Aha! I Got It! Escape Game +WETP = PictureBook Games: A Pop-Up Adventure +WF2P = Final Fantasy Crystal Chronicles: My Life as a Darklord +WF4P = Final Fantasy IV: The After Years +WFCP = Final Fantasy Crystal Chronicles: My Life as a King +WFQP = Frogger: Hyper Arcade Edition +WFTP = Fish'em All! +WFVP = Football Up +WFWP = Flowerworks: Follie's Adventure +WFYP = Family Games Pen & Paper Edition +WGDP = Gradius Rebirth +WGFP = Girlfriends Forever: Magic Skate +WGGP = Gabrielle's Ghostly Groove: Monster Mix +WGPP = Zenquaria: Virtual Aquarium +WGSP = Phoenix Wright: Ace Attorney +WHEP = Heracles: Chariot Racing +WHFP = Heavy Fire: Special Operations +WHRP = Heron: Steam Machine +WHWP = HoopWorld: BasketBrawl +WICP = NyxQuest: Kindred Spirits +WIDP = Dracula: Undead Awakening +WIEP = Tales of Monkey Island Chapter 3: Lair of the Leviathan +WILP = Tales of Monkey Island Chapter 1: Launch of the Screaming Narwhal +WIRP = Tales of Monkey Island Chapter 5: Rise Of The Pirate God +WISP = Tales of Monkey Island Chapter 2: The Siege of Spinner Cay +WITP = Aha! I Found It! Hidden Object Game +WIYP = Tales of Monkey Island Chapter 4: The Trial and Execution of Guybrush Threepwood +WJKP = Jewel Keepers: Easter Island +WKBP = You, Me and the Cubes +WKFP = Kung Fu Funk: Everybody Is Kung Fu Fighting +WKKP = Pop-Up Pirates! +WKRP = Karate Phants: Gloves of Glory +WKWP = Adventure on LOST ISLAND: Hidden Object Game WLEE = Leren met de PooYoo's: Aflevering 1 WLEP = Leren met de PooYoo's: Aflevering 1 WLNP = Leren met de PooYoo's: Aflevering 2 +WLOP = LostWinds: Winter of the Melodias +WLZP = lilt line +WM7P = Anima Ark of Sinners +WMBP = MaBoShi: The Three Shape Arcade +WMCP = Monsteca Corral: Monsters Vs. Robots +WMJP = Dive: The Medes Islands Secret +WMSP = Enjoy your massage! +WN9P = Military Madness: Nectaris +WNEP = Penguins & Friends Hey! That’s my Fish! +WNVP = Neves Plus: Phantheon of Tangrams +WOBP = Art Style: ORBIENT +WOTP = Overturn: Mecha Wars +WP3P = Pearl Harbor Trilogy 1941: Red Sun Rising +WP4P = Learning with the PooYoos: Episode 3 +WPKP = Texas Hold'Em Poker +WPQP = Protöthea +WPRP = Art Style: CUBELLO +WPVP = The Tales of Bearsworth Manor: Chaotic Conflicts +WREP = Racers Islands Crazy Arenas +WRIP = Rainbow Islands: Towering Adventure! +WRJP = Racers Islands - Crazy Racers +WRLP = FAST Racing League +WRRP = Robin Hood: The Return Of Richard +WRUP = Bit.Trip Runner +WSGP = Pop Them, Drop Them SAMEGAME +WSNP = Sonic The Hedgehog 4 Episode I +WSUP = Shootanto: Evolutionary Mayhem +WTEP = Tales of Elastic Boy Mission 1 +WTFP = Bit.Trip Flux +WTMP = Adventure Island: The Beginning +WTRP = Bit.Trip Beat +WTWP = Fenimore Fillmore: The Westerner +WTXP = Texas Hold’em Tournament +WU2P = Successfully Learning Mathematics Year 3 +WU3P = Successfully Learning Mathematics Year 4 +WU4P = Successfully Learning Mathematics Year 5 +WUIP = Successfully Learning Mathematics Year 2 +WVBP = Bit.Trip Void +WVOP = Rock'n Roll Climber +WVSP = Gods Vs Humans +WVUP = Mr Bumblebee Racing Champion +WW2P = Where's Wally? Fantastic Journey 2 +WW3P = Where's Wally? Fantastic Journey 3 +WWIP = Where's Wally? Fantastic Journey 1 +WWRP = Excitebike: World Challenge +WWXP = Paper Wars Cannon Fodder +WXBP = Ben 10: Alien Force - The Rise of Hex +WYIP = escapeVektor: Chapter 1 +WYSP = Yard Sale Hidden Treasures Sunnyville +WZIP = Rubik's Puzzle Galaxy: RUSH +WZZP = The Tales of Bearsworth Manor: Puzzling Pages XIBP = Fish em All Demo XICP = Gods vs Humans Demo XIDP = Racers Islands Crazy Racers Demo @@ -220,19 +348,143 @@ XIUP = Soccer Bashi Demo XIVP = Mix Superstar Demo XIZP = 3D Pixel Racing Demo XJEP = Aya and the Cubes of Light Demo +FA9P = Zelda II: The Adventure of Link +FB2L = Super Mario Bros.: The Lost Levels +FBKP = Teenage Mutant Ninja Turles +FC8P = Castlevania II: Simon's Quest +FCSP = Probotector II: Return of the Evil Forces +FDGP = Ghosts'n Goblins +FDRP = Skate or Die +FEML = Bio Miracle Bokutte UPA +FEQP = Castlevania III Dracula's Curse +FERM = Startropics II: Zoda's Revenge +FF5P = Double Dragon II: The Revenge +FFEP = A Boy and His Blob: Trouble on Blobolonia +FFPP = Ufouria: THE SAGA +FFUP = Adventure Island 2 +FFVM = S.C.A.T.: Special Cybernetic Attack Team +JA4P = Super Ghouls'n Ghosts +JABL = Mario’s Super Picross +JADP = The Legend of Zelda: A Link to the Past +JAFP = SimCity +JAHP = R-TYPE III: The Third Lightning +JAJP = Street Fighter II: The World Warrior +JALP = Super Probotector: Alien Rebels +JAZP = The Legend of the Mystical Ninja +JBBP = Super Street Fighter II: The New Challengers +JBDP = Donkey Kong Country 2: Diddy's Kong-Quest +JBIP = Street Fighter II Turbo: Hyper Fighting +JBPP = Donkey Kong Country 3: Dixie Kong’s Double Trouble +JCAL = DoReMi Fantasy - Milon’s DokiDoki Adventure +JCBM = Super Mario RPG: Legend of the Seven Stars +JCCP = Kirby’s Fun Pak +JCDM = Kirby’s Dream Land 3 +JCJP = Super Punch Out!! +JCKP = Space Invaders -The Original Game- +JCTM = Ogre Battle: The March of the Black Queen +JD3P = SUPER E.D.F.: Earth Defense Force +JDJP = Super Star Wars: The Empire Strikes Back +JDLP = Super Star Wars: Return of the Jedi +JDWP = Aero The Acrobat +JDZP = Mystic Quest Legend​ +NACP = The Legend of Zelda: Ocarina of Time +NAMP = Kirby 64: The Crystal Shards +NAOP = 1080°: TenEighty Snowboarding +NARP = The Legend of Zelda: Majora's Mask +NAYM = Ogre Battle 64: Person of Lordly Caliber +LALP = Fantasy Zone II +LANP = Alex Kidd: The Lost Stars +LAPP = Wonder Boy III: The Dragon's Trap +MA8P = Ecco: The Tides of Time +MAHP = Sonic the Hedgehog +MAKP = Shadow Dancer: The Secret of Shinobi +MALP = Bonanza Bros. +MAOP = Bio-Hazard Battle +MAVP = Wonder Boy In Monster World +MAXP = Alex Kidd In The Enchanted Castle +MB6P = Shining Force II +MBBP = Sonic the Hedgehog 2 +MBFP = Shinobi III: Return of the Ninja master +MBIP = Landstalker: The Treasures of King Nole +MBJP = Ghouls'n Ghosts +MBLP = ESWAT City Under Siege +MBMP = Sonic the Hedgehog 3 +MBUP = Sonic 3D: Flickies' Island +MBWM = Columns III: Revenge of Columns +MC3P = Super Street Fighter II: The New Challengers +MCCP = Phantasy Star III: Generations of Doom +MCHM = MUSHA +MCLP = Street Fighter II’: Special Champion Edition +MCQP = Boogerman - A Pick and Flick Adventure +MCRP = Wolf of the Battlefield: MERCS +MCSP = Wonder Boy III: Monster Lair +MCVP = Pitfall: The Mayan Adventure +MCZP = Shanghai II Dragon's Eye +PAAP = Bomberman'93 +PAGL = Bomberman'94 +PARL = Detana Twin Bee +PAWP = Galaga'90 +PBEP = Motoroader +PBIP = Bonk III: Bonk's Big Adventure +PBSP = Chew Man Fu +PBWP = Air 'Zonk' +PCSL = Digital Champ: Battle Boxing +PDJL = Street Fighter II': Champion Edition +QA3P = SimEarth: The Living Planet +QAAP = Super Air Zonk +QABP = Ys Book I & II +QADL = Gradius II: Gofer no Yabou +QAPL = Castlevania: Rondo of Blood +EA5P = Fatal Fury 3: Road To The Final Victory +EA7P = Samurai Shodown IV: Amakusa's Revenge +EA8M = Iron Clad +EAIP = Top Hunter +EBDP = Magical Drop 3 +EBFP = Spin master +EBSP = The Path of the Warrior: Art of Fighting 3 +ECAP = Real Bout Fatal Fury 2: The Newcomers +ECGP = Shock Troopers: 2nd Squad +E54P = GHOSTS'N GOBLINS +E55P = Commando +E57P = SonSon +E6PP = NINJA GAIDEN +C93P = The Last Ninja 2 +C96P = Summer Games 2 +C9IP = Cybernoid HAAA = Fotokanaal +HABA = Wii-winkelkanaal +HACA = Mii-personagekanaal +HADE = Internetkanaal HADP = Internetkanaal HAFP = Weerkanaal +HAGA = Nachrichtenkanaal HAGP = Nieuwskanaal +HAJP = Enquêtekanaal +HAPP = Mii-wedstrijdkanaal +HATP = Nintendo-kanaal +HAVP = Geluksdagkanaal +HAWP = Metroid Prime 3 Preview HAYA = Fotokanaal +HCAP = Jam with the Band Live +HCFE = Wii Speak-Kanaal +HCFP = Wii Speak-Kanaal +OHBC = Homebrew-Kanaal G4BP08 = Resident Evil 4: Wii Edition G4CP54 = Sjakie en chocolade G4MP69 = De Sims: Erop uit! +G4OP69 = De Sims 2: Huisdieren G4ZP69 = De Sims 2 GAZH69 = Harry Potter en de gevangene van Azkaban GF4H52 = Fantastic Four™ and ©2005 GH4H69 = Harry Potter en de Vuurbeker +GHSP69 = Harry Potter en de Geheime Kamer GIQX78 = The Incredibles: De opkomst van De Ondermijner -GQQH78 = Nickelodeon SpongeBob Squarepants: Licht uit, Camera aan! +GQLP54 = Dora the Explorer: Reis naar de Paarse Planeet +GQQD78 = SpongeBob SquarePants: Licht uit, camera aan! +GQQE78 = SpongeBob SquarePants: Licht uit, camera aan! +GQQF78 = SpongeBob SquarePants: Licht uit, camera aan! +GQQH78 = SpongeBob SquarePants: Licht uit, camera aan! +GQQP78 = SpongeBob SquarePants: Licht uit, camera aan! GQWP69 = Harry Potter: WK Zwerkbal +GUBP69 = De Urbz: Sims in the City GWHP41 = Winnie de Poeh en het Knaagje in zijn Maagje diff --git a/Data/Sys/wiitdb-pt.txt b/Data/Sys/wiitdb-pt.txt index 5823881fde83..66b7876db984 100644 --- a/Data/Sys/wiitdb-pt.txt +++ b/Data/Sys/wiitdb-pt.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: PT_unique version: 20191106234316) +TITLES = https://www.gametdb.com (type: Wii language: PT_unique version: 20230727194225) R42P69 = Os SIMS 2: Naufragos R43P69 = EA Sports Active R4PP69 = Os SIMS 2: Animais de Estimação @@ -6,7 +6,9 @@ R5AP8P = A Bússola Dourada R5AX8P = A Bússola Dourada R5PP69 = Harry Potter e a Ordem da Fénix R5PX69 = Harry Potter e a Ordem da Fénix +R5XJ13 = MySims Agents R6XP69 = Hasbro Family Game Night 2 +RBYJ78 = Barnyard RBYP78 = Balbúrdia Na Quinta RCAP78 = Carros RCAX78 = Carros @@ -15,6 +17,7 @@ RG6P69 = Boogie Superstar RGQP70 = Os Caça-Fantasmas: O Vídeo Jogo RH6P69 = Harry Potter e o Príncipe Misterioso RHNP70 = O meu Cavalo e eu +RJ2JGD = 007: Quantum of Solace RL7P69 = Littlest Pet Shop: Novos Amigos RLWP78 = Ratatui RLWX78 = Ratatui @@ -32,7 +35,61 @@ RZRPGT = Destiny Of Zorro SERF4Q = Disney Epic Mickey 2: O Regresso dos Heróis SERP4Q = Disney Epic Mickey 2: O Regresso dos Heróis SHDP52 = Como Treinares o teu Dragão +SIIP8P = Mario & Sonic nos Jogos Olímpicos de Londres 2012 +GFEK01 = Fire Emblem: Path of Radiance +GMSE02 = Super Mario Sunshine Multijogador PT2PSI = SingIt Portugal Hits Festa de Verão +RMCPCA = Mario Kart Wii (tradução catalã) +WA4E = WarioWare: D.I.Y. Showcase +WA4P = _D.I.Y. Showcase +WAQJ = Yakuman Wii: Ide Yousuke no Kenkou Mahjong +WCSE = CueSports: Pool Revolution +WCSP = CueSports: Snooker vs Billiards +WL2E = Target Toss Pro: Lawn Darts +WN9E = Military Madness: Nectaris +WN9J = Military Madness: Nectaris +WN9P = Military Madness: Nectaris +WPKE = Texas Hold'Em Poker +WPKP = Texas Hold'Em Poker +WRIE = Rainbow Islands: Towering Adventure! +WRIP = Rainbow Islands: Towering Adventure! +WRXJ = Mega Man 10 +WSNE = Sonic The Hedgehog 4 Episode I +WSNP = Sonic The Hedgehog 4 Episode I +WTXE = Texas Hold’em Tournament +WTXP = Texas Hold’em Tournament +WZIE = Rubik's Puzzle Galaxy RUSH +WZIP = Rubik's Puzzle Galaxy RUSH +MC3E = Super Street Fighter II: The New Challengers +MC3P = Super Street Fighter II: The New Challengers HAAA = Canal Photo -HAYA = Canal Photo +G6TE5G = Os Jovens Titãs +GAXE5D = Lucas: Um Intruso no Formigueiro +GAZD69 = Harry Potter e o Prisoneiro de Azkaban +GAZE69 = Harry Potter e o Prisoneiro de Azkaban +GAZF69 = Harry Potter e o Prisoneiro de Azkaban +GAZH69 = Harry Potter e o Prisoneiro de Azkaban +GAZI69 = Harry Potter e o Prisoneiro de Azkaban +GAZJ13 = Harry Potter e o Prisoneiro de Azkaban +GAZM69 = Harry Potter e o Prisoneiro de Azkaban +GAZP69 = Harry Potter e o Prisoneiro de Azkaban +GAZS69 = Harry Potter e o Prisoneiro de Azkaban +GB4E51 = Burnout 2: Ponto de Impacto +GB4P51 = Burnout 2: Ponto de Impacto +GEDJ01 = Eternal Darkness: Sanity's Requiem +GENP69 = 007: Everything Or Nothing +GFEJ01 = Fire Emblem: Path of Radiance GHSX69 = Harry Potter e a Câmara dos Segredos +GP3E78 = O Expresso Polar +GPQE6L = As Meninas Super-Poderosas: Relish Rampage +GR9E6L = Reino de Fogo +GT6E70 = O Exterminador do Futuro 3: A Redenção +GUBE69 = Os Urbz: Sims na Cidade +GW7E69 = 007: Agent Under Fire +GW7F69 = 007: Agent Under Fire +GW7P69 = 007: Agent Under Fire +GWKE41 = Peter Jackson's King Kong: O Jogo Oficial do Filme +GXFF69 = FIFA Footeball 2004 +GXFI69 = FIFA Footeball 2004 +GXFP69 = FIFA Football +GZQE7D = Robôs diff --git a/Data/Sys/wiitdb-ru.txt b/Data/Sys/wiitdb-ru.txt index 154ab8ec4ee3..a5e47fbaf5ef 100644 --- a/Data/Sys/wiitdb-ru.txt +++ b/Data/Sys/wiitdb-ru.txt @@ -1,10 +1,14 @@ -TITLES = https://www.gametdb.com (type: Wii language: RU_unique version: 20191106234325) +TITLES = https://www.gametdb.com (type: Wii language: RU_unique version: 20230727194232) R5IR4Q = История игрушек: Парк развлечений RN4P41 = Anno: Create A New World RWAR78 = Валл-И RXDR4Q = Disney Отвечай Не Зевай -RY2R41 = Возвращение бешеных кролегов +RY2R41 = Возвращение бешеных кроликов RYBP69 = BOOM BLOX Bash Party SFDPAF = 家庭训练机 梦幻主题乐园(欧) +SKSE54 = NBA 2K13(美) SP5E70 = 恶徒 来自地底的侵略者(美) STNP41 = Приключения Тинтина: Тайна Единорога +GMSE02 = Супер Марио Саншайн Мультиплеер +SOMR01 = Ритм небес +G3EP51 = XGIII: 익스트림 G 레이싱 diff --git a/Data/Sys/wiitdb-zh_CN.txt b/Data/Sys/wiitdb-zh_CN.txt index ff68c32d85a5..2d84582a044f 100644 --- a/Data/Sys/wiitdb-zh_CN.txt +++ b/Data/Sys/wiitdb-zh_CN.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: ZHCN_unique version: 20191106234333) +TITLES = https://www.gametdb.com (type: Wii language: ZHCN_unique version: 20230727194240) 410E01 = Wii 备份盘 v1.31(美) D2AJAF = 运动生活 探险家 试玩版(日) D2SE18 = 德卡运动会2 试玩版(美) @@ -21,7 +21,7 @@ DK6J18 = 穿越迷路2 试玩版[平衡板][WiFi](日) DMHE08 = 怪物猎人3 试玩版(美) DMHJ08 = 怪物猎人3 试玩版[WiFi](日) DPIE18 = 装扮聚会 试玩版(美) -DQAJK2 = 水瓶座棒球(日) +DQAJK2 = 水瓶座棒球(日或中) DQGP69 = 我的模拟人生 赛车 试玩版(欧) DRME18 = 奇幻房间 试玩版(美) DSFE7U = 胧村正 妖刀传 试玩版(美) @@ -30,13 +30,13 @@ DWEPA4 = 实况足球2008 试玩版(欧) DXSE18 = 德卡运动会 试玩版(美) DZDE01 = 塞尔达传说 黎明公主 试玩版(美) DZDP01 = 塞尔达传说 黎明公主 试玩版(欧) -R22E01 = 弹球小精灵[MP](美) +R22E01 = 弹球小精灵(美) R22J01 = 弹球小精灵[MP](日) R22P01 = 弹球小精灵[MP](欧) R23E52 = 芭比与三个火枪手(美) R23P52 = 芭比与三个火枪手(欧) R24J01 = 用Wii游玩小小机器人(日) -R25EWR = 乐高哈利波特 1-4 学年(美) +R25EWR = 乐高哈利波特 上集(美) R25PWR = 乐高哈利波特 1-4 学年(欧) R26E5G = Data East街机经典(美) R27E54 = 探险家多拉 拯救水晶王国(美) @@ -58,10 +58,10 @@ R2GEXJ = 废墟迷宫 再见月的废墟(美) R2GJAF = 废墟迷宫 再见月的废墟(日) R2GP99 = 废墟迷宫 再见月的废墟(欧) R2HE41 = 想象 冠军骑士(美) -R2IE69 = 美式橄榄球大联盟10[WiFi](美) +R2IE69 = 美式橄榄球大联盟10(美) R2IP69 = 美式橄榄球大联盟10[WiFi](欧) R2JJAF = 太鼓达人Wii(日) -R2KE54 = 唐金拳击[平衡板](美) +R2KE54 = 唐金拳击(美) R2KP54 = 唐金拳击[平衡板](欧) R2LJMS = 草裙舞Wii[平衡板](日) R2ME20 = 巧克力豆大冒险(美) @@ -75,16 +75,16 @@ R2PP99 = 魔法高尔夫(欧) R2QJC0 = 料理妈妈2 糟糕!妈妈好忙!!(日) R2RE4F = 小马伙伴2(美) R2RP4F = 小马伙伴2(欧) -R2SE18 = 德卡运动会2[WiFi](美) +R2SE18 = 德卡运动会2(美) R2SJ18 = 德卡运动会2[WiFi](日) R2SP18 = 德卡运动会2[WiFi](欧) R2TE41 = 忍者神龟 毁灭[WiFi](美) R2TP41 = 忍者神龟 毁灭[WiFi](欧) R2UE8P = 一起来敲打(美) -R2UJ8P = 一起来敲打(日) +R2UJ8P = 一起来拍打(日或中) R2UP8P = 一起来敲打(欧) R2VE01 = 罪与罚 宇宙的后继者[WiFi](美) -R2VJ01 = 罪与罚 宇宙的后继者[WiFi](日) +R2VJ01 = 罪与罚 宇宙的后继者(日或中) R2VP01 = 罪与罚 宇宙的后继者[WiFi](欧) R2WEA4 = 实况足球2009[WiFi](美) R2WJA4 = 实况足球2009[WiFi](日) @@ -100,15 +100,15 @@ R35JC8 = 三国志11 威力加强版(日) R36E69 = 摇滚乐队 绿日乐队(美) R36P69 = 摇滚乐队 绿日乐队(欧) R37E69 = 摇滚乐队 金属乐曲包(美) -R38E78 = 超级漫画英雄战队(美) +R38E78 = 漫威超级英雄小队(美) R38P78 = 超级漫画英雄战队(欧) -R38X78 = 超级漫画英雄战队 沃尔玛版(X) +R38X78 = 漫威超级英雄小队 沃尔玛版(X) R38Y78 = 超级漫画英雄战队(Y) R39EFP = 禧玛诺极限钓鱼(美) R39PNK = 禧玛诺极限钓鱼(欧) R3AE20 = 故事时间 冒险故事(美) R3AP7J = 故事时间 冒险故事(欧) -R3BE8P = 快乐桑巴[WiFi](美) +R3BE8P = 快乐桑巴(美) R3BJ8P = 快乐桑巴[WiFi](日) R3BP8P = 快乐桑巴[WiFi](欧) R3CE20 = 克莱斯勒经典赛车(美) @@ -118,11 +118,11 @@ R3DPS5 = 梦幻弹球3D(欧) R3EEWR = 游戏派对3(美) R3EPWR = 游戏派对3(欧) R3FJA4 = 实况力量棒球大联盟3(日) -R3GXUG = 国际儿童 疯狂小型高尔夫[MP](X) +R3GXUG = 儿童高尔夫(X) R3HP6Z = 特工雨果 热带假期(欧) R3HX6Z = 特工雨果 热带假期(X) -R3IJ01 = 用Wii玩银河战士Prime(日或中) -R3JE5G = 去玩吧马戏团明星[平衡板](美) +R3IJ01 = 用Wii玩银河战士(日或中) +R3JE5G = 去玩吧 马戏团明星(美) R3KP6N = 摩天大楼(欧) R3LEWR = 绿光战警 猎人的崛起(美) R3LPWR = 绿光战警 猎人的崛起(欧) @@ -155,7 +155,7 @@ R42E69 = 模拟人生2 生存游戏(美) R42P69 = 模拟人生2 生存游戏(欧) R43E69 = EA运动活力[平衡板](美) R43J13 = EA运动活力[平衡板](日) -R43P69 = EA运动活力[平衡板](欧) +R43P69 = EA运动活力(欧) R44J8P = 凉宫春日的并列(日) R46ENS = 灵武战记Wii(美) R46JKB = 灵武战记Wii(日) @@ -163,7 +163,7 @@ R47E20 = ATV沙滩车之王(美) R48E7D = 奇幻精灵事件簿(美) R48P7D = 奇幻精灵事件簿(欧) R49E01 = 大金刚 丛林敲击(美) -R49J01 = 大金刚 丛林敲击(日或中) +R49J01 = 大金刚 丛林节拍(日或中) R49P01 = 大金刚 丛林敲击(欧) R4AE69 = 模拟动物(美) R4AJ13 = 模拟动物(日) @@ -175,7 +175,7 @@ R4CJ13 = 模拟城市 建筑大师[WiFi](日) R4CK69 = 模拟城市 建筑大师[WiFi](韩) R4CP69 = 模拟城市 建筑大师[WiFi](欧) R4DDUS = 三个问号 高校之迷(德) -R4EE01 = 永恒蔚蓝2 蓝色世界[WiFi](美) +R4EE01 = 永恒蔚蓝2 蓝色世界(美) R4EJ01 = 永恒蔚蓝2 海的呼唤[WiFi](日) R4EP01 = 永恒蔚蓝2 深海探险[WiFi](欧) R4FE20 = 故事时间 童话故事(美) @@ -190,27 +190,26 @@ R4NX5G = 大小调的庄严进行曲(欧) R4PE69 = 模拟人生2 宠物(美) R4PP69 = 模拟人生2 宠物(欧) R4QE01 = 马里奥激情足球[WiFi](美) -R4QJ01 = 马里奥激情足球[WiFi](日) +R4QJ01 = 马里奥激情足球(日) R4QK01 = 马里奥激情足球[WiFi](韩) -R4QP01 = 马里奥激情足球[WiFi](欧) +R4QP01 = 马里奥激情足球(欧) R4RE69 = FIFA足球10[WiFi](美) R4RJ13 = FIFA足球10[WiFi](日) R4RK69 = FIFA足球10[WiFi](韩) R4RP69 = FIFA足球10[WiFi](欧) R4RX69 = FIFA足球10[WiFi](X) R4RY69 = FIFA足球10[WiFi](Y) -R4RZ69 = 自制 FIFA足球10[WiFi](美) +R4RZ69 = FIFA足球10(Z) R4SE54 = 北美职棒超明星(美) R4VEA4 = 故事绘本工坊(美) R4VJA4 = 电视剧场Wii[WiFi](日) R4WJA4 = 实况力量棒球大联盟2009(日) R4YJ2M = 猫社长蕾娜Wii(日) -R4ZJ01 = 零 月蚀之假面(日) +R4ZJ01 = 零 月蚀之假面(日或中) R52E08 = 尼奥宠物谜题大冒险(美) -R52P08 = 尼奥宠物谜题大冒险[WiFi](欧) +R52P08 = 尼奥宠物谜题大冒险(欧) R53PFH = 混音大师 阿曼凡布伦(欧) R54FMR = 倒数游戏(法) -R55F41 = 谁想成为百万富翁(法) R55P41 = 谁想成为百万富翁(欧) R56EG9 = 铁臂阿童木(美) R56PG9 = 铁臂阿童木(欧) @@ -220,14 +219,14 @@ R58FMR = 你来唱[麦克风](法) R58PMR = 你来唱[麦克风](欧) R58SMR = 你来唱[麦克风](西) R59D4Q = 企鹅俱乐部 游戏日[WiFi](欧) -R59E4Q = 企鹅俱乐部 游戏日[WiFi](美) +R59E4Q = 企鹅俱乐部 游戏日(美) R59P4Q = 企鹅俱乐部 游戏日[WiFi](欧) R5AE8P = 黄金罗盘(美) R5AP8P = 黄金罗盘(欧) R5AX8P = 黄金罗盘(X) R5DE5G = 翻转的扭曲世界(美) R5EPMR = 倒计时(欧) -R5FE41 = 冠军学院 足球[MP][平衡板](美) +R5FE41 = 冠军学院 足球(美) R5FP41 = 冠军学院 足球[MP][平衡板](欧) R5GE78 = 你比五年级生聪明吗(美) R5IE4Q = 玩具总动员(美) @@ -246,8 +245,8 @@ R5PX69 = 哈利波特与凤凰社(X) R5QPGT = 马戏团游戏(欧) R5SERW = 幽灵庄园的秘密(美) R5TE69 = 大满贯网球[MP][WiFi](美) -R5TJ13 = 大满贯网球[MP][WiFi](日) -R5TP69 = 大满贯网球[MP][WiFi](欧) +R5TJ13 = 大满贯网球(日) +R5TP69 = 大满贯网球(欧) R5UE41 = 犯罪现场调查 致命意图(美) R5UP41 = CSI犯罪现场 致命意图(欧) R5VE41 = 阿凡达[MP][平衡板](美) @@ -257,21 +256,21 @@ R5WEA4 = 寂静岭 破碎的记忆(美) R5WJA4 = 寂静岭 破碎的记忆(日) R5XJ13 = 我的模拟人生 特工(日) R5XP69 = 我的模拟人生 特工(欧) -R5YD78 = 全明星啦啦队[平衡板](德) -R5YE78 = 全明星啦啦队2[平衡板](美) +R5YD78 = 全明星啦啦队2(德) +R5YE78 = 全明星啦啦队2(美) R5YP78 = 全明星啦啦队2[平衡板](欧) R62E4Q = 迪士尼 想唱就唱 流行节奏(美) R62P4Q = 迪士尼 想唱就唱 流行节奏(欧) R63EG9 = 家庭聚会 30款有趣的户外游戏(美) R63PG9 = 家庭聚会 30款有趣的户外游戏(欧) -R64E01 = Wii音乐[平衡板][WiFi](美) +R64E01 = Wii音乐(美) R64J01 = Wii音乐[平衡板][WiFi](日) R64K01 = Wii音乐[平衡板][WiFi](韩) R64P01 = Wii音乐[平衡板][WiFi](欧) R65ENR = 猎鹿狂(美) R66E41 = 按你的运气 2010版(美) R67E6K = 聪明系列出品 佳佳的冒险(美) -R68E5G = 去玩吧 城市运动[平衡板](美) +R68E5G = 去玩吧 城市运动(美) R69E36 = 尘埃2(美) R69P36 = 尘埃2(欧) R6APPU = 宝贝和我[平衡板](欧) @@ -283,14 +282,14 @@ R6BX78 = 颜料宝贝(X) R6CEAF = 大家的啦啦队2(美) R6CJAF = 我们的啦啦队 热舞灵魂!(日) R6DFJW = 警告 公路规则(法) -R6EE41 = 家庭智力抢答 2010版(美) +R6EE41 = 家庭问答2010(美) R6FE41 = 六旗主题乐园(美) R6FERS = 六旗主题乐园(美) R6FP41 = 欢乐园聚会(欧) R6GPMR = 黄金球(欧) R6HE54 = 你好,开兰 超级游戏日(美) R6HP54 = 你好,开兰 超级游戏日(欧) -R6IE54 = 棒球冲击波[MP](美) +R6IE54 = 棒球冲击波(美) R6JJGD = 钢之炼金术师 晓之王子(日) R6KP36 = 灰烬杯板球赛2009(欧) R6KU36 = 灰烬杯板球赛2009(英) @@ -300,7 +299,7 @@ R6ME5Z = 全美超模大赛(美) R6MPML = 全美超模大赛(欧) R6NE41 = 肖恩怀特滑雪 世界舞台[MP][平衡板](美) R6NP41 = 肖恩怀特滑雪 世界舞台[MP][平衡板](欧) -R6NY41 = 肖恩怀特滑雪 世界舞台[MP][平衡板](Y) +R6NY41 = 肖恩怀特滑雪 世界舞台(欧) R6OE78 = 汽车总动员 奥拉玛大奖赛(美) R6OP78 = 汽车总动员 奥拉玛大奖赛(欧) R6OX78 = 汽车总动员 奥拉玛大奖赛(X) @@ -331,17 +330,17 @@ R7AP69 = 模拟动物 非洲(欧) R7BE20 = 吉利贝利 弹道豆(美) R7BP7J = 吉利贝利 弹道豆(欧) R7CJ01 = 彩虹队长(日) -R7EE8P = 梦精灵 星降夜物语[WiFi](美) +R7EE8P = 梦精灵 星降夜物语(美) R7EJ8P = 梦精灵 星降夜物语[WiFi](日) R7EP8P = 梦精灵 星降夜物语[WiFi](欧) -R7FEGD = 陆行鸟 忘却时间的迷宫[WiFi](美) +R7FEGD = 最终幻想陆行鸟 忘却时间的迷宫(美) R7FJGD = 陆行鸟 忘却时间的迷宫[WiFi](日) R7FPGD = 陆行鸟 忘却时间的迷宫[WiFi](欧) R7GEAF = 龙珠 天下第一大冒险(美) -R7GJAF = 龙珠 天下第一大冒险(日) +R7GJAF = 龙珠 天下第一大冒险(日或中) R7GPAF = 龙珠 天下第一大冒险(欧) R7HE6K = 救兵总动员(美) -R7IE69 = 魅力女孩俱乐部[平衡板](美) +R7IE69 = 魅力女孩俱乐部 睡衣派对(美) R7IP69 = 魅力女孩俱乐部 睡衣派对[平衡板](欧) R7KE6K = 岩石疾风(美) R7LP7J = 玛格的困惑!(欧) @@ -359,8 +358,8 @@ R7SE5G = 逃出博物馆(美) R7SP5G = 逃出博物馆(欧) R7TFJW = 法式滚球(法) R7VEWR = 度假岛 海滩派对[平衡板](美) -R7VPWR = 度假岛 海滩派对[平衡板](欧) -R7WE52 = 雪山运动[平衡板](美) +R7VPWR = 度假岛 海滩派对(欧) +R7WE52 = 雪山运动(美) R7WP52 = 雪山运动[平衡板](欧) R7XE69 = 极品飞车 氮气(美) R7XJ13 = 极品飞车 氮气(日) @@ -379,25 +378,25 @@ R84J99 = 牧场物语 安稳之树(日) R84P99 = 牧场物语 济世之树(欧) R85EG9 = 秘密星期六 第五太阳之兽(美) R85PG9 = 秘密星期六 第五日之兽(欧) -R86E20 = 梦之舞蹈啦啦队[平衡板](美) +R86E20 = 梦之舞蹈啦啦队(美) R87EVN = 斯基度雪地车挑战赛(美) R88J2L = 面包超人 热烈派对(日) R89JEL = 东京友好乐园2(日) R8AE01 = 口袋妖怪乐园 皮卡丘大冒险(美) -R8AJ01 = 口袋妖怪乐园 皮卡丘大冒险(日) +R8AJ01 = 宝可梦公园Wii 皮卡丘的大冒险(日或中) R8AP01 = 口袋乐园 皮卡丘历险记(欧) -R8BE41 = 保姆派对[平衡板](美) +R8BE41 = 保姆派对(美) R8BP41 = 保姆派对[平衡板](欧) R8DEA4 = 游戏王5D's 决斗狂热者[WiFi](美) -R8DJA4 = 游戏王5D's︰决斗狂热者(日) +R8DJA4 = 游戏王5D's 决斗狂热者(日或中) R8DPA4 = 游戏王5D's 决斗狂热者[WiFi](欧) -R8EJQC = 异星寻奇(日) +R8EJQC = 大地探索者(日或中) R8FES5 = 快餐危机(美) -R8FJHA = 匠餐厅大繁盛!(日或中) +R8FJHA = 匠餐厅大繁盛(日或中) R8FPNP = 快餐狂(欧) -R8GJC8 = GI骑师联盟2008[平衡板][WiFi](日) +R8GJC8 = GI骑师联盟2008(日) R8GPC8 = GI骑师联盟2008[平衡板][WiFi](欧) -R8HE4Q = 汉娜 蒙塔娜 电影版(美) +R8HE4Q = 汉娜·蒙塔娜 电影版(美) R8HP4Q = 汉娜 蒙塔娜 电影版(欧) R8HX4Q = 汉娜 蒙塔娜 电影版(X) R8HY4Q = 汉娜 蒙塔娜 电影版(Y) @@ -428,8 +427,8 @@ R8VE41 = 拯救地球 野生动物兽医(美) R8VP41 = 拯救地球 野生动物兽医(欧) R8XE52 = 侏罗纪 猎物(美) R8XZ52 = 顶级射手 恐龙猎人(美) -R8YE52 = 卡贝拉猎人2010(美) -R8ZE8P = 大师教你普拉提[平衡板](美) +R8YE52 = 坎贝拉猎人2010(美) +R8ZE8P = 大师教你普拉提(美) R8ZPGT = 大师教你普拉提[平衡板](欧) R92E01 = 皮克敏2 R92J01 = 用Wii玩皮克敏2(日) @@ -437,7 +436,7 @@ R92P01 = 用Wii玩皮克敏2(欧) R94PMR = 终极红球挑战赛(欧) R94XMR = 终极红球挑战赛(X) R96EAF = 风之克罗诺亚 幻影之门(美) -R96JAF = 风之克罗诺亚 幻影之门(日或中) +R96JAF = 风之克罗诺亚 通向幻界之门(日或中) R96KAF = 风之克罗诺亚 幻影之门(韩) R96PAF = 风之克罗诺亚 幻影之门(欧) R97E9B = 家庭欢乐橄榄球(美) @@ -452,12 +451,12 @@ R9FJ36 = 一级方程式赛车2009(日) R9FP36 = 一级方程式赛车2009(欧) R9GEWR = 猫头鹰家族守卫者(美) R9GPWR = 猫头鹰家族守卫者(欧) -R9HE78 = 你比五年级生聪明吗?(美) +R9HE78 = 你比五年级生聪明吗2(美) R9IE01 = 用Wii玩皮克敏(美) -R9IJ01 = 用Wii玩皮克敏(日) +R9IJ01 = 用Wii玩皮克敏星球探险(日) R9IK01 = 用Wii玩皮克敏(韩) R9IP01 = 用Wii玩皮克敏(欧) -R9JE69 = 甲壳虫 摇滚乐团[WiFi](美) +R9JE69 = 甲壳虫乐队 摇滚乐团(美) R9JP69 = 甲壳虫 摇滚乐团[WiFi](欧) R9KE20 = 律动方块(美) R9LE41 = 女孩生活 通宵派对[平衡板](美) @@ -484,15 +483,15 @@ R9XP52 = 街机地带(欧) R9YES5 = 撕裂雪橇(美) R9ZE54 = 职业棒球大联盟2K9(美) RB2E6K = 气球泡泡(美) -RB2J2K = 气球泡泡(日或中) +RB2J2K = 彩虹泡泡(日或中) RB2PGT = 气球泡泡(欧) RB4E08 = 生化危机4(美) RB4J08 = 生化危机4(日) RB4P08 = 生化危机4(欧) RB4X08 = 生化危机4(X) -RB5E41 = 战火兄弟连 双重时间(美) +RB5E41 = 战火兄弟连 浴血奋战(美) RB5P41 = 战火兄弟连 双重时间(欧) -RB6J18 = 炸弹人[WiFi](日) +RB6J18 = 炸弹人(日) RB7E54 = 恶霸鲁尼 学院风云(美) RB7P54 = 恶霸鲁尼 学院风云(欧) RB8E70 = 后院棒球09(美) @@ -515,12 +514,12 @@ RBFP7J = 乒乓特种兵(欧) RBGE54 = 大棒球联盟(美) RBGP54 = 职业棒球联赛(欧) RBHE08 = 生化危机0(美) -RBHJ08 = 生化危机0(日) +RBHJ08 = 生化危机0(日或中) RBHP08 = 生化危机0(欧) -RBIEE9 = 牧场物语 欢乐动物进行曲[WiFi](美) +RBIEE9 = 牧场物语 欢乐动物进行曲(美) RBIJ99 = 牧场物语 欢乐动物进行曲[WiFi](日) RBIP99 = 牧场物语 欢乐动物进行曲[WiFi](欧) -RBKE69 = 轰炸方块[WiFi](美) +RBKE69 = 轰炸方块(美) RBKJ13 = 轰炸方块(日) RBKK69 = 轰炸方块[WiFi](韩) RBKP69 = 轰炸方块[WiFi](欧) @@ -529,7 +528,7 @@ RBLJ8P = 死神 白刃闪耀圆舞曲(日) RBLP8P = 死神 白刃闪耀圆舞曲(欧) RBME5G = 泡泡龙(美) RBMPGT = 泡泡龙(欧) -RBNEG9 = Ben 10 守护地球(美) +RBNEG9 = 少年骇客 地球保卫者(美) RBNPG9 = Ben 10 守护地球(欧) RBNXG9 = Ben 10 守护地球(X) RBOE69 = 布吉摇摆(美) @@ -545,13 +544,13 @@ RBSJ08 = 战国 BASARA 2 英雄外传A(日) RBTE8P = 钓鱼高手(美) RBTJ8P = 钓鱼高手(日) RBTP8P = 钓鱼高手(欧) -RBUE08 = 生化危机 安布雷拉历代记(美或中) -RBUJ08 = 生化危机 安布雷拉历代记(日) -RBUK08 = 生化危机 安布雷拉历代记(韩) -RBUP08 = 生化危机 安布雷拉历代记(欧) -RBVE52 = 芭比 森林公主(美) +RBUE08 = 生化危机 安布雷拉编年史(美或中) +RBUJ08 = 生化危机 安布雷拉编年史(日) +RBUK08 = 生化危机 安布雷拉编年史(韩) +RBUP08 = 生化危机 安布雷拉编年史(欧) +RBVE52 = 芭比之森林公主(美) RBVP52 = 芭比 森林公主(欧) -RBWE01 = 军队战争2[WiFi](美) +RBWE01 = 军队战争2(美) RBWJ01 = 军队战争2[WiFi](日) RBWP01 = 军队战争2[WiFi](欧) RBXJ8P = 死神 对决十刃[WiFi](日) @@ -604,7 +603,7 @@ RCHJAF = 大家的啦啦队(日) RCHPGT = 大家的啦啦队(欧) RCIE41 = 犯罪现场调查 铁证如山(美) RCIP41 = 犯罪现场调查 铁证如山(欧) -RCJE8P = 管道[WiFi](美) +RCJE8P = 管道(美) RCJP8P = 管道[WiFi](欧) RCKPGN = 阿伦·汉森的运动挑战(欧) RCLE4Q = 四眼天鸡之动作天王(美) @@ -623,11 +622,10 @@ RCSE20 = 射鸡英雄传(美) RCSP7J = 射鸡英雄传(欧) RCTE5Z = 反击力量(美) RCTPGT = 反击力量(欧) -RCUE52 = 卡贝拉传奇冒险(美) -RCUP52 = 卡贝拉传奇冒险(欧) +RCUE52 = 坎贝拉传奇冒险(美) RCVE41 = 孤岛惊魂 复仇(美) RCVP41 = 孤岛惊魂 复仇(欧) -RCXE78 = 全明星拉拉队[平衡板](美) +RCXE78 = 全明星拉拉队(美) RCXP78 = 全明星拉拉队[平衡板](欧) RCXX78 = 全明星拉拉队[平衡板](欧) RCYPGN = 切格的聚会迷题(欧) @@ -635,28 +633,27 @@ RD2E41 = 赤铁2[MP](美) RD2J41 = 赤铁2[MP](日) RD2K41 = 赤铁2[MP](韩) RD2P41 = 赤铁2[MP](欧) -RD2X41 = 赤铁2[MP](X) -RD4EA4 = 劲舞革命 劲爆舞会 2[跳舞毯](美) -RD4JA4 = 劲舞革命 劲爆舞会2[跳舞毯](日) +RD2X41 = 赤铁2(X) +RD4EA4 = 劲舞革命 劲爆舞会2(美) +RD4JA4 = 劲舞革命 盛况空前的劲爆舞会(日或中) RD4PA4 = 劲舞革命 劲爆舞会2[跳舞毯](欧) RD6EE9 = 动物王国 野生动物探索(美) RD6J8N = 动物奇想天外!在谜之乐园摄影(日) RD6PNP = 动物奇想天外!在谜之乐园摄影(欧) -RD8E52 = 与星共舞[跳舞毯](美) +RD8E52 = 与星共舞(美) RD9J18 = 解谜系列Vol.1 数独(日) -RDAE52 = 与星共舞 一起跳[跳舞毯](美) -RDBE70 = 龙珠Z 电光火石 2(美) +RDAE52 = 与星共舞 一起跳(美) +RDBE70 = 龙珠Z 电光火石2(美) RDBJAF = 龙珠Z 电光火石(日) RDBPAF = 龙珠Z 电光火石 2(欧) RDCE78 = 致命生物(美) RDCP78 = 致命生物(欧) -RDDEA4 = 热舞革命 劲爆舞会[跳舞毯](美) +RDDEA4 = 热舞革命 劲爆舞会(美) RDDJA4 = 热舞革命 劲爆舞会[跳舞毯](日) -RDDPA4 = 热舞革命 劲爆舞会[跳舞毯](欧) RDEJ0A = 全日本货柜车祭典(日) RDFE41 = 肖恩怀特滑雪板[平衡板](美) RDFP41 = 肖恩怀特滑雪板[平衡板](欧) -RDGEA4 = 恶魔城 审判[WiFi](美) +RDGEA4 = 恶魔城 审判(美) RDGJA4 = 恶魔城 审判[WiFi](日) RDGPA4 = 恶魔城 审判[WiFi](欧) RDHE78 = 毁灭全人类 解放威廉(美) @@ -674,7 +671,7 @@ RDLP70 = 狐狸侦探智救人质(欧) RDME6K = 米侬向前冲(美) RDMJ8N = 米侬向前冲(日) RDMPHZ = 每日英雄 米侬(欧) -RDNEA4 = 劲舞革命 开心迪士尼[跳舞毯](美) +RDNEA4 = 劲舞革命 开心迪士尼(美) RDOE41 = 模拟宠物狗2(美) RDOJ41 = 模拟宠物狗2(日) RDOP41 = 模拟宠物狗2(欧) @@ -688,7 +685,7 @@ RDQPGD = 勇者斗恶龙 假面女王(欧) RDREA4 = 水精迪依大冒险(美) RDRJA4 = 水精迪依大冒险(日) RDRPA4 = 水精迪依大冒险(欧) -RDSE70 = 龙珠Z 电光火石 3[WiFi](美) +RDSE70 = 龙珠Z 电光火石3(美) RDSJAF = 龙珠Z 电光火石 3[WiFi](日) RDSPAF = 龙珠Z 电光火石 3[WiFi](欧) RDTEAF = 电子鸡宠物店(美) @@ -700,7 +697,7 @@ RDVP41 = 横冲直撞之平行线(欧) RDWEG9 = 龙刃 怒火燃烧(美) RDWJG9 = 龙刃 怒火燃烧(日) RDWPG9 = 龙刃 怒火燃烧(欧) -RDXE18 = 十项全能(美) +RDXE18 = 德卡运动会(美) RDXJ18 = 德卡运动会(日) RDXKA4 = 德卡运动会(韩) RDXP18 = 德卡运动会(欧) @@ -709,7 +706,7 @@ RDZJ01 = 天灾 危机之日(日或中) RDZP01 = 天灾 危机之日(欧) RE3ENR = 空战高手 二战英雄(美) RE4E08 = 生化危机 复刻版(美) -RE4J08 = 生化危机(日) +RE4J08 = 生化危机(日或中) RE4P08 = 生化危机(欧) RE5PAF = 大胃王(欧) RE6PRT = 夏季田径邀请赛的挑战(欧) @@ -718,10 +715,9 @@ RE8J99 = 家庭教师 禁断的暗之三角[WiFi](日) REAE69 = 名人体育(美) REAF69 = 名人体育(法) REAP69 = 名人体育(欧) -REBE4Z = 憨豆先生的古怪世界(欧) +REBE4Z = 憨豆先生的古怪世界(美) REBPMT = 憨豆先生的古怪世界(欧) RECE6K = 间谍游戏 电梯任务(美) -RECP6K = 间谍游戏 电梯任务(欧) REDE41 = 赤色钢铁(美) REDJ41 = 赤铁(日) REDP41 = 赤铁(欧) @@ -731,10 +727,10 @@ REGP36 = 紧急出动(欧) REHE41 = 紧急英雄(美) REHP41 = 紧急英雄(欧) REJEAF = 活力生活 极限挑战(美) -REJJAF = 家庭教练2[跳舞毯](日) +REJJAF = 家庭教练2(日) REJPAF = 活力生活 极限挑战[跳舞毯](欧) -REKE41 = 金牌吉姆卡迪欧塑身[平衡板](美) -REKJ2N = 有氧拳击 Wii快乐瘦身[平衡板](日或中) +REKE41 = 金吉姆健身房 卡迪欧塑身(美) +REKJ2N = 有氧拳击 Wii快乐瘦身(日或中) REKP41 = 金牌吉姆卡迪欧塑身[平衡板](欧) REKU41 = 金牌吉姆卡迪欧塑身[平衡板](英) RELEA4 = 能源小精灵(美) @@ -742,7 +738,7 @@ RELJA4 = 能源小精灵(日) RELKA4 = 能源小精灵(韩) RELPA4 = 能源小精灵(欧) REMJ8P = 哆啦A梦Wii 秘密道具王决定战!(日) -RENE8P = 索尼克与黑暗骑士[WiFi](美) +RENE8P = 索尼克与黑暗骑士(美) RENJ8P = 索尼克与黑暗骑士[WiFi](日) RENP8P = 索尼克与黑暗骑士[WiFi](欧) REQE54 = 迪亚哥 徒步旅行救助队(美) @@ -752,72 +748,72 @@ REQY54 = 迪亚哥 徒步旅行救助队(欧) RESP41 = 我的西班牙语教练(欧) RETJAF = 庙会达人(日) REUPNK = 我的形体教练(欧) -REVJ8P = 忌火起草 解明篇(日) +REVJ8P = 忌火起草 解明篇(日或中) REWFMR = 我的马匹俱乐部(法) REWXMR = 我的马匹俱乐部(X) REWYMR = 我的马匹俱乐部(Y) REXE01 = 疯狂卡车(美) REXJ01 = 疯狂卡车(日) REXP01 = 疯狂卡车(欧) -REYE4Q = 迪士尼 想唱就唱 歌舞青春3 毕业季(美) +REYE4Q = 歌舞青春3 毕业歌会(美) REYP4Q = 迪士尼 想唱就唱 歌舞青春3 毕业季(欧) REZEJJ = 西洋棋高手(美) REZPKM = 西洋棋高手(欧) -RF2E54 = 神奇四侠 神奇四侠与银影侠(美) +RF2E54 = 神奇四侠 银影侠来袭(美) RF2P54 = 神奇四侠 神奇四侠与银影侠(欧) RF3E52 = 法拉利挑战赛(美) RF3P6M = 法拉利挑战赛(欧) RF4E36 = 超级水果瀑布(美) RF4P6M = 超级水果瀑布(欧) RF7J08 = 龙之子对卡普空(日) -RF8E69 = FIFA足球08[WiFi](美) +RF8E69 = FIFA足球08(美) RF8J13 = FIFA足球08[WiFi](日) RF8K69 = FIFA足球08[WiFi](韩) RF8P69 = FIFA足球08[WiFi](欧) RF8X69 = FIFA足球08[WiFi](X) RF8Y69 = FIFA足球08[WiFi](Y) -RF9E69 = FIFA足球09[WiFi](美) +RF9E69 = FIFA足球09(美) RF9J13 = FIFA足球09[WiFi](日) RF9K69 = FIFA足球09[WiFi](韩) RF9P69 = FIFA足球09[WiFi](欧) RF9X69 = FIFA足球09[WiFi](X) RF9Y69 = FIFA足球09[WiFi](Y) -RFAEAF = 生命运动 户外挑战[跳舞毯](美) -RFAJAF = 家庭教练 体育世界(日) +RFAEAF = 活力生活 户外挑战(美) +RFAJAF = 家庭教练(日) RFAPAF = 家庭教练[跳舞毯](欧) -RFBE01 = 永恒蔚蓝[WiFi](美) +RFBE01 = 永恒蔚蓝(美) RFBJ01 = 永恒蔚蓝[WiFi](日) RFBP01 = 永恒蔚蓝[WiFi](欧) RFCEGD = 最终幻想水晶编年史 水晶守护者(美) RFCJGD = 最终幻想水晶编年史 水晶守护者(日) RFCPGD = 最终幻想水晶编年史 水晶守护者(欧) RFEE01 = 火炎纹章 晓之女神(美) -RFEJ01 = 火炎纹章 晓之女神(日或中) +RFEJ01 = 火焰纹章 晓之女神(日或中) RFEP01 = 火炎纹章 晓之女神(欧) -RFFEGD = 水晶编年史 时之回声[WiFi](美) +RFFEGD = 最终幻想水晶编年史 时之回声(美) RFFJGD = 水晶编年史 时之回声[WiFi](日) RFFPGD = 水晶编年史 时之回声[WiFi](欧) RFJJAF = 家庭赛马(日) -RFKE41 = 我的健康教练(美) +RFKE41 = 我的健身教练(美) RFKP41 = 我的健康教练(欧) RFKX41 = 我的健康教练(X) -RFLE69 = 美式橄榄球大联盟09[WiFi](美) +RFLE69 = 美式橄榄球大联盟09(美) RFLP69 = 美式橄榄球大联盟09[WiFi](欧) RFLPWK = 美式橄榄球大联盟09[WiFi](欧) RFMJAF = 职棒家庭棒球场[WiFi](日) -RFNE01 = Wii健身[平衡板](美) -RFNJ01 = Wii健身[平衡板](日) -RFNK01 = Wii健身[平衡板](韩) -RFNP01 = Wii健身[平衡板](欧) -RFNW01 = Wii健身[平衡板] +RFNE01 = Wii塑身[平衡板](美) +RFNJ01 = Wii塑身[平衡板](日) +RFNK01 = Wii塑身[平衡板](韩) +RFNP01 = Wii塑身[平衡板](欧) +RFNW01 = Wii塑身(中) RFOE52 = 蜘蛛侠 敌友难辨(美) RFOP52 = 蜘蛛侠 敌友难辨(欧) RFOX52 = 蜘蛛侠 敌友难辨(X) -RFPE01 = Wii健身加强版[平衡板](美) -RFPJ01 = Wii健身 加强版[平衡板](日) -RFPK01 = Wii健身加强版[平衡板](韩) -RFPP01 = Wii健身加强版[平衡板](欧) -RFPW01 = Wii健身加强版[平衡板] +RFPE01 = Wii塑身Plus[平衡板](美) +RFPJ01 = Wii塑身Plus[平衡板](日) +RFPK01 = Wii塑身Plus[平衡板](韩) +RFPP01 = Wii塑身Plus[平衡板](欧) +RFPW01 = Wii塑身Plus(中) RFQE69 = 破相拳击(美) RFQJ13 = 破相拳击(日) RFQK69 = 破相拳击(韩) @@ -833,13 +829,13 @@ RFVP52 = 淘气小猴 聚会时间(欧) RFWE5Z = 野外探险 非洲(美) RFWPNK = 非洲徒步大冒险(欧) RFYFMR = 博涯堡垒 开战(法) -RFZE41 = 想象 时尚聚会[平衡板](美) +RFZE41 = 想象 时尚聚会(美) RFZP41 = 想象 时尚偶像[平衡板](欧) RG2EXS = 罪恶装备XX(美) RG2JJF = 罪恶装备XX ΛCore(日) RG2PGT = 罪恶装备XX(欧) RG4JC0 = 电车Go!新干线EX 山阳新干线(日) -RG5EWR = 吉尼斯世界纪录 电视游戏[WiFi](美) +RG5EWR = 吉尼斯世界纪录 电视游戏(美) RG5PWR = 吉尼斯世界纪录 电视游戏[WiFi](欧) RG6E69 = 摇滚乐超级明星(美) RG6P69 = 摇滚乐超级明星(欧) @@ -851,12 +847,10 @@ RG9P54 = 嘉年华游戏 迷你高尔夫(欧) RGAE8P = 51号星球(美) RGAP8P = 51号星球(欧) RGBE08 = 哈维博德曼 律师(美) -RGBP08 = 哈维博德曼 律师(欧) RGCEXS = 遥控直升机Wii 飞行大冒险(美) RGCJJF = 遥控直升机Wii 飞行大冒险(日) RGCPGT = 遥控直升机Wii 飞行大冒险(欧) RGDEA4 = 恐怖行动(美) -RGDPA4 = 恐怖行动(欧) RGEJJ9 = 世界黄金蛋节奏合拍系日本的音符(日) RGFE69 = 教父 黑手党(美) RGFF69 = 教父 黑手党(法) @@ -864,7 +858,7 @@ RGFI69 = 教父 黑手党(意) RGFP69 = 教父 黑手党(欧) RGFS69 = 教父 黑手党(西) RGGJAF = GeGeGe的鬼太郎 妖怪大运动会(日) -RGHE52 = 吉他英雄3 摇滚传奇[WiFi](美) +RGHE52 = 吉他英雄3 摇滚传奇(美) RGHJ52 = 吉他英雄3 摇滚传奇[WiFi](日) RGHK52 = 吉他英雄3 摇滚传奇[WiFi](韩) RGHP52 = 吉他英雄3 摇滚传奇[WiFi](欧) @@ -872,9 +866,8 @@ RGIJC8 = G1骑师Wii(日) RGIPC8 = G1骑师Wii(欧) RGJE4Z = 森林泰山 探秘(美) RGJP7U = 森林泰山 探秘(欧) -RGKENR = 国际儿童 疯狂高尔夫(美) -RGKPNR = 国际儿童 疯狂高尔夫(欧) -RGLE7D = 几何战争 银河[WiFi](美) +RGKENR = 儿童高尔夫(美) +RGLE7D = 几何战争 银河(美) RGLP7D = 几何战争 银河[WiFi](欧) RGME5D = 企鹅也疯狂(美) RGMP5D = 企鹅也疯狂(欧) @@ -884,18 +877,18 @@ RGPJAF = 机动战士高达2 哀.战士篇(日) RGQE70 = 捉鬼敢死队(美) RGQP70 = 捉鬼敢死队(欧) RGSE8P = 幽灵小队[WiFi](美) -RGSJ8P = 幽灵小队(日) +RGSJ8P = 幽灵小队(日或中) RGSP8P = 幽灵小队[WiFi](欧) RGTE41 = GT职业赛车(美) RGTJBL = GT职业赛车(日) RGTP41 = GT职业赛车(欧) -RGVE52 = 吉他英雄 空中铁匠乐队专辑[WiFi](美) +RGVE52 = 吉他英雄 空中铁匠乐队(美) RGVJ52 = 吉他英雄 空中铁匠乐队专辑[WiFi](日) RGVP52 = 吉他英雄 空中铁匠乐队专辑[WiFi](欧) RGWE41 = 疯狂兔子 回家[WiFi](美) RGWJ41 = 疯狂兔子 回家[WiFi](日) RGWP41 = 疯狂兔子 回家[WiFi](欧) -RGWX41 = 疯狂兔子 回家[WiFi](X) +RGWX41 = 疯狂兔子 回家(X) RGXE5D = 游戏派对(美) RGXP5D = 游戏派对(欧) RGYE5Z = 美女卡丁车(美) @@ -908,7 +901,7 @@ RH3E4Q = 歌舞青春3 毕业舞会(美) RH3J4Q = 歌舞青春3 毕业舞会(日) RH3P4Q = 歌舞青春3 毕业舞会(欧) RH4XUG = 仓鼠英雄(X) -RH5EVN = 小马生活冒险[WiFi](美) +RH5EVN = 小马生活冒险(美) RH5PKM = 爱伦怀塔克的小马生活(欧) RH6E69 = 哈里波特与混血王子(美) RH6K69 = 哈利波特 混血王子的背叛(韩) @@ -917,7 +910,6 @@ RH7J8P = Sammy合集 北斗神拳[WiFi](日) RH8E4F = 古墓丽影 地下世界(美) RH8JEL = 古墓丽影 地下世界(日) RH8P4F = 古墓丽影 地下世界(欧) -RH8X4F = 古墓丽影 地下世界(X) RH9JC8 = 遥远时空4 (日) RHAE01 = Wii第一次接触(美) RHAJ01 = Wii第一次接触(日) @@ -935,7 +927,7 @@ RHFE5D = 快乐大脚(美) RHFP5D = 快乐大脚(欧) RHGP6Z = 特工雨果 柠檬榨汁(欧) RHGX6Z = 特工雨果 柠檬榨汁(X) -RHHJ8J = 凉宫春日的激动(日) +RHHJ8J = 凉宫春日的激动(日或中) RHIEXJ = 第一神拳 革命(美) RHIJJ9 = 第一神拳 革命(日) RHIP41 = 第一神拳 革命(欧) @@ -953,11 +945,11 @@ RHOE8P = 死亡之屋 过度杀戮(美) RHOJ8P = 死亡之屋 过度杀戮(日) RHOP8P = 死亡之屋 过度杀戮(欧) RHPJ8N = 欺诈流浪记(日) -RHQE4Q = 汉娜蒙塔娜 聚光灯下的世界巡演(美) +RHQE4Q = 汉娜·蒙塔娜 聚光灯下的世界巡演(美) RHQP4Q = 汉娜蒙塔娜 聚光灯下的世界巡演(欧) RHQX4Q = 孟汉娜万众瞩目全球巡演歌唱大赛(欧) RHQY4Q = 孟汉娜万众瞩目全球巡演歌唱大赛(Y) -RHRJ99 = 家庭教师HITMAN!梦之超级战斗!(日) +RHRJ99 = 家庭教师REBORN 超梦幻决胜(日或中) RHSE36 = 热导追踪(美) RHSP36 = 热导追踪(欧) RHSX36 = 热导追踪(X) @@ -975,16 +967,16 @@ RHXP78 = 乐队大战(欧) RHYJAF = 跳跃之门Wii 极限挑战(日) RHZE41 = 模拟宠物马2(美) RHZP41 = 模拟宠物马2(欧) -RI2E4Q = 迪斯尼 想唱就唱 高校音乐剧(美) +RI2E4Q = 歌舞青春(美) RI2P4Q = 迪斯尼 想唱就唱 高校音乐剧(欧) RI3E5D = 别惹蚂蚁(美) RI3P5D = 别惹蚂蚁(欧) RI6ENR = 夏季运动会2 小岛运动会(美) RI6P41 = 夏季运动聚会(欧) RI7E4Z = 怪物大破坏 创建和战斗(美) -RI8E41 = 战火兄弟连 双重时间(美) +RI8E41 = 战火兄弟连 进军30高地(美) RI8P41 = 战火兄弟连 双重时间(欧) -RI9EGT = 天后女孩 冰上公主[平衡板](美) +RI9EGT = 天后女孩 冰上公主(美) RI9PGT = 天后女孩 冰上公主[平衡板](欧) RIAE52 = 冰河世纪3 恐龙的黎明(美) RIAI52 = 冰河世纪3 恐龙的黎明(意) @@ -1015,7 +1007,6 @@ RINP08 = 丧尸围城 僵尸的祭品(欧) RIOPSU = 恐怖历史之残忍罗马(欧) RIPEAF = 海贼王 无尽的冒险(美) RIPJAF = 海贼王 无尽的冒险(日) -RIPPAF = 海贼王 无限巡航 EP1 波浪中的秘宝(欧) RIQPUJ = 冰上炫舞(欧) RIRE8P = 钢铁侠(美) RIRP8P = 钢铁侠(欧) @@ -1031,7 +1022,7 @@ RIXP7J = 道奇赛车 掌控者与挑战者(欧) RIYE52 = 太空营地(美) RIYP52 = 太空营地(欧) RIZENR = 印第500赛车(美) -RJ2E52 = 詹姆斯邦德007 量子危机[WiFi](美) +RJ2E52 = 詹姆斯邦德007 量子危机(美) RJ2JGD = 詹姆斯邦德007 量子危机[WiFi](日) RJ2P52 = 詹姆斯邦德007 量子危机[WiFi](欧) RJ3E20 = 吉普越野赛车(美) @@ -1043,7 +1034,6 @@ RJ6P69 = 我的模拟人生 空中英豪(欧) RJ7FWP = 电视7游戏 法语填字游戏(法) RJ8E64 = 印第安纳琼斯与帝王手杖(美) RJ8P64 = 印第安纳琼斯与帝王手杖(欧) -RJ9E5Z = 智能家庭(美) RJ9FMR = 思考 逻辑训练(法) RJ9PFR = 思考 逻辑训练(欧) RJ9XML = 思考 逻辑训练(X) @@ -1057,7 +1047,7 @@ RJCP52 = Baja 1000越野拉力赛(欧) RJDPKM = 我的动物中心(欧) RJEE70 = 层层叠世界巡回赛(美) RJEP70 = 层层叠世界巡回赛(欧) -RJFE5G = 吉利安麦克尔健身训练09[平衡板](美) +RJFE5G = Jillian Michaels的健身训练2009(美) RJFPKM = 吉利安麦克尔健身训练09[平衡板](欧) RJGJDA = 人生游戏(日) RJHE52 = 马达加斯加赛车(美) @@ -1074,8 +1064,8 @@ RJOP99 = 恐怖体感 咒怨(欧) RJPJA4 = 实况棒球Wii(日) RJQE5G = 睡衣山姆 别怕黑(美) RJQP70 = 睡衣山姆 别怕黑(欧) -RJREA4 = 热舞革命 劲爆舞会 3[跳舞墊][平衡板](美) -RJRJA4 = 劲舞革命 劲爆舞会3[跳舞毯][平衡板](日) +RJREA4 = 热舞革命 劲爆舞会3(美) +RJRJA4 = 劲舞革命 劲爆舞会3(日) RJRPA4 = 劲舞革命 劲爆舞会 3[跳舞毯][平衡板](欧) RJSENR = 川崎水上摩托(美) RJSPUG = 川崎水上摩托(欧) @@ -1084,28 +1074,27 @@ RJTJ01 = 大家的常识力(日) RJVEGN = 狂热医院 紧急病房(美) RJVPGN = 狂热医院 紧急病房(欧) RJWJEL = 猛犸象与神秘之石(日) -RJXE5G = 去玩吧伐木工[平衡板](美) -RJYE5Z = 费兹维泽医生的动物大拯救[平衡板](美) +RJXE5G = 去玩吧 伐木工(美) +RJYE5Z = 费兹维泽医生的动物大拯救(美) RJZP7U = SNK街机经典Vol1(欧) RK2EEB = 超执刀 新血[WiFi](美) RK2JEB = 超执刀 新血[WiFi](日) RK2P01 = 超执刀 新血[WiFi](欧) RK3J01 = 安藤检索(日) RK4JAF = 结界师 黑芒楼之影(日) -RK5E01 = 星之卡比 毛线传说(美) +RK5E01 = 星之卡比 毛线传说(美或中) RK5J01 = 星之卡比 毛线传说(日) RK5P01 = 星之卡比 毛线传说(欧) -RK6E18 = 穿越迷路2[平衡板][WiFi](美) +RK6E18 = 穿越迷路2(美) RK6J18 = 穿越迷路2[平衡板][WiFi](日) RK6P18 = 穿越迷路2[平衡板][WiFi](欧) RK7J0A = 黄金之绊(日) RK8E54 = 职业棒球大联盟2K8(美) -RK9EA4 = 卡拉OK革命[麦克风](美) +RK9EA4 = 卡拉OK革命(美) RK9PA4 = 卡拉OK革命[麦克风](欧) RKAE6K = 卡拉斯Wii射击集锦(美) RKAJMS = Milestone射击游戏精选Wii(日) RKAK8M = Milestone射击游戏精选Wii(韩) -RKAP6K = 卡拉斯Wii射击集锦(欧) RKBE41 = 卡波其涂鸦(美) RKBP41 = 卡波其涂鸦(欧) RKDEEB = 超执刀 再次执刀(美) @@ -1120,7 +1109,7 @@ RKGEGY = 贝兹娃娃(美) RKGPGY = 贝兹娃娃(欧) RKHE52 = 功夫熊猫 神龙大侠(美) RKHP52 = 功夫熊猫 神龙大侠(欧) -RKIENR = 国际儿童冰球赛(美) +RKIENR = 儿童冰球(美) RKIPUG = 国际儿童冰球赛(欧) RKIXUG = 国际儿童冰球赛(欧) RKJJ0Q = 汉字能力检定协会 250万人的汉检(日) @@ -1139,10 +1128,10 @@ RKPV52 = 功夫熊猫(欧) RKPX52 = 功夫熊猫(Y) RKPY52 = 功夫熊猫(Y) RKQENR = 糖果工厂(美) -RKSENR = 儿童篮球赛(美) +RKSENR = 儿童篮球(美) RKSPUG = 儿童篮球赛(欧) -RKTENR = 国际儿童足球赛(美) -RKTXUG = 国际儿童足球赛(X) +RKTENR = 儿童足球(美) +RKTXUG = 儿童足球(X) RKVE54 = 大棒球联盟2(美) RKVP54 = 大棒球联盟2(欧) RKWJ18 = 拼图小狗 每日一问(日) @@ -1151,7 +1140,7 @@ RKXP69 = 摇滚乐团(欧) RKYE20 = 玩具军人 倒霉战士(美) RKYP7J = 玩具军人 倒霉战士(欧) RKZEA4 = 迷失蔚蓝Wii(美) -RKZJA4 = 迷失蔚蓝Wii(日) +RKZJA4 = 幸存少年Wii(日或中) RKZPA4 = 迷失蔚蓝Wii(欧) RL2E78 = 我的驯马场(美) RL2PFR = 我的驯马场(欧) @@ -1174,7 +1163,6 @@ RLCP7J = 爱如鲜花盛开(欧) RLDEGY = 龙的传说(美) RLDPFK = 龙的传说(欧) RLEEFS = 大满贯保龄球2(美) -RLEPFS = 大满贯保龄球2(欧) RLFE64 = 星球大战 复制战纪(美) RLFP64 = 星球大战 复制战纪(欧) RLGE64 = 乐高星球大战 完整的传奇(美) @@ -1204,7 +1192,6 @@ RLRP4F = 古墓丽影 十周年纪念版(欧) RLSE8P = 异形特攻队(美) RLSP8P = 异形特攻队(欧) RLTENR = 伦敦出租车 高峰时间(美) -RLTPNR = 伦敦出租车 高峰时间(欧) RLTXUG = 伦敦出租车 高峰时间(X) RLUE4Q = 闪电狗(美) RLUP4Q = 闪电狗(欧) @@ -1225,7 +1212,7 @@ RLYEWR = 华纳群星总动员 超级兵工厂(美) RLYPWR = 华纳群星总动员 超级兵工厂(欧) RLZE4Z = 企鹅保卫战(美) RLZPXT = 企鹅保卫战(欧) -RM2E69 = 荣誉勋章 英雄2[WiFi](美) +RM2E69 = 荣誉勋章 英雄2(美) RM2J13 = 荣誉勋章 英雄2(日) RM2P69 = 荣誉勋章 英雄2[WiFi](欧) RM2U69 = 荣誉勋章 英雄2[WiFi](英) @@ -1240,7 +1227,7 @@ RM5E7D = 木乃伊归来3 龙帝之墓(美) RM5P7D = 木乃伊归来3 龙帝之墓(欧) RM6EEB = 巴洛克(美) RM6P99 = 巴洛克(欧) -RM7E4F = 怪物实验室[WiFi](美) +RM7E4F = 怪物实验室(美) RM7P4F = 怪物实验室[WiFi](欧) RM8E01 = 马里奥派对8(美) RM8J01 = 马里奥派对8(日) @@ -1253,11 +1240,11 @@ RMAJ01 = 用Wii玩马里奥网球GC(日) RMAP01 = 用Wii玩马里奥网球GC(欧) RMBE01 = 超级马里奥棒球场 家庭棒球(美) RMBJ01 = 超级马里奥棒球场 家庭棒球(日) -RMCE01 = 马里奥赛车[WiFi](美) -RMCJ01 = 马里奥赛车 Wii(日) -RMCK01 = 马里奥赛车[WiFi](韩) -RMCP01 = 马里奥赛车[WiFi](欧) -RMDE69 = 美式橄榄球大联盟07[WiFi](美) +RMCE01 = 马力欧卡丁车Wii(美) +RMCJ01 = 马力欧卡丁车Wii(日) +RMCK01 = 马力欧卡丁车Wii(韩) +RMCP01 = 马力欧卡丁车Wii(欧) +RMDE69 = 美式橄榄球大联盟07(美) RMDP69 = 美式橄榄球大联盟07[WiFi](欧) RMEJDA = 大联盟Wii投掷(日) RMFE68 = AMF保龄球 非同寻常(美) @@ -1267,7 +1254,7 @@ RMGJ01 = 超级马里奥银河(日或中) RMGK01 = 超级马里奥银河(韩) RMGP01 = 超级马里奥银河(欧) RMHE08 = 怪物猎人3[WiFi](美) -RMHJ08 = 怪物猎人3[WiFi](日或中) +RMHJ08 = 怪物猎人3(日或中) RMHP08 = 怪物猎人3[WiFi](美) RMIE20 = 玛戈的单词大脑(美) RMIP7J = 玛戈的单词大脑(欧) @@ -1288,27 +1275,24 @@ RMNPFR = 我的宠物旅店(欧) RMOE52 = 怪兽大卡车(美) RMOP52 = 怪兽大卡车(欧) RMPE54 = 职业力量棒球2008(美) -RMPP54 = 职业力量棒球2008(欧) RMQENR = 魔法制造者 末日宝石(美) RMQPUG = 魔法制造者 末日宝石(欧) -RMQXUG = 魔法制造者 末日宝石(X) RMRE5Z = 小魔怪魔法马戏团(美) RMRPNK = 小魔怪魔法马戏团(欧) RMRXNK = 小魔怪魔法马戏团(X) -RMSE52 = 惊奇漫画 终极联盟2[WiFi](美) +RMSE52 = 漫威终极联盟2(美) RMSP52 = 惊奇漫画 终极联盟2([WiFi]欧) RMTJ18 = 桃太郎电铁16北海道大移动[WiFi](日) -RMUE52 = 漫画英雄联盟(美) +RMUE52 = 漫威终极联盟(美) RMUJ2K = 漫画英雄联盟(日) RMUP52 = 漫画英雄联盟(欧) -RMVE69 = 荣誉勋章 先遣部队(美) +RMVE69 = 荣誉勋章 先遣部队(美或中) RMVP69 = 荣誉勋章 先遣部队(欧) RMVX69 = 荣誉勋章 先遣部队(X) RMWE20 = M&M巧克力卡丁赛车(美) -RMWP20 = M&M巧克力卡丁赛车(欧) -RMXE78 = 极限越野 突破[WiFi](美) +RMXE78 = 极限越野 突破(美) RMXF78 = 极限越野 突破[WiFi](法) -RMXP78 = 极限越野 突破[WiFi](欧) +RMXP78 = 极限越野 突破(欧) RMYE5Z = 超级卡丁车GP(美) RMYPUG = 超级卡丁车GP(欧) RMYXUG = 超级卡丁车GP(欧) @@ -1337,12 +1321,11 @@ RNBE69 = 美国职业篮球2008[WiFi](美) RNBP69 = 美国职业篮球2008[WiFi](欧) RNBX69 = 美国职业篮球2008[WiFi](X) RNCEH4 = SNK街机经典Vol1(美) -RNCPH4 = SNK街机经典Vol1(欧) RNDJAF = 交响情人梦 梦之☆管弦乐(日) -RNEEDA = 火影忍者疾风传 激斗忍者大战 3[WiFi](美) -RNEJDA = 火影忍者疾风传 激斗忍者大战 3[WiFi](日) +RNEEDA = 火影忍者疾风传 激斗忍者大战3(美) +RNEJDA = 火影忍者疾风传 激斗忍者大战EX3(日) RNEPDA = 火影忍者疾风传 激斗忍者大战 3[WiFi](欧) -RNFE69 = 美式橄榄球大联盟08[WiFi](美) +RNFE69 = 美式橄榄球大联盟08(美) RNFP69 = 美式橄榄球大联盟08[WiFi](欧) RNGJ99 = 魔法老师涅吉!?新契约大战!!(日) RNHE41 = 英雄不再(美) @@ -1381,7 +1364,6 @@ RNSE69 = 极品飞车10卡本峡谷(美) RNSF69 = 极品飞车10卡本峡谷(法) RNSJ13 = 极品飞车10卡本峡谷(日) RNSP69 = 极品飞车10卡本峡谷(欧) -RNSX69 = 极品飞车10卡本峡谷(X) RNUE8P = 南茜朱儿 冰溪白狼(美) RNVE5Z = 阿努比斯2(美) RNVPUG = 阿努比斯2(欧) @@ -1389,10 +1371,10 @@ RNVXUG = 阿努比斯2(X) RNWJAF = Namco博物馆 重制版(日) RNWKAF = Namco博物馆 重制版(韩) RNXEDA = 火影忍者疾风传 激斗忍者大战(美) -RNXJDA = 火影忍者疾风传 激斗忍者大战(日) +RNXJDA = 火影忍者疾风传 激斗忍者大战EX(日) RNXPDA = 火影忍者疾风传 激斗忍者大战(欧) RNYEDA = 火影忍者疾风传 激斗忍者大战 2(美) -RNYJDA = 火影忍者疾风传 激斗忍者大战 2(日) +RNYJDA = 火影忍者疾风传 激斗忍者大战EX2(日) RNYPDA = 火影忍者疾风传 激斗忍者大战 2(欧) RNZE69 = 忍者反应[WiFi](美) RNZJ13 = 忍者反应(日) @@ -1419,9 +1401,9 @@ ROBE7U = 暗夜杀机 结果(美) ROBPPL = 暗夜杀机 结果(欧) ROCE5Z = 小魔怪卡丁车(美) ROCPNK = 小魔怪卡丁车(欧) -RODE01 = 瓦里奥制造 平滑移动(美) +RODE01 = 瓦里奥制造 手舞足蹈(美) RODJ01 = 瓦里奥制造 平滑移动(日) -RODK01 = 瓦里奥制造 平滑移动(韩) +RODK01 = 瓦里奥制造 手舞足蹈(韩或中) RODP01 = 瓦里奥制造 平滑移动(欧) ROEEJZ = 流浪狗之家(美) ROEPGT = 流浪狗之家(欧) @@ -1437,11 +1419,11 @@ ROKJ18 = 卡拉OK 欢乐之声Wii(日) ROLE8P = 马里奥与索尼克在温哥华冬奥会[WiFi][平衡板](美) ROLJ01 = 马里奥与索尼克在温哥华冬季奥运(日) ROLK01 = 马里奥与索尼克在温哥华冬奥会[WiFi][平衡板](韩) -ROLP8P = 马里奥与索尼克在温哥华冬奥会[WiFi][平衡板](欧) +ROLP8P = 马里奥与索尼克在温哥华冬奥(欧) ROMJ08 = 怪物猎人 G[WiFi](日) -RONEG9 = 御姐玫瑰 革命[WiFi](美) -RONJG9 = 性感女剑士 Revolution(日或中) -RONPG9 = 御姐玫瑰 革命[WiFi](欧) +RONEG9 = 御姐玫瑰 革命(美) +RONJG9 = 御姐玫瑰 革命(日或中) +RONPG9 = 御姐玫瑰 革命(欧) ROPE41 = 狩猎季节(美) ROPP41 = 狩猎季节(欧) ROQJEP = 巴洛克(日) @@ -1464,7 +1446,7 @@ ROYX41 = 美食从天降(X) RP2E69 = 冷知识游戏(美) RP2P69 = 冷知识游戏(欧) RP3JAF = 高尔夫球选手猿(日) -RP4E69 = 我的模拟聚会[WiFi](美) +RP4E69 = 我的模拟聚会(美) RP4J13 = 我的模拟聚会[WiFi](日) RP4P69 = 我的模拟聚会[WiFi](欧) RP5JA4 = 实况力量棒球15(日) @@ -1476,7 +1458,7 @@ RP9ERS = 太空黑猩猩(美) RP9PRS = 太空黑猩猩(欧) RP9XRS = 太空黑猩猩(X) RPAF70 = 船桨男孩 迷失(法) -RPBE01 = 口袋妖怪 战斗革命[WiFi](美) +RPBE01 = 口袋妖怪 战斗革命(美) RPBJ01 = 口袋妖怪 战斗革命[WiFi](日) RPBP01 = 口袋妖怪 战斗革命[WiFi](欧) RPCE20 = 难题收藏(美) @@ -1525,13 +1507,12 @@ RPYE9B = 魔法高尔夫(美) RPYJ9B = 魔法高尔夫(日) RPYP9B = 魔法高尔夫(欧) RPZJA4 = 实况力量职棒Wii 决定版[WiFi](日) -RQ2JK6 = 疯狂攀登者Wii(日) +RQ2JK6 = 疯狂攀登者Wii(日或中) RQ3PGN = PDC世界飞镖锦标赛2009(欧) RQ4E78 = 棉球方块历险记(美) RQ4J78 = 棉球方块历险记(日) RQ4P78 = 棉球方块历险记(欧) RQ5E5G = 疯狗麦基利(美) -RQ5P5G = 疯狗麦基利(欧) RQ5X5G = 疯狗麦基利(欧) RQ6EJJ = 妖山诅咒(美) RQ6PKM = 妖山诅咒(欧) @@ -1548,7 +1529,7 @@ RQBPUG = 川崎4X4沙滩车(欧) RQBXUG = 川崎4X4沙滩车(X) RQCEAF = 大胃王(美) RQCJAF = 大胃王(日) -RQEE6U = 阿加莎克里斯蒂 阳光下的罪恶(美) +RQEE6U = 阿加莎·克里斯蒂 阳光下的罪恶(美) RQEP6V = 阿加莎克里斯蒂 阳光下的罪恶(欧) RQFE6U = 破箱人 终极难题冒险(美) RQFP6V = 破箱人 终极难题冒险(欧) @@ -1556,7 +1537,7 @@ RQGE69 = 我的模拟人生 赛车(美) RQGJ13 = 我的模拟人生 赛车(日) RQGP69 = 我的模拟人生 赛车(欧) RQIJ01 = NHK红白猜谜合战(日) -RQJE7D = 古惑狼之泰坦巨人[WiFi](美) +RQJE7D = 古惑狼 泰坦巨人(美) RQJP7D = 古惑狼之泰坦巨人[WiFi](欧) RQJX7D = 古惑狼之泰坦巨人[WiFi](X) RQKE41 = 马戏团游戏(美) @@ -1570,11 +1551,11 @@ RQNPWR = 史酷比最初恐惧(欧) RQOE69 = 孢子英雄(美) RQOJ13 = 孢子英雄(日) RQOP69 = 孢子英雄(欧) -RQPE52 = 卡贝拉的猎鹿(美) +RQPE52 = 坎贝拉的猎鹿(美) RQPP52 = 卡贝拉的猎鹿(欧) -RQPZ52 = 卡贝拉的猎鹿(欧) +RQPZ52 = 坎贝拉的猎鹿(欧) RQQE70 = 后院橄榄球2009(美) -RQREXJ = 空中杀手 无罪王牌(美) +RQREXJ = 空中杀手 无瑕王牌(美或中) RQRJAF = 空中杀手 无罪王牌(日) RQRPAF = 空中杀手 无罪王牌(欧) RQSE4Z = 弹珠台名人堂 威廉收藏版(美) @@ -1593,7 +1574,7 @@ RQZP41 = 怪兽4X4特级赛车(欧) RR2ENR = 装载卡车竞赛2(美) RR2PUG = 装载卡车竞赛2(欧) RR2XUG = 装载卡车竞赛2(欧) -RR3EA4 = 终极聚会挑战[跳舞毯](美) +RR3EA4 = 终极聚会挑战(美) RR3JA4 = 全家挑战(日) RR3PA4 = 一起派对(欧) RR4EGY = 熊熊工作室(美) @@ -1608,7 +1589,7 @@ RRAPUG = 猫王的摇滚大冒险(欧) RRAXUG = 猫王的摇滚大冒险(X) RRBE41 = 雷曼 疯狂兔子(美) RRBJ41 = 雷曼 疯狂兔子(日) -RRBP41 = 雷曼 疯狂兔子(欧) +RRBP41 = 疯狂兔子(欧) RRCE52 = 芭比小马冒险 骑术野营(美) RRCP52 = 芭比小马冒险 骑术野营(欧) RRDE69 = 摇滚乐团 乐曲扩展包2(美) @@ -1675,13 +1656,13 @@ RS5JC8 = 战国无双 KATANA(日) RS5PC8 = 战国无双 KATANA(欧) RS7J01 = 光速蒙面侠21 赛场上的最强战士(日) RS8J8N = 上海(日) -RS9E8P = 索尼克滑板 失重[WiFi](美) +RS9E8P = 索尼克滑板 失重(美) RS9J8P = 索尼克滑板 失重[WiFi](日) RS9P8P = 索尼克滑板 失重[WiFi](欧) RSAE78 = 海绵宝宝 亚特兰蒂斯(美) RSAP78 = 海绵宝宝 亚特兰蒂斯(欧) -RSBE01 = 任天堂明星大乱斗X[WiFi](美) -RSBJ01 = 任天堂明星大乱斗X[WiFi](日) +RSBE01 = 任天堂明星大乱斗X(美) +RSBJ01 = 任天堂明星大乱斗X(日) RSBK01 = 任天堂明星大乱斗X[WiFi](韩) RSBP01 = 任天堂明星大乱斗X[WiFi](欧) RSCD7D = 疤面煞星 掌握世界(德) @@ -1723,8 +1704,8 @@ RSPE01 = Wii运动(美) RSPJ01 = Wii运动(日) RSPK01 = Wii运动(韩) RSPP01 = Wii运动(欧) -RSPW01 = Wii运动 -RSQEAF = 家庭滑雪[平衡板](美) +RSPW01 = Wii运动(中) +RSQEAF = 家庭滑雪(美) RSQJAF = 家庭滑雪(日) RSQPAF = 家庭滑雪[平衡板](欧) RSRE8P = 索尼克与神秘指环(美) @@ -1774,7 +1755,7 @@ RT8P69 = 泰格伍兹高尔夫巡回赛08(欧) RT9E52 = 托尼霍克滑板 练习场[WiFi](美) RT9P52 = 托尼霍克滑板 练习场[WiFi](欧) RTAE41 = 汤姆克兰西之鹰击长空2(美) -RTAP41 = 汤姆克兰西之鹰击长空2(欧) +RTAP41 = 汤姆克兰西 鹰击长空2(欧) RTBE52 = 乐伯乐疯狂钓鱼(美) RTBP52 = 乐伯乐疯狂钓鱼(欧) RTCE41 = 分裂细胞 双重间谍(美) @@ -1791,7 +1772,7 @@ RTFK52 = 变形金刚 游戏(韩) RTFP52 = 变形金刚 游戏(欧) RTFX52 = 变形金刚 游戏(X) RTFY52 = 变形金刚 游戏(Y) -RTGJ18 = Wi-Fi对应 严选桌面游戏[WiFi](日) +RTGJ18 = 严选桌面游戏 Wii RTHE52 = 托尼霍克滑板 下坡.(美) RTHP52 = 托尼霍克滑板(欧) RTIE8P = 古怪运动世界(美) @@ -1808,7 +1789,7 @@ RTLP18 = 目标!钓鱼大师 世界版(欧) RTME41 = 忍者神龟2007旋风再起(美) RTMP41 = 忍者神龟2007旋风再起(欧) RTNE41 = 天诛4(美) -RTNJCQ = 天诛4(日) +RTNJCQ = 天诛4(日或中) RTNP41 = 天诛4(欧) RTOJ8P = 428 被封锁的涉谷(日) RTPP41 = 王牌冒险(欧) @@ -1836,7 +1817,7 @@ RTZP08 = 宝岛Z 巴尔巴罗斯的秘宝(欧) RU2E5Z = 冬季运动会2 下一个挑战[平衡板](美) RU2P5Z = 冬季运动会2 下一个挑战[平衡板](欧) RU3E5Z = 夏季田径运动会(美) -RU4E41 = 我的健身教练2 运动与营养[平衡板](美) +RU4E41 = 我的健身教练2 运动与营养(美) RU4X41 = 新个人健身教练[平衡板](X) RU5E4Q = 迪士尼公主和青蛙(美) RU5P4Q = 公主与青蛙(欧) @@ -1846,8 +1827,8 @@ RU6EHG = 自由奔跑(美) RU6PHY = 自由奔跑(欧) RU7E5G = 博物馆奇妙夜2 决战史密森尼(美) RU7X5G = 博物馆奇妙夜2 决战史密森尼(X) -RU8EFS = 模拟专业狩猎(美) -RU9EGT = 我的芭蕾舞工作室[平衡板](美) +RU8EFS = 巴斯专业店 狩猎(美) +RU9EGT = 我的芭蕾舞工作室(美) RU9PGT = 天后女孩 芭蕾天后[平衡板](欧) RUAE52 = 怪物卡车 袭击市区(美) RUAP52 = 怪物卡车 袭击市区(欧) @@ -1896,7 +1877,7 @@ RUSK78 = 海绵宝宝历险记 致命水珠(韩) RUSP78 = 海绵宝宝历险记 致命水珠(欧) RUSX78 = 海绵宝宝历险记 致命水珠(X) RUSY78 = 海绵宝宝历险记 致命水珠(Y) -RUUE01 = 动物之森 城市大家庭[WiFi](美) +RUUE01 = 动物之森 城市大家庭(美) RUUJ01 = 动物之森 城市大家庭[WiFi](日) RUUK01 = 动物之森 城市大家庭[WiFi](韩) RUUP01 = 动物之森 城市大家庭[WiFi](欧) @@ -1918,7 +1899,7 @@ RV9E78 = 降世神通 最后的气宗 前往地狱(美) RV9P78 = 降世神通 最后的气宗 前往地狱(欧) RVAE78 = 降世神通 燃烧的大地(美) RVAP78 = 降世神通 燃烧的大地(欧) -RVBERS = 艾尔文与花栗鼠(美) +RVBERS = 鼠来宝(美) RVBPRS = 艾尔文与花栗鼠(欧) RVDPLG = 德伯力克 原罪(欧) RVEFMR = 欢迎来到北方(法) @@ -1958,7 +1939,7 @@ RVVP78 = 大沙滩运动(欧) RVXFRT = 现代冬季两项2009[平衡板](法) RVXPRT = 现代冬季两项2009[平衡板](欧) RVYD52 = 使命召唤 世界大战[WiFi](德) -RVYE52 = 使命召唤 世界大战(美) +RVYE52 = 使命召唤 战争世界(美) RVYK52 = 使命召唤 世界大战[WiFi](韩) RVYP52 = 使命召唤 世界大战[WiFi](欧) RVYX52 = 使命召唤 世界大战[WiFi](X) @@ -1971,7 +1952,7 @@ RW3P4Q = 加勒比海盗 世界的尽头(欧) RW4D41 = 我的词汇教练(德) RW5F41 = 谁想成为百万富翁?第二集(法) RW5P41 = 谁想成为百万富翁?第二集(欧) -RW6PA4 = 劲舞革命 美少女俱乐部[跳舞毯](欧) +RW6PA4 = 劲舞革命 美少女俱乐部(欧) RW7E41 = 肖恩怀特滑雪[平衡板](美) RW8P41 = 想象 冠军骑士(欧) RW9P78 = 世界职业摔角联盟2009[WiFi](欧) @@ -2007,7 +1988,7 @@ RWJENR = 单词琼聚会(美) RWKE5G = 料理妈妈 世界厨房(美) RWKPGT = 料理妈妈 世界厨房(欧) RWLE01 = 瓦里奥大陆 摇动(美) -RWLJ01 = 瓦里奥大陆 摇动(日) +RWLJ01 = 瓦里奥大陆 摇晃(日或中) RWLK01 = 瓦里奥大陆 摇动(韩) RWLP01 = 瓦里奥大陆 摇动(欧) RWME78 = 百战天虫 怪异空间(美) @@ -2019,11 +2000,11 @@ RWOP69 = 大富翁(欧) RWQPSP = 真实世界斯诺克冠军赛2008(欧) RWRE4F = 古怪赛车 冲撞(美) RWRP4F = 古怪赛车 冲撞(欧) -RWSE8P = 马里奥与索尼克在奥运会[WiFi](美) +RWSE8P = 马里奥与索尼克在北京奥运(美) RWSJ01 = 马里奥与索尼克在北京奥运(日) RWSK01 = 马里奥与索尼克在奥运会[WiFi](韩) RWSP8P = 马里奥与索尼克在奥运会[WiFi](欧) -RWTEG9 = BEN 10 外星神力(美) +RWTEG9 = 少年骇客 外星英雄(美) RWTPG9 = BEN 10 外星神力(欧) RWUE52 = X战警 金钢狼(美) RWUP52 = X战警 金钢狼(欧) @@ -2040,13 +2021,13 @@ RWZP5G = 奇迹世界游乐园(欧) RWZX5G = 奇迹世界游乐园(X) RX2E70 = 我和我的小马2(美) RX2P70 = 我和我的小马2(欧) -RX3E01 = 激情漫游 特技竞速[WiFi](美) +RX3E01 = 激情漫游 特技竞速(美) RX3J01 = 激情漫游 特技竞速(日) RX4E4Z = 鬼马小灵精 恐怖学校鬼怪的运动日(美) RX4PMT = 鬼马小灵精 恐怖学校鬼怪的运动日(欧) RX5E52 = 托尼霍克 直立滑行(美) RX5P52 = 托尼霍克 直立滑行(欧) -RX6E78 = 减肥达人[平衡板](美) +RX6E78 = 减肥达人(美) RX6P78 = 减肥达人[平衡板](欧) RX7JGD = 梅吉玛吉演奏比赛(日) RX8JA4 = 实况力量棒球NEXT(日) @@ -2083,8 +2064,8 @@ RXLP41 = 医生格蕾(欧) RXMJ8P = 手舞足蹈填字谜(日) RXNEXS = 又上钩啦 实感钓鱼(美) RXNJJF = 鲈鱼钓手Wii 世界锦标赛[MP](日) -RXNPGT = 大收获 巴斯钓鱼2[MP](欧) -RXPEXS = 实感钓鱼[WiFi](美) +RXNPGT = 巴斯钓鱼2(欧) +RXPEXS = 实感钓鱼 上钩了(美) RXPJJF = 实感钓鱼[WiFi](日) RXPPGT = 实感钓鱼[WiFi](欧) RXQEWR = 野兽家园(美) @@ -2103,26 +2084,27 @@ RXXJ4Q = 化石超进化 起源(日) RXXP4Q = 化石超进化 起源(欧) RXYE4Z = 更多的难题挑战(美) RXYP4Z = 更多的难题挑战(欧) -RXZE52 = 卡贝拉危险狩猎2009(美) +RXZE52 = 坎贝拉危险狩猎2009(美) RXZP52 = 卡贝拉危险狩猎2009(欧) RY2E41 = 雷曼 疯狂兔子2[WiFi](美) RY2J41 = 雷曼 疯狂兔子2[WiFi](日) RY2K41 = 雷曼 疯狂兔子2[WiFi](韩) -RY2P41 = 雷曼 疯狂兔子2[WiFi](欧) +RY2P41 = 疯狂兔子2(欧) RY2R41 = 雷曼 疯狂兔子2[WiFi](俄) -RY3E41 = 雷曼 疯狂兔子 电视聚会[平衡板](美) +RY3E41 = 疯狂兔子 电视聚会(美) RY3J41 = 雷曼 疯狂兔子 电视聚会[平衡板](日) RY3K41 = 雷曼 疯狂兔子 电视聚会[WiFi][平衡板](韩) RY3P41 = 雷曼 疯狂兔子 电视聚会[WiFi][平衡板](欧) RY4J8P = 噗哟噗哟7(日) RY5E52 = 夏日运动大联盟(美) RY5P52 = 夏日运动大联盟(欧) -RY6EA4 = 去户外吧[平衡板][跳舞毯](美) +RY6EA4 = 去户外吧(美) RY6PA4 = 节拍漫步[平衡板][跳舞毯](欧) RY7PHZ = 忍者首领(欧) RY8EFS = 巴斯专业店 鱼饵(美) -RYAJDA = 小双侠Wii 噗通噗通大赛车(日) -RYBE69 = 轰炸方块 猛击聚会[WiFi](美) +RY9E69 = FIFA足球09[WiFi](美) +RYAJDA = 小双侠Wii 惊心动魄机器猛竞速(日或中) +RYBE69 = 轰炸方块 猛击聚会(美) RYBP69 = 轰炸方块 猛击聚会[WiFi](欧) RYDELT = 宠物伴侣 动物医生(美) RYDP6V = 宠物伴侣 动物医生(欧) @@ -2143,7 +2125,7 @@ RYLDSV = 德国顶级模特(德) RYNE6U = 哈迪男孩 隐藏的盗窃(美) RYNP6V = 哈迪男孩 隐藏的盗窃(欧) RYOEA4 = 游戏王5D's 破碎转轮(美) -RYOJA4 = 游戏王5D's 破碎转轮(日) +RYOJA4 = 游戏王5D's 骑乘决斗者(日或中) RYOPA4 = 游戏王5D's 破碎转轮(欧) RYQE69 = 打破砂锅问到底(美) RYQP69 = 打破砂锅问到底(欧) @@ -2168,12 +2150,12 @@ RZ6JG9 = 简单Wii系列5 打砖块[WiFi](日) RZ7JG9 = 简单Wii系列6 喧哗枪战[WiFi](日) RZ8JG9 = 简单2000系列1 桌面游戏(日) RZ9EG9 = 家庭聚会 30游戏(美) -RZ9JG9 = 简单2000系列2 家庭聚会(日) +RZ9JG9 = 简单2000系列2 聚会游戏(日或中) RZ9PG9 = 简单2000系列2 家庭聚会(欧) RZAPTV = 力量数学(欧) RZCE6K = 大圣王(美) RZDE01 = 塞尔达传说 黎明公主(美) -RZDJ01 = 塞尔达传说 黎明公主(日或中) +RZDJ01 = 塞尔达传说 黄昏公主(日或中) RZDK01 = 塞尔达传说 黎明公主(韩) RZDP01 = 塞尔达传说 黎明公主(欧) RZEE52 = 科学爸爸(美) @@ -2196,7 +2178,7 @@ RZNJ01 = 斩击的女武神(日) RZOE78 = 动物园世界(美) RZOP78 = 动物园世界(欧) RZPE01 = 林克的弓箭训练(美) -RZPJ01 = 林克的弓箭训练(日或中) +RZPJ01 = 林克的十字弓练习(日或中) RZPK01 = 林克的弓箭训练(韩) RZPP01 = 林克的弓箭训练(欧) RZREGT = 佐罗的宿命(美) @@ -2207,7 +2189,7 @@ RZTE01 = Wii运动 度假胜地[MP](美) RZTJ01 = Wii运动 度假胜地[MP](日) RZTK01 = Wii运动 度假胜地[MP](韩) RZTP01 = Wii运动 度假胜地[MP](欧) -RZTW01 = Wii运动 度假胜地[MP] +RZTW01 = Wii运动 度假胜地(中) RZUE4Z = 彩色之旅(美) RZYE41 = 我的单词教练(美) RZYF41 = 我的单词教练(法) @@ -2218,7 +2200,7 @@ RZZJEL = 疯狂世界(日) RZZP8P = 疯狂世界(欧) S22JAF = 家庭钓鱼(日) S25JGD = 勇者斗恶龙25周年纪念 FC & SFC 勇者斗恶龙1、2、3 (日) -S2AEAF = 运动生活 探险家(美) +S2AEAF = 活力生活 探险家(美) S2AJAF = 运动生活 探险家(日) S2APAF = 运动生活 探险家(欧) S2BEPZ = 乡村舞蹈2(美) @@ -2229,12 +2211,13 @@ S2EE41 = ABBA: You Can Dance(美) S2EP41 = ABBA: You Can Dance(欧) S2HE70 = 鬼屋(美) S2HP70 = 鬼屋(欧) -S2IE8P = 钢铁人2(美) +S2IE8P = 钢铁侠2(美) S2IP8P = 钢铁人2(欧) -S2LE01 = 神奇宝贝乐园 2 (美) +S2LE01 = 宝可梦公园2 在世界的彼端(美) S2LJ01 = 神奇宝贝乐园 2(日) S2LP01 = 神奇宝贝乐园 2(欧) -S2OEFS = 巴斯专业店鱼饵 锦标赛版(美) +S2ME69 = 美式橄榄球大联盟13(美) +S2OEFS = 巴斯专业店 鱼饵 锦标赛(美) S2PEA4 = 实况足球 中场指挥官 2012(美) S2PJA4 = 实况足球 中场指挥官 2012(日) S2PPA4 = 实况足球 中场指挥官 2012(欧) @@ -2244,10 +2227,13 @@ S2QE54 = NBA 2K12(美) S2QP54 = NBA 2K12(欧) S2RPNK = 目标狙击(美) S2TJAF = 太鼓达人Wii 大张旗鼓!二代目(日) +S2UE41 = 舞力全开2020(美) +S2UP41 = 舞力全开2020(欧) S2WE78 = WWE激爆职业摔角 全明星大赛(美) S2WP78 = WWE激爆职业摔角 全明星大赛(欧) S2XE41 = 蓝色小精灵2(美) S2XP41 = 蓝精灵2(欧) +S2YE52 = 勇敢向前冲4(美) S2ZE52 = 开心鼠园2(美) S2ZP52 = 开心鼠园2(欧) S3AE5G = 电影空间大冒险(美) @@ -2255,15 +2241,16 @@ S3APGT = 电影空间大冒险(美) S3BEWR = 蝙蝠侠 英勇与无畏(美) S3BPWR = 蝙蝠侠 英勇与无畏(欧) S3CENR = 三冠王滑雪锦标赛[平衡板](美) -S3DE18 = 德卡运动会3[MP][WiFi](美) +S3DE18 = 德卡运动会3(美) S3DJ18 = 德卡运动会3[MP][WiFi](日) S3DP18 = 德卡运动会3[MP][WiFi](欧) S3EE78 = 芭比娃娃 时尚风格(美) S3EP78 = 芭比娃娃 时尚风格(欧) +S3FE69 = FIFA足球13(美) S3FP69 = FIFA 足球 13 S3GE20 = 冰川赛车3(美) S3HJ08 = 战国 BASARA3 宴(日) -S3IPA4 = 实况足球2013 欧版 +S3IPA4 = 实况足球2013(欧) S3ME69 = 模拟人生3(美) S3MP69 = 模拟人生3(欧) S3PE4Q = 迪士尼公主 我的童话冒险(美) @@ -2282,10 +2269,15 @@ S59E01 = 战国无双 3(美) S59JC8 = 战国无双 3(日) S59P01 = 战国无双 3(欧) S5BETL = 回到未来(美) +S5DE41 = 舞力全开 迪士尼派对2(美) +S5DP41 = 舞力全开 迪士尼派对2(欧) +S5EE41 = 舞力全开2019(美) +S5EP41 = 舞力全开2019(欧) S5KJAF = 太鼓达人Wii 超豪华版(日) S5QJC8 = 战国无双3 猛将传(日) +S5RPNJ = 拉姆赛车(欧) S5SJHF = 闪电十一人GO时空之石 王牌前锋 2013(日) -S5TEG9 = Ben 10: 全能宇宙 +S5TEG9 = 少年骇客 全面进化(美) S5WE20 = 在50个游戏里环游世界(美) S6BE4Q = 勇敢传说(美) S6BP4Q = 勇敢传说(欧) @@ -2294,7 +2286,8 @@ S6IE78 = 迪斯尼公主故事书(美) S6IP78 = 迪斯尼公主故事书(美) S6RE52 = 无敌破坏王(美) S6RP52 = 无敌破坏王(欧) -S72J01 = 星之卡比 20周年纪念合集 +S72E01 = 星之卡比 20周年纪念合集(美) +S72J01 = 星之卡比 20周年纪念合集(日) S75E69 = 大富翁 风华大街(美) S75P69 = 大富翁 风华大街(欧) S7AEWR = 乐高蝙蝠侠2 DC超级英雄(美) @@ -2302,17 +2295,18 @@ S7APWR = 乐高蝙蝠侠2 DC超级英雄(欧) S7BE69 = 棋盘游戏(美) S7BP69 = 棋盘游戏(欧) S7CJAF = 假面骑士 巅峰英雄 Fourze(日) -S7DE52 = 愤怒的小鸟:星球大战 -SA3E5G = 艾尔文与金花鼠 3(美) -SA5E78 = 你比小学五年级聪明吗?开学(美) -SA6EG9 = Ben 10 银河赛车(美) +S7DE52 = 愤怒的小鸟 星球大战(美) +SA3E5G = 鼠来宝3(美) +SA5E78 = 你比五年级生聪明吗3(美) +SA6EG9 = 少年骇客 银河赛车(美) SA6PAF = Ben 10 银河赛车(美) -SA7ESZ = 橡皮糖熊的魔法勋章(美) -SABENR = 外星怪兽保龄球联赛[MP](美) +SA7ESZ = 小熊软糖 魔法勋章(美) +SABENR = 外星怪兽保龄球联赛(美) SABPJG = 外星怪兽保龄球联赛[MP](欧) SADE70 = 后院运动 沙地强打者(美) SAFUHS = 澳大利亚橄榄球联赛(英) SAGE41 = 极速前进(美) +SAHE69 = 孩之宝 家庭游戏之夜乐趣包(美) SAJE52 = 坎贝拉生存大冒险 卡特迈的阴影(美) SAJP52 = 坎贝拉生存大冒险 卡特迈的阴影(欧) SAKENS = 樱花大战5 再见吾爱(美) @@ -2320,13 +2314,15 @@ SAKPNS = 樱花大战5 再见吾爱(欧) SALE4Q = 爱丽丝漫游仙境(美) SALP4Q = 爱丽丝漫游仙境(欧) SANEFS = 巴斯专业店 狩猎 奖杯赛(美) +SAOE78 = 精灵高中 食尸鬼精神(美) SAOP78 = 怪物美少女 尸鬼精灵(欧) SAOXVZ = 怪物美少女 尸鬼精灵(欧) -SARE4Z = 阿拉丁魔毯竞速[平衡板](美) +SAQE5G = 好莱坞明星私教(美) +SARE4Z = 阿拉丁魔毯竞速(美) SARPNK = 阿拉丁魔毯竞速[平衡板](欧) -SATE6K = 查克E奶酪的超级收藏(美) +SATE6K = 查克奶酪的超级收藏(美) SAUJ8P = 魔法气泡! 20周年纪念版(日) -SAVE5G = 艾尔文与花栗鼠 明星俱乐部(美) +SAVE5G = 鼠来宝2(美) SAVX5G = 艾尔文与金花鼠 明星俱乐部(欧) SAWE52 = 愤怒的小鸟 三部曲(美) SAWP52 = 愤怒的小鸟 三部曲(欧) @@ -2343,7 +2339,7 @@ SB4E01 = 超级马里奥银河2(美) SB4J01 = 超级马里奥银河2(日) SB4K01 = 超级马里奥银河2(韩) SB4P01 = 超级马里奥银河2(欧) -SB4W01 = 超级马里奥银河2 +SB4W01 = 超级马里奥银河2(中) SB5E54 = NBA 2K11[WiFi](美) SB5P54 = NBA 2K11[WiFi](欧) SB6E52 = 爆丸 核心守护者(美) @@ -2357,25 +2353,25 @@ SBBE18 = 金属战斗陀螺 对决大赛场(美) SBBJ18 = 金属战斗陀螺 对决大赛场(日) SBBP18 = 金属战斗陀螺 对决大赛场(欧) SBCJ2N = 比利的训练营Wii 享受减肥(日) -SBDE08 = 生化危机 暗黑编年史[WiFi](美) -SBDJ08 = 生化危机 暗黑编年史[WiFi](日) -SBDK08 = 生化危机 暗黑编年史[WiFi](韩) -SBDP08 = 生化危机 暗黑编年史[WiFi](欧) +SBDE08 = 生化危机 暗黑编年史(美或中) +SBDJ08 = 生化危机 暗黑历代记[WiFi](日) +SBDK08 = 生化危机 暗黑历代记[WiFi](韩) +SBDP08 = 生化危机 暗黑历代记[WiFi](欧) SBEPSV = 百慕大三角 拯救珊瑚礁(欧) SBFE70 = 后院橄榄球10(美) SBHEFP = 雷明顿美洲猎鸟记(美) SBHPNK = 雷明顿美洲猎鸟记(欧) SBIEVZ = 勤劳理发师(美) SBIPVZ = 勤劳理发师(欧) -SBJEG9 = BEN 10 外星神力 终极异型(美) +SBJEG9 = 少年骇客 终极异形之宇宙毁灭(美) SBJPAF = BEN 10 外星神力 终极异型(欧) -SBKEPZ = 布朗斯威克 宇宙领域保龄球[MP](美) +SBKEPZ = 布朗斯威克 宇宙领域保龄球(美) SBLE5G = 男孩与软泥(美) SBLP5G = 男孩与软泥(欧) -SBNEG9 = BEN 10 外星神力 维尔加科斯的攻击(美) +SBNEG9 = 少年骇客 外星英雄之魔賈斯袭击(美) SBNPG9 = BEN 10 外星神力 维尔加科斯的反击(欧) SBQE4Z = 雄鹿猎人(美) -SBREJJ = 一起跳芭蕾[平衡板](美) +SBREJJ = 一起跳芭蕾(美) SBRPKM = 一起跳芭蕾[平衡板](欧) SBSEFP = 雷明顿狩猎北美超级大满贯(美) SBSURN = 雷明顿狩猎北美超级大满贯(英) @@ -2383,35 +2379,36 @@ SBVE78 = 海绵宝宝 碰碰船竞速(美) SBVP78 = 海绵宝宝 碰碰船竞速(欧) SBVS78 = 海绵宝宝 碰碰船竞速(欧) SBWE5G = 育儿妈妈(美) -SBWJRA = 育儿妈妈(日) +SBWJRA = 育儿妈妈(日或中) SBWPGT = 育儿妈妈(欧) SBXEWR = 亿万未婚夫(美) SBYE41 = 起舞百老汇(美) SBYP41 = 起舞百老汇(欧) SBZESZ = 百慕大三角 拯救珊瑚礁(美) -SC2E8P = 管道2[MP][WiFi](美) +SC2E8P = 管道2(美) SC2P8P = 管道2[MP][WiFi](欧) SC4E64 = 乐高星球大战3 克隆人战争(美) SC4P64 = 乐高星球大战3 克隆人战争(欧) SC5PGN = 挑战自我 填字游戏(欧) SC6PGN = 自我挑战 大脑智力题2(欧) -SC7D52 = 使命召唤7 黑色行动[WiFi](德) -SC7E52 = 使命召唤7 黑色行动(美) -SC7F52 = 使命召唤7 黑色行动[WiFi](法) -SC7I52 = 使命召唤7 黑色行动[WiFi](意) -SC7P52 = 使命召唤7 黑色行动[WiFi](欧) -SC7S52 = 使命召唤7 黑色行动[WiFi](西) +SC7D52 = 使命召唤 黑色行动(德) +SC7E52 = 使命召唤 黑色行动(美) +SC7F52 = 使命召唤 黑色行动(法) +SC7I52 = 使命召唤 黑色行动(意) +SC7P52 = 使命召唤 黑色行动(欧) +SC7S52 = 使命召唤 黑色行动(西) +SC7Z52 = 使命召唤 黑色行动(英) SC8E01 = Wii遥控器Plus 动感欢乐组合[MP](美) -SC8J01 = Wii遥控器Plus 动感欢乐组合[MP](日或中) +SC8J01 = Wii控制器加强版 动感欢乐组合(日或中) SC8P01 = Wii遥控器Plus 动感欢乐组合[MP](欧) SC9P52 = 卡贝拉猎人2010(美) SCAE18 = 鬼铃 黑暗来电(美) SCAJ18 = 鬼铃 黑暗来电(日) SCAP18 = 鬼铃 黑暗来电(欧) SCBPNK = 自行车运动(欧) -SCDE52 = 坎贝拉危险狩猎 2011(欧) +SCDE52 = 坎贝拉危险狩猎2011(美) SCDP52 = 坎贝拉危险狩猎 2011(欧) -SCEE6K = 查克 E. 奶酪的聚会游戏(美) +SCEE6K = 查克奶酪的派对游戏(美) SCFPNK = 魔怪狂欢节(欧) SCGE20 = 凯文塔克的乡村狂欢 农场动物赛车锦标赛(美) SCHEQH = 加拿大狩猎(美) @@ -2419,7 +2416,7 @@ SCIE41 = CSI 致命阴谋(美) SCIP41 = CSI 致命阴谋(欧) SCJE4Q = 乐高神鬼奇航(美) SCJP4Q = 乐高神鬼奇航(欧) -SCKE6K = 查克 E. 奶酪的运动游戏(美) +SCKE6K = 查克奶酪的运动游戏(美) SCMJAF = 假面骑士 巅峰英雄欧兹(日) SCNEA4 = 暮光之城(美) SCNPA4 = 暮光之城(欧) @@ -2430,7 +2427,7 @@ SCSE52 = 游轮度假游戏[MP](美) SCSPGR = 游轮度假游戏[MP](欧) SCTPNK = 小魔怪惊喜(欧) SCUPFR = 疯狂小鸡嘉年华派对(欧) -SCWE41 = 金牌体育 舞蹈锻炼[平衡板](美) +SCWE41 = 金吉姆健身房 舞蹈锻炼(美) SCWP41 = 我的健身教练 舞蹈锻炼[平衡板](欧) SCXESZ = 雪福来卡玛洛 野外驾驶(美) SCXPNJ = 雪福来卡玛洛 野外驾驶(美) @@ -2443,6 +2440,7 @@ SCZEMH = 疯狂机器(美) SCZPFR = 疯狂机器(欧) SD2E41 = 舞力全开2(美) SD2J01 = 舞力全开 Wii (日) +SD2K41 = 舞力全开2(韩) SD2P41 = 舞力全开2(欧) SD2Y41 = 舞力全开2 百思买版(美) SD3DSV = 健康教练 每天感觉好极了[平衡板](欧) @@ -2454,7 +2452,7 @@ SDAE5G = 女孩们的勇敢游戏(美) SDBE78 = 颜料宝贝2(美) SDBP78 = 颜料宝贝2(欧) SDDPML = 两性终极之战[平衡板](欧) -SDEE5G = 舞感[MP](美) +SDEE5G = 舞感(美) SDEPGT = 舞感[MP](美) SDFE4Q = 迪斯尼想唱就唱 合家欢唱版(美) SDFP4Q = 迪斯尼想唱就唱 合家欢唱版(欧) @@ -2487,21 +2485,24 @@ SDWP18 = 黑影之塔(欧) SDXE4Q = 迪士尼世界(美) SDXP4Q = 迪士尼世界(欧) SDYEA4 = 热舞革命[跳舞垫][平衡板](美) -SDYPA4 = 热舞革命 最夯的派对 4[跳舞垫][平衡板](欧) +SDYPA4 = 热舞革命 劲爆舞会4(欧) SDZE41 = 舞力全开 儿童版(美) SDZP41 = 舞力全开 儿童版(欧) SE2E69 = EA运动活力2(美) SE2P69 = EA运动活力2[平衡板](欧) -SE3E41 = 舞力全开 2015 +SE3E41 = 舞力全开2015(美) +SE3P41 = 舞力全开2015(欧) +SE8E41 = 舞力全开2018(美) +SE8P41 = 舞力全开2018(欧) SEAE69 = EA运动活力 更多锻炼[平衡板](美) SEAJ13 = EA运动活力 更多锻炼[平衡板](日) SEAP69 = EA运动活力 更多锻炼[平衡板](欧) SECE69 = EA创造(美) SECP69 = EA创造(欧) SEGE6U = 瑜伽[平衡板](美) -SEGP6V = 瑜伽[平衡板](欧) +SEGP6V = 瑜伽(欧) SEKJ99 = 活祭之夜(日) -SELE69 = FIFA足球11[WiFi](美) +SELE69 = FIFA足球11(美) SELP69 = FIFA足球11[WiFi](欧) SELX69 = FIFA足球11[WiFi](欧) SEME4Q = 米老鼠传奇(美) @@ -2512,8 +2513,8 @@ SEMY4Q = 传奇米老鼠(欧) SEMZ4Q = 传奇米老鼠(欧) SEPE41 = 黑眼豆豆大体验(美) SEPP41 = 黑眼豆豆大体验(欧) -SEPZ41 = 黑眼豆豆大体验(美) -SERE4Q = 传奇米老鼠2:双重力量(美) +SEPZ41 = 黑眼豆豆大体验 特别版(美) +SERE4Q = 传奇米老鼠2 双重力量(美) SERF4Q = 传奇米老鼠2:双重力量(欧) SERP4Q = 传奇米老鼠2:双重力量(欧) SERV4Q = 传奇米老鼠2:双重力量(欧) @@ -2522,22 +2523,22 @@ SF2P64 = 星际大战 原力解放2(欧) SF4E20 = 横冲直撞(美) SF5E41 = 六步健身法(美) SF5J41 = 健身工坊(日) -SF5P41 = 我的健身教练俱乐部(欧) -SF7E41 = 家庭智力抢答2012版(美) -SF8E01 = 大金刚国度 回归(美) +SF5P41 = 我的健身教练 俱乐部(欧) +SF7E41 = 家庭问答2012(美) +SF8E01 = 大金刚国度 回归(美或中) SF8J01 = 大金刚国度 回归(日) SF8P01 = 大金刚国度 回归(欧) -SFAE41 = 家庭对抗 智力问答(美) +SFAE41 = 家庭问答2011(美) SFAJGD = 钢之炼金术师 黄昏少女(日) SFBE70 = 后院运动 菜鸟向前冲(美) -SFDEAF = 家庭训练机 梦幻主题乐园(美) +SFDEAF = 活力生活 梦幻主题乐园(美) SFDJAF = 家庭训练机 梦幻主题乐园(日) SFDPAF = 家庭訓練機 夢幻主題樂園(歐) -SFGE69 = 孩之宝家庭游戏之夜4 游戏节目(美) +SFGE69 = 孩之宝 家庭游戏之夜4 游戏节目(美) SFHEFP = 户外活动合集(美) SFIE01 = 神秘档案 百灵泉(美) SFIP01 = 神秘案件档案(欧) -SFKEG9 = 家庭派对 欢乐瘦身[平衡板](美) +SFKEG9 = 家庭聚会 欢乐瘦身(美) SFKPAF = 家庭派对 欢乐瘦身[平衡板](欧) SFLDSV = 诅咒的复活节岛(德) SFOEAF = 网络食谱 烹饪对战(美) @@ -2564,7 +2565,7 @@ SFYEG9 = 家庭聚会 90个丰富好游戏(美) SFYPAF = 家庭聚会 90个丰富好游戏(欧) SFZEPZ = 雉鸡永存(美) SFZPXT = 雉鸡永存(欧) -SG2EFS = 疯狂迷你高尔夫2[MP](美) +SG2EFS = 疯狂迷你高尔夫2(美) SG2XUG = 疯狂迷你高尔夫2[MP](美) SG3DSV = 德国顶级模特2010[平衡板](德) SG5PSV = 家庭测验(欧) @@ -2582,7 +2583,7 @@ SGDEJJ = 花园一起玩(美) SGDPKM = 花园一起玩(欧) SGEEG9 = 国家地理杂志问答 野生动物(美) SGEPLG = 国家地理杂志问答 野生动物(欧) -SGHE41 = 汤姆克兰西 幽灵行动[WiFi](美) +SGHE41 = 汤姆克兰西 幽灵行动(美) SGHP41 = 汤姆克兰西 幽灵行动[WiFi](欧) SGIEA4 = GTI汽车俱乐部 世界城市竞速(美) SGIJA4 = GTI汽车俱乐部 世界城市竞速(日) @@ -2593,13 +2594,14 @@ SGKJC8 = 冠军骑师:风速神驹&骑师之道(日) SGKPC8 = 冠军骑师 骑师之道&风速神驹(欧) SGLEA4 = 高米迪战士 自然之王(美) SGLPA4 = 高米迪战士 自然之王(欧) +SGNE69 = 孩之宝 家庭游戏之夜超值包(美) SGODKP = 迷你高尔夫度假村(欧) SGOETV = 迷你高尔夫度假村(美) SGOPKP = 迷你高尔夫度假村(欧) SGPEYG = 最强赛车大奖赛 GP经典(美) SGPPNG = 经典赛车大奖赛(欧) SGQDSV = 德国顶级模特2011[平衡板](德) -SGREGT = 油脂劲歌热舞[平衡板](美) +SGREGT = 油脂劲歌热舞(美) SGRPGT = 油脂劲歌热舞[平衡板](欧) SGSESZ = 家庭游戏秀(美) SGSP7J = 家庭游戏秀(欧) @@ -2612,13 +2614,13 @@ SGVPAF = 欢乐假期(欧) SGWD7K = 比比小魔女(德) SGXE41 = 巨兽之战 恐龙袭击(美) SGXP41 = 巨兽之战 恐龙袭击(欧) -SGYESZ = 橡胶熊迷你高尔夫[MP](美) +SGYESZ = 小熊软糖 迷你高尔夫(美) SGYPNJ = 橡胶熊迷你高尔夫(欧) SH2JMS = 轻松学跳草裙舞(日) SH3E54 = 北美冰球联盟2011[MP][WiFi](美) SH3P54 = 北美冰球联盟2011[MP][WiFi](欧) SH4EFP = 战火纷飞 阿富汗(美) -SH5E69 = 哈利波特 死神的圣物 下集(美) +SH5E69 = 哈利波特与死亡圣器 下集(美) SH5P69 = 哈利波特 死神的圣物 下集(美) SH6E52 = 坎贝拉狩猎2012(美) SH7ESZ = 本田热力四射(美) @@ -2633,7 +2635,7 @@ SHDP52 = 驯龙高手(美) SHEDRM = 农场(德) SHFE20 = 篮球名人堂 极限挑战(美) SHGDRM = 假日游戏[MP](欧) -SHHE69 = 哈利波特与死神的圣物 上集(美) +SHHE69 = 哈利波特与死亡圣器 上集(美) SHHP69 = 哈利波特与死神的圣物 上集(欧) SHIJ2N = 有氧拳击2 Wii快乐瘦身(日) SHKE20 = 凯蒂猫 四季(美) @@ -2646,7 +2648,7 @@ SHOXKR = 雨果 巨魔树林里的魔法(X) SHOYKR = 雨果 巨魔树林里的魔法(Y) SHPE5G = 我们的家 聚会[WiFi](美) SHSE20 = 超级战斗机(美) -SHTE20 = 马修斯狩猎弓[MP](美) +SHTE20 = 马修斯狩猎弓(美) SHUE52 = 坎贝拉危险狩猎 2011 特别版(美) SHVE78 = 风火轮赛车 赛道攻击(美) SHVP78 = 风火轮赛车 赛道攻击(欧) @@ -2669,7 +2671,7 @@ SIFESZ = 弗兰克斯坦博士岛(美) SIFPNJ = 弗兰克斯坦博士岛(欧) SIIE8P = 马里奥与索尼克在伦敦奥运[WiFi](美) SIIJ01 = 马里奥与索尼克在伦敦奥运[WiFi](日) -SIIP8P = 马里奥与索尼克在伦敦奥运[WiFi](欧) +SIIP8P = 马里奥与索尼克在伦敦奥运(欧) SIJE52 = 我是凯利2 加入我们(美) SIJP52 = 我是凯利2 加入我们(欧) SILE78 = 百战天虫 战斗岛[WiFi](美) @@ -2686,13 +2688,23 @@ SJ2PWR = 史酷比 幽灵沼泽(欧) SJ3JDA = 人生游戏 欢乐家庭(日) SJ5JDA = 人生游戏 快乐家庭 当地题材增量版(日) SJ6E41 = 舞力全开:迪士尼派对 -SJ9E41 = 舞力全开 夏日派对 +SJ6P41 = 舞力全开 迪士尼派对(欧) +SJ7E41 = 舞力全开 儿童版2014(美) +SJ7P41 = 舞力全开 儿童版2014(欧) +SJ9E41 = 舞力全开 夏日派对(美) +SJ9P41 = 舞力全开2 额外的歌曲(欧) +SJAE5G = 大白鲨 终极猎食者(美) SJBE52 = 詹姆斯邦德007 黄金眼(美) SJBJ01 = 007 黄金眼(日) SJBP52 = 詹姆斯邦德007 黄金眼(欧) -SJDE41 = 舞力全开 3(美) -SJDJ01 = 舞力全开Wii 2 -SJDP41 = 舞力全开 3(美) +SJCEZW = 杰里和狗足球(美) +SJDE41 = 舞力全开3(美) +SJDJ01 = 舞力全开 Wii2(日) +SJDK41 = 舞力全开3(韩) +SJDP41 = 舞力全开3(欧) +SJDX41 = 舞力全开3 特别版(欧) +SJDY41 = 舞力全开3 百思买版(美) +SJDZ41 = 舞力全开3 塔吉特版(美) SJEEPK = 开始行动 逃离冒险岛(美) SJFE4Z = 儿童健身岛度假村(美) SJFPGR = 幼儿健身教练(欧) @@ -2704,9 +2716,12 @@ SJJEA4 = 吉米约翰的超级引擎(美) SJKEPK = 疯狂卡丁车(美) SJLEFS = 少年体育联赛(美) SJLPXT = 少年体育联赛(美) -SJME5G = 吉利安 麦克尔的健身训练2010[平衡板](美) +SJME5G = Jillian Michaels的健身训练2010(美) SJMPGT = 吉利安 麦克尔的健身训练2010[平衡板](欧) -SJOP41 = 舞力全开 2014 +SJNE41 = 舞力全开2016(美) +SJNP41 = 舞力全开2016(欧) +SJOE41 = 舞力全开2014(美) +SJOP41 = 舞力全开2014(欧) SJPE78 = 智力竞答(美) SJQEPZ = 宝石探秘三部曲(美) SJQPGR = 宝石探秘三部曲(美) @@ -2720,7 +2735,7 @@ SJUE20 = 恐龙快打(美) SJUPXT = 恐龙快打(美) SJVE20 = 肖恩约翰逊体操[平衡板](美) SJWJA4 = 胜利十一人2010 蓝武士的挑战(日) -SJXD41 = 舞力全开4(欧) +SJXD41 = 舞力全开4 特别版(欧) SJXE41 = 舞力全开4(美) SJXP41 = 舞力全开4(欧) SJZE41 = 舞力全开 儿童版2(美) @@ -2728,26 +2743,29 @@ SJZP41 = 舞力全开 儿童版2(欧) SK3EEB = 超执刀 创伤小队(美) SK4E52 = 史莱克4 快乐神仙(美) SK4P52 = 史莱克4 快乐神仙(欧) +SK6KJD = 舞动韩流(韩) SKAEA4 = 卡拉OK革命 欢乐合唱团(美) SKAPA4 = 卡拉OK革命 欢乐合唱团(欧) -SKBEG9 = Kidz Bop 舞蹈派对(美) +SKBEG9 = 儿童舞蹈派对(美) SKCE20 = 大脚车 压碎王(美) SKDJ18 = 卡拉OK JOYSOUND Wii 双人对唱曲篇 SKEJ18 = 卡拉OK JOYSOUND Wii 演歌・歌謡曲篇 SKGEA4 = 卡拉OK革命 欢乐合唱团2(美) SKGPA4 = 卡拉OK革命 欢乐合唱团2(欧) -SKHJAF = 假面骑士:超巅峰英雄 +SKHJAF = 假面骑士 超巅峰英雄(日) SKJE78 = 死亡医生(美) SKLDSV = K11 专员行动(欧) SKMJAF = 假面骑士 巅峰英雄W(日) -SKOEA4 = 卡拉OK革命欢乐合唱团3(美) +SKOEA4 = 卡拉OK革命 欢乐合唱团3(美) SKOPA4 = 卡拉OK革命欢乐合唱团3(美) SKREG9 = 假面骑士 龙骑士(美) -SKTE78 = 全明星空手道[MP](美) +SKSE54 = NBA 2K13(美) +SKTE78 = 全明星空手道(美) SKTP78 = 全明星空手道[MP](欧) SKUE78 = 功夫熊猫2(美) SKUP78 = 功夫熊猫2(欧) -SKVE20 = 凯文万达姆的大巴斯挑战(欧) +SKUZ78 = 功夫熊猫2(美) +SKVE20 = 凯文万达姆的大巴斯挑战(美) SKXE20 = 海盗袭击(美) SKYE52 = 小龙斯派罗:巨人(美) SKYP52 = 小龙斯派罗:巨人(欧) @@ -2756,16 +2774,18 @@ SKYY52 = 小龙斯派罗:巨人(欧) SKYZ52 = 小龙斯派罗:巨人(欧) SKZE52 = 梦工厂超级明星赛(美) SKZP52 = 梦工厂超级明星赛(欧) -SL2J01 = 零 ~ 真红之蝶(日) +SL2J01 = 零 真红之蝶(日或中) SL2P01 = 零 ~ 真红之蝶(欧) SL3ENR = 龙的巢穴三部曲(美) SLAE78 = 最后的气宗(美) SLAP78 = 最后的气宗(欧) SLAZ78 = 最后的气宗 玩具反斗城版(美) +SLCEGN = 起舞吧(美) +SLDEYG = 一起跳舞(美) SLDPLG = 跟Mel B一起跳舞(欧) SLEE78 = 乔布拉 促进大脑发展的冥想游戏(美) SLEP78 = 乔布拉 促进大脑发展的冥想游戏(欧) -SLHEWR = 乐高哈利波特 5-7年(美) +SLHEWR = 乐高哈利波特 下集(美) SLHPWR = 乐高哈利波特 5-7年(欧) SLIE52 = 小联盟棒球 二合一(美) SLPP5D = 狼的精神(欧) @@ -2785,7 +2805,8 @@ SM2P52 = 十分钟快速健身(欧) SM4E20 = 大脚怪物卡车大破坏(美) SM5EAF = 侍战队真剑者(美) SM5PAF = 侍战队真剑者(欧) -SM6PNK = 我的形体教练 2 健身与舞蹈(欧) +SM6PNK = 我的形体教练2 健身与舞蹈(欧) +SM7E69 = 美式橄榄球大联盟12(美) SM8D52 = 使命召唤 现代战争3(欧) SM8E52 = 使命召唤 现代战争3(美) SM8F52 = 使命召唤 现代战争3(欧) @@ -2797,10 +2818,11 @@ SM9E54 = 职业棒球大联盟2K12(美) SMAENR = 海军陆战队 现代城市战(美) SMAPGN = 海军陆战队 现代城市战(欧) SMBE8P = 超级猴子球 平衡滚球[平衡板](美) -SMBJ8P = 超级猴子球 平衡滚球[平衡板](日) -SMBP8P = 超级猴子球 平衡滚球[平衡板](欧) +SMBJ8P = 超级猴子球 平衡滚球(日) +SMBP8P = 超级猴子球 平衡滚球(欧) SMCENR = 我们祝你圣诞快乐(美) -SMEE69 = 疯狂美式橄榄球11(美) +SMCPXT = 我们祝你圣诞快乐(欧) +SMEE69 = 美式橄榄球大联盟11(美) SMFE4Q = 飞哥与小佛 超时空之谜(美) SMFP4Q = 飞哥与小佛 超时空之谜(欧) SMGE78 = 超级大坏蛋(美) @@ -2822,18 +2844,18 @@ SMOJ41 = 迈克杰克逊 梦幻体验(日) SMOP41 = 迈克尔杰克逊 生涯(欧) SMOX41 = 迈克尔杰克逊 生涯(美) SMOY41 = 迈克尔杰克逊 生涯(欧) -SMPE69 = 大富翁精选集 (美) -SMPP69 = 大富翁精选集 (美)(欧) +SMPE69 = 大富翁精选集(美) +SMPP69 = 大富翁精选集(欧) SMRE78 = 美国职业摔角联盟2011(美) SMRP78 = 美国职业摔角联盟2011(欧) -SMSE78 = 超级漫画英雄小队 无限挑战(美) +SMSE78 = 漫威超级英雄小队 无限挑战(美) SMSP78 = 超级漫画英雄小队 无限挑战(欧) SMTJ18 = 桃太郎电铁2010 战国 维新英雄大集合之卷(日) SMUJAF = 大怪兽格斗 终极竞技场DX 终极战士大集结(日) SMVE54 = 职业棒球大联盟2K11(美) SMWE4Z = 荒岛求生(美) -SMYE20 = 分秒必争[MP](美) -SMZE78 = 超级漫画英雄小队 漫画大战(美) +SMYE20 = 分秒必争(美) +SMZE78 = 漫威超级英雄小队 漫画大战(美) SMZP78 = 超级漫画英雄小队 漫画大战(美) SN2E69 = 玩具枪大战 双重爆破合集(美) SN3EYG = 急速赛车 拉力赛(美) @@ -2849,12 +2871,12 @@ SN7EYG = 急速赛车 超级卡车赛(美) SN7PNG = 急速赛车 超级卡车赛(欧) SN8EYG = 急速赛车 冲刺车(美) SN8PNG = 急速赛车 冲刺车(欧) -SN9E54 = 尼克罗顿健身[平衡板](美) +SN9E54 = 尼克罗顿健身(美) SNAE52 = 坎贝拉猎人 北美历险记2011(美) SNBE41 = 重返犯罪现场 NCIS(美) SNBP41 = 重返犯罪现场 NCIS(欧) -SNCE8P = 索尼克 五彩缤纷[WiFi](美) -SNCJ8P = 索尼克:五彩缤纷[WiFi](日) +SNCE8P = 索尼克 五彩缤纷(美) +SNCJ8P = 索尼克 五彩缤纷(日) SNCP8P = 索尼克 五彩缤纷[WiFi](欧) SNDE20 = 一掷千金特别版(美) SNEENR = 北美狩猎盛典2(美) @@ -2871,7 +2893,6 @@ SNJP69 = NBA嘉年华(欧) SNKP54 = 尼克罗顿健身[平衡板](欧) SNKX54 = 尼克罗顿健身[平衡板](欧) SNLE54 = 尼克罗顿舞蹈(美) -SNLP54 = 尼克罗顿舞蹈(欧) SNLX54 = 尼克罗顿舞蹈(欧) SNMEAF = Namco博物馆 重制版(美) SNQE7U = 国家地理大挑战(美) @@ -2883,14 +2904,18 @@ SNUPJW = 快乐神经元学院(欧) SNVE69 = 极速快感 亡命天涯(美) SNVJ13 = 极速快感 亡命天涯(日) SNVP69 = 极速快感 亡命天涯(欧) -SNXJDA = 火影忍者疾风传 激斗忍者大战Special(日) +SNXJDA = 火影忍者疾风传 激斗忍者大战特别版(日) +SNYEVZ = 精灵高中 13个愿望(美) +SNZEVZ = 芭比梦幻屋派对(美) SO3EE9 = 符文工房 蓝海奇缘(美) SO3J99 = 符文工房 蓝海奇缘(日) +SOAE52 = 坎贝拉狩猎探险(美) SOCE4Z = 致命捕捞 混乱海域(美) -SOIEEB = 101合1运动聚会游戏超级合集(美) +SOIEEB = 101合1 运动聚会游戏大合集(美) SOIPHZ = 101合1运动聚会游戏超级合集(欧) SOJE41 = 雷曼 起源(美) SOJP41 = 雷曼 起源(欧) +SOKEA4 = 卡拉OK 欢乐之声(美) SOKJ18 = 卡拉OK 欢乐之声Wii DX(日) SOME01 = 大家的节奏天国(美) SOMJ01 = 大家的节奏天国(日或中) @@ -2899,9 +2924,9 @@ SONDMR = 我的第一首卡拉OK(德) SONFMR = 我的第一首卡拉OK(法) SONPMR = 我的第一首卡拉OK(欧) SOSEG9 = 极速蜗牛 超级特技队(美) -SOTE52 = 失败比赛(美) +SOTE52 = 勇敢向前冲(美) SOUE01 = 萨尔达传说 天空之剑(美) -SOUJ01 = 萨尔达传说 天空之剑(日或中) +SOUJ01 = 塞尔达传说 天空之剑(日或中) SOUK01 = 萨尔达传说 天空之剑(韩) SOUP01 = 萨尔达传说 天空之剑(欧) SP2E01 = Wii运动+Wii运动 度假胜地(欧) @@ -2935,7 +2960,7 @@ SPPEFS = 力量拳击(美) SPQE7T = 金牌间谍之幽灵公寓(美) SPRE41 = 正确定价 2010版(美) SPTJEB = 创伤小队 6人医师(日) -SPUE20 = 一起绘画[MP](美) +SPUE20 = 一起绘画(美) SPVEA4 = 实况足球2011[WiFi](美) SPVPA4 = 实况足球2011[WiFi](欧) SPVXA4 = 实况足球2011[WiFi](X) @@ -2946,10 +2971,12 @@ SPYDSV = 企鹅派对岛(德) SPZE5G = 比萨外送员(美) SQ2EPZ = 乡村舞蹈(美) SQ3EPZ = 乡村舞蹈(美) -SQDE8P = 纽约风暴与洛杉矶机枪街机版[WiFi](美) +SQAE52 = 坎贝拉的非洲冒险(美) +SQDE8P = 纽约风暴与洛杉矶机枪街机版(美) SQDP8P = 纽约风暴与洛杉矶机枪街机版[WiFi](欧) SQFE5G = 飞哥与小佛 寻找酷的东西(美) SQIE4Q = 迪斯尼无限世界(美) +SQKE5G = 料理妈妈2合1(美) SQLE4Z = 卡通频道明星大乱斗 XL(美) SQLPGN = 卡通频道大乱斗 SQME52 = 蜘蛛侠:时间边缘(美) @@ -2958,8 +2985,9 @@ SQPPX4 = 速度 2(欧) SQUDX3 = 测验派对(欧) SQUFX3 = 测验派对(欧) SQUPX3 = 测验派对(欧) +SQVE69 = FIFA 15(美) SQVX69 = FIFA足球 15 -SR4E41 = 疯狂兔子 时空旅行[MP][WiFi](美) +SR4E41 = 疯狂兔子 时空旅行(美) SR4J41 = 疯狂兔子:时光旅行[WiFi](日) SR4P41 = 疯狂兔子 时空旅行[MP][WiFi](欧) SR5E41 = 雷曼 疯狂兔子 派对合集[WiFi][平衡板](美) @@ -2985,10 +3013,10 @@ SRNE70 = 天桥骄子[平衡板](美) SRNP70 = 天桥骄子[平衡板](欧) SRPE4Q = 迪斯尼 长发公主(美) SRPP4Q = 迪斯尼 长发公主(欧) -SRQE41 = 球拍运动[MP](美) +SRQE41 = 球拍运动(美) SRQP41 = 球拍运动[MP](欧) SRRENR = 消遣游戏室[MP](美) -SRRPGN = 盛大聚会游戏[MP](欧) +SRRPGN = 盛大聚会游戏(欧) SRSE20 = 超级音速赛车(美) SRUE4Z = 红鼻子驯鹿鲁道夫(美) SRVE41 = 价格是正确的(美) @@ -3026,23 +3054,26 @@ SSHPHH = 夏洛克福尔摩斯 银耳饰之案(欧) SSIENR = 冬季爆发 九大冰雪运动[平衡板](美) SSJEJJ = 夏季明星 2012(美) SSJPKM = 夏季明星 2012(欧) +SSLENR = 骑手的天堂(美) SSLPKM = 马术俱乐部(欧) +SSMEYG = 美国门萨学院(美) SSMPGD = 门萨学院(欧) -SSNEYG = 狙击精英[WiFi](美) +SSNEYG = 狙击精英(美) SSNPHY = 狙击精英[WiFi](欧) SSPP52 = 小龙斯派罗的大冒险(歐) SSPX52 = 小龙斯派罗的大冒险(欧) -SSQE01 = 马里奥派对9(美) -SSQJ01 = 马里奥派对9(日) +SSQE01 = 马力欧派对9(美) +SSQJ01 = 马力欧派对9(日) SSQP01 = 马里奥派对9(欧) -SSQW01 = 马里奥派对9 繁体中文版 +SSQW01 = 马里奥派对9(中) SSRE20 = 狂野西部枪战(美) SSRPXT = 狂野西部枪战(X) SSTEG9 = 小子历险记 天空上尉(美) SSTPY5 = 特技飞行 空中英雄(欧) SSUES5 = 回转寿司(美) +SSVE52 = 勇敢向前冲3(美) SSWDRM = 水上运动[平衡板](德) -SSWEPZ = 水上运动[平衡板](美) +SSWEPZ = 水上运动(美) SSWPGR = 水上运动[平衡板](欧) SSZE5G = 剑(美) ST3J01 = 听力大考验(日) @@ -3050,18 +3081,18 @@ ST4PNX = 托马斯和伙伴们 铁路小英雄[MP](美) ST4XNX = 托马斯和伙伴们 铁路小英雄[MP](美) ST5E52 = 变形金刚 塞伯坦冒险(美) ST5P52 = 变形金刚 赛博坦大战(欧) -ST6E78 = 减肥达人挑战赛[平衡板](美) +ST6E78 = 减肥达人挑战赛(美) ST6P78 = 减肥达人挑战赛[平衡板](欧) -ST7E01 = 顶级街 Wii (美) -ST7JGD = 富豪街 Wii (日或中) -ST7P01 = 顶级街 Wii (歐) +ST7E01 = 富豪街Wii[WiFi](美) +ST7JGD = 富豪街Wii(日或中) +ST7P01 = 富豪街Wii[WiFi](欧) ST9E52 = 顶级射手(美) STAE78 = 猜猜画画(美) STAP78 = 猜猜画画(欧) STAU78 = 猜猜画画(欧) STDEFP = 目标狙击(美) STEETR = 俄罗斯方块派对 豪华版[WiFi][平衡板](美) -STEJ18 = 俄罗斯方块派对 超值版[WiFi][平衡板](日) +STEJ18 = 俄罗斯方块派对奖金(日或中) STEPTR = 俄罗斯方块派对 豪华版[WiFi][平衡板](欧) STFE52 = 变形金刚:领袖(美) STFP52 = 变形金刚:领袖(欧) @@ -3103,7 +3134,7 @@ STXE69 = 泰格伍兹高尔夫巡回赛12 大师(美) STXP69 = 泰格伍兹高尔夫巡回赛12 大师(欧) STYE52 = 托尼霍克滑板(美) STYP52 = 托尼霍克滑板(欧) -STZE52 = 变形金刚3(美) +STZE52 = 变形金刚3 月黑之时(美) STZP52 = 变形金刚3(欧) SU2E54 = 尼克罗顿舞蹈2(美) SU2P54 = 尼克罗顿舞蹈2(欧) @@ -3116,26 +3147,29 @@ SU3SMR = 你来唱2[WiFi][麦克风](西) SU3UMR = 你来唱2[WiFi][麦克风](欧) SU4E78 = UFC 私人教练(美) SU4P78 = UFC 私人教练[平衡板][Wi-Fi](欧) -SU6E5G = 尊巴瘦身:核心版 +SU5EVZ = 精灵高校 极限轮滑迷宫(美) +SU6E5G = 尊巴健身 核心版(美) SU6XGT = 尊巴瘦身:核心版 SU7EG9 = 守护者联盟(美) SU9E4Q = 飞机总动员(美) SU9P4Q = 飞机总动员(欧) SUKE01 = 星之卡比 重回梦幻岛(美) -SUKJ01 = 星之卡比 Wii(日) +SUKJ01 = 星之卡比 重回梦幻岛(日或中) SUKP01 = 星之卡比 Wii(欧) SUMJC8 = 胜利赛马世界 2010(日) +SUNEYG = 麋鹿猎人 传奇(美) SUPE01 = Wii欢乐聚会(美) -SUPJ01 = Wii欢乐聚会(日或中) +SUPJ01 = Wii派对(日或中) SUPK01 = Wii欢乐聚会(韩) SUPP01 = Wii欢乐聚会(欧) -SUREA4 = 热舞革命 2[跳舞垫](美) +SUREA4 = 热舞革命2(美) SURPA4 = 热舞革命 5(欧) SUSFMR = 环球歌唱 女孩之夜(法) SUSPMR = 环球歌唱 女孩之夜(欧) SUTESZ = 很久很久以前(美) SUUE78 = 天才小画家 即时艺术家(美) SUUP78 = 天才小画家 即时艺术家(欧) +SUVE52 = 坎贝拉危险狩猎2013(美) SUWE78 = 天才小画家(美) SUWP78 = 天才小画家(欧) SUXEA4 = 实况足球2010[WiFi](美) @@ -3143,25 +3177,27 @@ SUXJA4 = 实况足球2010[WiFi](日) SUXPA4 = 实况足球2010[WiFi](欧) SUXXA4 = 实况足球2010[WiFi](X) SUXYA4 = 实况足球2010[WiFi](Y) -SV2E78 = 大沙滩运动2[平衡板](美) +SV2E78 = 大沙滩运动2(美) SV2P78 = 大沙滩运动2[平衡板](欧) SV3EG9 = 马达加斯加3(美) SV3PAF = 马达加斯加3(欧) -SV4E8P = VR网球 4[MP][WiFi](美) +SV4E8P = VR网球4(美) SV4P8P = VR网球 4[MP][WiFi](欧) -SVBE52 = 战舰 +SVBE52 = 战舰(美) SVDP52 = 海绵宝宝 痞老板机器人复仇 SVME01 = 超级马里奥25周年纪念包(美) SVMJ01 = 超级马里奥25周年纪念包(日) SVMP01 = 超级马里奥25周年纪念包(欧) SVPESZ = 维加斯聚会(美) SVPPNJ = 维加斯聚会(欧) +SVQEVZ = 芭比姐妹之狗狗救援队(美) SVTEXS = 超级线程(美) SVVEG9 = 疯狂原始人:史前派对(美) SVVPAF = 古魯家族(歐) SVWEQH = 蔬菜世界(美) -SVYEG9 = Ben10 全体宇宙2 -SW2E52 = 百战铁人王 2(美) +SVYEG9 = 少年骇客 全面进化2(美) +SVZEVZ = 驯龙高手2(美) +SW2E52 = 勇敢向前冲2(美) SW3EJJ = 冬季滑雪明星(美) SW3PKM = 冬季滑雪明星(欧) SW4JA4 = 实况足球2011[WiFi](日) @@ -3171,50 +3207,59 @@ SW7EVN = 西部英雄(美) SW7PNK = 西部英雄(欧) SW9EVN = 怪物大轰炸(美) SW9PYT = 怪物大轰炸(美) -SWAE52 = DJ英雄[WiFi](美) +SWAE52 = DJ英雄(美) SWAP52 = DJ英雄[WiFi](欧) -SWBE52 = DJ英雄2[WiFi](美) +SWBE52 = DJ英雄2(美) SWBP52 = DJ英雄2[WiFi](欧) SX2PNG = 丛林赛车(欧) SX3J01 = 潘朵拉之塔 直到你身边(日) SX3P01 = 潘朵拉之塔 直到你身边 (歐) SX4E01 = 异度之刃:编年史 -SX4J01 = 异度之刃(日) +SX4J01 = 异度之刃(日或中) SX4P01 = 异度之刃(欧) SX5E4Z = 圣诞老人进城啰(美) SX6JAF = 光之美少女 全明星全员集合一起舞蹈(日) SX7E52 = 忍者神龟 SX8E52 = X战警 命运(美) SX8P52 = X战警 命运(美) -SXAE52 = 吉他英雄 世界巡演[WiFi](美) +SXAE52 = 吉他英雄 世界巡演(美) SXAP52 = 吉他英雄 世界巡演[WiFi](欧) -SXBE52 = 吉他英雄 金属乐队专辑[WiFi](美) +SXBE52 = 吉他英雄 金属乐队[(美) SXBP52 = 吉他英雄 金属乐队专辑[WiFi](欧) -SXCE52 = 吉他英雄 流行精选[WiFi](美) +SXCE52 = 吉他英雄 流行精选(美) SXCP52 = 吉他英雄 流行精选[WiFi](欧) -SXDE52 = 吉他英雄 范海伦[WiFi](美) +SXDE52 = 吉他英雄 范海伦(美) SXDP52 = 吉他英雄 范海伦[WiFi](欧) -SXEE52 = 吉他英雄5[WiFi](美) +SXEE52 = 吉他英雄5(美) SXEP52 = 吉他英雄5[WiFi](欧) -SXFE52 = 乐团英雄[WiFi](美) +SXFE52 = 乐团英雄(美) SXFP52 = 乐团英雄[WiFi](欧) -SXIE52 = 吉他英雄6 摇滚战士[WiFi](美) +SXIE52 = 吉他英雄6 摇滚战士(美) SXIP52 = 吉他英雄6 摇滚战士[WiFi](欧) SZ2E5G = 尊巴南美拉丁舞 2(美) SZ2P5G = 尊巴南美拉丁舞 2(欧) SZ2XGT = 尊巴南美拉丁舞 2(欧) -SZ5E5G = 尊巴南美拉丁舞(美) +SZ3E5G = 尊巴健身 世界派对(美) +SZ5E5G = 尊巴健身(美) SZ5PGT = 尊巴南美拉丁舞(欧) +SZ7E41 = 舞力全开2017(美) +SZ7P41 = 舞力全开2017(欧) SZAE69 = 摇滚乐团2[WiFi](美) SZAP69 = 摇滚乐团2[WiFi](欧) SZBE69 = 摇滚乐团3[WiFi](美) SZBP69 = 摇滚乐团3[WiFi](欧) +23EE41 = 舞力全开2023 +AFRE01 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷8 AMNE01 = 自制 另一个超级马里奥兄弟Wii(美) AMOR04 = 自制 吉他英雄3 HARDcore(欧) -APRP01 = 自制 ANDY AFRO的复古自制(欧) -APRP02 = 自制 ANDY AFRO的新超级马里奥兄弟Wii 混搭X 第三辑(欧) -APRP08 = 自制 ANDY AFRO的新超级马里奥兄弟Wii 自制第一辑(欧) -ASMB01 = 自制 另一个超级马里奥兄弟Wii +APRP01 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷2 +APRP02 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷3 +APRP03 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷6 +APRP04 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷7 +APRP06 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷5 +APRP08 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷1 +ASIE41 = 舞力全开 Asia +ASMB01 = 另一版的超级马里奥兄弟Wii BEPS01 = 自制 吉他英雄 下载版(西) C3BE52 = 自制 吉他英雄3 下载版(美) C3FP52 = 自制 吉他英雄3 下载版(欧) @@ -3332,15 +3377,19 @@ CTHP00 = 自制 唱吧 Summer Party v2.0(欧) CTIP00 = 自制 唱吧 Rocks! Part. I v2.0(欧) CTJP00 = 自制 唱吧 Rocks! Part. II v2.0(欧) CVLE38 = 自制 马里奥赛车 胜利赛道(美) +DLCE41 = 舞力全开2015合集 DMKE01 = 自制 马里奥赛车Wii 2(美) DMSP4Q = 自制 迪斯尼电影 想唱就唱(欧) DQAJSC = 水瓶座棒球 (貓星漢化版) DRP22Q = 自制 唱吧 下载版(欧) DUCE01 = 自制 马里奥赛车Wii(美) DUDE01 = 自制 新史酷比马里奥兄弟(美) +FC2E41 = 舞力全开 Focus2 FF4ENG = 自制 零月蚀之假面(美) +GH2E41 = 舞力全开 GH2 +GMSE02 = 超級馬里奧陽光多人遊戲 HBWE01 = 自制 超级马里奥兄弟Wii 地狱男爵版(美) -KMKE01 = 自制 马里奥赛车Wii(美) +KMKE01 = 马里奥赛车Wii 自制版 L40P4Q = 自制 唱吧 下载版(欧) MDUE01 = 自制 马里奥赛车 Track Grand Priix[WiFi](美) MECPSI = 自制 唱吧 下载版(欧) @@ -3349,27 +3398,29 @@ MILPSI = 自制 唱吧 下载版(欧) MKTE01 = 自制 马里奥赛车 技巧(美) MKWP01 = 自制 超级马里奥赛车Wii(欧) MMRE01 = 自制 D.U.超级马里奥兄弟2.1 疯狂反击(美) -MRRP01 = 自制 新超级马里奥兄弟Wii 复古重制版(欧) +MRRP01 = 新超级马里奥兄弟Wii 复古重制版 NRJ1FR = 自制 唱吧 NRJ音乐之旅 1.1版(自) +NSSP01 = 更加新的超级马里奥兄弟Wii 夏日骄阳 ONKELZ = 自制 唱吧 下载版(美) OTFPSI = 自制 唱吧 下载版(欧) PDUE01 = 自制 另一个超级马里奥兄弟Wii(美) PMNEO1 = 自制 新旧超级马里奥兄弟Wii(美) POPPSI = 自制 唱吧 下载版(欧) -PPNE01 = 自制 新超级马里奥兄弟Wii 2 下一阶段(美) +PPNE01 = 新超级马里奥兄弟Wii2 下一阶段 PPNP01 = 自制 新超级马里奥兄弟Wii 2 下一阶段(欧) PT1PSI = 自制 唱吧 Portugal Hits(欧) PUTA01 = 自制 吉他英雄3 摇滚精选(?) R01PET = 自制 唱吧 下载版(欧) R02PEA = 自制 唱吧 下载版(欧) R15POH = 自制 唱吧 Radio 105(欧) +R24E01 = 用Wii游玩小小机器人(日) R4ZE01 = 自制 零月蚀之假面(美) R4ZP01 = 自制 零月蚀之假面(美) R8FJSC = 匠餐厅大繁盛! 简体中文版 -R8PC01 = 超级纸片马里奥(简) +R8PC01 = 超级纸片马里奥(中) RCCR78 = 自制 吉他英雄3 Coheed与Cambria(欧) -RCOC99 = 名侦探柯南 追忆的幻想(ACG汉化简体中文版) -RDUE01 = 自制 DU超级马里奥兄弟 寻找公主(美) +RCOC99 = 名侦探柯南 追忆的幻想(中) +RDUE01 = DU超级马里奥兄弟 寻找公主 RG0E52 = 自制 吉他英雄 年轻岁月 加强版(美) RG1552 = 自制 吉他英雄 Weird Al Yankovic(?) RG1E52 = 自制 吉他英雄3 Revenge(美) @@ -3404,24 +3455,32 @@ RI1POH = 自制 唱吧 下载版(欧) RI2POH = 自制 唱吧 下载版 Vol.2(欧) RI3POH = 自制 唱吧 下载版(欧) RJJG52 = 自制 吉他英雄3 JJ-KwiK版(欧) +RJUE41 = 舞力全开 China RL9ESD = 自制 吉他英雄 联合公园(美) -RMCC01 = 超级马里奥赛车(ACG汉化简体中文版) +RMCC01 = 马里奥赛车Wii(中) RMCE06 = 自制 Wiimm的马里奥赛车趣味2010-12(美) RMCE07 = 自制 Wiimm的马里奥赛车 复古版2011-02(欧) RMCE08 = 自制 Wiimm的马里奥赛车趣味2011-03(美) RMCE09 = 自制 Wiimm的马里奥赛车趣味2011-06(美) +RMCEGP = 马里奥赛车Wii CTGP革命 +RMCEYP = 耀西赛车度假村Plus(美) RMCJ12 = 马里奥赛车Wii 自制版(2011-11 Wiimm)(日) +RMCJYP = 耀西赛车度假村Plus(日) +RMCKYP = 耀西赛车度假村Plus(韩) RMCP05 = 自制 马里奥赛车Wii(欧) RMCP06 = 自制 Wiimm的马里奥赛车趣味2010-12(欧) RMCP07 = 自制 Wiimm的马里奥赛车 复古版2011-02(欧) RMCP08 = 自制 Wiimm的马里奥赛车趣味2011-03(欧) RMCP09 = 自制 Wiimm的马里奥赛车趣味2011-06(欧) +RMCPCA = 马力欧卡丁车Wii(加泰兰语) +RMCPYP = 耀西赛车度假村Plus(欧) RMGC01 = 自制 超级马里奥银河(简) RMGE52 = 自制 吉他英雄3 Megadeth(美) RMGR01 = 自制 超级马里奥银河(俄) RMHC08 = 怪物猎人3(ACG汉化简体中文版) RMKE02 = 自制 马里奥赛车1(美) RMMP52 = 自制 吉他英雄3 Metal Mayhem(欧) +RNVW01 = 超级马里奥银河(中) ROMESD = 自制 怪物猎人 G(美) RQQE52 = 自制 吉他英雄 皇后乐团(美) RSFC99 = 胧村正(ACG汉化简体中文版) @@ -3434,16 +3493,30 @@ RWWE52 = 自制 吉他英雄 WWE The Hits(美) RYAJSC = 小双侠赛车 Wii 惊心动魄机器猛竞速 RZDC01 = 塞尔达传说 黎明公主(ACG汉化简体中文版) S02PES = 自制 唱吧 下载版(欧) +S12E41 = 舞力全开 BestOf2 +S18E41 = 舞力全开 Fitted 2018 +S2PE41 = 舞力全开2020 Plus +S3EE41 = 舞力全开2023 +S3UE41 = 舞力全开 Spotlight +S4EE41 = 舞力全开2023 +S5UE41 = 舞力全开 Unlimited Party +S68E41 = 舞力全开2022 +S7EE41 = 舞力全开2023 S80U3Q = 自制 唱吧 下载版(欧) +S85E41 = 舞力全开2021 +S85P41 = 舞力全开2021 SANT3Q = 自制 唱吧 下载版(欧) SB4C01 = 超级马里奥银河2(ACG汉化简体中文版) +SBJE41 = 舞力全开 Melody SBOD3Q = 自制 唱吧 下载版(欧) SBVG3Q = 自制 唱吧 下载版(欧) SDAE01 = 自制 史酷比!冒险的兄弟(美) SDRP3Q = 自制 唱吧 下载版(欧) SDTH3Q = 自制 唱吧 下载版(欧) SDUEO1 = 自制 新超级玛利欧兄弟DU版(欧) -SDUPO1 = 自制 新超级玛利欧兄弟DU版(欧) +SDUPO1 = DU超级马里奥兄弟 +SE1E41 = 舞力全开 East +SEHE41 = 舞力全开 Epic Hits SEOP4Q = 自制 唱吧 下载版(欧) SGI1CL = 自制 唱吧 下载版(欧) SGI1DB = 自制 唱吧 下载版(欧) @@ -3451,6 +3524,8 @@ SGI1MC = 自制 唱吧 下载版(欧) SGI1ML = 自制 唱吧 下载版(自) SGI1PT = 自制 唱吧 下载版(自) SGI1RC = 自制 唱吧 下载版(自) +SH5E41 = 舞力全开 Hyper +SHIE41 = 舞力全开 Hits SIABOH = 自制 唱吧 Placebo SIBBHJ = 自制 唱吧 下载版(自) SIESP1 = 自制 唱吧 Canciones en Español @@ -3489,31 +3564,50 @@ SISREU = 自制 唱吧 摇滚v1.1(欧) SISRP4 = 自制 唱吧 下载版(欧) SISSOH = 自制 唱吧 下载版(欧) SISTDK = 自制 唱吧 土耳其聚会(欧) +SJDJ02 = 舞力全开 Flamengo +SJEE41 = 舞力全开2014合集 +SJME89 = 舞力全开 Japan +SL1E41 = 舞力全开 Starlight +SM3E01 = 超级马里奥兄弟3+ SMD3OH = 自制 唱吧 e La Magia Disney SMIG3Q = 自制 唱吧 下载版(欧) -SMMP01 = 自制 ANDY AFRO的自制收藏 第四辑(欧) +SMMP01 = 新超级马里奥兄弟Wii ANDY AFRO的自制系列卷4 SMNC01 = 自制 新超级马里奥兄弟Wii(中) SMNE02 = 自制 新超级马里奥兄弟Remake版(美) +SMNE03 = 更新的超级马里奥兄弟Wii +SMNE07 = 更加新的超级马里奥兄弟Wii 佳节特辑 SMNE09 = 自制 老超级马里奥兄弟Wii(美) +SMNE23 = 更加新的超级马里奥兄弟Wii 落叶 +SMNEXE = 加强的超级马里奥兄弟.WIi豪华版 SMNP77 = 自制 新超级马里奥兄弟 阿卡迪亚(欧) SMNPO1 = 自制 新超级马里奥兄弟Wii定制版(欧) SMOT3Q = 自制 唱吧 下载版(欧) +SMPP01 = 新超级马里奥兄弟Wii2 另一个P SMRE01 = 自制 新超级马里奥兄弟Wii 超级马里奥兄弟1自制(美) +SNBE66 = 新超级马里奥兄弟wii启示录 SOME02 = 大家的节奏天国(美) +SOUE41 = 舞力全开 Ocean SP9P4Q = 自制 唱吧 下载版(欧) SRBP4Q = 自制 唱吧 下载版(欧) +SRGP01 = 新超级马里奥兄弟Wii2 Reggie SSLPOH = 自制 唱吧 Legends(意) ST8P75 = 自制 唱吧 下载版(欧) STAP75 = 自制 唱吧 下载版(欧) STCP75 = 自制 唱吧 下载版(欧) STDP75 = 自制 唱吧 下载版(欧) +STFE41 = 舞力全开 Focus STHP75 = 自制 唱吧 下载版(欧) STPP75 = 自制 唱吧 下载版(欧) STQP75 = 自制 唱吧 下载版(欧) STRP75 = 自制 唱吧 下载版(欧) STSP75 = 自制 唱吧 下载版(欧) +SU5E41 = 舞力全开 Lights +SV1E41 = 舞力全开 Unlimited Party1 +SV2E41 = 舞力全开 Unlimited Party2 +SV4E41 = 舞力全开 Infinity Party SXEF52 = 自制 吉他英雄3 Megadeth SXFF52 = 自制 吉他英雄3 My Chemical Romance +ULTE41 = 舞力全开 Ultra WARE01 = 自制 DU超级瓦里奥兄弟(美) WFFF4I = 自制 零月蚀之假面(意) XBKE52 = 自制 吉他英雄3 下载版(美) @@ -3555,7 +3649,7 @@ WCIE = 水晶防线R1(美) WCIP = 水晶防线R1(欧) WCOP = 小魔怪钓鱼(欧) WCVE = 洞窟物语(美) -WD9E = 恶魔城传说:重生(美) +WD9E = 恶魔城 重生(美) WD9J = 恶魔城传说:重生(日) WD9P = 恶魔城传说:重生(欧) WDFE = 守卫城堡(美) @@ -3669,7 +3763,6 @@ JCBE = 超级玛利奥RPG(美) JCBM = 超级玛利奥RPG(欧) JCKE = 太空侵略者(美) JCKP = 太空侵略者(欧) -JCUE = 飞行俱乐部(美) JCVP = 飞行俱乐部(欧) JCWE = 超级马里奥赛车(美) JCWP = 超级马里奥赛车(欧) @@ -3695,6 +3788,7 @@ NATE = 马里奥网球(美) NATP = 马里奥网球(欧) NAUE = 马里奥高尔夫(美) NAUP = 马里奥高尔夫(欧) +NAYM = Ogre Battle 64: Person of Lordly Caliber EA2P = 合金弹头2(欧) EA4P = 侍魂III(欧) EA5P = 饿狼传说3 最终胜利之路(欧) @@ -3710,25 +3804,31 @@ E6WE = 黄金战斧(美) E6WP = 黄金战斧(欧) C9SP = 碟中谍(欧) HAAA = 照片频道 -HABA = 购物频道(欧) +HABA = Wii购物频道 +HABC = Wii购物频道 HACA = Mii频道(欧) -HACK = Mii频道(欧) +HACC = Mii频道 +HACK = Mii频道(韩) HADE = 网络频道(美) HADJ = 网络频道(日) HADP = 网络频道(欧) HAFE = 天气频道(美) HAFJ = 天气频道(日) HAFP = 天气频道(欧) +HAGA = 新闻频道(美) HAGE = 新闻频道(美) HAGJ = 新闻频道(日) HAGP = 新闻频道(欧) HAPE = Check Mii Out频道(美) HAPP = Check Mii Out频道(欧) HAYA = 照片频道 +HAYC = 照片频道 +HBNJ = 电视之友频道 +HCDJ = 数码相机打印频道 +HCHJ = 送餐频道 +HCIJ = Wii 房间 HCLE = Netflix系统安装盘(美) -JODI = 自制频道(欧) -LULZ = 自制频道(欧) -OHBC = 自制频道(欧) +HCMP = 卡比电视频道(欧) 9XGX = SNES9x超任模拟器(美) D64A = 任天堂N64模拟器(欧) DCRA = 都市打靶(欧) @@ -3758,9 +3858,28 @@ DWMA = Wad管理器 v1.5(美) DWRA = Wii电台(美) DWXA = Wii资源管理器(欧) FCEU = FCE Ultra任天堂FC模拟器(欧) +JODI = 自制频道(欧) +LULZ = 自制频道(欧) +OHBC = 自制频道(欧) VBGX = VBA模拟器(欧) G4ME69 = The Sims: Bustin' Out -G4OE69 = The Sims 2: Pets -G4OP69 = The Sims 2: Pets +G4SJ01 = 塞尔达传说 四支剑(日或中) +G8MJ01 = 纸片马里奥 千年之门(日或中) G8MP01 = Paper Mario: The Thousand-year Door GBHJC8 = 战斗封神 +GBIJ08 = 生化危机(日或中) +GBZJ08 = 生化危机0(日或中) +GC6J01 = 宝可梦圆形竞技场(日或中) +GCDJ08 = 生化危机 代号维罗妮卡(日或中) +GFEJ01 = 火焰之纹章 苍炎之轨迹(日或中) +GHAJ08 = 生化危机2(日或中) +GIKJ70 = 斑鸠(日或中) +GLEJ08 = 生化危机3(日或中) +GM8J01 = 银河战士(日或中) +GMSJ01 = 超级马里奥阳光(日或中) +GPIE01 = 皮克敏星球探险(美) +GSBJ8P = 索尼克大冒险2 战斗(日或中) +GVCJ08 = 红侠乔伊 火热乱斗(日或中) +GXXJ01 = 宝可梦XD 暗之旋风黑暗洛奇亚(日或中) +GZ2J01 = 塞尔达传说 黄昏公主(日或中) +GZLJ01 = 塞尔达传说 风之杖(日或中) diff --git a/Data/Sys/wiitdb-zh_TW.txt b/Data/Sys/wiitdb-zh_TW.txt index 4d5ad538ec20..bd7c0935b80d 100644 --- a/Data/Sys/wiitdb-zh_TW.txt +++ b/Data/Sys/wiitdb-zh_TW.txt @@ -1,4 +1,4 @@ -TITLES = https://www.gametdb.com (type: Wii language: ZHTW_unique version: 20191106234341) +TITLES = https://www.gametdb.com (type: Wii language: ZHTW_unique version: 20230727194247) 410E01 = Wii 備份光碟 v1.31(美) D2AJAF = 運動生活 探險家 試玩版(日) D2SE18 = 運動大集錦2 試玩版(美) @@ -21,11 +21,12 @@ DK6J18 = 轉轉球迷宮2 試玩版[平衡板][WiFi](日) DMHE08 = 魔物獵人 3 試玩版(美) DMHJ08 = 魔物獵人 3 試玩版[WiFi](日) DPIE18 = 裝扮聚會 試玩版(美) -DQAJK2 = 水瓶座棒球(日) +DQAJK2 = 水瓶座棒球(日或中) DQGP69 = 我的模擬人生 賽車 試玩版(歐) DRME18 = 奇幻房間 試玩版(美) DSFE7U = 朧村正(美) DSRJ8P = 音速小子 索尼克與秘密的戒指 試玩版(日) +DTOJ8P = 428 被封鎖的涉谷 (試用版)(日) DWEPA4 = 實況足球2008 試玩版(歐) DXSE18 = 運動大集錦 試玩版(美) DZDE01 = 薩爾達傳說 曙光公主 試玩版(美) @@ -36,7 +37,7 @@ R22P01 = 超級粉碎球 PLUS[MP](歐) R23E52 = 芭比公主三劍客(美) R23P52 = 芭比公主三劍客(歐) R24J01 = 用Wii遊玩小小機器人(日) -R25EWR = 樂高哈利波特 1-4年(美) +R25EWR = 樂高哈利波特 上集(美) R25PWR = 樂高哈利波特 1-4年(歐) R26E5G = 街機經典(美) R27E54 = 愛探險的朵拉 拯救水晶王國(美) @@ -58,10 +59,10 @@ R2GEXJ = 廢墟迷宮 再見月的廢墟(美) R2GJAF = 虛弱 再見月之廢墟(日) R2GP99 = 廢墟迷宮 再見月的廢墟(歐) R2HE41 = 想象 冠軍騎士(美) -R2IE69 = 勁爆美式足球10[WiFi](美) +R2IE69 = 勁爆美式足球10(美) R2IP69 = 勁爆美式足球10[WiFi](歐) R2JJAF = 太鼓達人Wii(日) -R2KE54 = 唐金拳擊[平衡板](美) +R2KE54 = 唐金拳擊(美) R2KP54 = 唐金拳擊[平衡板](歐) R2LJMS = 草裙舞Wii[平衡板](日) R2ME20 = M&M's巧克力豆大冒險(美) @@ -81,10 +82,10 @@ R2SP18 = 運動大集錦2 Wii的十項運動(歐) R2TE41 = 忍者龜 毀滅[WiFi](美) R2TP41 = 忍者龜 毀滅[WiFi](歐) R2UE8P = 一起來敲打(美) -R2UJ8P = 一起來敲打(日) +R2UJ8P = 一起來拍打(日或中) R2UP8P = 一起來敲打(歐) R2VE01 = 罪與罰2(美) -R2VJ01 = 罪與罰:宇宙的後繼者(日) +R2VJ01 = 罪與罰 宇宙的繼承者(日) R2VP01 = 罪與罰2[WiFi](歐) R2WEA4 = 實況足球2009[WiFi](美) R2WJA4 = 實況足球 中場指揮官 2009(日) @@ -108,7 +109,7 @@ R39EFP = 禧碼諾極限釣魚(美) R39PNK = 禧瑪諾極限釣魚(歐) R3AE20 = 冒險童話故事時間(美) R3AP7J = 故事時間 冒險故事(歐) -R3BE8P = 歡樂森巴[WiFi](美) +R3BE8P = 歡樂森巴(美) R3BJ8P = 歡樂森巴[WiFi](日) R3BP8P = 歡樂森巴[WiFi](歐) R3CE20 = 克萊斯勒經典賽車(美) @@ -118,11 +119,11 @@ R3DPS5 = 夢幻彈珠檯3D(歐) R3EEWR = 遊戲派對3(美) R3EPWR = 遊戲派對3(歐) R3FJA4 = 實況力量棒球大聯盟3(日) -R3GXUG = 國際兒童 瘋狂小型高爾夫(X) +R3GXUG = 兒童高爾夫(X) R3HP6Z = 特工雨果 熱帶假期(歐) R3HX6Z = 特工雨果 熱帶假期(X) -R3IJ01 = 用Wii玩銀河戰士Prime(日) -R3JE5G = 去玩吧馬戲團明星[平衡板](美) +R3IJ01 = 用Wii玩銀河戰士(日或中) +R3JE5G = 去玩吧 馬戲團明星(美) R3KP6N = 摩天大樓(歐) R3LEWR = 綠光戰警 獵人的崛起(美) R3LPWR = 綠光戰警 獵人的崛起(歐) @@ -155,7 +156,7 @@ R42E69 = 模擬人生2 生存遊戲(美) R42P69 = 模擬人生2 生存遊戲(歐) R43E69 = EA SPORTS 活力健身房 更多鍛鍊[平衡板](美) R43J13 = EA SPORTS 活力健身房 30天生活改善程序[平衡板](日) -R43P69 = EA SPORTS 活力健身房 更多鍛鍊[平衡板](歐) +R43P69 = EA運動活力(歐) R44J8P = 涼宮春日的并列(日) R46ENS = 通靈戰士Wii(美) R46JKB = 通靈戰士Wii(日) @@ -163,7 +164,7 @@ R47E20 = ATV沙灘車之王(美) R48E7D = 奇幻精靈事件簿(美) R48P7D = 奇幻精靈事件簿(歐) R49E01 = 大金剛森林節拍(美) -R49J01 = 大金剛森林節拍(日) +R49J01 = 大金剛 叢林節拍(日) R49P01 = 大金剛森林節拍(歐) R4AE69 = 模擬動物(美) R4AJ13 = 模擬動物(日) @@ -176,7 +177,7 @@ R4CK69 = 模擬城市 建筑大師[WiFi](韓) R4CP69 = 模擬城市 建筑大師[WiFi](歐) R4DDUS = 三個問號 高校之迷(德) R4EE01 = 永恆深藍 海洋的呼喚(美) -R4EJ01 = 永恆深藍 海洋的呼喚(日) +R4EJ01 = FOREVER BLUE 海洋的呼喚(日) R4EP01 = 永恆深藍2 海洋的呼喚(歐) R4FE20 = 故事時間 童話故事(美) R4FP7J = 經典童話故事時間(歐) @@ -190,27 +191,26 @@ R4NX5G = 大小調的莊嚴進行曲(X) R4PE69 = 模擬人生2 寵物(美) R4PP69 = 模擬人生2 寵物(歐) R4QE01 = 瑪利歐足球前鋒 Charged[WiFi](美) -R4QJ01 = 瑪利歐足球前鋒 Charged[WiFi](日) +R4QJ01 = 瑪利歐足球前鋒 Charged(日) R4QK01 = 瑪利歐足球前鋒 Charged[WiFi](韓) -R4QP01 = 瑪利歐足球前鋒 Charged[WiFi](歐) +R4QP01 = 瑪利歐足球前鋒 Charged(歐) R4RE69 = FIFA足球10[WiFi](美) R4RJ13 = FIFA足球10[WiFi](日) R4RK69 = FIFA足球10(韓) R4RP69 = FIFA足球10[WiFi](歐) R4RX69 = FIFA足球10[WiFi](X) R4RY69 = FIFA足球10[WiFi](Y) -R4RZ69 = FIFA足球10[WiFi](美) +R4RZ69 = FIFA足球10(Z) R4SE54 = 美國職棒大聯盟 超級明星隊(美) R4VEA4 = 故事繪本工坊(美) R4VJA4 = 電視劇場Wii[WiFi](日) R4WJA4 = 實況力量棒球大聯盟2009(日) R4YJ2M = 貓社長蕾娜Wii(日) -R4ZJ01 = 零 月蝕之假面(日) +R4ZJ01 = 零 月蝕之假面(日或中) R52E08 = 尼奧寵物謎題大冒險(美) -R52P08 = 尼奧寵物謎題大冒險[WiFi](歐) +R52P08 = 尼奧寵物謎題大冒險(歐) R53PFH = 混音大師 阿曼凡布倫(歐) R54FMR = 倒數遊戲(法) -R55F41 = 誰想成為百萬富翁(法) R55P41 = 誰想成為百萬富翁(歐) R56EG9 = 原子小金剛(美) R56PG9 = 原子小金剛(歐) @@ -220,14 +220,14 @@ R58FMR = 你來唱[麥克風](法) R58PMR = 你來唱[麥克風](歐) R58SMR = 你來唱[麥克風](西) R59D4Q = 企鵝俱樂部 遊戲日[WiFi](歐) -R59E4Q = 企鵝俱樂部 遊戲日[WiFi](美) +R59E4Q = 企鵝俱樂部 遊戲日(美) R59P4Q = 企鵝俱樂部 遊戲日[WiFi](歐) R5AE8P = 黃金羅盤(美) R5AP8P = 黃金羅盤(歐) R5AX8P = 黃金羅盤(X) R5DE5G = 弗利普的翻轉世界(美) R5EPMR = 倒計時(歐) -R5FE41 = 冠軍學院 足球[MP][平衡板](美) +R5FE41 = 冠軍學院 足球(美) R5FP41 = 冠軍學院 足球[MP][平衡板](歐) R5GE78 = 你比五年級生聰明嗎(美) R5IE4Q = 玩具瘋狂總動員(美) @@ -246,8 +246,8 @@ R5PX69 = 哈利波特 鳳凰會的密令(X) R5QPGT = 馬戲團遊戲(歐) R5SERW = 幽靈莊園的秘密(美) R5TE69 = 大滿貫網球[MP][WiFi](美) -R5TJ13 = 大滿貫網球[MP][WiFi](日) -R5TP69 = 大滿貫網球[MP][WiFi](歐) +R5TJ13 = 大滿貫網球(日) +R5TP69 = 大滿貫網球(歐) R5UE41 = CSI犯罪現場 致命意圖(美) R5UP41 = CSI犯罪現場 致命意圖(歐) R5VE41 = 阿凡達(美) @@ -257,21 +257,21 @@ R5WEA4 = 沉默之丘 破碎的記憶(美) R5WJA4 = 沉默之丘:破碎的記憶(日) R5XJ13 = 我的模擬人生 特工(日) R5XP69 = 我的模擬人生 特工(歐) -R5YD78 = 全明星啦啦隊[平衡板](德) -R5YE78 = 全明星啦啦隊2[平衡板](美) +R5YD78 = 全明星啦啦隊2(德) +R5YE78 = 全明星啦啦隊2(美) R5YP78 = 全明星啦啦隊2[平衡板](歐) R62E4Q = 迪士尼想唱就唱 流行節奏(美) R62P4Q = 迪士尼想唱就唱 流行節奏(歐) R63EG9 = 家庭聚會 30個戶外遊戲(美) R63PG9 = 家庭聚會 30個戶外遊戲(歐) -R64E01 = Wii音樂[平衡板][WiFi](美) +R64E01 = Wii音樂(美) R64J01 = Wii音樂(日) R64K01 = Wii音樂[平衡板][WiFi](韓) R64P01 = Wii音樂[平衡板][WiFi](歐) R65ENR = 獵鹿狂(美) R66E41 = 按你的運氣 2010版(美) R67E6K = 聰明系列出品 佳佳的冒險(美) -R68E5G = 去玩吧 城市運動[平衡板](美) +R68E5G = 去玩吧 城市運動(美) R69E36 = 越野精英賽大地長征2(美) R69P36 = 越野精英賽大地長征2(歐) R6APPU = 寶貝和我(歐) @@ -283,14 +283,14 @@ R6BX78 = 顏料寶貝(X) R6CEAF = 我們的啦啦隊2(美) R6CJAF = 我們的啦啦隊 熱舞靈魂!(日) R6DFJW = 警告 公路規則(法) -R6EE41 = 家庭智力搶答 2010版(美) +R6EE41 = 家庭問答2010(美) R6FE41 = 六旗主題樂園(美) R6FERS = 六旗主題樂園(美) R6FP41 = 歡樂園聚會(歐) R6GPMR = 黃金球(歐) R6HE54 = 你好,凱蘭 超級遊戲節(美) R6HP54 = 你好,凱蘭 超級遊戲節(歐) -R6IE54 = 棒球衝擊波[MP](美) +R6IE54 = 棒球衝擊波(美) R6JJGD = 鋼之煉金術師 曉之王子(日) R6KP36 = 灰燼杯板球2009(歐) R6KU36 = 灰燼杯板球賽2009(英) @@ -300,7 +300,7 @@ R6ME5Z = 美國超級模特兒新秀大賽(美) R6MPML = 全美超模大賽(歐) R6NE41 = 夏恩懷特滑雪 世界舞臺[MP][平衡板](美) R6NP41 = 夏恩懷特滑雪 世界舞臺[MP][平衡板](歐) -R6NY41 = 夏恩懷特滑雪 世界舞臺[MP][平衡板](Y) +R6NY41 = 夏恩懷特滑雪 世界舞臺(歐) R6OE78 = 汽車總動員 奧拉瑪大獎賽(美) R6OP78 = 汽車總動員 奧拉瑪大獎賽(歐) R6OX78 = 汽車總動員 奧拉瑪大獎賽(X) @@ -331,17 +331,17 @@ R7AP69 = 模擬動物 非洲(歐) R7BE20 = 吉利貝利 彈道豆(美) R7BP7J = 吉利貝利 彈道豆(歐) R7CJ01 = 彩虹隊長(日) -R7EE8P = 飛天幽夢 流星夜物語[WiFi](美) +R7EE8P = 飛天幽夢 流星夜物語(美) R7EJ8P = 飛天幽夢 流星夜物語[WiFi](日) R7EP8P = 飛天幽夢 流星夜物語[WiFi](歐) -R7FEGD = 陸行鳥之不可思議迷宮 忘卻時間的迷宮[WiFi](美) +R7FEGD = 陸行鳥之不可思議迷宮 忘卻時間的迷宮(美) R7FJGD = 陸行鳥之不可思議迷宮 忘卻時間的迷宮[WiFi](日) R7FPGD = 陸行鳥之不可思議迷宮 忘卻時間的迷宮[WiFi](歐) R7GEAF = 七龍珠 天下第一大冒險(美) -R7GJAF = 七龍珠 天下第一大冒險(日) +R7GJAF = 龍珠 天下第一大冒險(日或中) R7GPAF = 七龍珠 天下第一大冒險(歐) R7HE6K = 救兵總動員(美) -R7IE69 = 魅力女孩俱樂部[平衡板](美) +R7IE69 = 魅力女孩俱樂部 睡衣派對(美) R7IP69 = 魅力女孩俱樂部 睡衣派對[平衡板](歐) R7KE6K = 岩石爆破(美) R7LP7J = 瑪格的困惑!(歐) @@ -359,8 +359,8 @@ R7SE5G = 逃出博物館(美) R7SP5G = 逃出博物館(歐) R7TFJW = 法式滾球(法) R7VEWR = 度假島 海灘派對[平衡板](美) -R7VPWR = 度假島 海灘派對[平衡板](歐) -R7WE52 = 雪山運動[平衡板](美) +R7VPWR = 度假島 海灘派對(歐) +R7WE52 = 雪山運動(美) R7WP52 = 雪山運動[平衡板](歐) R7XE69 = 極速快感 爆衝王(美) R7XJ13 = 極速快感 爆衝王(日) @@ -379,25 +379,25 @@ R84J99 = 牧場物語 安祥之樹(日) R84P99 = 牧場物語 安祥之樹(歐) R85EG9 = 週末特工隊 怪獸與第五個太陽(美) R85PG9 = 週末特工隊 怪獸與第五個太陽(歐) -R86E20 = 夢幻舞蹈啦啦隊[平衡板](美) +R86E20 = 夢幻舞蹈啦啦隊(美) R87EVN = 斯基度雪地車挑戰賽(美) R88J2L = 麵包超人 微笑派對(日) R89JEL = 東京友好樂園2(日) R8AE01 = 神奇寶貝樂園 Wii 皮卡丘的大冒險(美) -R8AJ01 = 神奇寶貝樂園 Wii 皮卡丘的大冒險(日) +R8AJ01 = 寶可夢公園Wii 皮卡丘的大冒險(日或中) R8AP01 = 神奇寶貝樂園 Wii 皮卡丘的大冒險(歐) -R8BE41 = 保姆派對[平衡板](美) +R8BE41 = 保姆派對(美) R8BP41 = 保姆派對[平衡板](歐) R8DEA4 = 遊戲王5D's 世界冠軍大會(美) -R8DJA4 = 遊戲王5D's︰決鬥狂熱者(日) +R8DJA4 = 遊戲王5D's 決鬥狂熱者(日或中) R8DPA4 = 遊戲王5D's 決鬥狂熱者(歐) R8EJQC = 異星尋奇(日) R8FES5 = 快餐危機(美) -R8FJHA = 匠餐廳大繁盛!(日) +R8FJHA = 匠餐廳大繁盛(日) R8FPNP = 快餐危機(歐) -R8GJC8 = GI騎師聯盟2008[平衡板][WiFi](日) +R8GJC8 = GI騎師聯盟2008(日) R8GPC8 = GI騎師聯盟2008[平衡板][WiFi](歐) -R8HE4Q = 孟漢娜 電影版(美) +R8HE4Q = 汉娜·蒙塔娜 電影版(美) R8HP4Q = 孟漢娜 電影版(歐) R8HX4Q = 孟漢娜 電影版(X) R8HY4Q = 孟漢娜 電影版(Y) @@ -429,7 +429,7 @@ R8VP41 = 拯救地球 野生動物獸醫(歐) R8XE52 = 侏羅紀 獵殺(美) R8XZ52 = 頂級射手 恐龍獵人(美) R8YE52 = 坎貝拉獵人2010(美) -R8ZE8P = 黛茜福恩特斯普拉提[平衡板](美) +R8ZE8P = 黛茜福恩特斯普拉提(美) R8ZPGT = 黛茜福恩特斯普拉提[平衡板]((歐) R92E01 = 皮克敏2 R92J01 = 以 Wii 遊玩 皮克敏星球探險2(日) @@ -437,7 +437,7 @@ R92P01 = 以 Wii 遊玩 皮克敏星球探險2(歐) R94PMR = 終極紅球挑戰賽(歐) R94XMR = 終極紅球挑戰賽(X) R96EAF = 風之少年通往幻夢界之門(美) -R96JAF = 風之少年通往幻夢界之門(日) +R96JAF = 風之克羅諾亞 通向幻界之門(日或中) R96KAF = 風之少年通往幻夢界之門(韓) R96PAF = 風之少年通往幻夢界之門(歐) R97E9B = 家庭滑稽橄欖球(美) @@ -452,12 +452,12 @@ R9FJ36 = 一級方程式賽車2009(日) R9FP36 = 一級方程式賽車2009(歐) R9GEWR = 貓頭鷹守護神(美) R9GPWR = 貓頭鷹守護神(歐) -R9HE78 = 你比五年級生聰明嗎?(美) +R9HE78 = 你比五年級生聰明嗎2(美) R9IE01 = 以 Wii 遊玩 皮克敏星球探險(美) R9IJ01 = 以 Wii 遊玩 皮克敏星球探險(日) R9IK01 = 以 Wii 遊玩 皮克敏星球探險(韓) R9IP01 = 以 Wii 遊玩 皮克敏星球探險(歐) -R9JE69 = 搖滾樂團 披頭四[WiFi](美) +R9JE69 = 披頭四 搖滾樂團(美) R9JP69 = 搖滾樂團 披頭四[WiFi](歐) R9KE20 = 律動方塊(美) R9LE41 = 通宵派對(美) @@ -484,13 +484,13 @@ R9XP52 = 街機地帶(歐) R9YES5 = 撕裂雪橇(美) R9ZE54 = 職業棒球大聯盟2K9(美) RB2E6K = 氣球泡泡(美) -RB2J2K = 氣球泡泡(日) +RB2J2K = 彩虹泡泡(日或中) RB2PGT = 氣球泡泡(歐) RB4E08 = 惡靈古堡 4 Wii 加強版(美) RB4J08 = 惡靈古堡4 Wii 加強版(日) RB4P08 = 惡靈古堡 4 Wii 加強版(歐) RB4X08 = 惡靈古堡 4 Wii 加強版(X) -RB5E41 = 戰火兄弟連 浴血之戰(美) +RB5E41 = 戰火兄弟連 浴血奮戰(美) RB5P41 = 戰火兄弟連 浴血之戰(歐) RB6J18 = 轟炸超人(日) RB7E54 = 惡霸魯尼 獎學金版(美) @@ -515,12 +515,12 @@ RBFP7J = 乒乓特派員(歐) RBGE54 = 大棒球聯盟(美) RBGP54 = 職業棒球聯賽(歐) RBHE08 = 惡靈古堡0(美) -RBHJ08 = 惡靈古堡0(日) +RBHJ08 = 惡靈古堡0(日或中) RBHP08 = 惡靈古堡0(歐) RBIEE9 = 牧場物語 歡樂動物進行曲(美) RBIJ99 = 牧場物語 歡樂動物進行曲(日) RBIP99 = 牧場物語 歡樂動物進行曲(歐) -RBKE69 = 轟炸方塊[WiFi](美) +RBKE69 = 轟炸方塊(美) RBKJ13 = 歡樂轟炸(日) RBKK69 = 轟炸方塊(韓) RBKP69 = 轟炸方塊(歐) @@ -529,7 +529,7 @@ RBLJ8P = BLEACH死神 白刃閃耀圓舞曲(日) RBLP8P = BLEACH死神 白刃閃耀圓舞曲(歐) RBME5G = 泡泡龍(美) RBMPGT = 泡泡龍(歐) -RBNEG9 = Ben 10 地球保衛者(美) +RBNEG9 = 少年駭客 地球保衛者(美) RBNPG9 = Ben 10 地球保衛者(歐) RBNXG9 = Ben 10 地球保衛者(X) RBOE69 = 布吉搖擺(美) @@ -545,13 +545,13 @@ RBSJ08 = 戰國 BASARA 2 英雄外傳A(日) RBTE8P = 釣魚高手(美) RBTJ8P = 釣魚高手(日) RBTP8P = 釣魚高手(歐) -RBUE08 = 惡靈古堡 安布雷拉編年史(美) +RBUE08 = 惡靈古堡 安布雷拉編年史(美或中) RBUJ08 = 惡靈古堡 安布雷拉編年史(日) RBUK08 = 惡靈古堡 安布雷拉編年史(韓) RBUP08 = 惡靈古堡 安布雷拉編年史(歐) -RBVE52 = 芭比 森林公主(美) +RBVE52 = 芭比之森林公主(美) RBVP52 = 芭比 森林公主(歐) -RBWE01 = 突擊 FC 大戰2[[WiFi](美) +RBWE01 = 突擊FC大戰2(美) RBWJ01 = 突擊 FC 大戰2[[WiFi](日) RBWP01 = 突擊 FC 大戰2[WiFi](歐) RBXJ8P = BLEACH死神 對決十刃[WiFi](日) @@ -604,7 +604,7 @@ RCHJAF = 我們的啦啦隊(日) RCHPGT = 我們的啦啦隊(歐) RCIE41 = 犯罪現場調查 鐵證如山(美) RCIP41 = 犯罪現場調查 鐵證如山(歐) -RCJE8P = 暗渠[WiFi](美) +RCJE8P = 暗渠(美) RCJP8P = 暗渠[WiFi](歐) RCKPGN = 阿倫·漢森的運動挑戰(歐) RCLE4Q = 四眼天雞之動作天王(美) @@ -624,10 +624,9 @@ RCSP7J = 射雞英雄傳(歐) RCTE5Z = 反擊力量(美) RCTPGT = 反擊力量(歐) RCUE52 = 坎貝拉傳奇冒險(美) -RCUP52 = 坎貝拉傳奇冒險(歐) RCVE41 = 孤島驚魂 復仇(美) RCVP41 = 孤島驚魂 復仇(歐) -RCXE78 = 全明星拉拉隊[平衡板](美) +RCXE78 = 全明星拉拉隊(美) RCXP78 = 全明星拉拉隊[平衡板](歐) RCXX78 = 全明星拉拉隊[平衡板](歐) RCYPGN = 切格的聚會迷題(歐) @@ -636,27 +635,26 @@ RD2J41 = 赤色鋼鐵2(日) RD2K41 = 赤色鋼鐵2(韓) RD2P41 = 赤色鋼鐵 2(歐) RD2X41 = 赤色鋼鐵 2(X) -RD4EA4 = 熱舞革命 勁爆舞會 2[跳舞墊](美) -RD4JA4 = 熱舞革命 手舞足蹈派對[跳舞墊](日) +RD4EA4 = 熱舞革命 勁爆舞會2(美) +RD4JA4 = 熱舞革命 盛況空前的勁爆舞會(日或中) RD4PA4 = 熱舞革命 勁爆舞會2[跳舞墊](歐) RD6EE9 = 動物王國 野生動物探索(美) RD6J8N = 動物奇想天外!在謎之樂園攝影(日) RD6PNP = 動物奇想天外!在謎之樂園攝影(歐) -RD8E52 = 與巨星共舞[跳舞墊](美) +RD8E52 = 與巨星共舞(美) RD9J18 = 解謎系列Vol.1 數獨(日) -RDAE52 = 與巨星共舞 讓我們翩翩起舞[跳舞墊](美) +RDAE52 = 與巨星共舞 讓我們翩翩起舞(美) RDBE70 = 七龍珠Z 電光火石2(美) RDBJAF = 七龍珠 Z Sparking! NEO(日) RDBPAF = 七龍珠Z 電光火石2(歐) RDCE78 = 致命生物(美) RDCP78 = 致命生物(歐) -RDDEA4 = 熱舞革命 勁爆舞會[跳舞墊](美) +RDDEA4 = 熱舞革命 勁爆舞會(美) RDDJA4 = 熱舞革命 勁爆舞會(日) -RDDPA4 = 熱舞革命 勁爆舞會[跳舞墊](歐) RDEJ0A = 全日本貨柜車祭典(日) RDFE41 = 夏恩懷特滑雪板[平衡板](美) RDFP41 = 夏恩懷特滑雪板[平衡板](歐) -RDGEA4 = 惡魔城 審判[WiFi](美) +RDGEA4 = 惡魔城 審判(美) RDGJA4 = 惡魔城:審判(日) RDGPA4 = 惡魔城 審判[WiFi](歐) RDHE78 = 毀滅全人類 解放威廉(美) @@ -674,7 +672,7 @@ RDLP70 = 狐貍偵探智救人質(歐) RDME6K = 米儂向前沖(美) RDMJ8N = 米儂向前沖(日) RDMPHZ = 每日英雄 米儂(歐) -RDNEA4 = 熱舞革命 開心迪士尼[跳舞墊](美) +RDNEA4 = 熱舞革命 開心迪士尼(美) RDOE41 = 模擬寵物狗2(美) RDOJ41 = 模擬寵物狗2(日) RDOP41 = 模擬寵物狗2(歐) @@ -709,7 +707,7 @@ RDZJ01 = 大災難 危機之日(日) RDZP01 = 大災難 危機之日(歐) RE3ENR = 空戰高手 二戰英雄(美) RE4E08 = 惡靈古堡 復刻版(美) -RE4J08 = 惡靈古堡(日) +RE4J08 = 惡靈古堡(日或中) RE4P08 = 惡靈古堡(歐) RE5PAF = 貪吃精靈(歐) RE6PRT = 夏季田徑邀請賽的挑戰(歐) @@ -718,10 +716,9 @@ RE8J99 = 家庭教師 禁斷的暗之三角[WiFi](日) REAE69 = 名人體育(美) REAF69 = 名人體育(法) REAP69 = 名人體育(歐) -REBE4Z = 豆豆先生的古怪世界(歐) +REBE4Z = 豆豆先生的古怪世界(美) REBPMT = 憨豆先生的古怪世界(歐) RECE6K = 間諜遊戲 電梯任務(美) -RECP6K = 間諜遊戲 電梯任務(歐) REDE41 = 赤色鋼鐵(美) REDJ41 = 赤色鋼鐵(日) REDP41 = 赤色鋼鐵(歐) @@ -730,11 +727,11 @@ REGE36 = 緊急出動(美) REGP36 = 緊急出動(歐) REHE41 = 緊急英雄(美) REHP41 = 緊急英雄(歐) -REJEAF = 家庭訓練機 極限挑戰[跳舞墊](美) +REJEAF = 家庭訓練機 極限挑戰(美) REJJAF = 家庭訓練機2[跳舞墊](日) REJPAF = 家庭訓練機 極限挑戰[跳舞墊](歐) -REKE41 = 金牌吉姆卡迪歐塑身[平衡板](美) -REKJ2N = 節奏拳擊 用Wii享瘦(日) +REKE41 = 金吉姆健身房 卡迪歐塑身(美) +REKJ2N = 有氧拳擊 Wii快樂瘦身(日或中) REKP41 = 金牌吉姆卡迪歐塑身[平衡板](歐) REKU41 = 我的健康教練 金牌吉姆卡迪歐塑身[平衡板](英) RELEA4 = 能源小精靈(美) @@ -742,7 +739,7 @@ RELJA4 = 能源小精靈(日) RELKA4 = 能源小精靈(韓) RELPA4 = 能源小精靈(歐) REMJ8P = 哆啦A夢Wii 秘密道具王決定戰!(日) -RENE8P = 音速小子與黑暗騎士[WiFi](美) +RENE8P = 音速小子與黑暗騎士(美) RENJ8P = 音速小子與黑暗騎士[WiFi](日) RENP8P = 音速小子與黑暗騎士[WiFi](歐) REQE54 = 迪亞哥 徒步旅行救難隊(美) @@ -752,14 +749,14 @@ REQY54 = 迪亞哥 徒步旅行救難隊(歐) RESP41 = 我的西班牙語教練(歐) RETJAF = 廟會達人(日) REUPNK = 我的形體教練(歐) -REVJ8P = 忌火起草 解明篇(日) +REVJ8P = 忌火起草 解明篇(日或中) REWFMR = 我的馬匹俱樂部(法) REWXMR = 我的馬匹俱樂部(X) REWYMR = 我的馬匹俱樂部(Y) REXE01 = 瘋狂卡車(美) REXJ01 = 瘋狂卡車(日) REXP01 = 瘋狂卡車(歐) -REYE4Q = 迪士尼想唱就唱 歌舞青春3 畢業季(美) +REYE4Q = 高校音樂劇3 畢業歌會(美) REYP4Q = 迪士尼想唱就唱 歌舞青春3 畢業季(歐) REZEJJ = 西洋棋高手(美) REZPKM = 西洋棋高手(歐) @@ -770,22 +767,22 @@ RF3P6M = 法拉利挑戰賽(歐) RF4E36 = 超級水果瀑布(美) RF4P6M = 超級水果瀑布(歐) RF7J08 = 龍之子 VS. CAPCOM 英雄交鋒世代(日) -RF8E69 = FIFA足球08[WiFi](美) +RF8E69 = FIFA足球08(美) RF8J13 = FIFA足球08[WiFi](日) RF8K69 = FIFA足球08[WiFi](韓) RF8P69 = FIFA足球08[WiFi](歐) RF8X69 = FIFA足球08[WiFi](X) RF8Y69 = FIFA足球08[WiFi](Y) -RF9E69 = FIFA足球09[WiFi](美) +RF9E69 = FIFA足球09(美) RF9J13 = FIFA足球09[WiFi](日) RF9K69 = FIFA足球09[WiFi](韓) RF9P69 = FIFA足球09[WiFi](歐) RF9X69 = FIFA足球09[WiFi](X) RF9Y69 = FIFA足球09[WiFi](Y) -RFAEAF = 生命運動 戶外挑戰[跳舞墊](美) -RFAJAF = 家庭訓練機 運動天地(日) +RFAEAF = 活力生活 戶外挑戰(美) +RFAJAF = 家庭訓練機(日) RFAPAF = 家庭教練[跳舞墊](歐) -RFBE01 = 永恒蔚藍[WiFi](美) +RFBE01 = 永恒蔚藍(美) RFBJ01 = 永恒蔚藍[WiFi](日) RFBP01 = 永恒蔚藍[WiFi](歐) RFCEGD = 太空戰士 水晶編年史 水晶持有者(美) @@ -798,10 +795,10 @@ RFFEGD = 太空戰士 水晶編年史 時間的共鳴[WiFi](美) RFFJGD = 太空戰士 水晶編年史 時間的共鳴[WiFi](日) RFFPGD = 太空戰士 水晶編年史 時間的共鳴[WiFi](歐) RFJJAF = 家庭賽馬(日) -RFKE41 = 我的健康教練(美) +RFKE41 = 我的健身教練(美) RFKP41 = 我的健康教練(歐) RFKX41 = 我的健康教練(X) -RFLE69 = 勁爆美式足球09[WiFi](美) +RFLE69 = 勁爆美式足球09(美) RFLP69 = 勁爆美式足球09[WiFi](歐) RFLPWK = 美式橄欖球大聯盟09[WiFi](歐) RFMJAF = 職棒家庭棒球場[WiFi](日) @@ -809,15 +806,15 @@ RFNE01 = Wii塑身[平衡板](美) RFNJ01 = Wii塑身[平衡板](日) RFNK01 = Wii塑身[平衡板](韓) RFNP01 = Wii塑身[平衡板](歐) -RFNW01 = Wii塑身 繁體中文版[平衡板] +RFNW01 = Wii塑身(中) RFOE52 = 蜘蛛人 敵友難辨(美) RFOP52 = 蜘蛛人 敵友難辨(歐) RFOX52 = 蜘蛛人 敵友難辨(X) -RFPE01 = Wii塑身加強版[平衡板](美) -RFPJ01 = Wii塑身 加強版[平衡板](日) -RFPK01 = Wii塑身加強版[平衡板](韓) -RFPP01 = Wii塑身加強版[平衡板](歐) -RFPW01 = Wii塑身加強版 繁體中文版[平衡板] +RFPE01 = Wii塑身Plus[平衡板](美) +RFPJ01 = Wii塑身Plus[平衡板](日) +RFPK01 = Wii塑身Plus[平衡板](韓) +RFPP01 = Wii塑身Plus[平衡板](歐) +RFPW01 = Wii塑身Plus(中) RFQE69 = 重拳出擊(美) RFQJ13 = 破相拳擊(日) RFQK69 = 破相拳擊(韓) @@ -833,13 +830,13 @@ RFVP52 = 淘氣小猴 聚會時間(歐) RFWE5Z = 野外探險 非洲(美) RFWPNK = 非洲徒步大冒險(歐) RFYFMR = 博涯堡壘 開戰(法) -RFZE41 = 想象 時尚聚會[平衡板](美) +RFZE41 = 想象 時尚聚會(美) RFZP41 = 想象 時尚偶像[平衡板](歐) RG2EXS = 罪惡裝備XX(美) RG2JJF = 聖騎士之戰XX ΛCore(日) RG2PGT = 罪惡裝備XX(歐) RG4JC0 = 電車向前走!新幹線EX 山陽新幹線(日) -RG5EWR = 吉尼斯世界紀錄 電視遊戲[WiFi](美) +RG5EWR = 吉尼斯世界紀錄 電視遊戲(美) RG5PWR = 吉尼斯世界紀錄 電視遊戲[WiFi](歐) RG6E69 = 搖滾樂超級明星(美) RG6P69 = 搖滾樂超級明星(歐) @@ -851,12 +848,10 @@ RG9P54 = 嘉年華遊戲 迷你高爾夫(歐) RGAE8P = 51號星球(美) RGAP8P = 51號星球(歐) RGBE08 = 哈維博德曼 律師(美) -RGBP08 = 哈維博德曼 律師(歐) RGCEXS = 遙控直升機Wii 飛行大冒險(美) RGCJJF = 遙控直升機Wii 飛行大冒險(日) RGCPGT = 遙控直升機Wii 飛行大冒險(歐) RGDEA4 = 恐怖行動(美) -RGDPA4 = 恐怖行動(歐) RGEJJ9 = 世界黃金蛋節奏合拍系日本的音符(日) RGFE69 = 教父 黑手黨(美) RGFF69 = 教父 黑手黨(法) @@ -864,7 +859,7 @@ RGFI69 = 教父 黑手黨(意) RGFP69 = 教父 黑手黨(歐) RGFS69 = 教父 黑手黨(西) RGGJAF = GeGeGe的鬼太郎 妖怪大運動會(日) -RGHE52 = 吉他英雄3 搖滾傳奇[WiFi](美) +RGHE52 = 吉他英雄3 搖滾傳奇(美) RGHJ52 = 吉他英雄3 搖滾傳奇[WiFi](日) RGHK52 = 吉他英雄3 搖滾傳奇[WiFi](韓) RGHP52 = 吉他英雄3 搖滾傳奇[WiFi](歐) @@ -872,9 +867,8 @@ RGIJC8 = G1騎師Wii(日) RGIPC8 = G1騎師Wii(歐) RGJE4Z = 森林泰山 探秘(美) RGJP7U = 森林泰山 探秘(歐) -RGKENR = 國際兒童 瘋狂高爾夫(美) -RGKPNR = 國際兒童 瘋狂高爾夫(歐) -RGLE7D = 幾何戰爭 銀河[WiFi](美) +RGKENR = 兒童高爾夫(美) +RGLE7D = 幾何戰爭 銀河(美) RGLP7D = 幾何戰爭 銀河[WiFi](歐) RGME5D = 企鵝也瘋狂(美) RGMP5D = 企鵝也瘋狂(歐) @@ -884,18 +878,18 @@ RGPJAF = 機動戰士高達2 哀.戰士篇(日) RGQE70 = 魔鬼剋星(美) RGQP70 = 魔鬼剋星(歐) RGSE8P = 幽靈小隊[WiFi](美) -RGSJ8P = 魅影小隊(日) +RGSJ8P = 幽靈小隊(日或中) RGSP8P = 幽靈小隊[WiFi](歐) RGTE41 = GT職業賽車(美) RGTJBL = GT職業賽車(日) RGTP41 = GT職業賽車(歐) -RGVE52 = 吉他英雄 空中鐵匠樂隊專輯[WiFi](美) +RGVE52 = 吉他英雄 空中鐵匠樂隊(美) RGVJ52 = 吉他英雄 空中鐵匠樂隊專輯[WiFi](日) RGVP52 = 吉他英雄 空中鐵匠樂隊專輯[WiFi](歐) RGWE41 = 瘋狂兔子歸鄉記[WiFi](美) RGWJ41 = 瘋狂兔子 歸鄉記[WiFi](日) RGWP41 = 瘋狂兔子 歸鄉記[WiFi](歐) -RGWX41 = 瘋狂兔子 歸鄉記[WiFi](X) +RGWX41 = 瘋狂兔子 歸鄉記(X) RGXE5D = 遊戲派對(美) RGXP5D = 遊戲派對(歐) RGYE5Z = 賽車女郎(美) @@ -908,7 +902,7 @@ RH3E4Q = 歌舞青春3 畢業舞會(美) RH3J4Q = 歌舞青春3 畢業舞會(日) RH3P4Q = 歌舞青春3 畢業舞會(歐) RH4XUG = 倉鼠英雄(X) -RH5EVN = 小馬人生歷險記[WiFi](美) +RH5EVN = 小馬人生歷險記(美) RH5PKM = 愛倫懷塔克的小馬生活(歐) RH6E69 = 哈利波特 混血王子的背叛(美) RH6K69 = 哈利波特 混血王子的背叛(韓) @@ -917,13 +911,12 @@ RH7J8P = Sammy合集 北斗神拳[WiFi](日) RH8E4F = 古墓奇兵 地城奪寶(美) RH8JEL = 古墓奇兵 地城奪寶(日) RH8P4F = 古墓奇兵 地城奪寶(歐) -RH8X4F = 古墓奇兵 地城奪寶(X) RH9JC8 = 遙遠時空4 (日) RHAE01 = Wii第一次接觸(美) RHAJ01 = Wii第一次接觸(日) RHAK01 = Wii第一次接觸(韓) RHAP01 = Wii第一次接觸(歐) -RHAW01 = Wii第一次接觸 繁體中文版(中) +RHAW01 = Wii第一次接觸 RHCE52 = 歷史頻道 太平洋戰爭(美) RHCP52 = 歷史頻道 太平洋戰爭(歐) RHDE8P = 死亡之屋2+3(美) @@ -935,7 +928,7 @@ RHFE5D = 快樂腳(美) RHFP5D = 快樂腳(歐) RHGP6Z = 特工雨果 檸檬榨汁(歐) RHGX6Z = 特工雨果 檸檬榨汁(X) -RHHJ8J = 涼宮春日的激動(日) +RHHJ8J = 涼宮春日的激動(日或中) RHIEXJ = 第一神拳 革命(美) RHIJJ9 = 第一神拳 革命(日) RHIP41 = 第一神拳 革命(歐) @@ -953,11 +946,11 @@ RHOE8P = 死亡之屋 過度殺戮(美) RHOJ8P = 死亡之屋 過度殺戮(日) RHOP8P = 死亡之屋 過度殺戮(歐) RHPJ8N = 現子麻將~作弊流浪記~(日) -RHQE4Q = 孟漢娜萬眾矚目全球巡演歌唱大賽(美) +RHQE4Q = 汉娜·蒙塔娜 萬眾矚目全球巡演歌唱大賽(美) RHQP4Q = 孟漢娜萬眾矚目全球巡演歌唱大賽(歐) RHQX4Q = 孟漢娜萬眾矚目全球巡演歌唱大賽(歐) RHQY4Q = 孟漢娜萬眾矚目全球巡演歌唱大賽(Y) -RHRJ99 = 家庭教師HITMAN!夢之超級戰斗!(日) +RHRJ99 = 家庭教師REBORN 超夢幻決勝(日或中) RHSE36 = 熱導追蹤(美) RHSP36 = 熱導追蹤(歐) RHSX36 = 熱導追蹤(X) @@ -975,7 +968,7 @@ RHXP78 = 樂隊大戰(歐) RHYJAF = 跳躍之門Wii 極限挑戰(日) RHZE41 = 模擬寵物馬2(美) RHZP41 = 模擬寵物馬2(歐) -RI2E4Q = 迪斯尼 想唱就唱 高校音樂劇(美) +RI2E4Q = 高校音樂劇(美) RI2P4Q = 迪斯尼 想唱就唱 高校音樂劇(歐) RI3E5D = 聯合縮小兵(美) RI3P5D = 聯合縮小兵(歐) @@ -984,7 +977,7 @@ RI6P41 = 夏季運動派對(歐) RI7E4Z = 怪物大破壞 製作和戰鬥(美) RI8E41 = 戰火兄弟連 進軍30高地(美) RI8P41 = 戰火兄弟連 進軍30高地(歐) -RI9EGT = 女孩冰上公主[平衡板](美) +RI9EGT = 女孩冰上公主(美) RI9PGT = 女孩冰上公主[平衡板](歐) RIAE52 = 冰河世紀3 恐龍的黎明(美) RIAI52 = 冰河世紀3 恐龍的黎明(意) @@ -1015,7 +1008,6 @@ RINP08 = 死亡復甦 殭屍祭品(歐) RIOPSU = 恐怖歷史之殘忍羅馬(歐) RIPEAF = 航海王 無盡的冒險(美) RIPJAF = 航海王 無盡的冒險(日) -RIPPAF = 航海王 無限巡航 第一章 波浪中的秘寶(歐) RIQPUJ = 冰上炫舞(歐) RIRE8P = 鋼鐵人(美) RIRP8P = 鋼鐵人(歐) @@ -1031,7 +1023,7 @@ RIXP7J = 道奇賽車 掌控者與挑戰者(歐) RIYE52 = 太空營地(美) RIYP52 = 太空營地(歐) RIZENR = 印第500賽車(美) -RJ2E52 = 詹姆士龐德 007 量子危機[WiFi](美) +RJ2E52 = 詹姆士龐德007 量子危機(美) RJ2JGD = 詹姆士龐德 007 量子危機[WiFi](日) RJ2P52 = 詹姆士龐德 007 量子危機[WiFi](歐) RJ3E20 = 吉普越野賽車(美) @@ -1043,7 +1035,6 @@ RJ6P69 = 我的模擬人生 空中英豪(歐) RJ7FWP = 電視7遊戲 法語填字遊戲(法) RJ8E64 = 印第安納瓊斯與帝王手杖(美) RJ8P64 = 印第安納瓊斯與帝王手杖(歐) -RJ9E5Z = 智能家庭(美) RJ9FMR = 思考 邏輯訓練(法) RJ9PFR = 思考邏輯訓練器(歐) RJ9XML = 思考 邏輯訓練(X) @@ -1057,7 +1048,7 @@ RJCP52 = Baja 1000越野拉力賽(歐) RJDPKM = 我的動物中心(歐) RJEE70 = 層層疊世界巡迴賽(美) RJEP70 = 層層疊世界巡迴賽(歐) -RJFE5G = 吉利安麥克爾健身訓練09[平衡板](美) +RJFE5G = Jillian Michaels的健身訓練2009(美) RJFPKM = 吉利安麥克爾健身訓練09[平衡板](歐) RJGJDA = 人生遊戲(日) RJHE52 = 馬達加斯加 卡丁車(美) @@ -1069,13 +1060,13 @@ RJMERS = 移動世界(美) RJMPRS = 移動世界(歐) RJNE20 = N 制賽車速度怪物(美) RJOEXJ = 恐怖體感 咒怨(美) -RJOJJ9 = 恐怖體感 咒怨(日) +RJOJJ9 = 恐怖體感 咒怨(日或中) RJOP99 = 恐怖體感 咒怨(歐) RJPJA4 = 實況棒球Wii(日) RJQE5G = 睡衣山姆 別怕黑(美) RJQP70 = 睡衣山姆 別怕黑(歐) -RJREA4 = 熱舞革命 勁爆舞會 3[跳舞墊][平衡板](美) -RJRJA4 = 熱舞革命 音樂塑身[跳舞毯][平衡板](日) +RJREA4 = 熱舞革命 勁爆舞會3(美) +RJRJA4 = 熱舞革命 勁爆舞會3(日) RJRPA4 = 熱舞革命 勁爆舞會 3[跳舞墊]]平衡板](歐) RJSENR = 川崎水上摩托車(美) RJSPUG = 川崎水上摩托車(歐) @@ -1084,28 +1075,27 @@ RJTJ01 = 大家的常識力(日) RJVEGN = 狂熱醫院 緊急病房(美) RJVPGN = 狂熱醫院 緊急病房(歐) RJWJEL = 猛犸象與神秘之石(日) -RJXE5G = 去玩吧伐木工[平衡板](美) -RJYE5Z = 費茲維澤醫生的動物大拯救[平衡板](美) +RJXE5G = 去玩吧 伐木工(美) +RJYE5Z = 費茲維澤醫生的動物大拯救(美) RJZP7U = SNK街機經典Vol1(歐) RK2EEB = 超執刀 新血[WiFi](美) RK2JEB = 超執刀 新血[WiFi](日) RK2P01 = 超執刀 新血[WiFi](歐) RK3J01 = 安藤檢索(日) RK4JAF = 結界師 黑芒樓之影(日) -RK5E01 = 星之卡比 毛線傳說(美) +RK5E01 = 星之卡比 毛線傳說(美或中) RK5J01 = 毛線卡比(日) RK5P01 = 星之卡比 毛線傳說(歐) -RK6E18 = 轉轉球迷宮2[平衡板][WiFi](美) +RK6E18 = 轉轉球迷宮2(美) RK6J18 = 轉轉球迷宮2[平衡板][WiFi](日) RK6P18 = 轉轉球迷宮2[平衡板][WiFi](歐) RK7J0A = 黃金之絆(日) RK8E54 = 職業棒球大聯盟2K8(美) -RK9EA4 = 卡拉OK革命[麥克風](美) +RK9EA4 = 卡拉OK革命(美) RK9PA4 = 卡拉OK革命[麥克風](歐) RKAE6K = Milestone 射擊遊戲收藏集(美) RKAJMS = Milestone 射擊遊戲收藏集(日) RKAK8M = Milestone 射擊遊戲收藏集(韓) -RKAP6K = Milestone 射擊遊戲收藏集(歐) RKBE41 = 卡波其涂鴉(美) RKBP41 = 卡波其涂鴉(歐) RKDEEB = 超執刀 再次執刀(美) @@ -1120,7 +1110,7 @@ RKGEGY = 貝茲娃娃(美) RKGPGY = 貝茲娃娃(歐) RKHE52 = 功夫熊貓 神龍大俠(美) RKHP52 = 功夫熊貓 神龍大俠(歐) -RKIENR = 國際兒童冰球賽(美) +RKIENR = 兒童冰球(美) RKIPUG = 國際兒童冰球賽(歐) RKIXUG = 國際兒童冰球賽(歐) RKJJ0Q = 漢字能力檢定協會 250萬人的漢檢(日) @@ -1139,10 +1129,10 @@ RKPV52 = 功夫熊貓(歐) RKPX52 = 功夫熊貓(Y) RKPY52 = 功夫熊貓(Y) RKQENR = 糖果工廠(美) -RKSENR = 兒童籃球賽(美) +RKSENR = 兒童籃球(美) RKSPUG = 兒童籃球賽(歐) -RKTENR = 國際兒童足球賽(美) -RKTXUG = 國際兒童足球賽(X) +RKTENR = 兒童足球(美) +RKTXUG = 兒童足球(X) RKVE54 = 大棒球聯盟2(美) RKVP54 = 大棒球聯盟2(歐) RKWJ18 = 拼圖小狗 每日一問(日) @@ -1151,7 +1141,7 @@ RKXP69 = 搖滾樂團(歐) RKYE20 = 玩具兵大戰 倒霉戰士(美) RKYP7J = 玩具兵大戰 倒霉戰士(歐) RKZEA4 = 迷失蔚藍Wii(美) -RKZJA4 = 無人島求生記 Wii(日) +RKZJA4 = 倖存少年Wii(日或中) RKZPA4 = 迷失蔚藍Wii(歐) RL2E78 = 我的馴馬場(美) RL2PFR = 我的馴馬場(歐) @@ -1174,7 +1164,6 @@ RLCP7J = 愛如鮮花盛開(歐) RLDEGY = 龍的傳說(美) RLDPFK = 龍的傳說(歐) RLEEFS = 大滿貫保齡球2(美) -RLEPFS = 大滿貫保齡球2(歐) RLFE64 = 星球大戰 復制戰紀(美) RLFP64 = 星球大戰 復制戰紀(歐) RLGE64 = 樂高星際大戰 武林大會(美) @@ -1204,7 +1193,6 @@ RLRP4F = 古墓奇兵 十周年紀念版(歐) RLSE8P = 異形特攻隊(美) RLSP8P = 異形特攻隊(歐) RLTENR = 倫敦計程車 尖峰時刻(美) -RLTPNR = 倫敦計程車 尖峰時刻(歐) RLTXUG = 倫敦計程車 尖峰時刻(X) RLUE4Q = 雷霆戰狗Bolt(美) RLUP4Q = 雷霆戰狗Bolt(歐) @@ -1225,7 +1213,7 @@ RLYEWR = 華納群星總動員 超級兵工廠(美) RLYPWR = 華納群星總動員 超級兵工廠(歐) RLZE4Z = 企鵝保衛戰(美) RLZPXT = 企鵝保衛戰(歐) -RM2E69 = 榮譽勳章 英雄2[WiFi](美) +RM2E69 = 榮譽勳章 英雄2(美) RM2J13 = 榮譽勳章 鐵膽英豪2(日) RM2P69 = 榮譽勛章 英雄2[WiFi](歐) RM2U69 = 榮譽勛章 英雄2[WiFi](英) @@ -1240,7 +1228,7 @@ RM5E7D = 神鬼傳奇3 龍帝之墓(美) RM5P7D = 神鬼傳奇3 龍帝之墓(歐) RM6EEB = 巴洛克(美) RM6P99 = 巴洛克(歐) -RM7E4F = 怪物實驗室[WiFi](美) +RM7E4F = 怪物實驗室(美) RM7P4F = 怪物實驗室[WiFi](歐) RM8E01 = 瑪利歐派對8(美) RM8J01 = 瑪利歐派對8(日) @@ -1257,17 +1245,17 @@ RMCE01 = 瑪利歐賽車[WiFi](美) RMCJ01 = 瑪利歐賽車 Wii(日) RMCK01 = 瑪俐歐賽車[WiFi](韓) RMCP01 = 瑪利歐賽車[WiFi](歐) -RMDE69 = 勁爆美式足球07[WiFi](美) +RMDE69 = 勁爆美式足球07(美) RMDP69 = 勁爆美式足球07[WiFi](歐) RMEJDA = 大聯盟Wii投擲(日) RMFE68 = AMF保齡球 非同尋常(美) RMFP68 = AMF保齡球 非同尋常(歐) RMGE01 = 超級瑪利歐銀河(美) -RMGJ01 = 超級瑪利歐銀河(日) +RMGJ01 = 超級瑪利歐銀河(日或中) RMGK01 = 超級瑪利歐銀河(韓) RMGP01 = 超級瑪利歐銀河(歐) RMHE08 = 魔物獵人3[WiFi](美) -RMHJ08 = 魔物獵人3[WiFi](日) +RMHJ08 = 魔物獵人3(日) RMHP08 = 魔物獵人3[WiFi](美) RMIE20 = 瑪戈的單詞訓練(美) RMIP7J = 瑪戈的單詞訓練(歐) @@ -1288,27 +1276,24 @@ RMNPFR = 我的寵物旅店(歐) RMOE52 = 怪獸大卡車(美) RMOP52 = 怪獸大卡車(歐) RMPE54 = 實況野球大聯盟(美) -RMPP54 = 實況野球大聯盟 (歐) RMQENR = 神話創造者 命運水晶(美) RMQPUG = 神話創造者 命運水晶(歐) -RMQXUG = 神話創造者 命運水晶(X) RMRE5Z = 小魔怪魔法馬戲團(美) RMRPNK = 小魔怪魔法馬戲團(歐) RMRXNK = 小魔怪魔法馬戲團(X) -RMSE52 = 漫畫英雄 終極聯盟 2[WiFi](美) +RMSE52 = 漫威終極聯盟2(美) RMSP52 = 漫畫英雄 終極聯盟 2([WiFi]歐) RMTJ18 = 桃太郎電鐵16北海道大移動[WiFi](日) -RMUE52 = 漫畫英雄 終極聯盟(美) +RMUE52 = 漫威終極聯盟(美) RMUJ2K = 漫畫英雄 終極聯盟(日) RMUP52 = 漫畫英雄 終極聯盟(歐) -RMVE69 = 榮譽勳章 先遣部隊(美) +RMVE69 = 榮譽勳章 先遣部隊(美或中) RMVP69 = 榮譽勛章 先遣部隊(歐) RMVX69 = 榮譽勛章 先遣部隊(X) RMWE20 = M&M's巧克力豆卡丁賽車(美) -RMWP20 = M&M's巧克力豆卡丁賽車(歐) -RMXE78 = 極限越野 突破[WiFi](美) +RMXE78 = 極限越野 突破[(美) RMXF78 = 極限越野 突破[WiFi](法) -RMXP78 = 極限越野 突破[WiFi](歐) +RMXP78 = 極限越野 突破(歐) RMYE5Z = 超級卡丁車GP(美) RMYPUG = 超級卡丁車GP(歐) RMYXUG = 超級卡丁車GP(歐) @@ -1337,12 +1322,11 @@ RNBE69 = 美國職業籃球2008[WiFi](美) RNBP69 = 美國職業籃球2008[WiFi](歐) RNBX69 = 美國職業籃球2008[WiFi](X) RNCEH4 = SNK街機經典Vol1(美) -RNCPH4 = SNK街機經典Vol1(歐) RNDJAF = 交響情人夢 夢之☆管弦樂(日) -RNEEDA = 火影忍者疾風傳 激鬪忍者大戰3[WiFi](美) +RNEEDA = 火影忍者疾風傳 激鬪忍者大戰3(美) RNEJDA = 火影忍者疾風傳 激鬪忍者大戰EX3(日) RNEPDA = 火影忍者疾風傳 激鬪忍者大戰3(歐) -RNFE69 = 勁爆美式足球08[WiFi](美) +RNFE69 = 勁爆美式足球08(美) RNFP69 = 勁爆美式足球08[WiFi](歐) RNGJ99 = 魔法老師涅吉!新契約大戰(日) RNHE41 = 英雄不再(美) @@ -1381,7 +1365,6 @@ RNSE69 = 極速快感 玩命山道(美) RNSF69 = 極速快感 玩命山道(法) RNSJ13 = 極速快感 玩命山道(日) RNSP69 = 極速快感 玩命山道(歐) -RNSX69 = 極速快感 玩命山道(X) RNUE8P = 南茜朱兒 冰溪白狼(美) RNVE5Z = 阿努比斯2(美) RNVPUG = 阿努比斯2(歐) @@ -1419,9 +1402,9 @@ ROBE7U = 暗夜殺機 結果(美) ROBPPL = 暗夜殺機 結果(歐) ROCE5Z = 小魔怪卡丁車(美) ROCPNK = 小魔怪卡丁車(歐) -RODE01 = 舞動壞莉歐工作室(美) +RODE01 = 瓦里奧製造 手舞足蹈(美) RODJ01 = 舞動壞莉歐工作室(日) -RODK01 = 舞動壞莉歐工作室(韓) +RODK01 = 瓦里奧製造 手舞足蹈(韓或中) RODP01 = 舞動壞莉歐工作室(歐) ROEEJZ = 流浪狗之家(美) ROEPGT = 流浪狗之家(歐) @@ -1437,11 +1420,11 @@ ROKJ18 = 卡拉OK 歡樂之聲Wii(日) ROLE8P = 瑪利歐與音速小子在溫哥華冬奧會[WiFi][平衡板](美) ROLJ01 = 瑪利歐與音速小子在溫哥華冬季奧運(日) ROLK01 = 瑪利歐與音速小子在溫哥華冬奧會[WiFi][平衡板](韓) -ROLP8P = 瑪利歐與音速小子在溫哥華冬奧會[WiFi][平衡板](歐) +ROLP8P = 瑪利歐與音速小子在溫哥華冬奧(歐) ROMJ08 = 魔物獵人G[WiFi](日) -RONEG9 = 性感女劍士 革命[WiFi](美) -RONJG9 = 性感女劍士 Revolution(日) -RONPG9 = 性感女劍士 革命[WiFi](歐) +RONEG9 = 御姐玫瑰 革命(美) +RONJG9 = 御姐玫瑰 革命(日或中) +RONPG9 = 性感女劍士 革命[(歐) ROPE41 = 狩獵季節(美) ROPP41 = 狩獵季節(歐) ROQJEP = 巴洛克(日) @@ -1464,7 +1447,7 @@ ROYX41 = 食破天驚(X) RP2E69 = 冷知識遊戲(美) RP2P69 = 冷知識遊戲(歐) RP3JAF = 高爾夫球選手猿(日) -RP4E69 = 我的模擬聚會[WiFi](美) +RP4E69 = 我的模擬聚會(美) RP4J13 = 我的模擬聚會[WiFi](日) RP4P69 = 我的模擬聚會[WiFi](歐) RP5JA4 = 實況強力職棒15(日) @@ -1476,7 +1459,7 @@ RP9ERS = 太空黑猩猩(美) RP9PRS = 太空黑猩猩(歐) RP9XRS = 太空黑猩猩(X) RPAF70 = 船槳男孩 迷失(法) -RPBE01 = 神奇寶貝 戰鬥革命[WiFi](美) +RPBE01 = 神奇寶貝 戰鬥革命(美) RPBJ01 = 神奇寶貝 戰鬥革命[WiFi](日) RPBP01 = 神奇寶貝 戰鬥革命[WiFi](歐) RPCE20 = 難題收藏(美) @@ -1525,13 +1508,12 @@ RPYE9B = 魔法飛球(美) RPYJ9B = 魔法飛球(日) RPYP9B = 魔法高爾夫(歐) RPZJA4 = 實況強力職棒Wii 決定版(日) -RQ2JK6 = 瘋狂攀登者Wii(日) +RQ2JK6 = 瘋狂攀登者Wii(日或中) RQ3PGN = PDC世界飛鏢錦標賽2009(歐) RQ4E78 = 海綿寶寶 皮老闆大暴走(美) RQ4J78 = 海綿寶寶 皮老闆大暴走(日) RQ4P78 = 海綿寶寶 皮老闆大暴走(歐) RQ5E5G = 瘋狗麥基利(美) -RQ5P5G = 瘋狗麥基利(歐) RQ5X5G = 瘋狗麥基利(歐) RQ6EJJ = 妖山詛咒(美) RQ6PKM = 妖山詛咒(歐) @@ -1548,7 +1530,7 @@ RQBPUG = 川崎4X4沙灘車(歐) RQBXUG = 川崎4X4沙灘車(X) RQCEAF = 貪吃精靈(美) RQCJAF = 貪吃精靈(日) -RQEE6U = 阿加莎克里斯蒂 艷陽下的謀殺案(美) +RQEE6U = 阿加莎·克里斯蒂 艷陽下的謀殺案(美) RQEP6V = 阿加莎克里斯蒂 艷陽下的謀殺案(歐) RQFE6U = 破箱人 終極難題冒險(美) RQFP6V = 破箱人 終極難題冒險(歐) @@ -1556,7 +1538,7 @@ RQGE69 = 我的模擬人生 賽車(美) RQGJ13 = 我的模擬人生 賽車(日) RQGP69 = 我的模擬人生 賽車(歐) RQIJ01 = NHK紅白猜謎合戰(日) -RQJE7D = 古惑狼之泰坦巨人[WiFi](美) +RQJE7D = 古惑狼 泰坦巨人(美) RQJP7D = 古惑狼之泰坦巨人(歐) RQJX7D = 古惑狼之泰坦巨人[WiFi](X) RQKE41 = 馬戲團遊戲(美) @@ -1574,7 +1556,7 @@ RQPE52 = 坎貝拉的獵鹿(美) RQPP52 = 坎貝拉的獵鹿(歐) RQPZ52 = 坎貝拉鹿獵(歐) RQQE70 = 後院橄欖球2009(美) -RQREXJ = 空中殺手 無罪王牌(美) +RQREXJ = 空中殺手 無罪王牌(美或中) RQRJAF = 空中殺手:無瑕王牌(日) RQRPAF = 空中殺手 無罪王牌(歐) RQSE4Z = 彈珠臺名人堂 威廉收藏版(美) @@ -1593,7 +1575,7 @@ RQZP41 = 怪獸4X4特級賽車(歐) RR2ENR = 裝載卡車競賽2(美) RR2PUG = 裝載卡車競賽2(歐) RR2XUG = 裝載卡車競賽2(歐) -RR3EA4 = 終極聚會挑戰[跳舞墊](美) +RR3EA4 = 終極聚會挑戰(美) RR3JA4 = 家庭挑戰Wii(日) RR3PA4 = 一起派對(歐) RR4EGY = 熊熊製作工坊(美) @@ -1608,7 +1590,7 @@ RRAPUG = 貓王的搖滾大冒險(歐) RRAXUG = 貓王的搖滾大冒險(X) RRBE41 = 雷曼超人 瘋狂兔子(美) RRBJ41 = 雷曼超人 瘋狂兔子(日) -RRBP41 = 雷曼超人 瘋狂兔子(歐) +RRBP41 = 瘋狂兔子(歐) RRCE52 = 芭比小馬冒險 騎術野營(美) RRCP52 = 芭比小馬冒險 騎術野營(歐) RRDE69 = 搖滾樂團 樂曲擴展包2(美) @@ -1675,12 +1657,12 @@ RS5JC8 = 戰國無雙 KATANA(日) RS5PC8 = 戰國無雙 KATANA(歐) RS7J01 = 光速蒙面俠21 賽場上的最強戰士(日) RS8J8N = 上海(日) -RS9E8P = 音速小子滑板競速 流星故事[WiFi](美) +RS9E8P = 音速小子滑板競速 流星故事(美) RS9J8P = 音速小子滑板競速 流星故事(日) RS9P8P = 音速小子滑板競速 流星故事[WiFi](歐) RSAE78 = 海綿寶寶 亞特蘭堤斯(美) RSAP78 = 海綿寶寶 亞特蘭蒂斯(歐) -RSBE01 = 任天堂明星大亂鬪X[WiFi](美) +RSBE01 = 任天堂明星大亂鬪X(美) RSBJ01 = 任天堂明星大亂鬪X(日) RSBK01 = 任天堂明星大亂鬪X[WiFi](韓) RSBP01 = 任天堂明星大亂鬪X[WiFi](歐) @@ -1723,8 +1705,8 @@ RSPE01 = Wii運動(美) RSPJ01 = Wii運動(日) RSPK01 = Wii運動(韓) RSPP01 = Wii運動(歐) -RSPW01 = Wii運動 繁體中文版 -RSQEAF = 家庭滑雪[平衡板](美) +RSPW01 = Wii運動(中) +RSQEAF = 家庭滑雪(美) RSQJAF = 家庭滑雪(日) RSQPAF = 家庭滑雪[平衡板](歐) RSRE8P = 音速小子 索尼克與秘密的戒指(美) @@ -1791,7 +1773,7 @@ RTFK52 = 變形金剛(韓) RTFP52 = 變形金剛(歐) RTFX52 = 變形金剛(X) RTFY52 = 變形金剛(Y) -RTGJ18 = Wi-Fi對應 嚴選桌面遊戲[WiFi](日) +RTGJ18 = 嚴選桌面遊戲 Wii RTHE52 = 托尼霍克滑板(美) RTHP52 = 托尼霍克滑板(歐) RTIE8P = 古怪世界運動會(美) @@ -1808,7 +1790,7 @@ RTLP18 = 目標!釣魚大師 世界版(歐) RTME41 = 忍者龜 旋風再起(美) RTMP41 = 忍者龜 旋風再起(歐) RTNE41 = 天誅4(美) -RTNJCQ = 天誅4(日) +RTNJCQ = 天誅4(日或中) RTNP41 = 天誅4(歐) RTOJ8P = 428 被封鎖的涉谷(日) RTPP41 = 王牌冒險(歐) @@ -1836,7 +1818,7 @@ RTZP08 = 寶島Z 紅鬍子的秘寶(歐) RU2E5Z = 冬季運動會2 下一個挑戰[平衡板](美) RU2P5Z = 冬季運動會2 下一個挑戰[平衡板](歐) RU3E5Z = 夏季田徑運動會(美) -RU4E41 = 我的健身教練2 鍛煉與營養[平衡板](美) +RU4E41 = 我的健身教練2 鍛煉與營養(美) RU4X41 = 新健身首選私人教練[平衡板](X) RU5E4Q = 迪士尼公主和青蛙(美) RU5P4Q = 公主與青蛙(歐) @@ -1896,7 +1878,7 @@ RUSK78 = 海綿寶寶 致命水珠(韓) RUSP78 = 海綿寶寶 致命水珠(Y) RUSX78 = 海綿寶寶 致命水珠(X) RUSY78 = 海綿寶寶 致命水珠(Y) -RUUE01 = 動物之森 城市大家庭[WiFi](美) +RUUE01 = 動物之森 城市大家庭(美) RUUJ01 = 動物之森 城市大家庭(日) RUUK01 = 動物之森 城市大家庭[WiFi](韓) RUUP01 = 動物之森 城市大家庭[WiFi](歐) @@ -1971,7 +1953,7 @@ RW3P4Q = 神鬼奇航 世界的盡頭(歐) RW4D41 = 我的詞匯教練(德) RW5F41 = 誰想成為百萬富翁?第二集(法) RW5P41 = 誰想成為百萬富翁?第二集(歐) -RW6PA4 = 熱舞革命 美少女俱樂部[跳舞墊](歐) +RW6PA4 = 熱舞革命 美少女俱樂部(歐) RW7E41 = 夏恩懷特滑雪[平衡板](美) RW8P41 = 想象 冠軍騎士(歐) RW9P78 = WWE 激爆職業摔角 2009[WiFi](歐) @@ -2007,7 +1989,7 @@ RWJENR = 單詞瓊聚會(美) RWKE5G = 妙廚老媽2 世界廚房(美) RWKPGT = 妙廚老媽2 世界廚房(歐) RWLE01 = 壞莉歐樂園大震盪(美) -RWLJ01 = 壞莉歐樂園大震盪(日) +RWLJ01 = 壞莉歐樂園大震盪(日或中) RWLK01 = 壞莉歐樂園大震盪(韓) RWLP01 = 壞莉歐樂園大震盪(歐) RWME78 = 百戰天蟲 怪異空間(美) @@ -2019,11 +2001,11 @@ RWOP69 = 地產大亨(歐) RWQPSP = 真實世界斯諾克冠軍賽2008(歐) RWRE4F = 古怪賽車 衝撞(美) RWRP4F = 古怪賽車 衝撞(歐) -RWSE8P = 瑪利歐與音速小子在北京奧運[WiFi](美) +RWSE8P = 瑪利歐與音速小子在北京奧運(美) RWSJ01 = 瑪利歐與音速小子在北京奧運(日) RWSK01 = 瑪利歐與音速小子在北京奧運[WiFi](韓) RWSP8P = 瑪利歐與音速小子在北京奧運[WiFi](歐) -RWTEG9 = BEN 10 外星神力(美) +RWTEG9 = 少年駭客 外星英雄(美) RWTPG9 = BEN 10 外星神力(歐) RWUE52 = X戰警 金鋼狼(美) RWUP52 = X戰警 金鋼狼(歐) @@ -2040,13 +2022,13 @@ RWZP5G = 奇跡世界遊樂園(歐) RWZX5G = 奇跡世界遊樂園(X) RX2E70 = 我和我的小馬2(美) RX2P70 = 我和我的小馬2(歐) -RX3E01 = 激情漫游 特技競速[WiFi](美) +RX3E01 = 激情漫游 特技競速(美) RX3J01 = 激情漫遊:特技競速(日) RX4E4Z = 鬼馬小精靈 鬼怪運動日(美) RX4PMT = 鬼馬小靈精 恐怖學校鬼怪的運動日(歐) RX5E52 = 滑板高手 RIDE(美) RX5P52 = 滑板高手 RIDE(歐) -RX6E78 = 減肥達人[平衡板](美) +RX6E78 = 減肥達人(美) RX6P78 = 減肥達人[平衡板](歐) RX7JGD = 梅吉瑪吉演奏比賽(日) RX8JA4 = 實況力量棒球 NEXT(日) @@ -2083,8 +2065,8 @@ RXLP41 = 實習醫生格蕾(歐) RXMJ8P = 手舞足蹈填字謎(日) RXNEXS = 再次體感釣魚(美) RXNJJF = 鱸魚釣手Wii 世界錦標賽 (日) -RXNPGT = 大收獲 巴斯釣魚2[MP](歐) -RXPEXS = 實感釣魚[WiFi](美) +RXNPGT = 巴斯釣魚2(歐) +RXPEXS = 實感釣魚 上鉤了(美) RXPJJF = 實感釣魚[WiFi](日) RXPPGT = 實感釣魚[WiFi](歐) RXQEWR = 野獸冒險樂園(美) @@ -2108,21 +2090,22 @@ RXZP52 = 坎貝拉危險狩獵2009(歐) RY2E41 = 雷曼超人 瘋狂兔子2[WiFi](美) RY2J41 = 雷曼超人 瘋狂兔子2[WiFi](日) RY2K41 = 雷曼超人 瘋狂兔子2[WiFi](韓) -RY2P41 = 雷曼超人 瘋狂兔子2[WiFi](歐) +RY2P41 = 瘋狂兔子2(歐) RY2R41 = 雷曼超人 瘋狂兔子2[WiFi](俄) -RY3E41 = 雷曼超人 瘋狂兔子的電視派對[平衡板](美) +RY3E41 = 瘋狂兔子 電視派對(美) RY3J41 = 雷曼超人 瘋狂兔子的電視派對[平衡板](日) RY3K41 = 雷曼超人 瘋狂兔子的電視派對 [WiFi][平衡板](韓) RY3P41 = 雷曼超人 瘋狂兔子的電視派對[WiFi][平衡板](歐) RY4J8P = 魔法氣泡7(日) RY5E52 = 夏日運動大聯盟(美) RY5P52 = 夏日運動大聯盟(歐) -RY6EA4 = 去戶外吧[平衡板](美) +RY6EA4 = 去戶外吧(美) RY6PA4 = 節拍漫步(歐) RY7PHZ = 忍者首領(歐) RY8EFS = 巴斯專業店 魚餌(美) -RYAJDA = 正義雙俠Wii 驚奇機械大競速(日) -RYBE69 = 轟炸方塊 猛擊聚會[WiFi](美) +RY9E69 = FIFA足球09[WiFi](美) +RYAJDA = 小雙俠Wii 驚心動魄機器猛競速(日或中) +RYBE69 = 轟炸方塊 猛擊聚會(美) RYBP69 = 轟炸方塊 猛擊聚會[WiFi](歐) RYDELT = 寵物伴侶 動物醫生(美) RYDP6V = 寵物伴侶 動物醫生(歐) @@ -2143,7 +2126,7 @@ RYLDSV = 德國頂級模特(德) RYNE6U = 哈迪男孩 隱藏的盜竊(美) RYNP6V = 哈迪男孩 隱藏的盜竊(歐) RYOEA4 = 遊戲王5D's 破碎轉輪(美) -RYOJA4 = 遊戲王5D's 破碎轉輪(日) +RYOJA4 = 遊戲王5D's 騎乘決鬥者(日或中) RYOPA4 = 遊戲王5D's破碎轉輪(歐) RYQE69 = 棋盤問答(美) RYQP69 = 棋盤問答(歐) @@ -2168,12 +2151,12 @@ RZ6JG9 = 簡單Wii系列5 打磚塊[WiFi](日) RZ7JG9 = 簡單Wii系列6 喧嘩槍戰[WiFi](日) RZ8JG9 = 簡單2000系列1 桌面遊戲(日) RZ9EG9 = 家庭聚會 30個好遊戲(美) -RZ9JG9 = 簡單2000系列2 家庭聚會(日) +RZ9JG9 = 簡單2000系列2 聚會遊戲(日或中) RZ9PG9 = 家庭聚會 30個好遊戲(歐) RZAPTV = 力量數學(歐) RZCE6K = 聖徒(美) RZDE01 = 薩爾達傳說 曙光公主(美) -RZDJ01 = 薩爾達傳說 曙光公主(日) +RZDJ01 = 薩爾達傳說 曙光公主(日或中) RZDK01 = 薩爾達傳說 曙光公主(韓) RZDP01 = 薩爾達傳說 曙光公主(歐) RZEE52 = 科學老爸(美) @@ -2192,11 +2175,11 @@ RZKE20 = 謎題王國(美) RZKP7J = 謎題王國(歐) RZLE41 = 烹飪戰爭(美) RZLP41 = 烹飪聚會(歐) -RZNJ01 = 斬擊的女武神(日) +RZNJ01 = 斬擊之REGINLEIV(日) RZOE78 = 動物園世界(美) RZOP78 = 動物園世界(歐) RZPE01 = 林克的十字弓訓練(美) -RZPJ01 = 林克的十字弓訓練(日) +RZPJ01 = 林克的十字弓練習(日或中) RZPK01 = 林克的十字弓訓練(韓) RZPP01 = 林克的十字弓訓練(歐) RZREGT = 蒙面俠蘇洛的宿命(美) @@ -2207,7 +2190,7 @@ RZTE01 = Wii運動 度假勝地[MP](美) RZTJ01 = Wii運動 度假勝地[MP](日) RZTK01 = Wii運動 度假勝地[MP](韓) RZTP01 = Wii運動 度假勝地[MP](歐) -RZTW01 = Wii運動 度假勝地 繁體中文版[MP] +RZTW01 = Wii運動 度假勝地(中) RZUE4Z = 彩色之旅(美) RZYE41 = 我的單詞教練(美) RZYF41 = 我的單詞教練(法) @@ -2231,10 +2214,11 @@ S2HE70 = 鬼屋(美) S2HP70 = 鬼屋(歐) S2IE8P = 鋼鐵人2(美) S2IP8P = 鋼鐵人2(歐) -S2LE01 = 神奇寶貝樂園2 在世界的彼端 (美) +S2LE01 = 寶可夢公園2 在世界的彼端 (美) S2LJ01 = 神奇寶貝樂園2 在世界的彼端(日) S2LP01 = 神奇寶貝樂園2 在世界的彼端 (歐) -S2OEFS = 巴斯專業店魚餌 錦標賽版(美) +S2ME69 = 勁爆美式橄欖球13(美) +S2OEFS = 巴斯專業店 魚餌 錦標賽(美) S2PEA4 = 實況足球 2012(美) S2PJA4 = 實況足球 2012(日) S2PPA4 = 實況足球 2012(歐) @@ -2244,6 +2228,8 @@ S2QE54 = NBA 2K12(美) S2QP54 = NBA 2K12(歐) S2RPNK = 目標狙擊(美) S2TJAF = 太鼓達人Wii 大張旗鼓!二代目(日) +S2UE41 = 舞力全開2020(美) +S2UP41 = 舞力全開2020(歐) S2WE78 = WWE激爆職業摔角 全明星大賽(美) S2WP78 = WWE激爆職業摔角 全明星大賽(歐) S2XE41 = 藍色小精靈2(美) @@ -2260,10 +2246,11 @@ S3DJ18 = 運動大集錦3 Wii的十項運動[MP][WiFi](日) S3DP18 = 運動大集錦3 Wii的十項運動[MP][WiFi]((歐) S3EE78 = 芭比娃娃 時尚風格(美) S3EP78 = 芭比娃娃 時尚風格(歐) +S3FE69 = FIFA足球13(美) S3FP69 = FIFA 足球 13 S3GE20 = 極地越野賽3(美) S3HJ08 = 戰國 BASARA 3 宴(日) -S3IPA4 = 实况足球2013 欧版 +S3IPA4 = 實況足球2013(歐) S3ME69 = 模擬市民3(美) S3MP69 = 模擬市民3(歐) S3PE4Q = 迪士尼公主 我的童話冒險(美) @@ -2282,10 +2269,15 @@ S59E01 = 戰國無雙 3(美) S59JC8 = 戰國無雙 3(日) S59P01 = 戰國無雙 3(歐) S5BETL = 回到未來(美) +S5DE41 = 舞力全開 迪士尼派對2(美) +S5DP41 = 舞力全開 迪士尼派對2(歐) +S5EE41 = 舞力全開2019(美) +S5EP41 = 舞力全開2019(歐) S5KJAF = 太鼓達人Wii 超豪華版(日) S5QJC8 = 戰國無雙3 猛將傳(日) +S5RPNJ = 拉姆賽車(歐) S5SJHF = 閃電十一人GO時空之石 王牌前鋒 2013(日) -S5TEG9 = Ben 10: 全能宇宙 +S5TEG9 = 少年駭客 全面進化(美) S5WE20 = 世界各地的50款遊戲(美) S6BE4Q = 勇敢傳說(美) S6BP4Q = 勇敢傳說(歐) @@ -2294,7 +2286,8 @@ S6IE78 = 迪斯尼公主故事書(美) S6IP78 = 迪斯尼公主故事書(美) S6RE52 = 無敵破壞王(美) S6RP52 = 無敵破壞王(歐) -S72J01 = 星之卡比 20周年特別合集 +S72E01 = 星之卡比 20週年紀念合集(美) +S72J01 = 星之卡比 20週年紀念合集(日) S75E69 = 地產大亨 風華大街(美) S75P69 = 地產大亨 風華大街(歐) S7AEWR = 樂高蝙蝠俠2 DC超級英雄(美) @@ -2302,17 +2295,18 @@ S7APWR = 樂高蝙蝠俠2 DC超級英雄(歐) S7BE69 = 棋盤遊戲(美) S7BP69 = 棋盤遊戲(歐) S7CJAF = 假面騎士 巔峰英雄 Fourze(日) -S7DE52 = 憤怒的小鳥:星球大戰 -SA3E5G = 鼠來寶 3(美) -SA5E78 = 你比小學五年級聰明嗎?開學(美) -SA6EG9 = Ben 10 銀河賽車(美) +S7DE52 = 憤怒的小鳥 星球大戰(美) +SA3E5G = 鼠來寶3(美) +SA5E78 = 你比五年級生聰明嗎3(美) +SA6EG9 = 少年駭客 銀河賽車(美) SA6PAF = Ben 10 銀河賽車(美) -SA7ESZ = 橡皮糖熊的魔法勳章(美) -SABENR = 外星怪獸保齡球聯賽[MP](美) +SA7ESZ = 小熊軟糖 魔法勳章(美) +SABENR = 外星怪獸保齡球聯賽(美) SABPJG = 外星怪物保齡球聯賽[MP](歐) SADE70 = 後院運動 沙地強打者(美) SAFUHS = 澳大利亞澳式足球聯盟(英) SAGE41 = 驚險大挑戰(美) +SAHE69 = 孩之寶 家庭遊戲之夜樂趣包(美) SAJE52 = 坎貝拉生存大冒險 卡特邁的陰影(美) SAJP52 = 坎貝拉生存大冒險 卡特邁的陰影(歐) SAKENS = 櫻花大戰5 再見吾愛(美) @@ -2322,11 +2316,12 @@ SALP4Q = 愛麗絲夢遊仙境(歐) SANEFS = 巴斯專業店 狩獵 獎杯賽(美) SAOP78 = 怪物美少女 屍鬼精靈(歐) SAOXVZ = 怪物美少女 屍鬼精靈(歐) -SARE4Z = 阿拉丁魔毯競速[平衡板](美) +SAQE5G = 好萊塢明星私教(美) +SARE4Z = 阿拉丁魔毯競速(美) SARPNK = 阿拉丁魔毯競速[平衡板](歐) -SATE6K = 查克E奶酪的超級收藏(美) +SATE6K = 查克奶酪的超級收藏(美) SAUJ8P = 魔法氣泡!! 20周年紀念版(日) -SAVE5G = 鼠來寶明星俱樂部(美) +SAVE5G = 鼠來寶2(美) SAVX5G = 鼠來寶明星俱樂部(歐) SAWE52 = 憤怒的小鳥 三部曲(美) SAWP52 = 憤怒的小鳥 三部曲(歐) @@ -2343,7 +2338,7 @@ SB4E01 = 超級瑪利歐銀河2(美) SB4J01 = 超級瑪利歐銀河2(日) SB4K01 = 超級瑪利歐銀河2(韓) SB4P01 = 超級瑪利歐銀河2(美) -SB4W01 = 超級瑪利歐銀河2 繁體中文版 +SB4W01 = 超級瑪利歐銀河2(中) SB5E54 = NBA 2K11(美) SB5P54 = NBA 2K11(歐) SB6E52 = 爆丸 核心守護者(美) @@ -2357,22 +2352,22 @@ SBBE18 = 戰鬥陀螺 爆神須佐之男來襲(美) SBBJ18 = 戰鬥陀螺 對決大賽(日) SBBP18 = 戰鬥陀螺 爆神須佐之男來襲(歐) SBCJ2N = 比利的訓練營Wii 享受減肥(日) -SBDE08 = 惡靈古堡 黑暗面編年史[WiFi](美) -SBDJ08 = 惡靈古堡 暗黑編年史(日) -SBDK08 = 惡靈古堡 黑暗面編年史[WiFi](韓) -SBDP08 = 惡靈古堡 黑暗面編年史[WiFi](歐) +SBDE08 = 惡靈古堡 暗黑編年史(美或中) +SBDJ08 = 惡靈古堡 暗黑歷代記[WiFi](日) +SBDK08 = 惡靈古堡 黑暗歷代記[WiFi](韓) +SBDP08 = 惡靈古堡 黑暗歷代記[WiFi](歐) SBEPSV = 百慕大三角 拯救珊瑚礁(歐) SBFE70 = 后院橄欖球10(美) SBHEFP = 雷明頓美洲獵鳥記(美) SBHPNK = 雷明頓美洲獵鳥記(美) SBIEVZ = 勤勞理發師(美) SBIPVZ = 勤勞理發師(歐) -SBJEG9 = BEN 10 外星神力 終極異型(美) +SBJEG9 = 少年駭客 終極異形之宇宙毀滅(美) SBJPAF = BEN 10 外星神力 終極異型(歐) -SBKEPZ = 布朗斯維克 宇宙領域保齡球[MP](美) +SBKEPZ = 布朗斯維克 宇宙領域保齡球(美) SBLE5G = 一個男孩和他的軟泥(美) SBLP5G = 一個男孩和他的軟泥(歐) -SBNEG9 = BEN 10 外星神力 魔賈斯的反擊(美) +SBNEG9 = 少年駭客 外星英雄之魔賈斯襲擊(美) SBNPG9 = BEN 10 外星神力 魔賈斯的反擊(歐) SBQE4Z = 雄鹿獵人(美) SBREJJ = 一起跳芭蕾舞(美) @@ -2383,35 +2378,36 @@ SBVE78 = 海綿寶寶 碰碰船競賽(美) SBVP78 = 海綿寶寶 碰碰船競賽(歐) SBVS78 = 海綿寶寶 碰碰船競賽(歐) SBWE5G = 妙廚老媽 育兒媽媽(美) -SBWJRA = 妙廚老媽 育兒媽媽(日) +SBWJRA = 育兒媽媽(日或中) SBWPGT = 妙廚老媽 育兒媽媽(歐) SBXEWR = 億萬未婚夫(美) SBYE41 = 起舞百老匯(美) SBYP41 = 百老匯舞蹈(美) SBZESZ = 百慕大三角 拯救珊瑚礁(美) -SC2E8P = 暗渠2[MP][WiFi](美) +SC2E8P = 暗渠2(美) SC2P8P = 暗渠2[MP][WiFi](歐) SC4E64 = 樂高星際大戰3 複製人戰爭(美) SC4P64 = 樂高星際大戰3 複製人戰爭(歐) SC5PGN = 挑戰自我 填字遊戲(歐) SC6PGN = 自我挑戰 大腦智力題2(歐) -SC7D52 = 決勝時刻 黑色行動(歐) +SC7D52 = 決勝時刻 黑色行動(德) SC7E52 = 決勝時刻 黑色行動(美) -SC7F52 = 決勝時刻 黑色行動(歐) -SC7I52 = 決勝時刻 黑色行動(義) +SC7F52 = 決勝時刻 黑色行動(法) +SC7I52 = 決勝時刻 黑色行動(意) SC7P52 = 決勝時刻 黑色行動(歐) -SC7S52 = 決勝時刻 黑色行動(歐) +SC7S52 = 決勝時刻 黑色行動(西) +SC7Z52 = 決勝時刻 黑色行動(英) SC8E01 = Wii遙控器Plus 動感歡樂組合[MP](美) -SC8J01 = Wii遙控器Plus 動感歡樂組合[MP](日) +SC8J01 = Wii控制器加強版 動感歡樂組合(日或中) SC8P01 = Wii遙控器Plus 動感歡樂組合[MP](歐) SC9P52 = 坎貝拉獵人2010(美) SCAE18 = 鬼來電 黑暗來信(美) SCAJ18 = 鬼來電 黑暗來信(日) SCAP18 = 鬼來電 黑暗來信(歐) SCBPNK = 自行車運動(歐) -SCDE52 = 坎貝拉危險狩獵 2011(歐) +SCDE52 = 坎貝拉危險狩獵2011(美) SCDP52 = 坎貝拉危險狩獵 2011(歐) -SCEE6K = 查克E奶酪派對遊戲(美) +SCEE6K = 查克奶酪的派對遊戲(美) SCFPNK = 魔怪狂歡節(歐) SCGE20 = 加爾文塔克的鄉村狂歡 農場動物賽車錦標賽(美) SCHEQH = 加拿大狩獵(美) @@ -2419,7 +2415,7 @@ SCIE41 = CSI 犯罪現場 致命殺機(美) SCIP41 = CSI 犯罪現場 致命殺機(歐) SCJE4Q = 樂高神鬼奇航(美) SCJP4Q = 樂高神鬼奇航(歐) -SCKE6K = 查克E奶酪運動遊戲(美) +SCKE6K = 查克奶酪運動遊戲(美) SCMJAF = 假面騎士 巔峰英雄歐茲(日) SCNEA4 = 暮光之城(美) SCNPA4 = 暮光之城(歐) @@ -2430,7 +2426,7 @@ SCSE52 = 巡洋艦度假遊戲[MP](美) SCSPGR = 遊輪度假(歐) SCTPNK = 小魔怪驚喜(歐) SCUPFR = 瘋狂小雞嘉年華派對(歐) -SCWE41 = 金牌的體操舞蹈鍛煉(美) +SCWE41 = 金吉姆健身房 舞蹈鍛煉(美) SCWP41 = 我的健身房教練 舞蹈鍛鍊(歐) SCXESZ = 雪佛蘭Camaro 野外駕駛(美) SCXPNJ = 雪佛蘭Camaro 野外駕駛(美) @@ -2443,6 +2439,7 @@ SCZEMH = 瘋狂機器(美) SCZPFR = 瘋狂機器(歐) SD2E41 = 舞力全開2(美) SD2J01 = 舞力全開 Wii (日) +SD2K41 = 舞力全開2(韓) SD2P41 = 舞力全開2(歐) SD2Y41 = 舞力全開2 百思買版(美) SD3DSV = 健康教練 每天感覺好極了(歐) @@ -2487,21 +2484,24 @@ SDWP18 = 黑影之塔(歐) SDXE4Q = 迪士尼世界(美) SDXP4Q = 迪士尼世界(歐) SDYEA4 = 熱舞革命[跳舞墊][平衡板](美) -SDYPA4 = 熱舞革命 最夯的派對 4[跳舞墊][平衡板](歐) +SDYPA4 = 熱舞革命 勁爆舞會4(歐) SDZE41 = 舞力全開 兒童版(美) SDZP41 = 舞蹈少年(歐) SE2E69 = EA SPORTS 活力健身房 2.0(美) SE2P69 = EA SPORTS 活力健身房 2.0(歐) -SE3E41 = 舞力全開 2015 +SE3E41 = 舞力全開2015(美) +SE3P41 = 舞力全開2015(歐) +SE8E41 = 舞力全開2018(美) +SE8P41 = 舞力全開2018(歐) SEAE69 = EA運動活力 6星期練出好身材[平衡板](美) SEAJ13 = EA運動活力 6星期練出好身材[平衡板](日) SEAP69 = EA運動活力 6星期練出好身材[平衡板](歐) SECE69 = 小小設計師(美) SECP69 = 小小設計師(歐) SEGE6U = 瑜伽[平衡板](美) -SEGP6V = 瑜伽[平衡板](歐) +SEGP6V = 瑜伽(歐) SEKJ99 = 活祭之夜(日) -SELE69 = FIFA足球11[WiFi](美) +SELE69 = FIFA足球11(美) SELP69 = FIFA足球11[WiFi](歐) SELX69 = FIFA足球11(歐) SEME4Q = 傳奇米老鼠(美) @@ -2522,17 +2522,17 @@ SF2P64 = 星際大戰 原力解放2(歐) SF4E20 = 橫衝直撞(美) SF5E41 = 塑身教練俱樂部(美) SF5J41 = 健身工坊(日) -SF5P41 = 我的健身教練俱樂部(歐) -SF7E41 = 家庭智力搶答2012版(美) -SF8E01 = 大金剛再起(美) +SF5P41 = 我的健身教練 俱樂部(歐) +SF7E41 = 家庭問答2012(美) +SF8E01 = 大金剛再起(美或中) SF8J01 = 大金剛再起(日) SF8P01 = 大金剛再起(歐) -SFAE41 = 家庭對抗 智力問答(美) +SFAE41 = 家庭問答2011(美) SFAJGD = 鋼之煉金術師 黃昏少女(日) SFBE70 = 後院運動 菜鳥向前衝(美) SFDEAF = 家庭訓練機 夢幻主題樂園(美) SFDJAF = 家庭訓練機 夢幻主題樂園(日) -SFGE69 = 孩之寶家庭遊戲之夜4 遊戲節目(美) +SFGE69 = 孩之寶 家庭遊戲之夜4 遊戲節目(美) SFHEFP = 戶外活動合集(美) SFIE01 = 神秘案件檔案 百靈泉(美) SFIP01 = 神秘案件檔案(歐) @@ -2592,6 +2592,7 @@ SGKJC8 = 冠軍騎師:風速神駒&騎師之道(日) SGKPC8 = 冠軍騎師 騎師之道&風速神駒(歐) SGLEA4 = 高米迪戰士 自然之王(歐) SGLPA4 = 高米迪戰士 自然之王(歐) +SGNE69 = 孩之寶 家庭遊戲之夜超值包(美) SGODKP = 迷你高爾夫度假勝地(歐) SGOETV = 迷你高爾夫度假勝地(美) SGOPKP = 迷你高爾夫度假勝地(歐) @@ -2611,13 +2612,13 @@ SGVPAF = 歡樂假期(歐) SGWD7K = 比比小魔女(歐) SGXE41 = 恐龍之戰(美) SGXP41 = 恐龍之戰(歐) -SGYESZ = 橡膠熊迷你高爾夫(美) +SGYESZ = 小熊軟糖 迷你高爾夫(美) SGYPNJ = 橡膠熊迷你高爾夫(歐) SH2JMS = 輕鬆學跳草裙舞(日) SH3E54 = 勁爆冰上曲棍球2011[MP](美) SH3P54 = 勁爆冰上曲棍球2011[MP](歐) SH4EFP = 戰火紛飛 阿富汗(美) -SH5E69 = 哈利波特 死神的聖物 下集(美) +SH5E69 = 哈利波特與死亡聖器 下集(美) SH5P69 = 哈利波特 死神的聖物 下集(美) SH6E52 = 坎貝拉狩獵2012(美) SH7ESZ = 狂熱本田沙灘車(美) @@ -2632,7 +2633,7 @@ SHDP52 = 馴龍高手(美) SHEDRM = 農場(歐) SHFE20 = 籃球名人堂 極限挑戰(美) SHGDRM = 假日遊戲(歐) -SHHE69 = 哈利波特 死神的聖物 上集(美) +SHHE69 = 哈利波特與死亡聖器 上集(美) SHHP69 = 哈利波特 死神的聖物 上集(歐) SHIJ2N = 節奏拳擊2 用Wii享瘦(日) SHKE20 = 凱蒂貓 四季(美) @@ -2645,7 +2646,7 @@ SHOXKR = 雨果 巨魔樹林里的魔法(X) SHOYKR = 雨果 巨魔樹林里的魔法(歐) SHPE5G = 我們的家 聚會[WiFi](美) SHSE20 = 超級戰鬥機(美) -SHTE20 = 馬修斯狩獵弓[MP](美) +SHTE20 = 馬修斯狩獵弓(美) SHUE52 = 坎貝拉危險狩獵 2011 特別版(美) SHVE78 = 風火輪賽車 賽道攻擊(美) SHVP78 = 風火輪賽車 賽道攻擊(歐) @@ -2668,8 +2669,8 @@ SIFESZ = 弗蘭克斯坦博士島(美) SIFPNJ = 弗蘭克斯坦博士島(歐) SIIE8P = 瑪利歐與音速小子在倫敦奧運[WiFi](美) SIIJ01 = 瑪利歐與音速小子在倫敦奧運[WiFi](日) -SIIP8P = 瑪利歐與音速小子在倫敦奧運[WiFi](歐) -SIJE52 = 我是凱利2 加入我們(歐) +SIIP8P = 瑪利歐與音速小子在倫敦奧運(歐) +SIJE52 = 我是凱利2 加入我們(美) SIJP52 = 我是凱利2 加入我們(歐) SILE78 = 百戰天蟲 戰鬥島(美) SILP78 = 百戰天蟲 戰鬥島(歐) @@ -2684,12 +2685,22 @@ SJ2PWR = 史酷比 幽靈沼澤(歐) SJ3JDA = 人生遊戲 歡樂家庭(日) SJ5JDA = 人生遊戲 快樂家庭 當地題材增量版(日) SJ6E41 = 舞力全开:迪士尼派对 +SJ6P41 = 舞力全開 迪士尼派對(歐) +SJ7E41 = 舞力全開 兒童版2014(美) +SJ7P41 = 舞力全開 兒童版2014(歐) +SJ9E41 = 舞力全開 夏日派對(美) +SJ9P41 = 舞力全開2 額外的歌曲(歐) +SJAE5G = 大白鯊 終極獵食者(美) SJBE52 = 詹姆士龐德007 黃金眼(美) SJBJ01 = 007 黃金眼(日) SJBP52 = 詹姆士龐德007 黃金眼(歐) -SJDE41 = 舞力全開 3(美) -SJDJ01 = 舞力全开Wii 2 -SJDP41 = 舞力全開 3(美) +SJDE41 = 舞力全開3(美) +SJDJ01 = 舞力全開 Wii2(日) +SJDK41 = 舞力全開3(韓) +SJDP41 = 舞力全開3(歐) +SJDX41 = 舞力全開3 特別版(歐) +SJDY41 = 舞力全開3 百思買版(美) +SJDZ41 = 舞力全開3 塔吉特版(美) SJEEPK = JumpStart 逃離冒險島(美) SJFE4Z = 兒童健身島度假村(美) SJFPGR = 幼兒健身教練(歐) @@ -2701,9 +2712,12 @@ SJJEA4 = 吉米約翰的超級引擎(美) SJKEPK = 瘋狂卡丁車(美) SJLEFS = 少年體育聯賽(美) SJLPXT = 少年體育聯賽(美) -SJME5G = 吉利安 麥可斯健身最後通牒2010[平衡板](美) +SJME5G = Jillian Michaels的健身訓練2010(美) SJMPGT = 吉利安 麥可斯健身最後通牒2010[平衡板](美) -SJOP41 = 舞力全開 2014 +SJNE41 = 舞力全開2016(美) +SJNP41 = 舞力全開2016(歐) +SJOE41 = 舞力全開2014(美) +SJOP41 = 舞力全開2014(歐) SJPE78 = 智力競答(美) SJQEPZ = 寶石方塊三部曲(美) SJQPGR = 寶石方塊三部曲(美) @@ -2717,7 +2731,7 @@ SJUE20 = 恐龍快打(美) SJUPXT = 恐龍快打(美) SJVE20 = 肖恩約翰遜體操[平衡板](美) SJWJA4 = 實況足球2010 藍武士的挑戰(日) -SJXD41 = 舞力全開4(歐) +SJXD41 = 舞力全開4 特別版(歐) SJXE41 = 舞力全開4(美) SJXP41 = 舞力全開4(歐) SJZE41 = 舞力全開 兒童版2(美) @@ -2725,26 +2739,28 @@ SJZP41 = 舞力全開 兒童版2(歐) SK3EEB = 超執刀 外傷團隊(美) SK4E52 = 史瑞克快樂4神仙(美) SK4P52 = 史瑞克快樂4神仙(歐) +SK6KJD = 舞動韓流(韓) SKAEA4 = 卡拉OK革命 歡樂合唱團(美) SKAPA4 = 卡拉OK革命 歡樂合唱團(歐) -SKBEG9 = Kidz Bop舞蹈派對(美) +SKBEG9 = 兒童舞蹈派對(美) SKCE20 = 大腳車 壓碎王(美) SKDJ18 = 卡拉OK JOYSOUND Wii 雙人對唱曲篇 SKEJ18 = 卡拉OK JOYSOUND Wii 演歌・歌謠曲篇 SKGEA4 = 卡拉OK革命 歡樂合唱團2(美) SKGPA4 = 卡拉OK革命 歡樂合唱團2(歐) -SKHJAF = 假面骑士:超巅峰英雄 +SKHJAF = 假面骑士 超巅峰英雄(日) SKJE78 = 死亡醫生(美) SKLDSV = K11 專員行動(歐) SKMJAF = 假面騎士 巔峰英雄W(日) -SKOEA4 = 卡拉OK革命歡樂合唱團3(美) +SKOEA4 = 卡拉OK革命 歡樂合唱團3(美) SKOPA4 = 卡拉OK革命歡樂合唱團3(美) SKREG9 = 假面騎士 龍騎士(美) SKTE78 = 全明星空手道(美) SKTP78 = 全明星空手道(歐) SKUE78 = 功夫熊貓2(美) SKUP78 = 功夫熊貓2(歐) -SKVE20 = 凱文凡達姆的大巴斯挑戰(歐) +SKUZ78 = 功夫熊貓2(美) +SKVE20 = 凱文凡達姆的大巴斯挑戰(美) SKXE20 = 海盜襲擊(美) SKYE52 = 小龍斯派羅:巨人(美) SKYP52 = 小龍斯派羅:巨人(歐) @@ -2753,15 +2769,17 @@ SKYY52 = 小龍斯派羅:巨人(歐) SKYZ52 = 小龍斯派羅:巨人(歐) SKZE52 = 夢工廠超級明星賽(美) SKZP52 = 夢工廠超級明星賽(歐) -SL2J01 = 零 ~ 真紅之蝶(日) +SL2J01 = 零 真紅之蝶(日或中) SL2P01 = 零 ~ 真紅之蝶(歐) SL3ENR = 龍穴歷險三部曲(美) SLAE78 = 最後的氣宗(美) SLAP78 = 最後的氣宗(歐) SLAZ78 = 最後的氣宗 玩具反斗城版(美) +SLCEGN = 起舞吧(美) +SLDEYG = 一起跳舞(美) SLEE78 = 喬布拉 促進大腦發展的冥想遊戲(美) SLEP78 = 喬布拉 促進大腦發展的冥想遊戲(歐) -SLHEWR = 樂高哈利波特 5-7年(美) +SLHEWR = 樂高哈利波特 下集(美) SLHPWR = 樂高哈利波特 5-7年(歐) SLIE52 = 世界職業棒球聯盟 二合一(美) SLPP5D = 狼的精神(歐) @@ -2781,7 +2799,8 @@ SM2P52 = 十分鐘快速健身(歐) SM4E20 = 大腳怪物卡車大破壞(美) SM5EAF = 侍戰隊真劍者(美) SM5PAF = 侍戰隊真劍者(歐) -SM6PNK = 我的形體教練 2 健身與舞蹈(歐) +SM6PNK = 我的形體教練2 健身與舞蹈(歐) +SM7E69 = 勁爆美式橄欖球12(美) SM8D52 = 決勝時刻 現代戰爭3(歐) SM8E52 = 決勝時刻 現代戰爭3(美) SM8F52 = 決勝時刻 現代戰爭3(歐) @@ -2793,9 +2812,10 @@ SM9E54 = 職業棒球大聯盟2K12(美) SMAENR = 海軍陸戰隊 現代城市戰(美) SMAPGN = 海軍陸戰隊 現代城市戰(歐) SMBE8P = 超級猴子球 體感滾動[平衡板](美) -SMBJ8P = 超級猴子球 體感滾動[平衡板](日) -SMBP8P = 超級猴子球 體感滾動[平衡板](歐) +SMBJ8P = 超級猴子球 體感滾動(日) +SMBP8P = 超級猴子球 體感滾動(歐) SMCENR = 我們祝你聖誕快樂(美) +SMCPXT = 我們祝你聖誕快樂(歐) SMEE69 = 勁爆美式橄欖球11(美) SMFE4Q = 飛哥與小佛 超時空之謎(美) SMFP4Q = 飛哥與小佛 超時空之謎(歐) @@ -2812,7 +2832,7 @@ SMNE01 = 新超級瑪利歐兄弟Wii(美) SMNJ01 = 新超級瑪利歐兄弟Wii(日) SMNK01 = 新超級瑪利歐兄弟Wii(韓) SMNP01 = 新超級瑪利歐兄弟Wii(歐) -SMNW01 = 新超級瑪利歐兄弟Wii 繁體中文版(中) +SMNW01 = 新超級瑪利歐兄弟Wii(中) SMOE41 = 麥可傑克森 舞王體驗(美) SMOJ41 = 麥可傑克森 夢幻體驗(日) SMOP41 = 麥可傑克森 舞王體驗(美) @@ -2845,7 +2865,7 @@ SN7EYG = 急速賽車 超級卡車賽(美) SN7PNG = 急速賽車 超級卡車賽(歐) SN8EYG = 急速賽車 衝刺車(美) SN8PNG = 急速賽車 衝刺車(歐) -SN9E54 = 尼克羅頓健身[平衡板](美) +SN9E54 = 尼克羅頓健身(美) SNAE52 = 坎貝拉獵人2011 北美歷險記(美) SNBE41 = 重返犯罪現場 NCIS(美) SNBP41 = 重返犯罪現場 NCIS(歐) @@ -2867,7 +2887,6 @@ SNJP69 = NBA JAM(歐) SNKP54 = 尼克羅頓健身[平衡板](歐) SNKX54 = 尼克羅頓健身[平衡板](歐) SNLE54 = 尼克羅頓舞蹈(美) -SNLP54 = 尼克羅頓舞蹈(歐) SNLX54 = 尼克羅頓舞蹈(歐) SNMEAF = 拿姆科博物館 經典合集(美) SNQE7U = 國家地理大挑戰(美) @@ -2879,25 +2898,28 @@ SNUPJW = 快樂神經元學院(歐) SNVE69 = 極速快感 亡命天涯(美) SNVJ13 = 極速快感 亡命天涯(日) SNVP69 = 極速快感 亡命天涯(歐) -SNXJDA = 火影忍者疾風傳 激鬥忍者大戰Special(日) +SNXJDA = 火影忍者疾風傳 激鬥忍者大戰特別版(日) +SNZEVZ = 芭比夢幻屋派對(美) SO3EE9 = 符文工廠 藍海奇緣(美) SO3J99 = 符文工廠 藍海奇緣(日) +SOAE52 = 坎貝拉狩獵探險(美) SOCE4Z = 致命捕撈 混亂海域(美) SOIEEB = 101合1 運動聚會遊戲大合集(美) SOIPHZ = 101合1 運動聚會遊戲大合集(歐) SOJE41 = 雷射超人 起源(美) SOJP41 = 雷射超人 起源(歐) +SOKEA4 = 卡拉OK 歡樂之聲(美) SOKJ18 = 卡拉OK 歡樂之聲Wii DX(日) SOME01 = 全民節奏天國(美) -SOMJ01 = 全民節奏天國(日) -SOMP01 = 全民節奏天國(歐) +SOMJ01 = 大家的節奏天國(日或中) +SOMP01 = 大家的節奏天國(歐) SONDMR = 我的第一個卡拉OK(歐) SONFMR = 我的第一個卡拉OK(歐) SONPMR = 我的第一個卡拉OK(歐) SOSEG9 = 極速蝸牛 超級特技隊(美) SOTE52 = 失敗比賽(美) SOUE01 = 薩爾達傳說 天空之劍(美) -SOUJ01 = 薩爾達傳說 天空之劍(日) +SOUJ01 = 薩爾達傳說 天空之劍(日或中) SOUK01 = 薩爾達傳說 天空之劍(韓) SOUP01 = 薩爾達傳說 天空之劍(歐) SP2E01 = Wii運動+Wii運動 度假勝地(歐 @@ -2953,8 +2975,9 @@ SQPPX4 = 速度 2(歐) SQUDX3 = 測驗派對(歐) SQUFX3 = 測驗派對(歐) SQUPX3 = 測驗派對(歐) +SQVE69 = FIFA 15(美) SQVX69 = FIFA足球 15 -SR4E41 = 雷曼超人 瘋狂兔子時空旅行[MP][WiFi](美) +SR4E41 = 雷曼超人 瘋狂兔子時空旅行(美) SR4J41 = 瘋狂兔子:時光旅行[WiFi](日) SR4P41 = 雷曼超人 瘋狂兔子時空旅行(歐) SR5E41 = 雷曼超人 瘋狂兔子派對合集(美) @@ -2980,7 +3003,7 @@ SRNE70 = 天橋驕子(美) SRNP70 = 天橋驕子(歐) SRPE4Q = 迪士尼 魔髮奇緣(美) SRPP4Q = 迪士尼 魔髮奇緣(歐) -SRQE41 = 球拍運動[MP](美) +SRQE41 = 球拍運動(美) SRQP41 = 球拍運動[MP](歐) SRRENR = 消遣遊戲室[MP](美) SRRPGN = 盛大聚會遊戲(歐) @@ -3021,6 +3044,7 @@ SSHPHH = 夏洛克福爾摩斯 銀耳飾之案(歐) SSIENR = 冬季爆發 九大冰雪運動(美) SSJEJJ = 夏季明星 2012(美) SSJPKM = 夏季明星 2012(歐) +SSLENR = 騎手的天堂(美) SSLPKM = 馬術俱樂部(歐) SSMPGD = 門薩學院(歐) SSNEYG = 狙擊精英(美) @@ -3030,14 +3054,14 @@ SSPX52 = 小龍斯派羅的大冒險(歐) SSQE01 = 瑪利歐派對9(美) SSQJ01 = 瑪利歐派對9(日) SSQP01 = 瑪利歐派對9(歐) -SSQW01 = 瑪利歐派對9 繁體中文版 +SSQW01 = 瑪利歐派對9(中) SSRE20 = 狂野西部槍戰(美) SSRPXT = 狂野西部槍戰(X) SSTEG9 = 兒童冒險 天空隊長(美) SSTPY5 = 特技飛行 空中英雄(歐) SSUES5 = 迴轉壽司(美) SSWDRM = 水上運動(德) -SSWEPZ = 水上運動[平衡板](美) +SSWEPZ = 水上運動(美) SSWPGR = 水上運動[平衡板](歐) SSZE5G = 劍(美) ST3J01 = 聽力大考驗(日) @@ -3045,18 +3069,18 @@ ST4PNX = 湯瑪士小火車 鐵路小英雄(歐) ST4XNX = 湯瑪士小火車 鐵路小英雄(歐) ST5E52 = 變形金剛 賽博坦大戰(美) ST5P52 = 變形金剛 賽博坦大戰(歐) -ST6E78 = 減肥達人挑戰賽[平衡板](美) +ST6E78 = 減肥達人挑戰賽(美) ST6P78 = 減肥達人挑戰賽[平衡板](歐) -ST7E01 = 頂級街 Wii (美) -ST7JGD = 人生街道 Wii (日) -ST7P01 = 人生街道 Wii (欧) +ST7E01 = 富豪街Wii[WiFi](美) +ST7JGD = 富豪街Wii(日或中) +ST7P01 = 富豪街Wii[WiFi](歐) ST9E52 = 頂級射手(美) STAE78 = 猜猜畫畫(美) STAP78 = 猜猜畫畫(歐) STAU78 = 猜猜畫畫(歐) STDEFP = 目標狙擊(美) -STEETR = 俄羅斯方塊聚會 豪華版(美) -STEJ18 = 俄羅斯方塊派對 超值版(日) +STEETR = 俄羅斯方塊聚會 豪華版[WiFi][平衡板](美) +STEJ18 = 俄羅斯方塊派對獎金(日或中) STEPTR = 俄羅斯方塊派對(歐) STFE52 = 變形金剛 領袖之證(美) STFP52 = 變形金剛 領袖之證(歐) @@ -3098,7 +3122,7 @@ STXE69 = 老虎伍茲 12 高球名人賽(美) STXP69 = 老虎伍茲 12 高球名人賽(歐) STYE52 = 滑板高手(美) STYP52 = 滑板高手(歐) -STZE52 = 變形金剛3(美) +STZE52 = 變形金剛3 月黑之時(美) STZP52 = 變形金剛3(歐) SU2E54 = 尼克羅頓舞蹈2(美) SU2P54 = 尼克羅頓舞蹈2(歐) @@ -3110,26 +3134,28 @@ SU3SMR = 環球歌唱2[WiFi][麥克風](西) SU3UMR = 環球歌唱2[WiFi][麥克風](歐) SU4E78 = UFC 私人教練[平衡板][Wi-Fi](美) SU4P78 = UFC 私人教練[平衡板][Wi-Fi](歐) -SU6E5G = 尊巴瘦身:核心版 +SU6E5G = 尊巴健身 核心版(美) SU6XGT = 尊巴瘦身:核心版 SU7EG9 = 守護者聯盟(美) SU9E4Q = 飛機總動員(美) SU9P4Q = 飛機總動員(歐) SUKE01 = 星之卡比 重回夢幻島(美) -SUKJ01 = 星之卡比 Wii(日) +SUKJ01 = 星之卡比 重回夢幻島(日或中) SUKP01 = 星之卡比 Wii(歐) SUMJC8 = 賽馬大亨世界 2010(日) +SUNEYG = 麋鹿獵人 傳奇(美) SUPE01 = Wii 派對(美) -SUPJ01 = Wii 派對(日) +SUPJ01 = Wii派對(日或中) SUPK01 = Wii 派對(韓) SUPP01 = Wii 派對(歐) -SUREA4 = 熱舞革命 2[跳舞墊](美) +SUREA4 = 熱舞革命2(美) SURPA4 = 熱舞革命 5(歐) SUSFMR = 環球歌唱 強尼哈勒戴(歐) SUSPMR = 環球歌唱 女孩之夜(歐) SUTESZ = 很久很久以前(美) SUUE78 = 天才小畫家 即時藝術家(美) SUUP78 = 天才小畫家 即時藝術家(歐) +SUVE52 = 坎貝拉危險狩獵2013(美) SUWE78 = 天才小畫家(美) SUWP78 = 天才小畫家(歐) SUXEA4 = 實況足球2010[WiFi](美) @@ -3141,20 +3167,22 @@ SV2E78 = 大沙灘運動2(美) SV2P78 = 大沙灘運動2(歐) SV3EG9 = 馬達加斯加3(美) SV3PAF = 馬達加斯加3(歐) -SV4E8P = 威力網球 4[MP][WiFi](美) +SV4E8P = 威力網球4(美) SV4P8P = 威力網球 4[MP][WiFi](歐) -SVBE52 = 战舰 +SVBE52 = 战舰(美) SVDP52 = 海綿寶寶 痞老闆機器人復仇 SVME01 = 超級瑪利歐收藏集 特別包(美) SVMJ01 = 超級瑪利歐收藏集(日) SVMP01 = 超級瑪利歐收藏集 特別包(歐) SVPESZ = 維加斯聚會(美) SVPPNJ = 維加斯聚會(歐) +SVQEVZ = 芭比姐妹之狗狗救援隊(美) SVTEXS = 超級線程(美) SVVEG9 = 古魯家族(美) SVVPAF = 古魯家族(歐) SVWEQH = 蔬菜世界(美) -SVYEG9 = Ben10 全體宇宙2 +SVYEG9 = 少年駭客 全面進化2(美) +SVZEVZ = 馴龍高手2(美) SW2E52 = 百戰鐵人王 2(美) SW3EJJ = 冬季滑雪明星(美) SW3PKM = 冬季滑雪明星(歐) @@ -3165,49 +3193,59 @@ SW7EVN = 西部英雄(美) SW7PNK = 西部英雄(歐) SW9EVN = 怪物大轟炸(美) SW9PYT = 怪物大轟炸(美) -SWAE52 = DJ英雄[WiFi](美) +SWAE52 = DJ英雄(美) SWAP52 = DJ英雄[WiFi](歐) SWBE52 = DJ 英雄2(美) SWBP52 = DJ 英雄2[WiFi]((歐) SX2PNG = 叢林賽車(歐) -SX3J01 = 潘朵拉之塔 直到你身邊(日) +SX3J01 = 潘朵拉之塔 回到你身邊(日) SX3P01 = 潘朵拉之塔 直到你身邊 (欧) SX4E01 = 异度之刃:编年史 -SX4J01 = 異域神劍(日) +SX4J01 = 異域神劍(日或中) SX4P01 = 異域神劍(歐) SX5E4Z = 聖誕老人進城囉(美) SX6JAF = 光之美少女 全明星全員集合一起舞蹈(日) SX7E52 = 忍者神龜 SX8E52 = X戰警 命運(美) SX8P52 = X戰警 命運(美) -SXAE52 = 吉他英雄 世界巡演[WiFi](美) +SXAE52 = 吉他英雄 世界巡演(美) SXAP52 = 吉他英雄 世界巡演[WiFi](歐) -SXBE52 = 吉他英雄 金屬樂隊專輯[WiFi](美) +SXBE52 = 吉他英雄 金屬樂隊(美) SXBP52 = 吉他英雄 金屬樂隊專輯[WiFi](歐) -SXCE52 = 吉他英雄 流行精選[WiFi](美) +SXCE52 = 吉他英雄 流行精選(美) SXCP52 = 吉他英雄 流行精選[WiFi](歐) -SXDE52 = 吉他英雄 范海倫[WiFi](美) +SXDE52 = 吉他英雄 范海倫(美) SXDP52 = 吉他英雄 范海倫[WiFi](歐) -SXEE52 = 吉他英雄5[WiFi](美) +SXEE52 = 吉他英雄5(美) SXEP52 = 吉他英雄5[WiFi](歐) -SXFE52 = 樂團英雄[WiFi](美) +SXFE52 = 樂團英雄(美) SXFP52 = 樂團英雄[WiFi](歐) SXIE52 = 吉他英雄 搖滾鬥士(美) SXIP52 = 吉他英雄 搖滾鬥士(歐) SZ2E5G = 尊巴南美拉丁舞 2(美) SZ2P5G = 尊巴南美拉丁舞 2(歐) SZ2XGT = 尊巴南美拉丁舞 2(歐) -SZ5E5G = 尊巴南美拉丁舞(美) +SZ3E5G = 尊巴健身 世界派對(美) +SZ5E5G = 尊巴健身(美) SZ5PGT = 尊巴南美拉丁舞(歐) +SZ7E41 = 舞力全開2017(美) +SZ7P41 = 舞力全開2017(歐) SZAE69 = 搖滾樂隊2[WiFi](美) SZAP69 = 搖滾樂隊2[WiFi](歐) SZBE69 = 搖滾樂隊3(美) SZBP69 = 搖滾樂隊3(歐) +23EE41 = 舞力全開2023 +AFRE01 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷8 AMNE01 = 另一個超級瑪利歐兄弟Wii(美) AMOR04 = 自製 吉他英雄3 HARDcore(歐) -APRP01 = 自製 ANDY AFRO的復古自製(歐) -APRP08 = 自製 ANDY AFRO的新超級馬裡奧兄弟Wii 自製第一輯(歐) -ASMB01 = 另一個超級瑪利歐兄弟Wii(自) +APRP01 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷2 +APRP02 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷3 +APRP03 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷6 +APRP04 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷7 +APRP06 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷5 +APRP08 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷1 +ASIE41 = 舞力全開 Asia +ASMB01 = 另一版的超級瑪利歐兄弟Wii BEPS01 = 自制 吉他英雄 下載版(西) C3BE52 = 自制 吉他英雄3 下載版(美) C3FP52 = 自制 吉他英雄3 下載版(歐) @@ -3275,33 +3313,39 @@ CKBE88 = 瑪莉歐賽車黑化版(美) CLAPSI = 自制 唱吧 下載版(歐) CMDE52 = 自制 吉他英雄3 下載版(美) CVLE38 = 瑪利歐賽車 勝利賽道[WiFi](美) +DLCE41 = 舞力全開2015合集 DMSP4Q = 迪斯尼電影 想唱就唱(歐) DQAJSC = 水瓶座棒球 (猫星汉化版) DRP22Q = 自制 唱吧 下載版(歐) +FC2E41 = 舞力全開 Focus2 FF4ENG = 零月蝕之假面(美) +GH2E41 = 舞力全開 GH2 +GMSE02 = 超级马里奥阳光多人游戏 HBWE01 = 超級瑪利歐兄弟Wii Hellboy Edition(美) -KMKE01 = Kustom 瑪利歐賽車[WiFi](美) +KMKE01 = 瑪利歐賽車Wii 自製版 L40P4Q = 自制 唱吧 下載版(歐) MDUE01 = 瑪利歐賽車 Track Grand Priix[WiFi](美) MECPSI = 自制 唱吧 下載版(歐) MIJPSI = 自製 唱吧 麥可傑克森(歐) MILPSI = 自制 唱吧 下載版(歐) +MRRP01 = 新超級瑪利歐兄弟Wii 復古重製版 NRJ1FR = 自制 唱吧 NRJ音樂之旅 1.1版(自) ONKELZ = 自制 唱吧 下載版(美) OTFPSI = 自制 唱吧 下載版(歐) PDUE01 = 另一個超級瑪利歐兄弟Wii(美) PMNEO1 = 新舊超級瑪利歐兄弟Wii(美) POPPSI = 自制 唱吧 下載版(歐) -PPNE01 = 新超級瑪利歐兄弟Wii 加強版(美) +PPNE01 = 新超級瑪利歐兄弟Wii2 下一階段 PUTA01 = 自製 吉他英雄3 搖滾精選(?) R01PET = 自制 唱吧 下載版(歐) R02PEA = 自制 唱吧 下載版(歐) R15POH = 自製 唱吧 Radio 105(歐) +R24E01 = 用Wii遊玩小小機器人(日) R4ZE01 = 零月蝕之假面(美) R4ZP01 = 零月蝕之假面(美) -R8PC01 = 超級紙片瑪利歐(簡) -RCOC99 = 名偵探柯南 追憶的幻想(ACG漢化簡體中文版) -RDUE01 = DU 超級瑪利歐兄弟 尋找公主(美) +R8PC01 = 超級紙片瑪利歐(中) +RCOC99 = 名偵探柯南 追憶的幻想(中) +RDUE01 = DU超級瑪利歐兄弟 尋找公主 RG0E52 = 吉他英雄 年輕歲月 加強版(美) RG1552 = 自制 吉他英雄 怪人奧爾(?) RG1E52 = 自制 吉他英雄3 復仇(美) @@ -3333,14 +3377,21 @@ RI1POH = 自制 唱吧 下載版(歐) RI2POH = 自制 唱吧 下載版 Vol.2(歐) RI3POH = 自制 唱吧 下載版(歐) RJJG52 = 自制 吉他英雄3 JJ-KwiK版(歐) +RJUE41 = 舞力全開 China RL9ESD = 吉他英雄 聯合公園(美) -RMCC01 = 瑪利歐賽車 Wii(日) +RMCC01 = 瑪利歐賽車Wii(中) RMCE06 = Wiimms瑪利歐賽車趣味2010-12(美) +RMCEYP = 耀西賽車度假村Plus(美) RMCJ12 = 瑪俐歐賽車Wii 自製版(2011-11 Wiimm)(日) +RMCJYP = 耀西賽車度假村Plus(日) +RMCKYP = 耀西賽車度假村Plus(韓) +RMCPCA = 瑪利歐賽車Wii(加泰蘭語) +RMCPYP = 耀西賽車度假村Plus(歐) RMGC01 = 超級瑪利歐銀河(中) RMGE52 = 自制 吉他英雄3 麥加帝斯合唱團(美) RMGR01 = 超級瑪利歐銀河(俄) RMKE02 = 自製 瑪利歐賽車(美) +RNVW01 = 超級瑪利歐銀河(中) ROMESD = 魔物獵人G(美) RQQE52 = 吉他英雄 皇后樂團(美) RSJESD = 自製 吉他英雄 墮落體制合唱團(美) @@ -3350,15 +3401,29 @@ RWDC52 = 自制 吉他英雄 下載版(歐) RYAJSC = 小雙俠賽車 Wii RZDC01 = 薩爾達傳說 曙光公主(中) S02PES = 自制 唱吧 下載版(歐) +S12E41 = 舞力全開 BestOf2 +S18E41 = 舞力全開 Fitted 2018 +S2PE41 = 舞力全開2020 Plus +S3EE41 = 舞力全開2023 +S3UE41 = 舞力全開 Spotlight +S4EE41 = 舞力全開2023 +S5UE41 = 舞力全開 Unlimited Party +S68E41 = 舞力全開2022 +S7EE41 = 舞力全開2023 S80U3Q = 自制 唱吧 下載版(歐) +S85E41 = 舞力全開2021 +S85P41 = 舞力全開2021 SANT3Q = 自制 唱吧 下載版(歐) +SBJE41 = 舞力全開 Melody SBOD3Q = 自制 唱吧 下載版(歐) SBVG3Q = 自制 唱吧 下載版(歐) SDAE01 = 史酷比!冒險的兄弟(美) SDRP3Q = 自制 唱吧 下載版(歐) SDTH3Q = 自制 唱吧 下載版(歐) SDUEO1 = 新超級瑪利歐兄弟Wii DU版(歐) -SDUPO1 = 新超級瑪利歐兄弟Wii DU版(歐) +SDUPO1 = DU超級瑪利歐兄弟 +SE1E41 = 舞力全開 East +SEHE41 = 舞力全開 Epic Hits SEOP4Q = 自制 唱吧 下載版(歐) SGI1CL = 自制 唱吧 下載版(歐) SGI1DB = 自制 唱吧 下載版(歐) @@ -3366,6 +3431,8 @@ SGI1MC = 自制 唱吧 下載版(歐) SGI1ML = 自制 唱吧 下載版(自) SGI1PT = 自制 唱吧 下載版(自) SGI1RC = 自制 唱吧 下載版(自) +SH5E41 = 舞力全開 Hyper +SHIE41 = 舞力全開 Hits SIBBHJ = 自制 唱吧 下載版(自) SILP4Q = 自制 唱吧 下載版(歐) SIS1OH = 自制 唱吧 下載版(歐) @@ -3395,22 +3462,40 @@ SISR3Q = 自制 唱吧 下載版(歐) SISRP4 = 自制 唱吧 下載版(歐) SISSOH = 自制 唱吧 下載版(歐) SISTDK = 迪斯尼 想唱就唱 土耳其聚會(歐) +SJDJ02 = 舞力全開 Flamengo +SJEE41 = 舞力全開2014合集 +SJME89 = 舞力全開 Japan +SL1E41 = 舞力全開 Starlight +SM3E01 = 超級瑪利歐兄弟3+ SMIG3Q = 自制 唱吧 下載版(歐) +SMMP01 = 新超級瑪利歐兄弟Wii ANDY AFRO的自製系列卷4 SMNC01 = 新超級瑪利歐兄弟Wii(中) +SMNE03 = 更新的超級瑪利歐兄弟Wii +SMNEXE = 加強的超級馬里奧兄弟.WIi豪華版 SMNPO1 = 新超級瑪利歐兄弟Wii定製版(歐) SMOT3Q = 自制 唱吧 下載版(歐) +SMPP01 = 新超級瑪利歐兄弟Wii2 另一個P +SNBE66 = 新超級馬里奧兄弟wii啟示錄 SOME02 = 全民節奏天國(美) +SOUE41 = 舞力全開 Ocean SP9P4Q = 自制 唱吧 下載版(歐) SRBP4Q = 自制 唱吧 下載版(歐) +SRGP01 = 新超級瑪利歐兄弟Wii2 Reggie ST8P75 = 自制 唱吧 下載版(歐) STAP75 = 自制 唱吧 下載版(歐) STCP75 = 自制 唱吧 下載版(歐) STDP75 = 自制 唱吧 下載版(歐) +STFE41 = 舞力全開 Focus STHP75 = 自制 唱吧 下載版(歐) STPP75 = 自制 唱吧 下載版(歐) STQP75 = 自制 唱吧 下載版(歐) STRP75 = 自制 唱吧 下載版(歐) STSP75 = 自制 唱吧 下載版(歐) +SU5E41 = 舞力全開 Lights +SV1E41 = 舞力全開 Unlimited Party1 +SV2E41 = 舞力全開 Unlimited Party2 +SV4E41 = 舞力全開 Infinity Party +ULTE41 = 舞力全開 Ultra XBKE52 = 自制 吉他英雄3 下載版(美) XNWE52 = 自制 吉它英雄3 Nightwish(美) ZXFP52 = 自製 吉他英雄3 Encore(歐) @@ -3438,6 +3523,7 @@ WTTE = 小雞快跑(美) WVCE = V.I.P 賭場:21點(美) WVIE = 天境奏琴(美) WVIP = 天境奏琴(美) +FBDT = 키드 이카루스 FCWP = 超級瑪莉歐兄弟3(歐) FD7P = 洛克人3(歐) FFRP = 沙納多(歐) @@ -3445,6 +3531,7 @@ JA4P = 超魔界村(歐) JA7P = 雷莎出擊(歐) JA8P = 街頭快打(歐) JACP = F-Zero(歐) +JAHQ = 알타입 III: 더 서드 라이트닝 JAMM = 宇宙巡航機3(歐) JAVP = 超級銀河戰士(歐) JBLP = 小精靈的攻擊(歐) @@ -3465,20 +3552,21 @@ C9SP = 不可能的任務 II(歐) HAAA = 照片頻道 HABA = 購物頻道(歐) HACA = Mii頻道(歐) -HACK = Mii頻道(歐) +HACK = Mii頻道(韓) HADE = 網絡頻道(美) HADP = 網絡頻道(歐) HAFE = 天氣頻道(美) HAFP = 天氣頻道(歐) +HAGA = 新聞頻道(美) HAGE = 新聞頻道(美) +HAGJ = 新聞頻道(美) HAGP = 新聞頻道(歐) HAPE = Check Mii Out頻道(美) HAPP = Check Mii Out頻道(歐) HAYA = 照片頻道 HCLE = Netflix系統安裝光碟(美) -JODI = 自制頻道(歐) -LULZ = 自制頻道(歐) -OHBC = 自制頻道(歐) +HCMP = 卡比電視頻道(歐) +RFPW = Wii Fit Plus頻道 9XGX = SNES9x超任模擬器(美) D64A = 任天堂N64模擬器(歐) DCRA = 都市打靶(歐) @@ -3508,6 +3596,9 @@ DWMA = Wad管理器 v1.5(美) DWRA = Wii電臺(美) DWXA = Wii資源管理器(歐) FCEU = FCE Ultra任天堂FC模擬器(歐) +JODI = 自制頻道(歐) +LULZ = 自制頻道(歐) +OHBC = 自制頻道(歐) VBGX = VBA模擬器(歐) GBHJC8 = 戰鬥封神 GEGJ8P = 光與蛋~比利哈恰的大冒險~ diff --git a/Externals/LZO/CMakeLists.txt b/Externals/LZO/CMakeLists.txt index 3bb91ee5c5c5..44b59bd49675 100644 --- a/Externals/LZO/CMakeLists.txt +++ b/Externals/LZO/CMakeLists.txt @@ -7,3 +7,4 @@ target_include_directories(lzo2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ) +add_library(LZO::LZO ALIAS lzo2) diff --git a/Externals/MoltenVK/CMakeLists.txt b/Externals/MoltenVK/CMakeLists.txt index 7e59505e9ce6..09ad4121123b 100644 --- a/Externals/MoltenVK/CMakeLists.txt +++ b/Externals/MoltenVK/CMakeLists.txt @@ -1,6 +1,6 @@ include(ExternalProject) -set(MOLTENVK_VERSION "v1.2.2") +set(MOLTENVK_VERSION "v1.2.3") ExternalProject_Add(MoltenVK GIT_REPOSITORY https://github.com/KhronosGroup/MoltenVK.git diff --git a/Externals/Qt b/Externals/Qt index 376baafde6cc..495517af2b92 160000 --- a/Externals/Qt +++ b/Externals/Qt @@ -1 +1 @@ -Subproject commit 376baafde6cce2f8892c34c17ed397afa6c46d08 +Subproject commit 495517af2b922c10c24f543e0fd6ea3ddf774e50 diff --git a/Externals/SDL/CMakeLists.txt b/Externals/SDL/CMakeLists.txt new file mode 100644 index 000000000000..15d3ffe4ce81 --- /dev/null +++ b/Externals/SDL/CMakeLists.txt @@ -0,0 +1,17 @@ +option(SDL2_DISABLE_SDL2MAIN "" ON) +option(SDL2_DISABLE_INSTALL "" ON) +option(SDL2_DISABLE_UNINSTALL "" ON) +set(SDL_SHARED OFF) +set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) +set(SDL_STATIC ON) +set(SDL_STATIC_ENABLED_BY_DEFAULT ON) +set(SDL_TEST OFF) +set(SDL_TEST_ENABLED_BY_DEFAULT OFF) +set(OPT_DEF_LIBC ON) +add_subdirectory(SDL) +if (TARGET SDL2) + dolphin_disable_warnings_msvc(SDL2) +endif() +if (TARGET SDL2-static) + dolphin_disable_warnings_msvc(SDL2-static) +endif() diff --git a/Externals/SDL/SDL b/Externals/SDL/SDL index f741adc86c8f..ac13ca9ab691 160000 --- a/Externals/SDL/SDL +++ b/Externals/SDL/SDL @@ -1 +1 @@ -Subproject commit f741adc86c8f5e7fc5c1863cf0d5e08b899d6209 +Subproject commit ac13ca9ab691e13e8eebe9684740ddcb0d716203 diff --git a/Externals/SFML/CMakeLists.txt b/Externals/SFML/CMakeLists.txt index aac2192cad13..1b7060ef95d7 100644 --- a/Externals/SFML/CMakeLists.txt +++ b/Externals/SFML/CMakeLists.txt @@ -1,5 +1,3 @@ -include_directories(BEFORE include src) - set(SRC_NETWORK src/SFML/Network/Http.cpp src/SFML/Network/IPAddress.cpp @@ -23,7 +21,11 @@ set(SRC_SYSTEM src/SFML/System/Time.cpp ) -add_library(sfml-network ${SRC_NETWORK}) -add_library(sfml-system ${SRC_SYSTEM}) +add_library(sfml-network STATIC ${SRC_NETWORK}) +add_library(sfml-system STATIC ${SRC_SYSTEM}) +target_compile_definitions(sfml-system PUBLIC SFML_STATIC) +target_include_directories(sfml-system PUBLIC include PRIVATE src) +target_include_directories(sfml-network PUBLIC include PRIVATE src) +target_link_libraries(sfml-network PUBLIC sfml-system) dolphin_disable_warnings_msvc(sfml-network) dolphin_disable_warnings_msvc(sfml-system) diff --git a/Externals/VulkanMemoryAllocator b/Externals/VulkanMemoryAllocator index c35169249051..498e20dfd134 160000 --- a/Externals/VulkanMemoryAllocator +++ b/Externals/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit c351692490513cdb0e5a2c925aaf7ea4a9b672f4 +Subproject commit 498e20dfd1343d99b9115201034bb0219801cdec diff --git a/Externals/WIL/CMakeLists.txt b/Externals/WIL/CMakeLists.txt index 27765fd1c981..5adbebbfe0e5 100644 --- a/Externals/WIL/CMakeLists.txt +++ b/Externals/WIL/CMakeLists.txt @@ -1,13 +1,21 @@ -cmake_minimum_required(VERSION 3.11) +cmake_minimum_required(VERSION 3.15) project(WIL) +include(GNUInstallDirs) + # Set by build server to speed up build/reduce file/object size option(FAST_BUILD "Sets options to speed up build/reduce obj/executable size" OFF) +option(WIL_BUILD_PACKAGING "Sets option to build the packaging, default on" ON) +option(WIL_BUILD_TESTS "Sets option to build the unit tests, default on" ON) if (NOT DEFINED WIL_BUILD_VERSION) set(WIL_BUILD_VERSION "0.0.0") endif() +if (NOT DEFINED CPPWINRT_VERSION) + set(CPPWINRT_VERSION "2.0.221121.5") +endif() + # Detect the Windows SDK version. If we're using the Visual Studio generator, this will be provided for us. Otherwise # we'll need to assume that this value comes from the command line (e.g. through the VS command prompt) if (DEFINED CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION) @@ -17,5 +25,39 @@ else() string(REGEX REPLACE "\\\\$" "" WIL_WINDOWS_SDK_VERSION "$ENV{WindowsSDKVersion}") endif() -add_subdirectory(packaging) -add_subdirectory(tests) +if (${WIL_BUILD_PACKAGING}) + add_subdirectory(packaging) +endif() + +if (${WIL_BUILD_TESTS}) + add_subdirectory(tests) +endif() + +# Gather headers into an interface library. +file(GLOB_RECURSE HEADER_FILES "${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME}/*.h") +add_library(${PROJECT_NAME} INTERFACE) +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) + +# The interface's include directory. +target_include_directories(${PROJECT_NAME} INTERFACE + $ + $ +) + +# Include the .natvis files +if (MSVC) + target_sources(${PROJECT_NAME} INTERFACE + "$") +endif() + +# Install Package Configuration +string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) +install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME_LOWER}_targets) +install(EXPORT ${PROJECT_NAME_LOWER}_targets + NAMESPACE ${PROJECT_NAME}:: + FILE ${PROJECT_NAME_LOWER}Config.cmake + DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" +) + +# Install the headers at a standard cmake location. +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/wil" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") diff --git a/Externals/WIL/README.md b/Externals/WIL/README.md index 8d4e538f8137..0d47bcf97b9f 100644 --- a/Externals/WIL/README.md +++ b/Externals/WIL/README.md @@ -12,7 +12,8 @@ Some things that WIL includes to whet your appetite: Smart pointers and auto-releasing resource wrappers to let you manage Windows API HANDLEs, HWNDs, and other resources and resource handles with [RAII](https://en.cppreference.com/w/cpp/language/raii) semantics. -- [`include/wil/win32_helpers.h`](include/wil/win32_helpers.h): Wrappers for API functions +- [`include/wil/win32_helpers.h`](include/wil/win32_helpers.h) + ([documentation](https://github.com/microsoft/wil/wiki/Win32-helpers)): Wrappers for API functions that save you the work of manually specifying buffer sizes, calling a function twice to get the needed buffer size and then allocate and pass the right-size buffer, casting or converting between types, and so on. @@ -24,6 +25,11 @@ Some things that WIL includes to whet your appetite: Preprocessor macros to help you check for errors from Windows API functions, in many of the myriad ways those errors are reported, and surface them as error codes or C++ exceptions in your code. +- [`include/wil/Tracelogging.h`](include/wil/Tracelogging.h): This file contains the convenience macros + that enable developers define and log telemetry. These macros use + [`TraceLogging API`](https://docs.microsoft.com/en-us/windows/win32/tracelogging/trace-logging-portal) + to log data. This data can be viewed in tools such as + [`Windows Performance Analyzer`](https://docs.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-analyzer). WIL can be used by C++ code that uses C++ exceptions as well as code that uses returned error codes to report errors. All of WIL can be used from user-space Windows code, @@ -50,7 +56,7 @@ Note that even though WIL is a header-only library, you still need to install th # Building/Testing To get started testing WIL, first make sure that you have a recent version of [Visual Studio](https://visualstudio.microsoft.com/downloads/) and the most recent [Windows SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk) installed. If you are doing any non-trivial work, also be sure to have a recent version of [Clang](http://releases.llvm.org/download.html) installed. Once everything is installed, open a VS -native command window (e.g. "x64 Native Tools Command Prompt for VS 2019"). If you are familiar with CMake you can get started building normally. Otherwise, or if you prefer to skip all of the boilerplate, you can use one of the scripts in the [scripts](scripts) directory: +native command window (e.g. "x64 Native Tools Command Prompt for VS 2022"). If you are familiar with CMake you can get started building normally. Otherwise, or if you prefer to skip all of the boilerplate, you can use one of the scripts in the [scripts](scripts) directory: ```cmd C:\wil> scripts\init.cmd -c clang -g ninja -b debug ``` @@ -76,7 +82,7 @@ C:\wil> scripts\build_all.cmd C:\wil> scripts\runtests.cmd ``` Note that this will only test for the architecture that corresponds to the command window you opened. You will want to -repeat this process for the other architecture (e.g. by using the "x86 Native Tools Command Prompt for VS 2019") +repeat this process for the other architecture (e.g. by using the "x86 Native Tools Command Prompt for VS 2022") # Contributing diff --git a/Externals/WIL/cmake/common_build_flags.cmake b/Externals/WIL/cmake/common_build_flags.cmake index c9f953fc5a79..0e6839bf84c2 100644 --- a/Externals/WIL/cmake/common_build_flags.cmake +++ b/Externals/WIL/cmake/common_build_flags.cmake @@ -1,5 +1,6 @@ -# E.g. replace_cxx_flag("/W[0-4]", "/W4") +# This is unfortunately still needed to disable exceptions/RTTI since modern CMake still has no builtin support... +# E.g. replace_cxx_flag("/EHsc", "/EHs-c-") macro(replace_cxx_flag pattern text) foreach (flag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE @@ -10,60 +11,61 @@ macro(replace_cxx_flag pattern text) endforeach() endmacro() -macro(append_cxx_flag text) - foreach (flag - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - - string(APPEND ${flag} " ${text}") - - endforeach() -endmacro() - # Fixup default compiler settings - -# Be as strict as reasonably possible, since we want to support consumers using strict warning levels -replace_cxx_flag("/W[0-4]" "/W4") -append_cxx_flag("/WX") - -# We want to be as conformant as possible, so tell MSVC to not be permissive (note that this has no effect on clang-cl) -append_cxx_flag("/permissive-") - -# wistd::function has padding due to alignment. This is expected -append_cxx_flag("/wd4324") - -if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - # Ignore a few Clang warnings. We may want to revisit in the future to see if any of these can/should be removed - append_cxx_flag("-Wno-switch") - append_cxx_flag("-Wno-c++17-compat-mangling") - append_cxx_flag("-Wno-missing-field-initializers") - - # For tests, we want to be able to test self assignment, so disable this warning - append_cxx_flag("-Wno-self-assign-overloaded") - append_cxx_flag("-Wno-self-move") - - # clang-cl does not understand the /permissive- flag (or at least it opts to ignore it). We can achieve similar - # results through the following flags. - append_cxx_flag("-fno-delayed-template-parsing") - - # NOTE: Windows headers not clean enough for us to realistically attempt to start fixing these errors yet. That - # said, errors that originate from WIL headers may benefit - # append_cxx_flag("-fno-ms-compatibility") - # append_cxx_flag("-ferror-limit=999") - # append_cxx_flag("-fmacro-backtrace-limit=0") - # -fno-ms-compatibility turns off preprocessor compatability, which currently only works when __VA_OPT__ support is - # available (i.e. >= C++20) - # append_cxx_flag("-Xclang -std=c++2a") +add_compile_options( + # Be as strict as reasonably possible, since we want to support consumers using strict warning levels + /W4 /WX + ) + +if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options( + # Ignore some pedantic warnings enabled by '-Wextra' + -Wno-missing-field-initializers + + # Ignore some pedantic warnings enabled by '-Wpedantic' + -Wno-language-extension-token + -Wno-c++17-attribute-extensions + -Wno-gnu-zero-variadic-macro-arguments + -Wno-extra-semi + + # For tests, we want to be able to test self assignment, so disable this warning + -Wno-self-assign-overloaded + -Wno-self-move + + # clang needs this to enable _InterlockedCompareExchange128 + -mcx16 + + # We don't want legacy MSVC conformance + -fno-delayed-template-parsing + + # NOTE: Windows headers not clean enough for us to realistically attempt to start fixing these errors yet. That + # said, errors that originate from WIL headers may benefit + # -fno-ms-compatibility + # -ferror-limit=999 + # -fmacro-backtrace-limit=0 + + # -fno-ms-compatibility turns off preprocessor compatability, which currently only works when __VA_OPT__ support + # is available (i.e. >= C++20) + # -Xclang -std=c++2a + ) else() - # Flags that are either ignored or unrecognized by clang-cl - # TODO: https://github.com/Microsoft/wil/issues/6 - # append_cxx_flag("/experimental:preprocessor") + add_compile_options( + # We want to be as conformant as possible, so tell MSVC to not be permissive (note that this has no effect on clang-cl) + /permissive- + + # wistd::function has padding due to alignment. This is expected + /wd4324 + + # TODO: https://github.com/Microsoft/wil/issues/6 + # /experimental:preprocessor - # CRT headers are not yet /experimental:preprocessor clean, so work around the known issues - # append_cxx_flag("/Wv:18") + # CRT headers are not yet /experimental:preprocessor clean, so work around the known issues + # /Wv:18 - append_cxx_flag("/bigobj") + # Some tests have a LOT of template instantiations + /bigobj - # NOTE: Temporary workaround while https://github.com/microsoft/wil/issues/102 is being investigated - append_cxx_flag("/d2FH4-") + # NOTE: Temporary workaround while https://github.com/microsoft/wil/issues/102 is being investigated + /d2FH4- + ) endif() diff --git a/Externals/WIL/include/wil/Tracelogging.h b/Externals/WIL/include/wil/Tracelogging.h new file mode 100644 index 000000000000..2dbfef82c620 --- /dev/null +++ b/Externals/WIL/include/wil/Tracelogging.h @@ -0,0 +1,3359 @@ +#pragma once +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* + +#ifndef __WIL_TRACELOGGING_H_INCLUDED +#define __WIL_TRACELOGGING_H_INCLUDED + +#ifdef _KERNEL_MODE +#error This header is not supported in kernel-mode. +#endif + +// Note that we avoid pulling in STL's memory header from TraceLogging.h through Resource.h as we have +// TraceLogging customers who are still on older versions of STL (without std::shared_ptr<>). +#define RESOURCE_SUPPRESS_STL +#ifndef __WIL_RESULT_INCLUDED +#include +#endif +#undef RESOURCE_SUPPRESS_STL +#include +#include +#include +#ifndef __WIL_TRACELOGGING_CONFIG_H +#include +#endif +#ifndef TRACELOGGING_SUPPRESS_NEW +#include +#endif +#include + +#pragma warning(push) +#pragma warning(disable: 26135) // Missing locking annotation, Caller failing to hold lock + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmicrosoft-template-shadow" +#endif + +#ifndef __TRACELOGGING_TEST_HOOK_ERROR +#define __TRACELOGGING_TEST_HOOK_ERROR(failure) +#define __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure) +#define __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, hr) +#define __TRACELOGGING_TEST_HOOK_ACTIVITY_START() +#define __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, hr) +#define __TRACELOGGING_TEST_HOOK_SET_ENABLED false +#define __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters) +#define __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS 5000 +#endif + +// For use only within wil\TraceLogging.h: +#define _wiltlg_STRINGIZE(x) _wiltlg_STRINGIZE_imp(x) +#define _wiltlg_STRINGIZE_imp(x) #x +#define _wiltlg_LSTRINGIZE(x) _wiltlg_LSTRINGIZE_imp1(x) +#define _wiltlg_LSTRINGIZE_imp1(x) _wiltlg_LSTRINGIZE_imp2(#x) +#define _wiltlg_LSTRINGIZE_imp2(s) L##s + +/* +Macro __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2): +This macro defines a storage link association between two names for use by the +TlgReflector static analysis tool. +*/ +#define __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(name1, name2) \ + __annotation(L"_TlgProviderLink:|" _wiltlg_LSTRINGIZE(__LINE__) L"|Key|" _wiltlg_LSTRINGIZE(name1) L"=" _wiltlg_LSTRINGIZE(name2)) + +// Utility macro for writing relevant fields from a wil::FailureInfo structure into a TraceLoggingWrite +// statement. Most fields are relevant for telemetry or for simple ETW, but there are a few additional +// fields reported via ETW. + +#define __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) \ + TraceLoggingUInt32((failure).hr, "hresult", "Failure error code"), \ + TraceLoggingString((failure).pszFile, "fileName", "Source code file name where the error occurred"), \ + TraceLoggingUInt32((failure).uLineNumber, "lineNumber", "Line number within the source code file where the error occurred"), \ + TraceLoggingString((failure).pszModule, "module", "Name of the binary where the error occurred"), \ + TraceLoggingUInt32(static_cast((failure).type), "failureType", "Indicates what type of failure was observed (exception, returned error, logged error or fail fast"), \ + TraceLoggingWideString((failure).pszMessage, "message", "Custom message associated with the failure (if any)"), \ + TraceLoggingUInt32((failure).threadId, "threadId", "Identifier of the thread the error occurred on"), \ + TraceLoggingString((failure).pszCallContext, "callContext", "List of telemetry activities containing this error"), \ + TraceLoggingUInt32((failure).callContextOriginating.contextId, "originatingContextId", "Identifier for the oldest telemetry activity containing this error"), \ + TraceLoggingString((failure).callContextOriginating.contextName, "originatingContextName", "Name of the oldest telemetry activity containing this error"), \ + TraceLoggingWideString((failure).callContextOriginating.contextMessage, "originatingContextMessage", "Custom message associated with the oldest telemetry activity containing this error (if any)"), \ + TraceLoggingUInt32((failure).callContextCurrent.contextId, "currentContextId", "Identifier for the newest telemetry activity containing this error"), \ + TraceLoggingString((failure).callContextCurrent.contextName, "currentContextName", "Name of the newest telemetry activity containing this error"), \ + TraceLoggingWideString((failure).callContextCurrent.contextMessage, "currentContextMessage", "Custom message associated with the newest telemetry activity containing this error (if any)") + +#define __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) \ + __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure), \ + TraceLoggingUInt32(static_cast((failure).failureId), "failureId", "Identifier assigned to this failure"), \ + TraceLoggingUInt32(static_cast((failure).cFailureCount), "failureCount", "Number of failures seen within the binary where the error occurred"), \ + TraceLoggingString((failure).pszFunction, "function", "Name of the function where the error occurred") + +// Activity Start Event (ALL) +#define __ACTIVITY_START_PARAMS() \ + TraceLoggingStruct(1, "wilActivity"), \ + TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on") + +// Activity Stop Event (SUCCESSFUL or those WITHOUT full failure info -- just hr) +// Also utilized for intermediate stop events (a successful call to 'Stop()' from a Split activity +#define __ACTIVITY_STOP_PARAMS(hr) \ + TraceLoggingStruct(2, "wilActivity"), \ + TraceLoggingUInt32(hr, "hresult", "Failure error code"), \ + TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on") + +// Activity Stop Event (FAILED with full failure info) +#define __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(14, "wilActivity"), \ + __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) +#define __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(17, "wilActivity"), \ + __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) + +// "ActivityError" tagged event (all distinct FAILURES occurring within the outer activity scope) +#define __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(14, "wilActivity"), \ + __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) +#define __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(17, "wilActivity"), \ + __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) + +// "ActivityFailure" tagged event (only comes through on TELEMETRY for CallContext activities that have FAILED) +#define __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(14, "wilActivity"), \ + __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) +#define __ACTIVITY_FAILURE_TELEMETRY_PARAMS(hr, contextName, contextMessage) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(4, "wilActivity"), \ + TraceLoggingUInt32(hr, "hresult", "Failure error code"), \ + TraceLoggingUInt32(::GetCurrentThreadId(), "threadId", "Identifier of the thread the activity was run on"), \ + TraceLoggingString(contextName, "currentContextName", "Name of the activity containing this error"), \ + TraceLoggingWideString(contextMessage, "currentContextMessage", "Custom message for the activity containing this error (if any)") + +// "FallbackError" events (all FAILURE events happening outside of ANY activity context) +#define __RESULT_TELEMETRY_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(14, "wilResult"), \ + __RESULT_TELEMETRY_COMMON_FAILURE_PARAMS(failure) +#define __RESULT_TRACELOGGING_FAILURE_PARAMS(failure) \ + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), \ + TraceLoggingStruct(17, "wilResult"), \ + __RESULT_TRACELOGGING_COMMON_FAILURE_PARAMS(failure) + +namespace wil +{ + enum class ActivityOptions + { + None = 0, + TelemetryOnFailure = 0x1, + TraceLoggingOnFailure = 0x2 + }; + DEFINE_ENUM_FLAG_OPERATORS(ActivityOptions) + + template + class ActivityBase; + + /// @cond + namespace details + { + // Lazy static initialization helper for holding a singleton telemetry class to maintain + // the provider handle. + + template + class static_lazy + { + public: + void __cdecl cleanup() WI_NOEXCEPT + { + if (wil::init_once_initialized(m_initOnce)) + { + reinterpret_cast(m_storage)->~T(); + } + } + + T* get(void(__cdecl *cleanupFunc)(void)) WI_NOEXCEPT + { + wil::init_once_failfast(m_initOnce, [=]() -> HRESULT + { + ::new (m_storage) T(); + atexit(cleanupFunc); + reinterpret_cast(m_storage)->Create(); + return S_OK; + }); + + return reinterpret_cast(m_storage); + } + + private: + INIT_ONCE m_initOnce = INIT_ONCE_STATIC_INIT; + alignas(T) BYTE m_storage[sizeof(T)]; + }; + + // This class serves as a simple RAII wrapper around CallContextInfo. It presumes that + // the contextName parameter is always a static string, but copies or allocates the + // contextMessage as needed. + + class StoredCallContextInfo : public wil::CallContextInfo + { + public: + StoredCallContextInfo() + { + ::ZeroMemory(this, sizeof(*this)); + } + + StoredCallContextInfo(StoredCallContextInfo &&other) : + StoredCallContextInfo() + { + operator=(wistd::move(other)); + } + + StoredCallContextInfo& operator=(StoredCallContextInfo &&other) + { + contextId = other.contextId; + contextName = other.contextName; + ClearMessage(); + contextMessage = other.contextMessage; + other.contextMessage = nullptr; + m_ownsMessage = other.m_ownsMessage; + other.m_ownsMessage = false; + return *this; + } + + StoredCallContextInfo(StoredCallContextInfo const &other) : + m_ownsMessage(false) + { + contextId = other.contextId; + contextName = other.contextName; + if (other.m_ownsMessage) + { + AssignMessage(other.contextMessage); + } + else + { + contextMessage = other.contextMessage; + } + } + + StoredCallContextInfo(_In_opt_ PCSTR staticContextName) : + m_ownsMessage(false) + { + contextId = 0; + contextName = staticContextName; + contextMessage = nullptr; + } + + StoredCallContextInfo(PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) : + StoredCallContextInfo(staticContextName) + { + SetMessage(formatString, argList); + } + + void SetMessage(_Printf_format_string_ PCSTR formatString, va_list argList) + { + wchar_t loggingMessage[2048]; + PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList); + ClearMessage(); + AssignMessage(loggingMessage); + } + + void SetMessage(_In_opt_ PCWSTR message) + { + ClearMessage(); + contextMessage = message; + } + + void SetMessageCopy(_In_opt_ PCWSTR message) + { + ClearMessage(); + if (message != nullptr) + { + AssignMessage(message); + } + } + + void ClearMessage() + { + if (m_ownsMessage) + { + WIL_FreeMemory(const_cast(contextMessage)); + m_ownsMessage = false; + } + contextMessage = nullptr; + } + + ~StoredCallContextInfo() + { + ClearMessage(); + } + + StoredCallContextInfo& operator=(StoredCallContextInfo const &) = delete; + + private: + void AssignMessage(PCWSTR message) + { + auto length = wcslen(message); + if (length > 0) + { + auto sizeBytes = (length + 1) * sizeof(wchar_t); + contextMessage = static_cast(WIL_AllocateMemory(sizeBytes)); + if (contextMessage != nullptr) + { + m_ownsMessage = true; + memcpy_s(const_cast(contextMessage), sizeBytes, message, sizeBytes); + } + } + } + + bool m_ownsMessage; + }; + + template + void SetRelatedActivityId(TActivity&) + { + } + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) + template + void SetRelatedActivityId(wil::ActivityBase& activity) + { + GUID capturedRelatedId; + EventActivityIdControl(EVENT_ACTIVITY_CTRL_GET_ID, &capturedRelatedId); + activity.SetRelatedActivityId(capturedRelatedId); + } +#endif + + typedef wistd::integral_constant tag_start; + typedef wistd::integral_constant tag_start_cv; + } // namespace details + /// @endcond + + + // This class acts as a simple RAII class returned by a call to ContinueOnCurrentThread() for an activity + // or by a call to WatchCurrentThread() on a provider. The result is meant to be a stack local variable + // whose scope controls the lifetime of an error watcher on the given thread. That error watcher re-directs + // errors occurrent within the object's lifetime to the associated provider or activity. + + class ActivityThreadWatcher + { + public: + ActivityThreadWatcher() WI_NOEXCEPT + : m_callbackHolder(nullptr, nullptr, false) + {} + + ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, PCSTR staticContextName) WI_NOEXCEPT : + m_callContext(staticContextName), + m_callbackHolder(pCallback, &m_callContext) + { + } + + ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT : + ActivityThreadWatcher(pCallback, staticContextName) + { + m_callContext.SetMessage(formatString, argList); + } + + // Uses the supplied StoredCallContextInfo rather than producing one itself + ActivityThreadWatcher(_In_ details::IFailureCallback *pCallback, _In_ details::StoredCallContextInfo const &callContext) WI_NOEXCEPT : + m_callContext(callContext), + m_callbackHolder(pCallback, &m_callContext) + { + } + + ActivityThreadWatcher(ActivityThreadWatcher &&other) WI_NOEXCEPT : + m_callContext(wistd::move(other.m_callContext)), + m_callbackHolder(wistd::move(other.m_callbackHolder)) + { + m_callbackHolder.SetCallContext(&m_callContext); + } + + ActivityThreadWatcher(ActivityThreadWatcher const &) = delete; + ActivityThreadWatcher& operator=(ActivityThreadWatcher const &) = delete; + + void SetMessage(_Printf_format_string_ PCSTR formatString, ...) + { + va_list argList; + va_start(argList, formatString); + m_callContext.SetMessage(formatString, argList); + va_end(argList); + } + + void SetMessage(_In_opt_ PCWSTR message) + { + m_callContext.SetMessage(message); + } + + void SetMessageCopy(_In_opt_ PCWSTR message) + { + m_callContext.SetMessageCopy(message); + } + + private: + details::StoredCallContextInfo m_callContext; + details::ThreadFailureCallbackHolder m_callbackHolder; + }; + + + // This is the base-class implementation of a TraceLogging class. TraceLogging classes are defined with + // BEGIN_TRACELOGGING_CLASS and automatically derive from this class + + enum class ErrorReportingType + { + None = 0, + Telemetry, + TraceLogging + }; + + class TraceLoggingProvider : public details::IFailureCallback + { + public: + // Only one instance of each of these derived classes should be created + TraceLoggingProvider(_In_ TraceLoggingProvider const&) = delete; + TraceLoggingProvider& operator=(TraceLoggingProvider const&) = delete; + void* operator new(size_t) = delete; + void* operator new[](size_t) = delete; + + protected: + + // This can be overridden to provide specific initialization code for any individual provider. + // It will be ran once when the single static singleton instance of this class is created. + virtual void Initialize() WI_NOEXCEPT {} + + // This method can be overridden by a provider to more tightly control what happens in the event + // of a failure in a CallContext activity, WatchCurrentThread() object, or attributed to a specific failure. + virtual void OnErrorReported(bool alreadyReported, FailureInfo const &failure) WI_NOEXCEPT + { + if (!alreadyReported && WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry)) + { + if (m_errorReportingType == ErrorReportingType::Telemetry) + { + ReportTelemetryFailure(failure); + } + else if (m_errorReportingType == ErrorReportingType::TraceLogging) + { + ReportTraceLoggingFailure(failure); + } + } + } + + public: + TraceLoggingHProvider Provider_() const WI_NOEXCEPT + { + return m_providerHandle; + } + + protected: + TraceLoggingProvider() WI_NOEXCEPT {} + + virtual ~TraceLoggingProvider() WI_NOEXCEPT + { + if (m_ownsProviderHandle) + { + TraceLoggingUnregister(m_providerHandle); + } + } + + bool IsEnabled_(UCHAR eventLevel /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */, ULONGLONG eventKeywords /* MICROSOFT_KEYWORD_XXX */) const WI_NOEXCEPT + { + return ((m_providerHandle != nullptr) && TraceLoggingProviderEnabled(m_providerHandle, eventLevel, eventKeywords)) || __TRACELOGGING_TEST_HOOK_SET_ENABLED; + } + + void SetErrorReportingType_(ErrorReportingType type) + { + m_errorReportingType = type; + } + + static bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT + { + static long volatile s_lastFailureSeen = -1; + auto wasSeen = (s_lastFailureSeen == failureId); + s_lastFailureSeen = failureId; + return wasSeen; + } + + void ReportTelemetryFailure(FailureInfo const &failure) WI_NOEXCEPT + { + __TRACELOGGING_TEST_HOOK_ERROR(failure); + TraceLoggingWrite(m_providerHandle, "FallbackError", TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __RESULT_TELEMETRY_FAILURE_PARAMS(failure)); + } + + void ReportTraceLoggingFailure(FailureInfo const &failure) WI_NOEXCEPT + { + TraceLoggingWrite(m_providerHandle, "FallbackError", TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __RESULT_TRACELOGGING_FAILURE_PARAMS(failure)); + } + + // Helper function for TraceLoggingError. + // It prints out a trace message for debug purposes. The message does not go into the telemetry. + void ReportTraceLoggingError(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT + { + if (IsEnabled_(WINEVENT_LEVEL_ERROR, 0)) + { + wchar_t loggingMessage[2048]; + details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList); + TraceLoggingWrite(m_providerHandle, "TraceLoggingError", TraceLoggingLevel(WINEVENT_LEVEL_ERROR), TraceLoggingWideString(loggingMessage, "traceLoggingMessage")); + } + } + + // Helper function for TraceLoggingInfo. + // It prints out a trace message for debug purposes. The message does not go into the telemetry. + void ReportTraceLoggingMessage(_In_ _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT + { + if (IsEnabled_(WINEVENT_LEVEL_VERBOSE, 0)) + { + wchar_t loggingMessage[2048]; + details::PrintLoggingMessage(loggingMessage, ARRAYSIZE(loggingMessage), formatString, argList); + TraceLoggingWrite(m_providerHandle, "TraceLoggingInfo", TraceLoggingLevel(WINEVENT_LEVEL_VERBOSE), TraceLoggingWideString(loggingMessage, "traceLoggingMessage")); + } + } + + void Register(TraceLoggingHProvider const providerHandle, TLG_PENABLECALLBACK callback = nullptr) WI_NOEXCEPT + { + // taking over the lifetime and management of providerHandle + m_providerHandle = providerHandle; + m_ownsProviderHandle = true; + TraceLoggingRegisterEx(providerHandle, callback, nullptr); + InternalInitialize(); + } + + void AttachProvider(TraceLoggingHProvider const providerHandle) WI_NOEXCEPT + { + m_providerHandle = providerHandle; + m_ownsProviderHandle = false; + InternalInitialize(); + } + + private: + // IFailureCallback + bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override + { + if (!WasAlreadyReportedToTelemetry(failure.failureId)) + { + OnErrorReported(false, failure); + } + return true; + } + + void InternalInitialize() + { + m_errorReportingType = ErrorReportingType::Telemetry; + Initialize(); + } + + TraceLoggingHProvider m_providerHandle; + bool m_ownsProviderHandle; + ErrorReportingType m_errorReportingType; + }; + + template< + typename TraceLoggingType, + UINT64 keyword = 0, + UINT8 level = WINEVENT_LEVEL_VERBOSE, + typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type + class BasicActivity + : public _TlgActivityBase, keyword, level> + { + using BaseTy = _TlgActivityBase, keyword, level>; + friend BaseTy; + + void OnStarted() + { + } + + void OnStopped() + { + } + + public: + + BasicActivity() + { + } + + BasicActivity(BasicActivity&& rhs) : + BaseTy(wistd::move(rhs)) + { + } + + BasicActivity& operator=(BasicActivity&& rhs) + { + BaseTy::operator=(wistd::move(rhs)); + return *this; + } + + /* + Returns a handle to the TraceLogging provider associated with this activity. + */ + TraceLoggingHProvider Provider() const + { + return TraceLoggingType::Provider(); + } + + /* + Sets the related (parent) activity. + May only be called once. If used, must be called before starting the activity. + */ + template + void SetRelatedActivity(_In_ const ActivityTy& relatedActivity) + { + this->SetRelatedId(*relatedActivity.Id()); + } + + /* + Sets the related (parent) activity. + May only be called once. If used, must be called before starting the activity. + */ + void SetRelatedActivityId(_In_ const GUID& relatedActivityId) + { + this->SetRelatedId(relatedActivityId); + } + + /* + Sets the related (parent) activity. + May only be called once. If used, must be called before starting the activity. + */ + void SetRelatedActivityId(_In_ const GUID* relatedActivityId) + { + __FAIL_FAST_IMMEDIATE_ASSERT__(relatedActivityId != NULL); + this->SetRelatedId(*relatedActivityId); + } + }; + + template< + typename TraceLoggingType, + UINT64 keyword = 0, + UINT8 level = WINEVENT_LEVEL_VERBOSE, + typename TlgReflectorTag = _TlgReflectorTag_Param0IsProviderType> // helps TlgReflector understand that this is a wrapper type + class BasicThreadActivity + : public _TlgActivityBase, keyword, level> + { + using BaseTy = _TlgActivityBase, keyword, level>; + friend BaseTy; + + void OnStarted() + { + this->PushThreadActivityId(); + } + + void OnStopped() + { + this->PopThreadActivityId(); + } + + public: + + BasicThreadActivity() + { + } + + BasicThreadActivity(BasicThreadActivity&& rhs) + : BaseTy(wistd::move(rhs)) + { + } + + BasicThreadActivity& operator=(BasicThreadActivity&& rhs) + { + BaseTy::operator=(wistd::move(rhs)); + return *this; + } + + /* + Returns a handle to the TraceLogging provider associated with this activity. + */ + TraceLoggingHProvider Provider() const + { + return TraceLoggingType::Provider(); + } + }; + +#define __WI_TraceLoggingWriteTagged(activity, name, ...) \ + __pragma(warning(push)) __pragma(warning(disable:4127)) \ + do { \ + _tlgActivityDecl(activity) \ + TraceLoggingWriteActivity( \ + TraceLoggingType::Provider(), \ + (name), \ + _tlgActivityRef(activity).Id(), \ + NULL, \ + __VA_ARGS__); \ + } while(0) \ + __pragma(warning(pop)) \ + + + // This is the ultimate base class implementation for all activities. Activity classes are defined with + // DEFINE_TRACELOGGING_ACTIVITY, DEFINE_CALLCONTEXT_ACTIVITY, DEFINE_TELEMETRY_ACTIVITY and others + + + template + class ActivityBase : public details::IFailureCallback + { + public: + typedef ActivityTraceLoggingType TraceLoggingType; + + static UINT64 const Keyword = keyword; + static UINT8 const Level = level; + static UINT64 const PrivacyTag = privacyTag; + + ActivityBase(PCSTR contextName, bool shouldWatchErrors = false) WI_NOEXCEPT : + m_activityData(contextName), + m_pActivityData(&m_activityData), + m_callbackHolder(this, m_activityData.GetCallContext(), shouldWatchErrors) + { + } + + ActivityBase(ActivityBase &&other, bool shouldWatchErrors) WI_NOEXCEPT : + m_activityData(wistd::move(other.m_activityData)), + m_sharedActivityData(wistd::move(other.m_sharedActivityData)), + m_callbackHolder(this, nullptr, shouldWatchErrors) + { + m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData; + m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext()); + other.m_pActivityData = &other.m_activityData; + if (other.m_callbackHolder.IsWatching()) + { + other.m_callbackHolder.StopWatching(); + } + } + + ActivityBase(ActivityBase &&other) WI_NOEXCEPT : + ActivityBase(wistd::move(other), other.m_callbackHolder.IsWatching()) + { + } + + ActivityBase(ActivityBase const &other) WI_NOEXCEPT : + m_activityData(), + m_pActivityData(&m_activityData), + m_callbackHolder(this, nullptr, false) // false = do not automatically watch for failures + { + operator=(other); + } + + ActivityBase& operator=(ActivityBase &&other) WI_NOEXCEPT + { + m_activityData = wistd::move(other.m_activityData); + m_sharedActivityData = wistd::move(other.m_sharedActivityData); + m_pActivityData = m_sharedActivityData ? m_sharedActivityData.get() : &m_activityData; + m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext()); + m_callbackHolder.SetWatching(other.m_callbackHolder.IsWatching()); + other.m_pActivityData = &other.m_activityData; + if (other.m_callbackHolder.IsWatching()) + { + other.m_callbackHolder.StopWatching(); + } + return *this; + } + + ActivityBase& operator=(ActivityBase const &other) WI_NOEXCEPT + { + if (m_callbackHolder.IsWatching()) + { + m_callbackHolder.StopWatching(); + } + + if (other.m_sharedActivityData) + { + m_pActivityData = other.m_pActivityData; + m_sharedActivityData = other.m_sharedActivityData; + } + else if (m_sharedActivityData.create(wistd::move(other.m_activityData))) + { + // Locking should not be required as the first copy should always take place on the owning + // thread... + m_pActivityData = m_sharedActivityData.get(); + other.m_sharedActivityData = m_sharedActivityData; + other.m_pActivityData = m_pActivityData; + other.m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext()); + } + m_callbackHolder.SetCallContext(m_pActivityData->GetCallContext()); + return *this; + } + + // These calls all result in setting a message to associate with any failures that might occur while + // running the activity. For example, you could associate a filename with a call context activity + // so that the file name is only reported if the activity fails with the failure. + + void SetMessage(_In_ _Printf_format_string_ PCSTR formatString, ...) + { + va_list argList; + va_start(argList, formatString); + auto lock = LockExclusive(); + GetCallContext()->SetMessage(formatString, argList); + va_end(argList); + } + + void SetMessage(_In_opt_ PCWSTR message) + { + auto lock = LockExclusive(); + GetCallContext()->SetMessage(message); + } + + void SetMessageCopy(_In_opt_ PCWSTR message) + { + auto lock = LockExclusive(); + GetCallContext()->SetMessageCopy(message); + } + + // This call stops watching for errors on the thread that the activity was originally + // created on. Use it when moving the activity into a thread-agnostic class or moving + // an activity across threads. + + void IgnoreCurrentThread() WI_NOEXCEPT + { + if (m_callbackHolder.IsWatching()) + { + m_callbackHolder.StopWatching(); + } + } + + // Call this API to retrieve an RAII object to watch events on the current thread. The returned + // object should only be used on the stack. + + WI_NODISCARD ActivityThreadWatcher ContinueOnCurrentThread() WI_NOEXCEPT + { + if (IsRunning()) + { + return ActivityThreadWatcher(this, *m_pActivityData->GetCallContext()); + } + return ActivityThreadWatcher(); + } + + // This is the 'default' Stop routine that accepts an HRESULT and completes the activity... + + void Stop(HRESULT hr = S_OK) WI_NOEXCEPT + { + bool stopActivity; + HRESULT hrLocal; + { + auto lock = LockExclusive(); + stopActivity = m_pActivityData->SetStopResult(hr, &hrLocal); + } + if (stopActivity) + { + ReportStopActivity(hrLocal); + } + else + { + __WI_TraceLoggingWriteTagged(*this, "ActivityIntermediateStop", TraceLoggingKeyword(Keyword), TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), __ACTIVITY_STOP_PARAMS(hr)); + } + IgnoreCurrentThread(); + } + + // IFailureCallback + + bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override + { + // We always report errors to the ETW stream, but we hold-back the telemetry keyword if we've already reported this error to this + // particular telemetry provider. + + __TRACELOGGING_TEST_HOOK_ACTIVITY_ERROR(failure); + + if (WI_IsFlagClear(failure.flags, FailureFlags::RequestSuppressTelemetry)) + { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-value" +#endif +#pragma warning(push) +#pragma warning(disable: 6319) + if (false, WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure) && !WasAlreadyReportedToTelemetry(failure.failureId)) + { + __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TELEMETRY_FAILURE_PARAMS(failure)); + } + else if (false, WI_IsFlagSet(options, ActivityOptions::TraceLoggingOnFailure)) + { + __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(0), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure)); + } + else + { + __WI_TraceLoggingWriteTagged(*this, "ActivityError", TraceLoggingKeyword(Keyword), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_ERROR_TRACELOGGING_FAILURE_PARAMS(failure)); + } +#pragma warning(pop) +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + } + + auto lock = LockExclusive(); + m_pActivityData->NotifyFailure(failure); + return true; + } + + // This is the base TraceLoggingActivity<> contract... we implement it so that this class + // can be used by all of the activity macros and we re-route the request as needed. + // + // The contract required by the TraceLogging Activity macros is: + // - activity.Keyword // compile-time constant + // - activity.Level // compile-time constant + // - activity.PrivacyTag // compile-time constant + // - activity.Provider() + // - activity.Id() + // - activity.zInternalRelatedId() + // - activity.zInternalStart() + // - activity.zInternalStop() + // In addition, for TlgReflector to work correctly, it must be possible for + // TlgReflector to statically map from typeof(activity) to hProvider. + + GUID const* zInternalRelatedId() const WI_NOEXCEPT + { + return m_pActivityData->zInternalRelatedId(); + } + + void zInternalStart() WI_NOEXCEPT + { + auto lock = LockExclusive(); m_pActivityData->zInternalStart(); + } + + void zInternalStop() WI_NOEXCEPT + { + auto lock = LockExclusive(); m_pActivityData->zInternalStop(); + } + + static TraceLoggingHProvider Provider() WI_NOEXCEPT + { + return ActivityTraceLoggingType::Provider(); + } + + GUID const* Id() const WI_NOEXCEPT + { + return m_pActivityData->Id(); + } + + GUID const* providerGuid() const WI_NOEXCEPT + { + return m_pActivityData->providerGuid(); + } + + template + void SetRelatedActivity(OtherTy const &relatedActivity) WI_NOEXCEPT + { + auto lock = LockExclusive(); + m_pActivityData->SetRelatedActivityId(relatedActivity.Id()); + } + + void SetRelatedActivityId(_In_ const GUID& relatedActivityId) WI_NOEXCEPT + { + auto lock = LockExclusive(); + m_pActivityData->SetRelatedActivityId(&relatedActivityId); + } + + void SetRelatedActivityId(_In_ const GUID* relatedActivityId) WI_NOEXCEPT + { + auto lock = LockExclusive(); + m_pActivityData->SetRelatedActivityId(relatedActivityId); + } + + inline bool IsRunning() const WI_NOEXCEPT + { + return m_pActivityData->NeedsStopped(); + } + protected: + virtual void StopActivity() WI_NOEXCEPT = 0; + virtual bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT = 0; + + void EnsureWatchingCurrentThread() + { + if (!m_callbackHolder.IsWatching()) + { + m_callbackHolder.StartWatching(); + } + } + + void SetStopResult(HRESULT hr, _Out_opt_ HRESULT *phr = nullptr) WI_NOEXCEPT + { + auto lock = LockExclusive(); + m_pActivityData->SetStopResult(hr, phr); + } + + void IncrementExpectedStopCount() WI_NOEXCEPT + { + auto lock = LockExclusive(); + m_pActivityData->IncrementExpectedStopCount(); + } + + // Locking should not be required on these accessors as we only use this at reporting (which will only happen from + // the final stop) + + FailureInfo const * GetFailureInfo() WI_NOEXCEPT + { + return m_pActivityData->GetFailureInfo(); + } + + inline HRESULT GetResult() const WI_NOEXCEPT + { + return m_pActivityData->GetResult(); + } + + details::StoredCallContextInfo *GetCallContext() const WI_NOEXCEPT + { + return m_pActivityData->GetCallContext(); + } + + // Think of this routine as the destructor -- since we need to call virtual derived methods, we can't use it as + // a destructor without a pure virtual method call, so we have the derived class call it in its destructor... + + void Destroy() WI_NOEXCEPT + { + bool fStop = true; + if (m_sharedActivityData) + { + // The lock unifies the 'unique()' check and the 'reset()' of any non-unique activity so that we + // can positively identify the final release of the internal data + + auto lock = LockExclusive(); + if (!m_sharedActivityData.unique()) + { + fStop = false; + m_sharedActivityData.reset(); + } + } + + if (fStop && m_pActivityData->NeedsStopped()) + { + ReportStopActivity(m_pActivityData->SetUnhandledException()); + } + } + + private: + void ReportStopActivity(HRESULT hr) WI_NOEXCEPT + { + if (FAILED(hr) && WI_AreAllFlagsClear(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA)) && WI_IsFlagSet(options, ActivityOptions::TelemetryOnFailure)) + { + wil::FailureInfo const* pFailure = GetFailureInfo(); + if (pFailure != nullptr) + { + __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(pFailure, pFailure->hr); + auto & failure = *pFailure; + __WI_TraceLoggingWriteTagged(*this, "ActivityFailure", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), __ACTIVITY_FAILURE_TELEMETRY_FAILURE_PARAMS(failure)); + } + else + { + __TRACELOGGING_TEST_HOOK_CALLCONTEXT_ERROR(nullptr, hr); + __WI_TraceLoggingWriteTagged(*this, "ActivityFailure", TraceLoggingKeyword(Keyword | MICROSOFT_KEYWORD_TELEMETRY), TraceLoggingLevel(WINEVENT_LEVEL_ERROR), + __ACTIVITY_FAILURE_TELEMETRY_PARAMS(hr, m_pActivityData->GetCallContext()->contextName, m_pActivityData->GetCallContext()->contextMessage)); + } + } + + StopActivity(); + } + + rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT + { + // We only need to lock when we're sharing.... + return (m_sharedActivityData ? m_sharedActivityData->LockExclusive() : rwlock_release_exclusive_scope_exit()); + } + + template + class ActivityData : + public _TlgActivityBase, keyword, level> + { + using BaseTy = _TlgActivityBase, keyword, level>; + friend BaseTy; + void OnStarted() {} + void OnStopped() {} + + // SFINAE dispatching on presence of ActivityTraceLoggingType::CreateActivityId(_Out_ GUID& childActivityId, _In_opt_ const GUID* relatedActivityId) + template + auto CreateActivityIdByProviderType(int, _Out_ GUID& childActivityId) -> + decltype(ProviderType::CreateActivityId(childActivityId, this->GetRelatedId()), (void)0) + { + ProviderType::CreateActivityId(childActivityId, this->GetRelatedId()); + } + + template + auto CreateActivityIdByProviderType(long, _Out_ GUID& childActivityId) -> + void + { + EventActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, &childActivityId); + } + + void CreateActivityId(_Out_ GUID& childActivityId) + { + CreateActivityIdByProviderType(0, childActivityId); + } + + public: + ActivityData(_In_opt_ PCSTR contextName = nullptr) WI_NOEXCEPT : + BaseTy(), + m_callContext(contextName), + m_result(S_OK), + m_stopCountExpected(1) + { + } + + ActivityData(ActivityData &&other) WI_NOEXCEPT : + BaseTy(wistd::move(other)), + m_callContext(wistd::move(other.m_callContext)), + m_result(other.m_result), + m_failure(wistd::move(other.m_failure)), + m_stopCountExpected(other.m_stopCountExpected) + { + } + + ActivityData & operator=(ActivityData &&other) WI_NOEXCEPT + { + BaseTy::operator=(wistd::move(other)); + m_callContext = wistd::move(other.m_callContext); + m_result = other.m_result; + m_failure = wistd::move(other.m_failure); + m_stopCountExpected = other.m_stopCountExpected; + return *this; + } + + ActivityData(ActivityData const &other) = delete; + ActivityData & operator=(ActivityData const &other) = delete; + + // returns true if the event was reported to telemetry + void NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT + { + if ((failure.hr != m_failure.GetFailureInfo().hr) && // don't replace with the same error (likely propagation up the stack) + ((failure.hr != m_result) || SUCCEEDED(m_result))) // don't replace if we've already got the current explicitly supplied failure code + { + m_failure.SetFailureInfo(failure); + } + } + + rwlock_release_exclusive_scope_exit LockExclusive() WI_NOEXCEPT + { + return m_lock.lock_exclusive(); + } + + static TraceLoggingHProvider Provider() + { + return ActivityTraceLoggingType::Provider(); + } + + bool NeedsStopped() const WI_NOEXCEPT + { + return BaseTy::IsStarted(); + } + + void SetRelatedActivityId(const GUID* relatedId) + { + this->SetRelatedId(*relatedId); + } + + bool SetStopResult(HRESULT hr, _Out_opt_ HRESULT *phr) WI_NOEXCEPT + { + // We must be expecting at least one Stop -- otherwise the caller is calling Stop() more times + // than it can (normally once, or +1 for each call to Split()) + __FAIL_FAST_IMMEDIATE_ASSERT__(m_stopCountExpected >= 1); + if (SUCCEEDED(m_result)) + { + m_result = hr; + } + if (phr != nullptr) + { + *phr = m_result; + } + return ((--m_stopCountExpected) == 0); + } + + HRESULT SetUnhandledException() WI_NOEXCEPT + { + HRESULT hr = m_failure.GetFailureInfo().hr; + SetStopResult(FAILED(hr) ? hr : HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), &hr); + return hr; + } + + void IncrementExpectedStopCount() WI_NOEXCEPT + { + m_stopCountExpected++; + } + + FailureInfo const *GetFailureInfo() const WI_NOEXCEPT + { + return (FAILED(m_result) && (m_result == m_failure.GetFailureInfo().hr)) ? &m_failure.GetFailureInfo() : nullptr; + } + + inline HRESULT GetResult() const WI_NOEXCEPT + { + return m_result; + } + + details::StoredCallContextInfo *GetCallContext() WI_NOEXCEPT + { + return &m_callContext; + } + + private: + details::StoredCallContextInfo m_callContext; + HRESULT m_result; + StoredFailureInfo m_failure; + int m_stopCountExpected; + wil::srwlock m_lock; + }; + + mutable ActivityData m_activityData; + mutable ActivityData *m_pActivityData; + mutable details::shared_object> m_sharedActivityData; + mutable details::ThreadFailureCallbackHolder m_callbackHolder; + }; + +} // namespace wil + + +// Internal MACRO implementation of Activities. +// Do NOT use these macros directly. + +#define __WI_TraceLoggingWriteStart(activity, name, ...) \ + __pragma(warning(push)) __pragma(warning(disable:4127)) \ + do { \ + _tlgActivityDecl(activity) \ + static const UINT64 _tlgActivity_Keyword = _tlgActivityRef(activity).Keyword;\ + static const UINT8 _tlgActivity_Level = _tlgActivityRef(activity).Level;\ + static const UINT64 _tlgActivityPrivacyTag = _tlgActivityRef(activity).PrivacyTag;\ + static_assert( \ + _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, __VA_ARGS__)), \ + "Do not use TraceLoggingKeyword in TraceLoggingWriteStart. Keywords for START events are " \ + "specified in the activity type, e.g. TraceLoggingActivity."); \ + static_assert( \ + _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, __VA_ARGS__)), \ + "Do not use TraceLoggingLevel in TraceLoggingWriteStart. The Level for START events is " \ + "specified in the activity type, e.g. TraceLoggingActivity."); \ + _tlgActivityRef(activity).zInternalStart(); \ + TraceLoggingWriteActivity( \ + TraceLoggingType::Provider(), \ + (name), \ + _tlgActivityRef(activity).Id(), \ + _tlgActivityRef(activity).zInternalRelatedId(), \ + TraceLoggingOpcode(1 /* WINEVENT_OPCODE_START */), \ + TraceLoggingKeyword(_tlgActivity_Keyword), \ + TraceLoggingLevel(_tlgActivity_Level), \ + TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \ + TraceLoggingDescription("~^" _wiltlg_LSTRINGIZE(activity) L"^~"), \ + __VA_ARGS__); \ + } while(0) \ + __pragma(warning(pop)) \ + +#define __WRITE_ACTIVITY_START(EventId, ...) \ + __TRACELOGGING_TEST_HOOK_ACTIVITY_START(); \ + __WI_TraceLoggingWriteStart(*this, #EventId, __ACTIVITY_START_PARAMS(), __VA_ARGS__); \ + EnsureWatchingCurrentThread() + +#define __WI_TraceLoggingWriteStop(activity, name, ...) \ + __pragma(warning(push)) __pragma(warning(disable:4127)) \ + do { \ + _tlgActivityDecl(activity) \ + static const UINT64 _tlgActivity_Keyword = _tlgActivityRef(activity).Keyword;\ + static const UINT8 _tlgActivity_Level = _tlgActivityRef(activity).Level;\ + static const UINT64 _tlgActivityPrivacyTag = _tlgActivityRef(activity).PrivacyTag;\ + static_assert( \ + _tlgActivity_Keyword == (_tlgActivity_Keyword _tlg_FOREACH(_tlgKeywordVal, __VA_ARGS__)), \ + "Do not use TraceLoggingKeyword in TraceLoggingWriteStop. Keywords for STOP events are " \ + "specified in the activity type, e.g. TraceLoggingActivity."); \ + static_assert( \ + _tlgActivity_Level == (_tlgActivity_Level _tlg_FOREACH(_tlgLevelVal, __VA_ARGS__)), \ + "Do not use TraceLoggingLevel in TraceLoggingWriteStop. The Level for STOP events is " \ + "specified in the activity type, e.g. TraceLoggingActivity."); \ + _tlgActivityRef(activity).zInternalStop(); \ + TraceLoggingWriteActivity( \ + TraceLoggingType::Provider(), \ + (name), \ + _tlgActivityRef(activity).Id(), \ + NULL, \ + TraceLoggingOpcode(2 /* WINEVENT_OPCODE_STOP */),\ + TraceLoggingKeyword(_tlgActivity_Keyword),\ + TraceLoggingLevel(_tlgActivity_Level),\ + TelemetryPrivacyDataTag(_tlgActivityPrivacyTag), \ + TraceLoggingDescription("~^" _wiltlg_LSTRINGIZE(activity) L"^~"),\ + __VA_ARGS__); \ + } while(0) \ + __pragma(warning(pop)) \ + +#define __WRITE_ACTIVITY_STOP(EventId, ...) \ + wil::FailureInfo const* pFailure = GetFailureInfo(); \ + if (pFailure != nullptr) \ + { \ + __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(pFailure, pFailure->hr); \ + auto &failure = *pFailure; \ + if (false, WI_IsAnyFlagSet(Keyword, (MICROSOFT_KEYWORD_TELEMETRY | MICROSOFT_KEYWORD_MEASURES | MICROSOFT_KEYWORD_CRITICAL_DATA))) \ + { \ + __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TELEMETRY_FAILURE_PARAMS(failure), __VA_ARGS__); \ + } \ + else \ + { \ + __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_TRACELOGGING_FAILURE_PARAMS(failure), __VA_ARGS__); \ + } \ + } \ + else \ + { \ + __TRACELOGGING_TEST_HOOK_ACTIVITY_STOP(nullptr, GetResult()); \ + __WI_TraceLoggingWriteStop(*this, #EventId, __ACTIVITY_STOP_PARAMS(GetResult()), __VA_ARGS__); \ + } \ + IgnoreCurrentThread(); + +// optional params are: KeyWord, Level, PrivacyTags, Options +#define __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, ...) \ + class ActivityClassName final : public wil::ActivityBase \ + { \ + protected: \ + void StopActivity() WI_NOEXCEPT override \ + { __WRITE_ACTIVITY_STOP(ActivityClassName); } \ + bool WasAlreadyReportedToTelemetry(long failureId) WI_NOEXCEPT override \ + { return TraceLoggingType::WasAlreadyReportedToTelemetry(failureId); } \ + public: \ + static bool IsEnabled() WI_NOEXCEPT \ + { return TraceLoggingType::IsEnabled(); } \ + ~ActivityClassName() WI_NOEXCEPT { ActivityBase::Destroy(); } \ + ActivityClassName(ActivityClassName const &other) WI_NOEXCEPT : ActivityBase(other) {} \ + ActivityClassName(ActivityClassName &&other) WI_NOEXCEPT : ActivityBase(wistd::move(other)) {} \ + ActivityClassName(ActivityClassName &&other, bool shouldWatchErrors) WI_NOEXCEPT : ActivityBase(wistd::move(other), shouldWatchErrors) {} \ + ActivityClassName& operator=(ActivityClassName const &other) WI_NOEXCEPT \ + { ActivityBase::operator=(other); return *this; } \ + ActivityClassName& operator=(ActivityClassName &&other) WI_NOEXCEPT \ + { auto localActivity(wistd::move(*this)); ActivityBase::operator=(wistd::move(other)); return *this; } \ + explicit operator bool() const WI_NOEXCEPT \ + { return IsRunning(); } \ + void StopWithResult(HRESULT hr) \ + { ActivityBase::Stop(hr); } \ + template \ + void StopWithResult(HRESULT hr, TArgs&&... args) \ + { SetStopResult(hr); Stop(wistd::forward(args)...); } \ + void Stop(HRESULT hr = S_OK) WI_NOEXCEPT \ + { ActivityBase::Stop(hr); } \ + void StartActivity() WI_NOEXCEPT \ + { __WRITE_ACTIVITY_START(ActivityClassName); } \ + void StartRelatedActivity() WI_NOEXCEPT \ + { wil::details::SetRelatedActivityId(*this); StartActivity(); } \ + void StartActivityWithCorrelationVector(PCSTR correlationVector) WI_NOEXCEPT \ + { __WRITE_ACTIVITY_START(ActivityClassName, TraceLoggingString(correlationVector, "__TlgCV__")); } \ + WI_NODISCARD ActivityClassName Split() WI_NOEXCEPT \ + { __FAIL_FAST_IMMEDIATE_ASSERT__(IsRunning()); IncrementExpectedStopCount(); return ActivityClassName(*this); } \ + WI_NODISCARD ActivityClassName TransferToCurrentThread() WI_NOEXCEPT \ + { return ActivityClassName(wistd::move(*this), IsRunning()); } \ + WI_NODISCARD ActivityClassName TransferToMember() WI_NOEXCEPT \ + { return ActivityClassName(wistd::move(*this), false); } + +#define __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) \ + private: \ + template \ + ActivityClassName(wil::details::tag_start, TArgs&&... args) WI_NOEXCEPT : ActivityBase(#ActivityClassName) \ + { StartActivity(wistd::forward(args)...); \ + __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK("this", ActivityClassName); } \ + template \ + ActivityClassName(wil::details::tag_start_cv, _In_opt_ PCSTR correlationVector, TArgs&&... args) WI_NOEXCEPT : ActivityBase(#ActivityClassName) \ + { StartActivityWithCorrelationVector(correlationVector, wistd::forward(args)...); \ + __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK("this", ActivityClassName); } \ + public: \ + ActivityClassName() WI_NOEXCEPT : ActivityBase(#ActivityClassName, false) {} \ + template \ + WI_NODISCARD static ActivityClassName Start(TArgs&&... args) \ + { return ActivityClassName(wil::details::tag_start(), wistd::forward(args)...); } \ + template \ + WI_NODISCARD static ActivityClassName StartWithCorrelationVector(_In_ PCSTR correlationVector, TArgs&&... args) \ + { return ActivityClassName(wil::details::tag_start_cv(), correlationVector, wistd::forward(args)...); } + +#define __IMPLEMENT_CALLCONTEXT_CLASS(ActivityClassName) \ + protected: \ + ActivityClassName(_In_ void **, PCSTR contextName, _In_opt_ _Printf_format_string_ PCSTR formatString, _In_opt_ va_list argList) : \ + ActivityBase(contextName) \ + { GetCallContext()->SetMessage(formatString, argList); StartActivity(); } \ + ActivityClassName(_In_ void **, PCSTR contextName) : \ + ActivityBase(contextName) \ + { StartActivity(); } \ + public: \ + ActivityClassName(PCSTR contextName) : ActivityBase(contextName, false) {} \ + ActivityClassName(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT : ActivityClassName(contextName) \ + { va_list argList; va_start(argList, formatString); GetCallContext()->SetMessage(formatString, argList); } \ + WI_NODISCARD static ActivityClassName Start(PCSTR contextName) WI_NOEXCEPT \ + { return ActivityClassName(static_cast(__nullptr), contextName); } \ + WI_NODISCARD static ActivityClassName Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \ + { va_list argList; va_start(argList, formatString); return ActivityClassName(static_cast(__nullptr), contextName, formatString, argList); } + +#define __END_TRACELOGGING_ACTIVITY_CLASS() \ + }; + +#ifdef _GENERIC_PARTB_FIELDS_ENABLED +#define _TLGWRITE_GENERIC_PARTB_FIELDS _GENERIC_PARTB_FIELDS_ENABLED, +#endif + +#define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \ + void EventId() \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \ + void EventId(PCSTR correlationVector) \ + { __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__) +#define DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__) +#define DEFINE_TAGGED_TRACELOGGING_EVENT_STRING(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, __VA_ARGS__) + + +// Internal MACRO implementation of TraceLogging classes. +// Do NOT use these macros directly. + +#define __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingProviderOwnerClassName) \ + public: \ + typedef TraceLoggingProviderOwnerClassName TraceLoggingType; \ + static bool IsEnabled(UCHAR eventLevel = 0 /* WINEVENT_LEVEL_XXX, e.g. WINEVENT_LEVEL_VERBOSE */, ULONGLONG eventKeywords = 0 /* MICROSOFT_KEYWORD_XXX */) WI_NOEXCEPT \ + { return Instance()->IsEnabled_(eventLevel, eventKeywords); } \ + static TraceLoggingHProvider Provider() WI_NOEXCEPT \ + { return static_cast(Instance())->Provider_(); } \ + static void SetTelemetryEnabled(bool) WI_NOEXCEPT {} \ + static void SetErrorReportingType(wil::ErrorReportingType type) WI_NOEXCEPT \ + { return Instance()->SetErrorReportingType_(type); } \ + static void __stdcall FallbackTelemetryCallback(bool alreadyReported, wil::FailureInfo const &failure) WI_NOEXCEPT \ + { return Instance()->OnErrorReported(alreadyReported, failure); } \ + WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread(PCSTR contextName) WI_NOEXCEPT \ + { return wil::ActivityThreadWatcher(Instance(), contextName); } \ + WI_NODISCARD static wil::ActivityThreadWatcher WatchCurrentThread(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \ + { va_list argList; va_start(argList, formatString); return wil::ActivityThreadWatcher(Instance(), contextName, formatString, argList); } \ + __BEGIN_TRACELOGGING_ACTIVITY_CLASS(CallContext, wil::ActivityOptions::TelemetryOnFailure) \ + __IMPLEMENT_CALLCONTEXT_CLASS(CallContext); \ + __END_TRACELOGGING_ACTIVITY_CLASS(); \ + static CallContext Start(PCSTR contextName) WI_NOEXCEPT \ + { return CallContext(contextName, __nullptr, __nullptr); } \ + static CallContext Start(PCSTR contextName, _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \ + { va_list argList; va_start(argList, formatString); return CallContext(contextName, formatString, argList); } \ + static void TraceLoggingInfo(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \ + { va_list argList; va_start(argList, formatString); return Instance()->ReportTraceLoggingMessage(formatString, argList); } \ + static void TraceLoggingError(_Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT \ + { va_list argList; va_start(argList, formatString); return Instance()->ReportTraceLoggingError(formatString, argList); } \ + private: \ + TraceLoggingHProvider Provider_() const WI_NOEXCEPT = delete; \ + TraceLoggingClassName() WI_NOEXCEPT {}; \ + protected: \ + static TraceLoggingClassName* Instance() WI_NOEXCEPT \ + { static wil::details::static_lazy wrapper; return wrapper.get([](){wrapper.cleanup();}); } \ + friend class wil::details::static_lazy; \ + + +#define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \ + __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \ + private: \ + struct StaticHandle \ + { \ + TraceLoggingHProvider handle; \ + StaticHandle() WI_NOEXCEPT \ + { \ + TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \ + _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \ + handle = &__hInner; \ + } \ + } m_staticHandle; \ + protected: \ + void Create() WI_NOEXCEPT \ + { Register(m_staticHandle.handle); } \ + public: + +#define __IMPLEMENT_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \ + __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry()) + +#define __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOption) \ + __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \ + private: \ + struct StaticHandle \ + { \ + TraceLoggingHProvider handle; \ + StaticHandle() WI_NOEXCEPT \ + { \ + TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId, TraceLoggingOption); \ + _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \ + handle = &__hInner; \ + } \ + } m_staticHandle; \ + static VOID NTAPI Callback( _In_ const GUID* SourceId, \ + ULONG ControlCode, \ + UCHAR Level, \ + ULONGLONG MatchAnyKeyword, \ + ULONGLONG MatchAllKeyword, \ + _In_opt_ EVENT_FILTER_DESCRIPTOR* FilterData, \ + void* CallbackContext ); \ + protected: \ + void Create() WI_NOEXCEPT \ + { Register(m_staticHandle.handle, &TraceLoggingClassName::Callback); } \ + public: + + +#define __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \ + __IMPLEMENT_TRACELOGGING_CLASS_BASE(TraceLoggingClassName, TraceLoggingClassName) \ + private: \ + struct StaticHandle \ + { \ + TraceLoggingHProvider handle; \ + StaticHandle() WI_NOEXCEPT \ + { \ + TRACELOGGING_DEFINE_PROVIDER_STORAGE(__hInner, ProviderName, ProviderId); \ + _tlg_DefineProvider_annotation(TraceLoggingClassName, _Tlg##TraceLoggingClassName##Prov, 0, ProviderName); \ + handle = &__hInner; \ + } \ + } m_staticHandle; \ + protected: \ + void Create() WI_NOEXCEPT \ + { Register(m_staticHandle.handle); } \ + public: + +#define DEFINE_TRACELOGGING_EVENT(EventId, ...) \ + static void EventId() { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \ + static void EventId(PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, T10 &&varName10) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + TraceLoggingValue(static_cast(wistd::forward(varName10)), _wiltlg_STRINGIZE(varName10)), \ + _TLGWRITE_GENERIC_PARTB_FIELDS \ + __VA_ARGS__); \ + } + +#define DEFINE_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__) +#define DEFINE_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__) +#define DEFINE_TRACELOGGING_EVENT_STRING(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, PCWSTR, varName, __VA_ARGS__) + + +// Declaring a pure TraceLogging class +// To declare a tracelogging class, declare your class derived from wil::TraceLoggingProvider, populate the uuid +// attribute of the class with the GUID of your provider, and then include the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY +// macro within your class. +// +// If you want to register a provider using a callback to log events, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK +// Additionally your tracelogging class will have to implement a static Callback method. See the declaration within __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB. +// +// If you don't need or use telemetry, you can instead use the IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY. +// This prevents telemetry from enabling your provider even if you're not using telemetry. + +#define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \ + __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, GroupName) + +#define IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName) \ + __IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, GroupName) + +#define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \ + IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry()) +#define IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY_AND_CALLBACK(TraceLoggingClassName, ProviderName, ProviderId) \ + IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP_CB(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionMicrosoftTelemetry()) +#define IMPLEMENT_TRACELOGGING_CLASS_WITH_WINDOWS_CORE_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \ + IMPLEMENT_TRACELOGGING_CLASS_WITH_GROUP(TraceLoggingClassName, ProviderName, ProviderId, TraceLoggingOptionWindowsCoreTelemetry()) +#define IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) \ + __IMPLEMENT_TRACELOGGING_CLASS_WITHOUT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId) + +#ifndef WIL_HIDE_DEPRECATED_1612 +WIL_WARN_DEPRECATED_1612_PRAGMA("IMPLEMENT_TRACELOGGING_CLASS") +// DEPRECATED: Use IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY +#define IMPLEMENT_TRACELOGGING_CLASS IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY +#endif + +// [Optional] Externally using a Tracelogging class +// Use TraceLoggingProviderWrite to directly use the trace logging provider externally from the class in code. +// This is recommended only for simple TraceLogging events. Telemetry events and activities are better defined +// within your Tracelogging class using one of the macros below. + +#define TraceLoggingProviderWrite(TraceLoggingClassName, EventId, ...) \ + TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, __VA_ARGS__) + +#define TraceLoggingProviderWriteTelemetry(TraceLoggingClassName, EventId, ...) \ + TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__) + +#define TraceLoggingProviderWriteMeasure(TraceLoggingClassName, EventId, ...) \ + TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__) + +#define TraceLoggingProviderWriteCriticalData(TraceLoggingClassName, EventId, ...) \ + TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__) + + +// [Optional] Custom Events +// Use these macros to define a Custom Event for a Provider. Use the TraceLoggingClassWrite or TraceLoggingClassWriteTelemetry +// from within a custom event to issue the event. Methods will be a no-op (and not be called) if the provider is not +// enabled. + +#define TraceLoggingClassWrite(EventId, ...) \ + TraceLoggingWrite(TraceLoggingType::Provider(), EventId, __VA_ARGS__) + +#define TraceLoggingClassWriteTelemetry(EventId, ...) \ + TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__) + +#define TraceLoggingClassWriteMeasure(EventId, ...) \ + TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__) + +#define TraceLoggingClassWriteCriticalData(EventId, ...) \ + TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__) + +#define DEFINE_EVENT_METHOD(MethodName) \ + template \ + static void MethodName(TArgs&&... args) WI_NOEXCEPT \ + { \ + if (IsEnabled()) \ + { Instance()->MethodName##_(wistd::forward(args)...); } \ + } \ + void MethodName##_ + + +// [Optional] Simple Events +// Use these macros to define very simple telemetry events for a Provider. The events can +// be TELEMETRY events or TRACELOGGING events. + +#define DEFINE_TELEMETRY_EVENT(EventId) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) + +#define DEFINE_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) + +#define DEFINE_TELEMETRY_EVENT_CV(EventId) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TELEMETRY_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) + +#define DEFINE_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_CV(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_CV(EventId, PrivacyTag, EventTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_TELEMETRY_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) + +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// [Optional] Simple Events +// Use these macros to define very simple measure events for a Provider. + +#define DEFINE_MEASURES_EVENT(EventId) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) + +#define DEFINE_MEASURES_EVENT_CV(EventId) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_MEASURES_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) + +#define DEFINE_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_MEASURES_EVENT_STRING(EventId, varName) DEFINE_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM9(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \ + DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM10(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10) \ + DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_MEASURES_EVENT_CV(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_MEASURES_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_CV(EventId, PrivacyTag, EventTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_MEASURES_EVENT_PARAM9_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \ + DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) + +#define DEFINE_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// [Optional] Simple Events +// Use these macros to define very simple critical data events for a Provider. + +#define DEFINE_CRITICAL_DATA_EVENT(EventId) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) + +#define DEFINE_CRITICAL_DATA_EVENT_CV(EventId) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) + +#define DEFINE_CRITICAL_DATA_EVENT_UINT32(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_CRITICAL_DATA_EVENT_STRING(EventId, varName) DEFINE_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_CV(EventId, PrivacyTag, EventTag) \ + DEFINE_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, PrivacyTag, EventTag, VarType1, varName1) \ + DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) +#define DEFINE_COMPLIANT_EVENTTAGGED_CRITICAL_DATA_EVENT_PARAM9_CV(EventId, PrivacyTag, EventTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \ + DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag), TraceLoggingEventTag(EventTag)) + +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// Custom Activities +// For these you pair the appropriate BEGIN and END macros to define your activity. Within the pair +// you can use the (TODO: LIST MACRO NAMES) macros to add behavior. + +// [optional] params are: Options, Keyword, Level, PrivacyTag +#define BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, ...) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, __VA_ARGS__) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// [optional] param is: Level, PrivacyTag +#define BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::None, 0, Level, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// [optional] param is: Level +#define BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, 0, Level, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// [optional] param is: Level +#define BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_TELEMETRY, Level, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// [optional] param is: Level +#define BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_MEASURES, Level, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// [optional] param is: Level +#define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, WINEVENT_LEVEL_VERBOSE, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) +#define BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) __BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName, wil::ActivityOptions::TelemetryOnFailure, MICROSOFT_KEYWORD_CRITICAL_DATA, Level, PrivacyTag) \ + __IMPLEMENT_ACTIVITY_CLASS(ActivityClassName) + +// Use to end ALL activity class definitions +#define END_ACTIVITY_CLASS() __END_TRACELOGGING_ACTIVITY_CLASS() + + +// Simple Activities +// For these you just use the appropriate macro to define the KIND of activity you want and specify +// the name (for tracelogging you can give other options) + +// [optional] params are: Options, Keyword, Level +#define DEFINE_CUSTOM_ACTIVITY(ActivityClassName, ...) \ + BEGIN_CUSTOM_ACTIVITY_CLASS(ActivityClassName, __VA_ARGS__) \ + END_ACTIVITY_CLASS() + +#define DEFINE_TRACELOGGING_ACTIVITY(ActivityClassName) \ + BEGIN_TRACELOGGING_ACTIVITY_CLASS(ActivityClassName) \ + END_ACTIVITY_CLASS() +#define DEFINE_TRACELOGGING_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \ + BEGIN_TRACELOGGING_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \ + END_ACTIVITY_CLASS() + +#define DEFINE_CALLCONTEXT_ACTIVITY(ActivityClassName) \ + BEGIN_CALLCONTEXT_ACTIVITY_CLASS(ActivityClassName) \ + END_ACTIVITY_CLASS() +#define DEFINE_CALLCONTEXT_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \ + BEGIN_CALLCONTEXT_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \ + END_ACTIVITY_CLASS() + +#define DEFINE_TELEMETRY_ACTIVITY(ActivityClassName) \ + BEGIN_TELEMETRY_ACTIVITY_CLASS(ActivityClassName) \ + END_ACTIVITY_CLASS() +#define DEFINE_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \ + BEGIN_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY(ActivityClassName, PrivacyTag) \ + BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_TELEMETRY_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + BEGIN_COMPLIANT_TELEMETRY_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + END_ACTIVITY_CLASS() + +#define DEFINE_MEASURES_ACTIVITY(ActivityClassName) \ + BEGIN_MEASURES_ACTIVITY_CLASS(ActivityClassName) \ + END_ACTIVITY_CLASS() +#define DEFINE_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \ + BEGIN_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_MEASURES_ACTIVITY(ActivityClassName, PrivacyTag) \ + BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_MEASURES_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + BEGIN_COMPLIANT_MEASURES_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + END_ACTIVITY_CLASS() + +#define DEFINE_CRITICAL_DATA_ACTIVITY(ActivityClassName) \ + BEGIN_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName) \ + END_ACTIVITY_CLASS() +#define DEFINE_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, Level) \ + BEGIN_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, Level) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY(ActivityClassName, PrivacyTag) \ + BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS(ActivityClassName, PrivacyTag) \ + END_ACTIVITY_CLASS() +#define DEFINE_COMPLIANT_CRITICAL_DATA_ACTIVITY_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + BEGIN_COMPLIANT_CRITICAL_DATA_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, PrivacyTag, Level) \ + END_ACTIVITY_CLASS() + + +// [Optional] Custom Start or Stop Events for Activities +// Use these macros to define custom start or custom stop methods for an activity. Any activity can +// have multiple start or stop methods. To add custom start or stop events, define a StartActivity instance +// method or a Stop instance method within the BEGIN/END pair of a custom activity. Within that function, use +// TraceLoggingClassWriteStart or TraceLoggingClassWriteStop. + +// Params: (EventId, ...) +#define TraceLoggingClassWriteStart __WRITE_ACTIVITY_START +#define TraceLoggingClassWriteStop __WRITE_ACTIVITY_STOP + + +// [Optional] Custom Tagged Events for Activities +// Use these macros to define a Custom Tagged Event for a Custom Activity. Use the +// TraceLoggingClassWriteTagged or TraceLoggingClassWriteTaggedTelemetry macros from within a custom event +// to write the event. + +#define TraceLoggingClassWriteTagged(EventId, ...) \ + __WI_TraceLoggingWriteTagged(*this, #EventId, __VA_ARGS__) + +#define TraceLoggingClassWriteTaggedTelemetry(EventId, ...) \ + __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__) + +#define TraceLoggingClassWriteTaggedMeasure(EventId, ...) \ + __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), __VA_ARGS__) + +#define TraceLoggingClassWriteTaggedCriticalData(EventId, ...) \ + __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), __VA_ARGS__) + +// [Optional] Simple Tagged Events for Activities +// Use these methods to define very simple tagged events for a Custom Activity. + +#define DEFINE_TAGGED_TELEMETRY_EVENT(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) + +#define DEFINE_TAGGED_TELEMETRY_EVENT_CV(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) +#define DEFINE_TAGGED_TELEMETRY_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY)) + +#define DEFINE_TAGGED_TELEMETRY_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_TAGGED_TELEMETRY_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_TAGGED_TELEMETRY_EVENT_STRING(EventId, varName) DEFINE_TAGGED_TELEMETRY_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT(EventId, PrivacyTag) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_TELEMETRY_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// [Optional] Simple Tagged Events for Activities +// Use these methods to define very simple tagged measures events for a Custom Activity. + +#define DEFINE_TAGGED_MEASURES_EVENT(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) + +#define DEFINE_TAGGED_MEASURES_EVENT_CV(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) +#define DEFINE_TAGGED_MEASURES_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)) + +#define DEFINE_TAGGED_MEASURES_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_TAGGED_MEASURES_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_TAGGED_MEASURES_EVENT_STRING(EventId, varName) DEFINE_TAGGED_MEASURES_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT(EventId, PrivacyTag) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_MEASURES_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// [Optional] Simple Tagged Events for Activities +// Use these methods to define very simple tagged CRITICAL_DATA events for a Custom Activity. + +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) + +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_CV(EventId) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1_CV(EventId, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)) + +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_UINT32(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, UINT32, varName) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_BOOL(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, bool, varName) +#define DEFINE_TAGGED_CRITICAL_DATA_EVENT_STRING(EventId, varName) DEFINE_TAGGED_CRITICAL_DATA_EVENT_PARAM1(EventId, PCWSTR, varName) + +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT(EventId, PrivacyTag) \ + DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, VarType1, varName1) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM2(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM3(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM4(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM5(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM6(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM7(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM8(EventId, PrivacyTag, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8) \ + DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA), TelemetryPrivacyDataTag(PrivacyTag)) + +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_UINT32(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, UINT32, varName) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_BOOL(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, bool, varName) +#define DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_STRING(EventId, PrivacyTag, varName) DEFINE_TAGGED_COMPLIANT_CRITICAL_DATA_EVENT_PARAM1(EventId, PrivacyTag, PCWSTR, varName) + +// Thread Activities [deprecated] +// These are desktop only and are not recommended by the fundamentals team. These activities lag behind regular activities in +// their ability to use CallContext or to be cross-thread portable, so their usage should be limited. + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \ + class ActivityClassName final : public _TlgActivityBase \ + { \ + static const UINT64 PrivacyTag = 0; \ + friend class _TlgActivityBase; \ + void OnStarted() { PushThreadActivityId(); } \ + void OnStopped() { PopThreadActivityId(); } \ + public: \ + ActivityClassName() : m_result(S_OK) \ + { \ + } \ + private: \ + template \ + ActivityClassName(_In_ void **, TArgs&&... args) : m_result(S_OK) \ + { \ + StartActivity(wistd::forward(args)...); \ + } \ + protected: \ + void EnsureWatchingCurrentThread() {} \ + void IgnoreCurrentThread() {} \ + wil::FailureInfo const *GetFailureInfo() \ + { \ + return (FAILED(m_result) && (m_cache.GetFailure() != nullptr) && (m_result == m_cache.GetFailure()->hr)) ? m_cache.GetFailure() : nullptr; \ + } \ + HRESULT GetResult() \ + { \ + return m_result; \ + } \ + public: \ + ~ActivityClassName() \ + { \ + Stop(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); \ + } \ + ActivityClassName(const ActivityClassName &) = default; \ + ActivityClassName(ActivityClassName &&) = default; \ + TraceLoggingHProvider Provider() const \ + { \ + return TraceLoggingType::Provider(); \ + } \ + void Stop(HRESULT hr = S_OK) \ + { \ + if (IsStarted()) \ + { \ + m_result = hr; \ + TRACELOGGING_WRITE_ACTIVITY_STOP(ActivityClassName); \ + } \ + } \ + template \ + void StopWithResult(HRESULT hr, TArgs&&... args) \ + { \ + m_result = hr; \ + Stop(wistd::forward(args)...); \ + } \ + template \ + static ActivityClassName Start(TArgs&&... args) \ + { \ + return ActivityClassName(static_cast(__nullptr), wistd::forward(args)...); \ + } \ + void StartActivity() \ + { \ + TRACELOGGING_WRITE_ACTIVITY_START(ActivityClassName); \ + } \ + +#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, WINEVENT_LEVEL_VERBOSE) + +#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, level) + +#define BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, 0, WINEVENT_LEVEL_VERBOSE) + +#define END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() \ + private: \ + HRESULT m_result; \ + wil::ThreadFailureCache m_cache; \ + }; + +#define BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, MICROSOFT_KEYWORD_TELEMETRY) + +#define END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS() \ + END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() + +#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD_LEVEL(ActivityClassName, keyword, level) \ + END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() + +#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_KEYWORD(ActivityClassName, keyword) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_KEYWORD(ActivityClassName, keyword) \ + END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() + +#define DEFINE_TRACELOGGING_THREAD_ACTIVITY_WITH_LEVEL(ActivityClassName, level) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS_WITH_LEVEL(ActivityClassName, level) \ + END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() + +#define DEFINE_TRACELOGGING_THREAD_ACTIVITY(ActivityClassName) \ + BEGIN_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS(ActivityClassName) \ + END_DEFINE_TRACELOGGING_THREAD_ACTIVITY_CLASS() + +#define DEFINE_TELEMETRY_THREAD_ACTIVITY(ActivityClassName) \ + BEGIN_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS(ActivityClassName) \ + END_DEFINE_TELEMETRY_THREAD_ACTIVITY_CLASS() + +#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */ + + +// [deprecated] +// DO NOT USE these concepts +// These should be removed post RI/FI cycle... + +#define DEFINE_TRACELOGGING_METHOD DEFINE_EVENT_METHOD +#define BEGIN_DEFINE_TELEMETRY_ACTIVITY_CLASS BEGIN_TELEMETRY_ACTIVITY_CLASS +#define END_DEFINE_TELEMETRY_ACTIVITY_CLASS END_ACTIVITY_CLASS +#define BEGIN_DEFINE_TRACELOGGING_ACTIVITY_CLASS BEGIN_TRACELOGGING_ACTIVITY_CLASS +#define END_DEFINE_TRACELOGGING_ACTIVITY_CLASS END_ACTIVITY_CLASS +#define TELEMETRY_WRITE_ACTIVITY_START TraceLoggingClassWriteStart +#define TRACELOGGING_WRITE_ACTIVITY_START TraceLoggingClassWriteStart +#define TELEMETRY_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop +#define TRACELOGGING_WRITE_ACTIVITY_STOP TraceLoggingClassWriteStop +#define WRITE_TRACELOGGING_EVENT TraceLoggingClassWrite +#define WRITE_TELEMETRY_EVENT TraceLoggingClassWriteTelemetry +#define TRACELOGGING_WRITE_TAGGED_EVENT TraceLoggingClassWriteTagged +#define TELEMETRY_WRITE_TAGGED_EVENT TraceLoggingClassWriteTaggedTelemetry + +// [deprecated] +// DO NOT USE these concepts +// These should be removed post RI/FI cycle... +#define __DEFINE_EVENT DEFINE_TRACELOGGING_EVENT +#define __DEFINE_EVENT_PARAM1 DEFINE_TRACELOGGING_EVENT_PARAM1 +#define __DEFINE_EVENT_PARAM2 DEFINE_TRACELOGGING_EVENT_PARAM2 +#define __DEFINE_EVENT_PARAM3 DEFINE_TRACELOGGING_EVENT_PARAM3 +#define __DEFINE_EVENT_PARAM4 DEFINE_TRACELOGGING_EVENT_PARAM4 +#define __DEFINE_EVENT_PARAM5 DEFINE_TRACELOGGING_EVENT_PARAM5 +#define __DEFINE_EVENT_PARAM6 DEFINE_TRACELOGGING_EVENT_PARAM6 +#define __DEFINE_EVENT_PARAM7 DEFINE_TRACELOGGING_EVENT_PARAM7 +#define __DEFINE_EVENT_UINT32 DEFINE_TRACELOGGING_EVENT_UINT32 +#define __DEFINE_EVENT_BOOL DEFINE_TRACELOGGING_EVENT_BOOL +#define __DEFINE_EVENT_STRING DEFINE_TRACELOGGING_EVENT_STRING + +// [deprecated] +// DO NOT USE these concepts +// These should be removed post RI/FI cycle... +#define __DEFINE_TAGGED_EVENT DEFINE_TAGGED_TRACELOGGING_EVENT +#define __DEFINE_TAGGED_EVENT_PARAM1 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1 +#define __DEFINE_TAGGED_EVENT_PARAM2 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2 +#define __DEFINE_TAGGED_EVENT_PARAM3 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3 +#define __DEFINE_TAGGED_EVENT_PARAM4 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4 +#define __DEFINE_TAGGED_EVENT_PARAM5 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5 +#define __DEFINE_TAGGED_EVENT_PARAM6 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6 +#define __DEFINE_TAGGED_EVENT_PARAM7 DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7 +#define __DEFINE_TAGGED_EVENT_UINT32 DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32 +#define __DEFINE_TAGGED_EVENT_BOOL DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL +#define __DEFINE_TAGGED_EVENT_STRING DEFINE_TAGGED_TRACELOGGING_EVENT_STRING + +template +class ActivityErrorTracer +{ +public: + ActivityErrorTracer(T const &) {} +}; + +using TelemetryBase = wil::TraceLoggingProvider; + +#define TRACELOGGING_WRITE_EVENT(TraceLoggingClassName, EventId, ...) \ + TraceLoggingWrite(TraceLoggingClassName::TraceLoggingType::Provider(), EventId, __VA_ARGS__) + +#define TELEMETRY_WRITE_EVENT(EventId, ...) \ + TraceLoggingWrite(TraceLoggingType::Provider(), EventId, TraceLoggingKeyword(MICROSOFT_KEYWORD_TELEMETRY), __VA_ARGS__) + +#define DEFINE_TAGGED_EVENT_METHOD(MethodName) \ + public: void MethodName + +#define DEFINE_ACTIVITY_START(...) \ + void StartActivity(__VA_ARGS__) + +#define DEFINE_ACTIVITY_STOP(...) \ + void Stop(__VA_ARGS__) + +#define DECLARE_TRACELOGGING_CLASS(TraceLoggingClassName, ProviderName, ProviderId) \ + class TraceLoggingClassName : public wil::TraceLoggingProvider \ + { \ + IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(TraceLoggingClassName, ProviderName, ProviderId); \ + }; + +#define IMPLEMENT_TELEMETRY_CLASS(TelemetryClassName, TraceLoggingClassName) \ + __IMPLEMENT_TRACELOGGING_CLASS_BASE(TelemetryClassName, TraceLoggingClassName) \ + protected: \ + void Create() \ + { AttachProvider(TraceLoggingClassName::Provider()); \ + __TRACELOGGING_DEFINE_PROVIDER_STORAGE_LINK(TelemetryClassName, TraceLoggingClassName); } \ + public: + +namespace wil +{ + /// @cond + namespace details + { +#ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER +#pragma detect_mismatch("ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch", "1") +#else +#pragma detect_mismatch("ODR_violation_WIL_API_TELEMETRY_SUSPEND_HANDLER_mismatch", "0") +#endif + + class ApiTelemetryLogger : public wil::TraceLoggingProvider + { + // {fb7fcbc6-7156-5a5b-eabd-0be47b14f453} + IMPLEMENT_TRACELOGGING_CLASS_WITH_MICROSOFT_TELEMETRY(ApiTelemetryLogger, "Microsoft.Windows.ApiTelemetry", (0xfb7fcbc6, 0x7156, 0x5a5b, 0xea, 0xbd, 0x0b, 0xe4, 0x7b, 0x14, 0xf4, 0x53)); + public: + // Used to store of list of APIs (with namespace, class, custom and call count data per API). + // This is public so that it can be unit tested. + class ApiDataList + { + public: + struct ApiData + { + PCWSTR className = nullptr; + PCWSTR apiName = nullptr; + PCSTR specialization = nullptr; + volatile long* counterReference = nullptr; + wistd::unique_ptr next; + + ApiData(PCWSTR className_, PCWSTR apiName_, PCSTR specialization_, volatile long* counterReference_) : + className(className_), apiName(apiName_), specialization(specialization_), counterReference(counterReference_) + { + } + }; + + // Inserts a new Api call counter into the list, keeping the list sorted by className + void Insert(PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference) + { + wistd::unique_ptr newApiData(new(std::nothrow) ApiData(className, apiName, specialization, counterReference)); + if (newApiData) + { + auto lock = m_lock.lock_exclusive(); + + // Insert the new ApiData, keeping the list sorted by className. + wistd::unique_ptr* currentNode = &m_root; + while (*currentNode) + { + wistd::unique_ptr& node = *currentNode; + if (wcscmp(className, node->className) <= 0) + { + break; + } + currentNode = &(node->next); + } + newApiData->next.reset(currentNode->release()); + currentNode->reset(newApiData.release()); + } + } + + // For each distinct namespace, calls the provided flushCallback function. + // After returning, it will have deleted all ApiData elements, and zeroed the *counterReference stored in each ApiData. + void Flush(wistd::function flushCallback) + { + wistd::unique_ptr root; + if (m_root) + { + auto lock = m_lock.lock_exclusive(); + root.swap(m_root); + } + + while (root) + { + // First find the number of characters we need to allocate for each string, and the number of items in the counter array to allocate + size_t totalApiListLength = 1; // Init to 1 to account for null terminator + size_t totalSpecializationsLength = 1; // Init to 1 to account for null terminator + UINT16 numCounts = 0; + + ProcessSingleNamespace(&root, + [&](wistd::unique_ptr& node) + { + // Get the length needed for the class string + const wchar_t* strAfterNamespace = GetClassStringPointer(node->className); + size_t classStrLen = wcslen(strAfterNamespace ? strAfterNamespace : node->className); + + totalApiListLength += (classStrLen + wcslen(node->apiName) + 1); // We add 1 to account for the comma delimeter + if (node->specialization) + { + totalSpecializationsLength += strlen(node->specialization) + 1; // We add 1 to account for the comma delimeter + } + else + { + totalSpecializationsLength += 2; // '-' plus comma delimeter + } + numCounts++; + }); + + // Fill arrays with the API data, and then pass it to the callback function + wistd::unique_ptr apiList(new(std::nothrow) wchar_t[totalApiListLength]); + wistd::unique_ptr specializationList(new(std::nothrow) char[totalSpecializationsLength]); + wistd::unique_ptr countArray(new(std::nothrow) UINT32[numCounts]); + size_t nameSpaceLength = GetNameSpaceLength(root->className) + 1; + wistd::unique_ptr nameSpace(new(std::nothrow) wchar_t[nameSpaceLength]); + if (!apiList || !specializationList || !countArray || !nameSpace) + { + return; + } + + ZeroMemory(apiList.get(), totalApiListLength * sizeof(wchar_t)); + ZeroMemory(specializationList.get(), totalSpecializationsLength * sizeof(char)); + ZeroMemory(countArray.get(), numCounts * sizeof(UINT32)); + ZeroMemory(nameSpace.get(), nameSpaceLength * sizeof(wchar_t)); + + StringCchCopyNW(nameSpace.get(), STRSAFE_MAX_CCH, root->className, nameSpaceLength - 1); + + int countArrayIndex = 0; + + wistd::unique_ptr* lastNamespaceNode = ProcessSingleNamespace(&root, + [&](wistd::unique_ptr& node) + { + countArray[countArrayIndex] = static_cast(::InterlockedExchangeNoFence(node->counterReference, 0)); + + // Prepend the portion of the apiName group string that's after the '.'. So for example, if the + // className is "Windows.System.Launcher", then we prepend "Launcher." to the apiName string. + const wchar_t* strAfterNamespace = GetClassStringPointer(node->className); + if (strAfterNamespace) + { + FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, strAfterNamespace + 1)); + FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L".")); + } + + FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, node->apiName)); + if (node->specialization) + { + FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, node->specialization, strlen(node->specialization)) != 0); + } + else + { + FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, "-", 1) != 0); + } + + if (countArrayIndex != (numCounts - 1)) + { + FAIL_FAST_IF_FAILED(StringCchCatW(apiList.get(), totalApiListLength, L",")); + FAIL_FAST_IF(strncat_s(specializationList.get(), totalSpecializationsLength, ",", 1) != 0); + } + + countArrayIndex++; + }); + + // Call the callback function with the data we've collected for this namespace + flushCallback(nameSpace.get(), apiList.get(), specializationList.get(), countArray.get(), numCounts); + + if (*lastNamespaceNode) + { + root.swap((*lastNamespaceNode)->next); + } + else + { + root.reset(); + } + } + } + + private: + static wistd::unique_ptr* ProcessSingleNamespace(wistd::unique_ptr* root, wistd::function&)> workerCallback) + { + wistd::unique_ptr* currentNode = root; + while (*currentNode) + { + wistd::unique_ptr& node = *currentNode; + + workerCallback(node); + + // Check if our next node would be a new namespace; if so, then break out + if (node->next && !IsSameNameSpace(node->className, node->next->className)) + { + break; + } + + currentNode = &(node->next); + } + + return currentNode; + } + + static bool IsSameNameSpace(PCWSTR namespaceClass1, PCWSTR namespaceClass2) + { + return (wcsncmp(namespaceClass1, namespaceClass2, GetNameSpaceLength(namespaceClass2) + 1) == 0); + } + + static size_t GetNameSpaceLength(PCWSTR nameSpaceClass) + { + const wchar_t* strAfterNamespace = GetClassStringPointer(nameSpaceClass); + return (strAfterNamespace ? (strAfterNamespace - nameSpaceClass) : wcslen(nameSpaceClass)); + } + + static const wchar_t* GetClassStringPointer(PCWSTR nameSpaceClass) + { + // Note: Usage of wcsrchr can cause build errors in some components, so we implement a way of getting the pointer to the 'class' portion + // of the string ourselves. + int retIndex = 0; + while (nameSpaceClass[retIndex] != '\0') + { + retIndex++; + } + while (retIndex > 0 && nameSpaceClass[retIndex] != '.') + { + retIndex--; + } + return (retIndex != 0 ? &(nameSpaceClass[retIndex]) : nullptr); + } + + wistd::unique_ptr m_root; + wil::srwlock m_lock; + }; + + public: + // Initializes an entry that holds the className.apiName, along with a counter for that className.apiName. + // The counterReference passed to this should later be passed to LogApiInfo. + // + // A separate entry will be created for each apiName that has a distinct specialization value. + // + // This function only needs to be called once for each API, although it doesn't hurt if it gets called more than once. + // + // The apiName, className, and specialization parameters should be compile time constants. specialization can be null. + DEFINE_EVENT_METHOD(InitApiData)(PCWSTR className, PCWSTR apiName, _In_opt_ PCSTR specialization, volatile long* counterReference) + { + // TODO: Validate that apiName and className are a compile-time constants; validate that specialization is + // either compile-time constant or nullptr; validate that counterReference points to static variable. + // Can do this by making sure address is <= (GetModuleHandle() + DLL size). + m_apiDataList.Insert(className, apiName, specialization, counterReference); + } + + // Fires a telemetry event that contains the method call apiName that has been logged by the component, + // since the last FireEvent() call, or since the component was loaded. + DEFINE_EVENT_METHOD(FireEvent)() + { + m_apiDataList.Flush( + [](PCWSTR nameSpace, PCWSTR apiList, PCSTR specializationList, UINT32* countArray, UINT16 numCounters) + { + if (::wil::details::IsDebuggerPresent()) + { + TraceLoggingWrite(Provider(), "ApiCallCountsWithDebuggerPresent", TraceLoggingValue(nameSpace, "Namespace"), TraceLoggingValue(apiList, "ApiDataList"), + TraceLoggingValue(specializationList, "CustomList"), TraceLoggingUInt32Array(countArray, numCounters, "HitCounts"), TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)); + } + else + { + TraceLoggingWrite(Provider(), "ApiCallCounts", TraceLoggingValue(nameSpace, "Namespace"), TraceLoggingValue(apiList, "ApiDataList"), + TraceLoggingValue(specializationList, "CustomList"), TraceLoggingUInt32Array(countArray, numCounters, "HitCounts"), TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)); + } + + __TRACELOGGING_TEST_HOOK_VERIFY_API_TELEMETRY(nameSpace, apiList, specializationList, countArray, numCounters); + }); + + if (m_fireEventDelay < c_fireEventDelayLimit) + { + // Double the exponential backoff timer, until it reaches the maximum + m_fireEventDelay *= 2; + if (m_fireEventDelay > c_fireEventDelayLimit) + { + m_fireEventDelay = c_fireEventDelayLimit; + } + } + + ScheduleFireEventCallback(); + } + + // Used to declare that the component will handle calling FireEvent() in its own suspend handler. + // This optimizes the frequency at which the event will be fired. + DEFINE_EVENT_METHOD(UsingOwnSuspendHandler)() + { + m_fireEventDelay = c_fireEventDelayLimit; + ScheduleFireEventCallback(); + } + + private: + void Initialize() WI_NOEXCEPT override + { +#ifdef WIL_API_TELEMETRY_SUSPEND_HANDLER + m_fireEventDelay = c_fireEventDelayLimit; + + PPSM_APPSTATE_REGISTRATION psmReg; + BOOLEAN quiesced; + PsmRegisterAppStateChangeNotification( + [](BOOLEAN quiesced, PVOID, HANDLE) + { + if (quiesced) + { + FireEvent(); + } + }, + StateChangeCategoryApplication, 0, nullptr, &quiesced, &psmReg); +#else + m_fireEventDelay = __TRACELOGGING_TEST_HOOK_API_TELEMETRY_EVENT_DELAY_MS; +#endif + m_fireEventThreadPoolTimer.reset(::CreateThreadpoolTimer( + [](PTP_CALLBACK_INSTANCE, PVOID, PTP_TIMER) + { + FireEvent(); + }, + nullptr, + nullptr)); + ScheduleFireEventCallback(); + } + + ~ApiTelemetryLogger() WI_NOEXCEPT override + { + FireEvent(); + + // release handle to thread pool timer instead of its destructor being call, if process is being terminated and dll is not being unloaded dynamically + // destruction of threadpool timer is considered invalid during process termination + if (ProcessShutdownInProgress()) + { + m_fireEventThreadPoolTimer.release(); + } + } + + void ScheduleFireEventCallback() + { + // do not schedule thread pool timer callback, if process is being terminated and dll is not being unloaded dynamically + if (m_fireEventThreadPoolTimer && !ProcessShutdownInProgress()) + { + // Note this will override any pending scheduled callback + FILETIME dueTime; + *reinterpret_cast(&dueTime) = -static_cast(m_fireEventDelay * 10000); + SetThreadpoolTimer(m_fireEventThreadPoolTimer.get(), &dueTime, 0, 0); + } + } + + ApiDataList m_apiDataList; + wil::unique_threadpool_timer m_fireEventThreadPoolTimer; + + // The timer used to determine when to fire the next telemetry event (when it's fired based on a timer). + UINT m_fireEventDelay; + DWORD const c_fireEventDelayLimit = 20 * 60 * 1000; // 20 minutes + }; + } // namespace details + /// @endcond +} // namespace wil + +// Insert WI_LOG_API_USE near the top of a WinRT method to log that a method was called. +// The parameter should be the method name, for example: +// - WI_LOG_API_USE(L"LaunchUriAsync"); +// +// To log that the WinRT method reached a certain line of code, pass an override string: +// - WI_LOG_API_USE(L"LaunchUriAsync", "PointA"); +// +// If the class name can't be obtained at runtime, or if instrumenting a non-WinRT API, use the below macro, +// and pass the fully qualified class name (in the case of WinRT), or a string identifying the group of the non-WinRT API: +// - WI_LOG_CLASS_API_USE(RuntimeClass_Windows_System_Launcher, L"LaunchUriAsync"); +// +// Note: If the component can have a suspend handler, the following line should be added before including TraceLogging.h: +// - #define WIL_API_TELEMETRY_SUSPEND_HANDLER +// This will optimize the component's ability to upload telemetry, as it will upload on suspend. It will also disable +// frequent telemetry upload early in process execution. +// +// Alternatively, a component can call wil::details:ApiTelemetryLogger::FireEvent() from it's own suspend handler. +// If this is done, then in DLLMain it should also call wil::details::ApiTelemetryLogger::UsingOwnSuspendHandler(). +// +// Note: In your DLLMain method, please also add following code snippet +// +// wil::details::g_processShutdownInProgress = (lpReserved == nullptr); +// +// Adding this code snippet ensures that during process termination, thread pool timer +// destructor or SetThreadPoolTimer methods are not called, because they are invalid to call +// when dll is not getting dynamically unloaded. Skipping this code block will result in a continuable +// exception being thrown if process is getting terminated and dll in which ApiTelemetryLogger is not getting dynamically +// unloaded. For more details about lpReserved parameter, please refer to MSDN. + +#define __WI_LOG_CLASS_API_USE3(className, apiName, specialization) \ + do \ + { \ + static volatile long __wil_apiCallCounter = 0; \ + if (1 == ::InterlockedIncrementNoFence(&__wil_apiCallCounter)) \ + { \ + ::wil::details::ApiTelemetryLogger::InitApiData(className, apiName, specialization, &__wil_apiCallCounter); \ + } \ + } \ + while (0,0) +#define __WI_LOG_CLASS_API_USE2(className, apiName) \ + __WI_LOG_CLASS_API_USE3(className, apiName, nullptr) +#define __WI_LOG_API_USE2(apiName, specialization) \ + __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, specialization) +#define __WI_LOG_API_USE1(apiName) \ + __WI_LOG_CLASS_API_USE3(InternalGetRuntimeClassName(), apiName, nullptr) + +#define WI_LOG_CLASS_API_USE(...) \ + WI_MACRO_DISPATCH(__WI_LOG_CLASS_API_USE, __VA_ARGS__) + +#define WI_LOG_API_USE(...) \ + WI_MACRO_DISPATCH(__WI_LOG_API_USE, __VA_ARGS__) + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#pragma warning(pop) +#endif // __WIL_TRACELOGGING_H_INCLUDED diff --git a/Externals/WIL/include/wil/com.h b/Externals/WIL/include/wil/com.h index 6a994590d7c2..79dff91a6fda 100644 --- a/Externals/WIL/include/wil/com.h +++ b/Externals/WIL/include/wil/com.h @@ -16,6 +16,13 @@ #include "result.h" #include "resource.h" // last to ensure _COMBASEAPI_H_ protected definitions are available +#if __has_include() +#include +#endif +#if __has_include() +#include +#endif + // Forward declaration within WIL (see https://msdn.microsoft.com/en-us/library/br244983.aspx) /// @cond namespace Microsoft @@ -46,10 +53,10 @@ namespace wil { }; - typedef wistd::integral_constant tag_com_query; - typedef wistd::integral_constant tag_try_com_query; - typedef wistd::integral_constant tag_com_copy; - typedef wistd::integral_constant tag_try_com_copy; + using tag_com_query = wistd::integral_constant; + using tag_try_com_query = wistd::integral_constant; + using tag_com_copy = wistd::integral_constant; + using tag_try_com_copy = wistd::integral_constant; class default_query_policy { @@ -87,7 +94,7 @@ namespace wil template struct query_policy_helper { - typedef default_query_policy type; + using type = default_query_policy; }; class weak_query_policy @@ -99,7 +106,7 @@ namespace wil *result = nullptr; IInspectable* temp; - HRESULT hr = ptr->Resolve(__uuidof(IInspectable), reinterpret_cast(&temp)); + HRESULT hr = ptr->Resolve(__uuidof(IInspectable), &temp); if (SUCCEEDED(hr)) { if (temp == nullptr) @@ -144,7 +151,7 @@ namespace wil template <> struct query_policy_helper { - typedef weak_query_policy type; + using type = weak_query_policy; }; #if (NTDDI_VERSION >= NTDDI_WINBLUE) @@ -170,7 +177,7 @@ namespace wil template <> struct query_policy_helper { - typedef agile_query_policy type; + using type = agile_query_policy; }; #endif @@ -190,15 +197,15 @@ namespace wil class com_ptr_t { private: - typedef typename wistd::add_lvalue_reference::type element_type_reference; - typedef details::query_policy_t query_policy; + using element_type_reference = typename wistd::add_lvalue_reference::type; + using query_policy = details::query_policy_t; public: //! The function return result (HRESULT or void) for the given err_policy (see @ref page_errors). - typedef typename err_policy::result result; + using result = typename err_policy::result; //! The template type `T` being held by the com_ptr_t. - typedef T element_type; + using element_type = T; //! A pointer to the template type `T` being held by the com_ptr_t (what `get()` returns). - typedef T* pointer; + using pointer = T*; //! @name Constructors //! @{ @@ -359,8 +366,7 @@ namespace wil m_ptr = other; if (ptr) { - ULONG ref; - ref = ptr->Release(); + ULONG ref = ptr->Release(); WI_ASSERT_MSG(((other != ptr) || (ref > 0)), "Bug: Attaching the same already assigned, destructed pointer"); } } @@ -397,9 +403,9 @@ namespace wil //! Returns the address of the internal pointer casted to IUnknown** (releases ownership of the pointer BEFORE returning the address). //! @see put - IUnknown** put_unknown() WI_NOEXCEPT + ::IUnknown** put_unknown() WI_NOEXCEPT { - return reinterpret_cast(put()); + return reinterpret_cast<::IUnknown**>(put()); } //! Returns the address of the internal pointer (releases ownership of the pointer BEFORE returning the address). @@ -863,7 +869,7 @@ namespace wil // Internal Helpers /// @cond template - inline com_ptr_t(_In_ U* ptr, details::tag_com_query) + inline com_ptr_t(_In_ U* ptr, details::tag_com_query) : m_ptr(nullptr) { err_policy::HResult(details::query_policy_t::query(ptr, &m_ptr)); } @@ -875,14 +881,12 @@ namespace wil } template - inline com_ptr_t(_In_opt_ U* ptr, details::tag_com_copy) + inline com_ptr_t(_In_opt_ U* ptr, details::tag_com_copy) : m_ptr(nullptr) { if (ptr) { err_policy::HResult(details::query_policy_t::query(ptr, &m_ptr)); - return; } - m_ptr = nullptr; } template @@ -1182,6 +1186,43 @@ namespace wil #endif /// @endcond +#ifdef WIL_ENABLE_EXCEPTIONS + //! Constructs a `com_ptr` from a raw pointer. + //! This avoids having to restate the interface in pre-C++20. + //! Starting in C++20, you can write `wil::com_ptr(p)` directly. + //! ~~~ + //! void example(ILongNamedThing* thing) + //! { + //! callback([thing = wil::make_com_ptr(thing)] { /* do something */ }); + //! } + //! ~~~ + template + com_ptr make_com_ptr(T* p) { return p; } +#endif + + //! Constructs a `com_ptr_nothrow` from a raw pointer. + //! This avoids having to restate the interface in pre-C++20. + //! Starting in C++20, you can write `wil::com_ptr_nothrow(p)` directly. + //! ~~~ + //! void example(ILongNamedThing* thing) + //! { + //! callback([thing = wil::make_com_ptr_nothrow(thing)] { /* do something */ }); + //! } + //! ~~~ + template + com_ptr_nothrow make_com_ptr_nothrow(T* p) { return p; } + + //! Constructs a `com_ptr_failfast` from a raw pointer. + //! This avoids having to restate the interface in pre-C++20. + //! Starting in C++20, you can write `wil::com_ptr_failfast(p)` directly. + //! ~~~ + //! void example(ILongNamedThing* thing) + //! { + //! callback([thing = wil::make_com_ptr_failfast(thing)] { /* do something */ }); + //! } + //! ~~~ + template + com_ptr_failfast make_com_ptr_failfast(T* p) { return p; } //! @name Stand-alone query helpers //! * Source pointer can be raw interface pointer, any wil com_ptr, or WRL ComPtr @@ -1255,7 +1296,7 @@ namespace wil auto raw = com_raw_ptr(wistd::forward(ptrSource)); auto hr = details::query_policy_t::query(raw, ptrResult); __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr)); - RETURN_HR(hr); + return hr; } #ifdef WIL_ENABLE_EXCEPTIONS @@ -1297,7 +1338,7 @@ namespace wil auto raw = com_raw_ptr(wistd::forward(ptrSource)); auto hr = details::query_policy_t::query(raw, riid, ptrResult); __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr)); - RETURN_HR(hr); + return hr; } //! @} @@ -1687,7 +1728,7 @@ namespace wil auto raw = com_raw_ptr(wistd::forward(ptrSource)); auto hr = ::RoGetAgileReference(options, __uuidof(raw), raw, ptrResult); __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr)); - RETURN_HR(hr); + return hr; } #ifdef WIL_ENABLE_EXCEPTIONS @@ -1802,7 +1843,7 @@ namespace wil auto raw = com_raw_ptr(wistd::forward(ptrSource)); auto hr = details::GetWeakReference(raw, ptrResult); __analysis_assume(SUCCEEDED(hr) || (*ptrResult == nullptr)); - RETURN_HR(hr); + return hr; } #ifdef WIL_ENABLE_EXCEPTIONS @@ -1873,14 +1914,14 @@ namespace wil /** constructs a COM object using an CLSID on a specific interface or IUnknown. */ template - wil::com_ptr_failfast CoCreateInstanceFailFast(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) + wil::com_ptr_failfast CoCreateInstanceFailFast(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT { return CoCreateInstance(rclsid, dwClsContext); } /** constructs a COM object using the class as the identifier (that has an associated CLSID) on a specific interface or IUnknown. */ template - wil::com_ptr_failfast CoCreateInstanceFailFast(DWORD dwClsContext = CLSCTX_INPROC_SERVER) + wil::com_ptr_failfast CoCreateInstanceFailFast(DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT { return CoCreateInstanceFailFast(__uuidof(Class), dwClsContext); } @@ -1888,7 +1929,7 @@ namespace wil /** constructs a COM object using an CLSID on a specific interface or IUnknown. Note, failures are reported as a null result, the HRESULT is lost. */ template - wil::com_ptr_nothrow CoCreateInstanceNoThrow(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) + wil::com_ptr_nothrow CoCreateInstanceNoThrow(REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT { return CoCreateInstance(rclsid, dwClsContext); } @@ -1896,7 +1937,7 @@ namespace wil /** constructs a COM object using the class as the identifier (that has an associated CLSID) on a specific interface or IUnknown. Note, failures are reported as a null result, the HRESULT is lost. */ template - wil::com_ptr_nothrow CoCreateInstanceNoThrow(DWORD dwClsContext = CLSCTX_INPROC_SERVER) + wil::com_ptr_nothrow CoCreateInstanceNoThrow(DWORD dwClsContext = CLSCTX_INPROC_SERVER) WI_NOEXCEPT { return CoCreateInstanceNoThrow(__uuidof(Class), dwClsContext); } @@ -1949,6 +1990,140 @@ namespace wil { return CoGetClassObjectNoThrow(__uuidof(Class), dwClsContext); } + +#if __cpp_lib_apply && __has_include() + namespace details + { + template + auto CoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx) noexcept + { + MULTI_QI multiQis[sizeof...(Results)]{}; + const IID* iids[sizeof...(Results)]{ &__uuidof(Results)... }; + + static_assert(sizeof...(Results) > 0); + + for (auto i = 0U; i < sizeof...(Results); ++i) + { + multiQis[i].pIID = iids[i]; + } + + const auto hr = CoCreateInstanceEx(clsid, nullptr, clsCtx, nullptr, + ARRAYSIZE(multiQis), multiQis); + + std::tuple...> resultTuple; + + std::apply([i = 0, &multiQis](auto&... a) mutable + { + (a.attach(reinterpret_cast::type::pointer>(multiQis[i++].pItf)), ...); + }, resultTuple); + return std::tuple(hr, std::move(resultTuple)); + } + + template + auto com_multi_query(IUnknown* obj) + { + MULTI_QI multiQis[sizeof...(Results)]{}; + const IID* iids[sizeof...(Results)]{ &__uuidof(Results)... }; + + static_assert(sizeof...(Results) > 0); + + for (auto i = 0U; i < sizeof...(Results); ++i) + { + multiQis[i].pIID = iids[i]; + } + + std::tuple...> resultTuple{}; + + wil::com_ptr_nothrow multiQi; + auto hr = obj->QueryInterface(IID_PPV_ARGS(&multiQi)); + if (SUCCEEDED(hr)) + { + hr = multiQi->QueryMultipleInterfaces(ARRAYSIZE(multiQis), multiQis); + std::apply([i = 0, &multiQis](auto&... a) mutable + { + (a.attach(reinterpret_cast::type::pointer>(multiQis[i++].pItf)), ...); + }, resultTuple); + } + return std::tuple{hr, std::move(resultTuple)}; + } + } + +#ifdef WIL_ENABLE_EXCEPTIONS + // CoCreateInstanceEx can be used to improve performance by requesting multiple interfaces + // from an object at create time. This is most useful for out of process (OOP) servers, saving + // and RPC per extra interface requested. + template + auto CoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + THROW_IF_FAILED(error); + THROW_HR_IF(E_NOINTERFACE, error == CO_S_NOTALLINTERFACES); + return result; + } + + template + auto TryCoCreateInstanceEx(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + return result; + } +#endif + + // Returns [error, result] where result is a tuple with each of the requested interfaces. + template + auto CoCreateInstanceExNoThrow(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + if (SUCCEEDED(error) && (error == CO_S_NOTALLINTERFACES)) + { + return std::tuple{E_NOINTERFACE, {}}; + } + return std::tuple{error, result}; + } + + template + auto TryCoCreateInstanceExNoThrow(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + return result; + } + + template + auto CoCreateInstanceExFailFast(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + FAIL_FAST_IF_FAILED(error); + FAIL_FAST_HR_IF(E_NOINTERFACE, error == CO_S_NOTALLINTERFACES); + return result; + } + + template + auto TryCoCreateInstanceExFailFast(REFCLSID clsid, CLSCTX clsCtx = CLSCTX_LOCAL_SERVER) noexcept + { + auto [error, result] = details::CoCreateInstanceEx(clsid, clsCtx); + return result; + } + +#ifdef WIL_ENABLE_EXCEPTIONS + template + auto com_multi_query(IUnknown* obj) + { + auto [error, result] = details::com_multi_query(obj); + THROW_IF_FAILED(error); + THROW_HR_IF(E_NOINTERFACE, error == S_FALSE); + return result; + } + + template + auto try_com_multi_query(IUnknown* obj) + { + auto [error, result] = details::com_multi_query(obj); + return result; + } +#endif + +#endif // __cpp_lib_apply && __has_include() + #pragma endregion #pragma region Stream helpers @@ -2262,8 +2437,8 @@ namespace wil @param value Set to point to the allocated result of reading a string from `source` */ inline HRESULT stream_read_string_nothrow( - _In_ ISequentialStream* source, - _When_(options == empty_string_options::returns_empty, _Outptr_result_z_) _When_(options == empty_string_options::returns_null, _Outptr_result_maybenull_z_) wchar_t** value, + _In_ ISequentialStream* source, + _When_(options == empty_string_options::returns_empty, _Outptr_result_z_) _When_(options == empty_string_options::returns_null, _Outptr_result_maybenull_z_) wchar_t** value, empty_string_options options = empty_string_options::returns_empty) { unsigned short cch; @@ -2601,8 +2776,8 @@ namespace wil wil::stream_write_string(target, L"Waffles", 3); ~~~~ @param target The stream to which to write a string - @param source The string to write. Can be null if `writeLength` is zero - @param writeLength The number of characters to write from source into `target` + @param source The string to write. Can be null if `toWriteCch` is zero + @param toWriteCch The number of characters to write from source into `target` */ inline void stream_write_string(_In_ ISequentialStream* target, _In_reads_opt_(toWriteCch) const wchar_t* source, _In_ size_t toWriteCch) { diff --git a/Externals/WIL/include/wil/com_apartment_variable.h b/Externals/WIL/include/wil/com_apartment_variable.h new file mode 100644 index 000000000000..3ae0b9238ca4 --- /dev/null +++ b/Externals/WIL/include/wil/com_apartment_variable.h @@ -0,0 +1,467 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* +#ifndef __WIL_COM_APARTMENT_VARIABLE_INCLUDED +#define __WIL_COM_APARTMENT_VARIABLE_INCLUDED + +#include +#include +#include +#include +#include +#include + +#include "com.h" +#include "cppwinrt.h" +#include "result_macros.h" +#include "win32_helpers.h" + +#ifndef WIL_ENABLE_EXCEPTIONS +#error This header requires exceptions +#endif + +namespace wil +{ + // Determine if apartment variables are supported in the current process context. + // Prior to build 22365, the APIs needed to create apartment variables (e.g. RoGetApartmentIdentifier) + // failed for unpackaged processes. For MS people, see http://task.ms/31861017 for details. + // APIs needed to implement apartment variables did not work in non-packaged processes. + inline bool are_apartment_variables_supported() + { + unsigned long long apartmentId{}; + return RoGetApartmentIdentifier(&apartmentId) != HRESULT_FROM_WIN32(ERROR_API_UNAVAILABLE); + } + + // COM will implicitly rundown the apartment registration when it invokes a handler + // and blocks calling unregister when executing the callback. So be careful to release() + // this when callback is invoked to avoid a double free of the cookie. + using unique_apartment_shutdown_registration = unique_any; + + struct apartment_variable_platform + { + static unsigned long long GetApartmentId() + { + unsigned long long apartmentId{}; + FAIL_FAST_IF_FAILED(RoGetApartmentIdentifier(&apartmentId)); + return apartmentId; + } + + static auto RegisterForApartmentShutdown(IApartmentShutdown* observer) + { + unsigned long long id{}; + shutdown_type cookie; + THROW_IF_FAILED(RoRegisterForApartmentShutdown(observer, &id, cookie.put())); + return cookie; + } + + static void UnRegisterForApartmentShutdown(APARTMENT_SHUTDOWN_REGISTRATION_COOKIE cookie) + { + FAIL_FAST_IF_FAILED(RoUnregisterForApartmentShutdown(cookie)); + } + + static auto CoInitializeEx(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/) + { + return wil::CoInitializeEx(coinitFlags); + } + + // disable the test hook + inline static constexpr unsigned long AsyncRundownDelayForTestingRaces = INFINITE; + + using shutdown_type = wil::unique_apartment_shutdown_registration; + }; + + enum class apartment_variable_leak_action { fail_fast, ignore }; + + // "pins" the current module in memory by incrementing the module reference count and leaking that. + inline void ensure_module_stays_loaded() + { + static INIT_ONCE s_initLeakModule{}; // avoiding magic statics + wil::init_once_failfast(s_initLeakModule, []() + { + HMODULE result{}; + FAIL_FAST_IF(!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, L"", &result)); + return S_OK; + }); + } + + namespace details + { + // For the address of data, you can detect global variables by the ability to resolve the module from the address. + inline bool IsGlobalVariable(const void* moduleAddress) noexcept + { + wil::unique_hmodule moduleHandle; + return GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, static_cast(moduleAddress), &moduleHandle) != FALSE; + } + + struct any_maker_base + { + std::any(*adapter)(void*); + void* inner; + + std::any operator()() const + { + return adapter(inner); + } + }; + + template + struct any_maker : any_maker_base + { + any_maker() + { + adapter = [](auto) -> std::any { return T{}; }; + } + + any_maker(T(*maker)()) + { + adapter = [](auto maker) -> std::any { return reinterpret_cast(maker)(); }; + inner = reinterpret_cast(maker); + } + + template + any_maker(F&& f) + { + adapter = [](auto maker) -> std::any { return reinterpret_cast(maker)[0](); }; + inner = std::addressof(f); + } + }; + + template + struct apartment_variable_base + { + inline static winrt::slim_mutex s_lock; + + struct apartment_variable_storage + { + apartment_variable_storage(apartment_variable_storage&& other) noexcept = default; + apartment_variable_storage(const apartment_variable_storage& other) = delete; + + apartment_variable_storage(typename test_hook::shutdown_type&& cookie_) : cookie(std::move(cookie_)) + { + } + + winrt::apartment_context context; + typename test_hook::shutdown_type cookie; + // Variables are stored using the address of the apartment_variable_base<> as the key. + std::unordered_map*, std::any> variables; + }; + + // Apartment id -> variables storage. + inline static wil::object_without_destructor_on_shutdown< + std::unordered_map> + s_apartmentStorage; + + constexpr apartment_variable_base() = default; + ~apartment_variable_base() + { + // Global variables (object with static storage duration) + // are run down when the process is shutting down or when the + // dll is unloaded. At these points it is not possible to start + // an async operation and the work performed is not needed, + // the apartments with variable have been run down already. + const auto isGlobal = details::IsGlobalVariable(this); + if (!isGlobal) + { + clear_all_apartments_async(); + } + + if constexpr (leak_action == apartment_variable_leak_action::fail_fast) + { + if (isGlobal && !ProcessShutdownInProgress()) + { + // If you hit this fail fast it means the storage in s_apartmentStorage will be leaked. + // For apartment variables used in .exes, this is expected and + // this fail fast should be disabled using + // wil::apartment_variable + // + // For DLLs, if this is expected, disable this fail fast using + // wil::apartment_variable + // + // Use of apartment variables in DLLs only loaded by COM will never hit this case + // as COM will unload DLLs before apartments are rundown, + // providing the opportunity to empty s_apartmentStorage. + // + // But DLLs loaded and unloaded to call DLL entry points (outside of COM) may + // create variable storage that can't be cleaned up as the DLL lifetime is + // shorter that the COM lifetime. In these cases either + // 1) accept the leaks and disable the fail fast as describe above + // 2) disable module unloading by calling wil::ensure_module_stays_loaded + // 3) CoCreate an object from this DLL to make COM aware of the DLL + FAIL_FAST_IF(!s_apartmentStorage.get().empty()); + } + } + } + + // non-copyable, non-assignable + apartment_variable_base(apartment_variable_base const&) = delete; + void operator=(apartment_variable_base const&) = delete; + + // get current value or throw if no value has been set + std::any& get_existing() + { + if (auto any = get_if()) + { + return *any; + } + THROW_HR(E_NOT_SET); + } + + static apartment_variable_storage* get_current_apartment_variable_storage() + { + auto storage = s_apartmentStorage.get().find(test_hook::GetApartmentId()); + if (storage != s_apartmentStorage.get().end()) + { + return &storage->second; + } + return nullptr; + } + + apartment_variable_storage* ensure_current_apartment_variables() + { + auto variables = get_current_apartment_variable_storage(); + if (variables) + { + return variables; + } + + struct ApartmentObserver : public winrt::implements + { + void STDMETHODCALLTYPE OnUninitialize(unsigned long long apartmentId) noexcept override + { + // This code runs at apartment rundown so be careful to avoid deadlocks by + // extracting the variables under the lock then release them outside. + auto variables = [apartmentId]() + { + auto lock = winrt::slim_lock_guard(s_lock); + return s_apartmentStorage.get().extract(apartmentId); + }(); + WI_ASSERT(variables.key() == apartmentId); + // The system implicitly releases the shutdown observer + // after invoking the callback and does not allow calling unregister + // in the callback. So release the reference to the registration. + variables.mapped().cookie.release(); + } + }; + auto shutdownRegistration = test_hook::RegisterForApartmentShutdown(winrt::make().get()); + return &s_apartmentStorage.get().insert({ test_hook::GetApartmentId(), apartment_variable_storage(std::move(shutdownRegistration)) }).first->second; + } + + // get current value or custom-construct one on demand + template + std::any& get_or_create(any_maker && creator) + { + apartment_variable_storage* variable_storage = nullptr; + + { // scope for lock + auto lock = winrt::slim_lock_guard(s_lock); + variable_storage = ensure_current_apartment_variables(); + + auto variable = variable_storage->variables.find(this); + if (variable != variable_storage->variables.end()) + { + return variable->second; + } + } // drop the lock + + // create the object outside the lock to avoid reentrant deadlock + auto value = creator(); + + auto insert_lock = winrt::slim_lock_guard(s_lock); + // The insertion may fail if creator() recursively caused itself to be created, + // in which case we return the existing object and the falsely-created one is discarded. + return variable_storage->variables.insert({ this, std::move(value) }).first->second; + } + + // get pointer to current value or nullptr if no value has been set + std::any* get_if() + { + auto lock = winrt::slim_lock_guard(s_lock); + + if (auto variable_storage = get_current_apartment_variable_storage()) + { + auto variable = variable_storage->variables.find(this); + if (variable != variable_storage->variables.end()) + { + return &(variable->second); + } + } + return nullptr; + } + + // replace or create the current value, fail fasts if the value is not already stored + void set(std::any value) + { + // release value, with the swapped value, outside of the lock + { + auto lock = winrt::slim_lock_guard(s_lock); + auto storage = s_apartmentStorage.get().find(test_hook::GetApartmentId()); + FAIL_FAST_IF(storage == s_apartmentStorage.get().end()); + auto& variable_storage = storage->second; + auto variable = variable_storage.variables.find(this); + FAIL_FAST_IF(variable == variable_storage.variables.end()); + variable->second.swap(value); + } + } + + // remove any current value + void clear() + { + auto lock = winrt::slim_lock_guard(s_lock); + if (auto variable_storage = get_current_apartment_variable_storage()) + { + variable_storage->variables.erase(this); + if (variable_storage->variables.size() == 0) + { + s_apartmentStorage.get().erase(test_hook::GetApartmentId()); + } + } + } + + winrt::Windows::Foundation::IAsyncAction clear_all_apartments_async() + { + // gather all the apartments that hold objects we need to destruct + // (do not gather the objects themselves, because the apartment might + // destruct before we get around to it, and we should let the apartment + // destruct the object while it still can). + + std::vector contexts; + { // scope for lock + auto lock = winrt::slim_lock_guard(s_lock); + for (auto& [id, storage] : s_apartmentStorage.get()) + { + auto variable = storage.variables.find(this); + if (variable != storage.variables.end()) + { + contexts.push_back(storage.context); + } + } + } + + if (contexts.empty()) + { + co_return; + } + + wil::unique_mta_usage_cookie mta_reference; // need to extend the MTA due to async cleanup + FAIL_FAST_IF_FAILED(CoIncrementMTAUsage(mta_reference.put())); + + // From a background thread hop into each apartment to run down the object + // if it's still there. + co_await winrt::resume_background(); + + // This hook enables testing the case where execution of this method loses the race with + // apartment rundown by other means. + if constexpr (test_hook::AsyncRundownDelayForTestingRaces != INFINITE) + { + Sleep(test_hook::AsyncRundownDelayForTestingRaces); + } + + for (auto&& context : contexts) + { + try + { + co_await context; + clear(); + } + catch (winrt::hresult_error const& e) + { + // Ignore failure if apartment ran down before we could clean it up. + // The object already ran down as part of apartment cleanup. + if ((e.code() != RPC_E_SERVER_DIED_DNE) && + (e.code() != RPC_E_DISCONNECTED)) + { + throw; + } + } + catch (...) + { + FAIL_FAST(); + } + } + } + + static const auto& storage() + { + return s_apartmentStorage.get(); + } + + static size_t current_apartment_variable_count() + { + auto lock = winrt::slim_lock_guard(s_lock); + if (auto variable_storage = get_current_apartment_variable_storage()) + { + return variable_storage->variables.size(); + } + return 0; + } + }; + } + + // Apartment variables enable storing COM objects safely in globals + // (objects with static storage duration) by creating a unique copy + // in each apartment and managing their lifetime based on apartment rundown + // notifications. + // They can also be used for automatic or dynamic storage duration but those + // cases are less common. + // This type is also useful for storing references to apartment affine objects. + // + // Note, that apartment variables hosted in a COM DLL need to integrate with + // the DllCanUnloadNow() function to include the ref counts contributed by + // C++ WinRT objects. This is automatic for DLLs that host C++ WinRT objects + // but WRL projects will need to be updated to call winrt::get_module_lock(). + + template + struct apartment_variable : details::apartment_variable_base + { + using base = details::apartment_variable_base; + + constexpr apartment_variable() = default; + + // Get current value or throw if no value has been set. + T& get_existing() { return std::any_cast(base::get_existing()); } + + // Get current value or default-construct one on demand. + T& get_or_create() + { + return std::any_cast(base::get_or_create(details::any_maker())); + } + + // Get current value or custom-construct one on demand. + template + T& get_or_create(F&& f) + { + return std::any_cast(base::get_or_create(details::any_maker(std::forward(f)))); + } + + // get pointer to current value or nullptr if no value has been set + T* get_if() { return std::any_cast(base::get_if()); } + + // replace or create the current value, fail fasts if the value is not already stored + template void set(V&& value) { return base::set(std::forward(value)); } + + // Clear the value in the current apartment. + using base::clear; + + // Asynchronously clear the value in all apartments it is present in. + using base::clear_all_apartments_async; + + // For testing only. + // 1) To observe the state of the storage in the debugger assign this to + // a temporary variable (const&) and watch its contents. + // 2) Use this to test the implementation. + using base::storage; + // For testing only. The number of variables in the current apartment. + using base::current_apartment_variable_count; + }; +} + +#endif // __WIL_COM_APARTMENT_VARIABLE_INCLUDED diff --git a/Externals/WIL/include/wil/common.h b/Externals/WIL/include/wil/common.h index 88dcfeadcd85..5b336884a565 100644 --- a/Externals/WIL/include/wil/common.h +++ b/Externals/WIL/include/wil/common.h @@ -75,27 +75,7 @@ #define __WI_SUPPRESS_NOEXCEPT_ANALYSIS #endif -#if !defined(__cplusplus) || defined(__WIL_MIN_KERNEL) - -#define WI_ODR_PRAGMA(NAME, TOKEN) -#define WI_NOEXCEPT - -#else -#pragma warning(push) -#pragma warning(disable:4714) // __forceinline not honored - -// DO NOT add *any* further includes to this file -- there should be no dependencies from its usage #include -#include "wistd_type_traits.h" - -//! This macro inserts ODR violation protection; the macro allows it to be compatible with straight "C" code -#define WI_ODR_PRAGMA(NAME, TOKEN) __pragma(detect_mismatch("ODR_violation_" NAME "_mismatch", TOKEN)) - -#ifdef WIL_KERNEL_MODE -WI_ODR_PRAGMA("WIL_KERNEL_MODE", "1") -#else -WI_ODR_PRAGMA("WIL_KERNEL_MODE", "0") -#endif // Some SAL remapping / decoration to better support Doxygen. Macros that look like function calls can // confuse Doxygen when they are used to decorate a function or variable. We simplify some of these to @@ -107,73 +87,6 @@ WI_ODR_PRAGMA("WIL_KERNEL_MODE", "0") #define __declspec_selectany_ __declspec(selectany) /// @endcond -#if defined(_CPPUNWIND) && !defined(WIL_SUPPRESS_EXCEPTIONS) -/** This define is automatically set when exceptions are enabled within wil. -It is automatically defined when your code is compiled with exceptions enabled (via checking for the built-in -_CPPUNWIND flag) unless you explicitly define WIL_SUPPRESS_EXCEPTIONS ahead of including your first wil -header. All exception-based WIL methods and classes are included behind: -~~~~ -#ifdef WIL_ENABLE_EXCEPTIONS -// code -#endif -~~~~ -This enables exception-free code to directly include WIL headers without worrying about exception-based -routines suddenly becoming available. */ -#define WIL_ENABLE_EXCEPTIONS -#endif -/// @endcond - -/// @cond -#if defined(WIL_EXCEPTION_MODE) -static_assert(WIL_EXCEPTION_MODE <= 2, "Invalid exception mode"); -#elif !defined(WIL_LOCK_EXCEPTION_MODE) -#define WIL_EXCEPTION_MODE 0 // default, can link exception-based and non-exception based libraries together -#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "0") -#elif defined(WIL_ENABLE_EXCEPTIONS) -#define WIL_EXCEPTION_MODE 1 // new code optimization: ONLY support linking libraries together that have exceptions enabled -#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "1") -#else -#define WIL_EXCEPTION_MODE 2 // old code optimization: ONLY support linking libraries that are NOT using exceptions -#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "2") -#endif - -#if WIL_EXCEPTION_MODE == 1 && !defined(WIL_ENABLE_EXCEPTIONS) -#error Must enable exceptions when WIL_EXCEPTION_MODE == 1 -#endif - -// block for documentation only -#if defined(WIL_DOXYGEN) -/** This define can be explicitly set to disable exception usage within wil. -Normally this define is never needed as the WIL_ENABLE_EXCEPTIONS macro is enabled automatically by looking -at _CPPUNWIND. If your code compiles with exceptions enabled, but does not want to enable the exception-based -classes and methods from WIL, define this macro ahead of including the first WIL header. */ -#define WIL_SUPPRESS_EXCEPTIONS - -/** This define can be explicitly set to lock the process exception mode to WIL_ENABLE_EXCEPTIONS. -Locking the exception mode provides optimizations to exception barriers, staging hooks and DLL load costs as it eliminates the need to -do copy-on-write initialization of various function pointers and the necessary indirection that's done within WIL to avoid ODR violations -when linking libraries together with different exception handling semantics. */ -#define WIL_LOCK_EXCEPTION_MODE - -/** This define explicit sets the exception mode for the process to control optimizations. -Three exception modes are available: -0) This is the default. This enables a binary to link both exception-based and non-exception based libraries together that - use WIL. This adds overhead to exception barriers, DLL copy on write pages and indirection through function pointers to avoid ODR - violations when linking libraries together with different exception handling semantics. -1) Prefer this setting when it can be used. This locks the binary to only supporting libraries which were built with exceptions enabled. -2) This locks the binary to libraries built without exceptions. */ -#define WIL_EXCEPTION_MODE -#endif - -#if (__cplusplus >= 201703) || (_MSVC_LANG >= 201703) -#define WIL_HAS_CXX_17 1 -#else -#define WIL_HAS_CXX_17 0 -#endif - -// Until we'll have C++17 enabled in our code base, we're falling back to SAL -#define WI_NODISCARD __WI_LIBCPP_NODISCARD_ATTRIBUTE - //! @defgroup macrobuilding Macro Composition //! The following macros are building blocks primarily intended for authoring other macros. //! @{ @@ -327,8 +240,96 @@ Three exception modes are available: //! @} // Macro composition helpers -#define __R_ENABLE_IF_IS_CLASS(ptrType) wistd::enable_if_t::value, void*> = (void*)0 -#define __R_ENABLE_IF_IS_NOT_CLASS(ptrType) wistd::enable_if_t::value, void*> = (void*)0 +#if !defined(__cplusplus) || defined(__WIL_MIN_KERNEL) + +#define WI_ODR_PRAGMA(NAME, TOKEN) +#define WI_NOEXCEPT + +#else +#pragma warning(push) +#pragma warning(disable:4714) // __forceinline not honored + +// DO NOT add *any* further includes to this file -- there should be no dependencies from its usage +#include "wistd_type_traits.h" + +//! This macro inserts ODR violation protection; the macro allows it to be compatible with straight "C" code +#define WI_ODR_PRAGMA(NAME, TOKEN) __pragma(detect_mismatch("ODR_violation_" NAME "_mismatch", TOKEN)) + +#ifdef WIL_KERNEL_MODE +WI_ODR_PRAGMA("WIL_KERNEL_MODE", "1") +#else +WI_ODR_PRAGMA("WIL_KERNEL_MODE", "0") +#endif + +#if (defined(_CPPUNWIND) || defined(__EXCEPTIONS)) && !defined(WIL_SUPPRESS_EXCEPTIONS) +/** This define is automatically set when exceptions are enabled within wil. +It is automatically defined when your code is compiled with exceptions enabled (via checking for the built-in +_CPPUNWIND or __EXCEPTIONS flag) unless you explicitly define WIL_SUPPRESS_EXCEPTIONS ahead of including your first wil +header. All exception-based WIL methods and classes are included behind: +~~~~ +#ifdef WIL_ENABLE_EXCEPTIONS +// code +#endif +~~~~ +This enables exception-free code to directly include WIL headers without worrying about exception-based +routines suddenly becoming available. */ +#define WIL_ENABLE_EXCEPTIONS +#endif +/// @endcond + +/// @cond +#if defined(WIL_EXCEPTION_MODE) +static_assert(WIL_EXCEPTION_MODE <= 2, "Invalid exception mode"); +#elif !defined(WIL_LOCK_EXCEPTION_MODE) +#define WIL_EXCEPTION_MODE 0 // default, can link exception-based and non-exception based libraries together +#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "0") +#elif defined(WIL_ENABLE_EXCEPTIONS) +#define WIL_EXCEPTION_MODE 1 // new code optimization: ONLY support linking libraries together that have exceptions enabled +#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "1") +#else +#define WIL_EXCEPTION_MODE 2 // old code optimization: ONLY support linking libraries that are NOT using exceptions +#pragma detect_mismatch("ODR_violation_WIL_EXCEPTION_MODE_mismatch", "2") +#endif + +#if WIL_EXCEPTION_MODE == 1 && !defined(WIL_ENABLE_EXCEPTIONS) +#error Must enable exceptions when WIL_EXCEPTION_MODE == 1 +#endif + +// block for documentation only +#if defined(WIL_DOXYGEN) +/** This define can be explicitly set to disable exception usage within wil. +Normally this define is never needed as the WIL_ENABLE_EXCEPTIONS macro is enabled automatically by looking +at _CPPUNWIND. If your code compiles with exceptions enabled, but does not want to enable the exception-based +classes and methods from WIL, define this macro ahead of including the first WIL header. */ +#define WIL_SUPPRESS_EXCEPTIONS + +/** This define can be explicitly set to lock the process exception mode to WIL_ENABLE_EXCEPTIONS. +Locking the exception mode provides optimizations to exception barriers, staging hooks and DLL load costs as it eliminates the need to +do copy-on-write initialization of various function pointers and the necessary indirection that's done within WIL to avoid ODR violations +when linking libraries together with different exception handling semantics. */ +#define WIL_LOCK_EXCEPTION_MODE + +/** This define explicit sets the exception mode for the process to control optimizations. +Three exception modes are available: +0) This is the default. This enables a binary to link both exception-based and non-exception based libraries together that + use WIL. This adds overhead to exception barriers, DLL copy on write pages and indirection through function pointers to avoid ODR + violations when linking libraries together with different exception handling semantics. +1) Prefer this setting when it can be used. This locks the binary to only supporting libraries which were built with exceptions enabled. +2) This locks the binary to libraries built without exceptions. */ +#define WIL_EXCEPTION_MODE +#endif + +#if (__cplusplus >= 201703) || (_MSVC_LANG >= 201703) +#define WIL_HAS_CXX_17 1 +#else +#define WIL_HAS_CXX_17 0 +#endif + +// Until we'll have C++17 enabled in our code base, we're falling back to SAL +#define WI_NODISCARD __WI_LIBCPP_NODISCARD_ATTRIBUTE + +#define __R_ENABLE_IF_IS_CLASS(ptrType) wistd::enable_if_t::value, void*> = nullptr +#define __R_ENABLE_IF_IS_NOT_CLASS(ptrType) wistd::enable_if_t::value, void*> = nullptr //! @defgroup bitwise Bitwise Inspection and Manipulation //! Bitwise helpers to improve readability and reduce the error rate of bitwise operations. @@ -612,10 +613,10 @@ namespace wil } template <> - _Post_satisfies_(return == !!val) + _Post_satisfies_(return == (val != 0)) __forceinline constexpr bool verify_bool(unsigned char val) { - return !!val; + return (val != 0); } /** Verify that `val` is a Win32 BOOL value. @@ -651,16 +652,62 @@ namespace wil ~~~~ RETURN_HR_IF(static_cast(UIA_E_NOTSUPPORTED), (patternId != UIA_DragPatternId)); ~~~~ - @param val The HRESULT returning expression + @param hr The HRESULT returning expression @return An HRESULT representing the evaluation of `val`. */ template _Post_satisfies_(return == hr) inline constexpr long verify_hresult(T hr) { - // Note: Written in terms of 'int' as HRESULT is actually: typedef _Return_type_success_(return >= 0) long HRESULT + // Note: Written in terms of 'long' as HRESULT is actually: typedef _Return_type_success_(return >= 0) long HRESULT static_assert(wistd::is_same::value, "Wrong Type: HRESULT expected"); return hr; } + + /** Verify that `status` is an NTSTATUS value. + Other types will generate an intentional compilation error. Note that this will accept any `long` value as that is the + underlying typedef behind NTSTATUS. + //! + Note that occasionally you might run into an NTSTATUS which is directly defined with a #define, such as: + ~~~~ + #define STATUS_NOT_SUPPORTED 0x1 + ~~~~ + Though this looks like an `NTSTATUS`, this is actually an `unsigned long` (the hex specification forces this). When + these are encountered and they are NOT in the public SDK (have not yet shipped to the public), then you should change + their definition to match the manner in which `NTSTATUS` constants are defined in ntstatus.h: + ~~~~ + #define STATUS_NOT_SUPPORTED ((NTSTATUS)0xC00000BBL) + ~~~~ + When these are encountered in the public SDK, their type should not be changed and you should use a static_cast + to use this value in a macro that utilizes `verify_ntstatus`, for example: + ~~~~ + NT_RETURN_IF_FALSE(static_cast(STATUS_NOT_SUPPORTED), (dispatch->Version == HKE_V1_0)); + ~~~~ + @param status The NTSTATUS returning expression + @return An NTSTATUS representing the evaluation of `val`. */ + template + _Post_satisfies_(return == status) + inline long verify_ntstatus(T status) + { + // Note: Written in terms of 'long' as NTSTATUS is actually: typedef _Return_type_success_(return >= 0) long NTSTATUS + static_assert(wistd::is_same::value, "Wrong Type: NTSTATUS expected"); + return status; + } + + /** Verify that `error` is a Win32 error code. + Other types will generate an intentional compilation error. Note that this will accept any `long` value as that is + the underlying type used for WIN32 error codes, as well as any `DWORD` (`unsigned long`) value since this is the type + commonly used when manipulating Win32 error codes. + @param error The Win32 error code returning expression + @return An Win32 error code representing the evaluation of `error`. */ + template + _Post_satisfies_(return == error) + inline T verify_win32(T error) + { + // Note: Win32 error code are defined as 'long' (#define ERROR_SUCCESS 0L), but are more frequently used as DWORD (unsigned long). + // This accept both types. + static_assert(wistd::is_same::value || wistd::is_same::value, "Wrong Type: Win32 error code (long / unsigned long) expected"); + return error; + } /// @} // end type validation routines /// @cond @@ -706,31 +753,31 @@ namespace wil template <> struct variable_size<1> { - typedef unsigned char type; + using type = unsigned char; }; template <> struct variable_size<2> { - typedef unsigned short type; + using type = unsigned short; }; template <> struct variable_size<4> { - typedef unsigned long type; + using type = unsigned long; }; template <> struct variable_size<8> { - typedef unsigned long long type; + using type = unsigned long long; }; template struct variable_size_mapping { - typedef typename variable_size::type type; + using type = typename variable_size::type; }; } // details /// @endcond @@ -739,6 +786,10 @@ namespace wil This allows code to generically convert any enum class to it's corresponding underlying type. */ template using integral_from_enum = typename details::variable_size_mapping::type; + + //! Declares a name that intentionally hides a name from an outer scope. + //! Use this to prevent accidental use of a parameter or lambda captured variable. + using hide_name = void(struct hidden_name); } // wil #pragma warning(pop) diff --git a/Externals/WIL/include/wil/cppwinrt.h b/Externals/WIL/include/wil/cppwinrt.h index c7da612fec87..1cc8d263babb 100644 --- a/Externals/WIL/include/wil/cppwinrt.h +++ b/Externals/WIL/include/wil/cppwinrt.h @@ -14,6 +14,7 @@ #include "common.h" #include #include +#include #include // WIL and C++/WinRT use two different exception types for communicating HRESULT failures. Thus, both libraries need to @@ -27,18 +28,43 @@ namespace wil::details { // Since the C++/WinRT version macro is a string... - inline constexpr int major_version_from_string(const char* versionString) + // For example: "2.0.221104.6" + inline constexpr int version_from_string(const char* versionString) { int result = 0; - auto str = versionString; - while ((*str >= '0') && (*str <= '9')) + while ((*versionString >= '0') && (*versionString <= '9')) { - result = result * 10 + (*str - '0'); - ++str; + result = result * 10 + (*versionString - '0'); + ++versionString; } return result; } + + inline constexpr int major_version_from_string(const char* versionString) + { + return version_from_string(versionString); + } + + inline constexpr int minor_version_from_string(const char* versionString) + { + int dotCount = 0; + while ((*versionString != '\0')) + { + if (*versionString == '.') + { + ++dotCount; + } + + ++versionString; + if (dotCount == 2) + { + return version_from_string(versionString); + } + } + + return 0; + } } /// @endcond @@ -74,6 +100,9 @@ static_assert(::wil::details::major_version_from_string(CPPWINRT_VERSION) >= 2, // use it unless the version of C++/WinRT is high enough extern std::int32_t(__stdcall* winrt_to_hresult_handler)(void*) noexcept; +// The same is true with this function pointer as well, except that the version must be 2.X or higher. +extern void(__stdcall* winrt_throw_hresult_handler)(uint32_t, char const*, char const*, void*, winrt::hresult const) noexcept; + /// @cond namespace wil::details { @@ -108,7 +137,7 @@ namespace wil::details catch (const winrt::hresult_error& exception) { MaybeGetExceptionString(exception, debugString, debugStringChars); - return exception.code().value; + return exception.to_abi(); } catch (const std::bad_alloc& exception) { @@ -149,7 +178,7 @@ namespace wil::details catch (const winrt::hresult_error& exception) { MaybeGetExceptionString(exception, debugString, debugStringChars); - return exception.code().value; + return exception.to_abi(); } catch (const std::bad_alloc& exception) { @@ -192,6 +221,12 @@ namespace wil return static_cast(details::ReportFailure_CaughtException(__R_DIAGNOSTICS_RA(DiagnosticsInfo{}, returnAddress))); } + inline void __stdcall winrt_throw_hresult(uint32_t lineNumber, char const* fileName, char const* functionName, void* returnAddress, winrt::hresult const result) noexcept + { + void* callerReturnAddress{nullptr}; PCSTR code{nullptr}; + wil::details::ReportFailure_Hr(__R_FN_CALL_FULL __R_COMMA result); + } + inline void WilInitialize_CppWinRT() { details::g_pfnResultFromCaughtException_CppWinRt = details::ResultFromCaughtException_CppWinRt; @@ -199,9 +234,15 @@ namespace wil { WI_ASSERT(winrt_to_hresult_handler == nullptr); winrt_to_hresult_handler = winrt_to_hresult; + + if constexpr (details::minor_version_from_string(CPPWINRT_VERSION) >= 210122) + { + WI_ASSERT(winrt_throw_hresult_handler == nullptr); + winrt_throw_hresult_handler = winrt_throw_hresult; + } } } - + /// @cond namespace details { @@ -236,6 +277,11 @@ namespace wil return static_cast(winrt::get_abi(object)); } + inline auto str_raw_ptr(const winrt::hstring& str) noexcept + { + return str.c_str(); + } + template auto put_abi(T& object) noexcept { @@ -246,6 +292,117 @@ namespace wil { return reinterpret_cast(winrt::put_abi(object)); } + + inline ::IUnknown* com_raw_ptr(const winrt::Windows::Foundation::IUnknown& ptr) noexcept + { + return static_cast<::IUnknown*>(winrt::get_abi(ptr)); + } + + // Needed to power wil::cx_object_from_abi that requires IInspectable + inline ::IInspectable* com_raw_ptr(const winrt::Windows::Foundation::IInspectable& ptr) noexcept + { + return static_cast<::IInspectable*>(winrt::get_abi(ptr)); + } + + // Taken from the docs.microsoft.com article + template + T convert_from_abi(::IUnknown* from) + { + T to{ nullptr }; // `T` is a projected type. + winrt::check_hresult(from->QueryInterface(winrt::guid_of(), winrt::put_abi(to))); + return to; + } + + // For obtaining an object from an interop method on the factory. Example: + // winrt::InputPane inputPane = wil::capture_interop(&IInputPaneInterop::GetForWindow, hwnd); + // If the method produces something different from the factory type: + // winrt::IAsyncAction action = wil::capture_interop(&IAccountsSettingsPaneInterop::ShowAddAccountForWindow, hwnd); + template + auto capture_interop(HRESULT(__stdcall Interface::* method)(InterfaceArgs...), Args&&... args) + { + auto interop = winrt::get_activation_factory(); + return winrt::capture(interop, method, std::forward(args)...); + } + + // For obtaining an object from an interop method on an instance. Example: + // winrt::UserActivitySession session = wil::capture_interop(activity, &IUserActivityInterop::CreateSessionForWindow, hwnd); + template + auto capture_interop(winrt::Windows::Foundation::IUnknown const& o, HRESULT(__stdcall Interface::* method)(InterfaceArgs...), Args&&... args) + { + return winrt::capture(o.as(), method, std::forward(args)...); + } + + /** Holds a reference to the host C++/WinRT module to prevent it from being unloaded. + Normally, this is done by being in an IAsyncOperation coroutine or by holding a strong + reference to a C++/WinRT object hosted in the same module, but if you have neither, + you will need to hold a reference explicitly. For the WRL equivalent, see wrl_module_reference. + + This can be used as a base, which permits EBO: + ~~~~ + struct NonWinrtObject : wil::winrt_module_reference + { + int value; + }; + + // DLL will not be unloaded as long as NonWinrtObject is still alive. + auto p = std::make_unique(); + ~~~~ + + Or it can be used as a member (with [[no_unique_address]] to avoid + occupying any memory): + ~~~~ + struct NonWinrtObject + { + int value; + + [[no_unique_address]] wil::winrt_module_reference module_ref; + }; + + // DLL will not be unloaded as long as NonWinrtObject is still alive. + auto p = std::make_unique(); + ~~~~ + + If using it to prevent the host DLL from unloading while a thread + or threadpool work item is still running, create the object before + starting the thread, and pass it to the thread. This avoids a race + condition where the host DLL could get unloaded before the thread starts. + ~~~~ + std::thread([module_ref = wil::winrt_module_reference()]() { do_background_work(); }); + + // Don't do this (race condition) + std::thread([]() { wil::winrt_module_reference module_ref; do_background_work(); }); // WRONG + ~~~~ + + Also useful in coroutines that neither capture DLL-hosted COM objects, nor are themselves + DLL-hosted COM objects. (If the coroutine returns IAsyncAction or captures a get_strong() + of its containing WinRT class, then the IAsyncAction or strong reference will itself keep + a strong reference to the host module.) + ~~~~ + winrt::fire_and_forget ContinueBackgroundWork() + { + // prevent DLL from unloading while we are running on a background thread. + // Do this before switching to the background thread. + wil::winrt_module_reference module_ref; + + co_await winrt::resume_background(); + do_background_work(); + }; + ~~~~ + */ + struct [[nodiscard]] winrt_module_reference + { + winrt_module_reference() + { + ++winrt::get_module_lock(); + } + + winrt_module_reference(winrt_module_reference const&) : winrt_module_reference() {} + + ~winrt_module_reference() + { + --winrt::get_module_lock(); + } + }; } #endif // __WIL_CPPWINRT_INCLUDED diff --git a/Externals/WIL/include/wil/cppwinrt_helpers.h b/Externals/WIL/include/wil/cppwinrt_helpers.h new file mode 100644 index 000000000000..6678b8f3bb0a --- /dev/null +++ b/Externals/WIL/include/wil/cppwinrt_helpers.h @@ -0,0 +1,352 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* + +#ifndef __WIL_CPPWINRT_HELPERS_DEFINED +#define __WIL_CPPWINRT_HELPERS_DEFINED + +/// @cond +namespace wil::details +{ + struct dispatcher_RunAsync + { + template + static void Schedule(Dispatcher const& dispatcher, Args&&... args) + { + dispatcher.RunAsync(std::forward(args)...); + } + }; + + struct dispatcher_TryEnqueue + { + template + static void Schedule(Dispatcher const& dispatcher, Args&&... args) + { + dispatcher.TryEnqueue(std::forward(args)...); + } + }; + + template struct dispatcher_traits; +} + +#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) +#include +namespace wil::details +{ + template using coroutine_handle = std::experimental::coroutine_handle; +} +#elif defined(__cpp_lib_coroutine) && (__cpp_lib_coroutine >= 201902L) +#include +namespace wil::details +{ + template using coroutine_handle = std::coroutine_handle; +} +#endif +/// @endcond + +#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) || (defined(__cpp_lib_coroutine) && (__cpp_lib_coroutine >= 201902L)) +/// @cond +namespace wil::details +{ + struct dispatched_handler_state + { + details::coroutine_handle<> handle{}; + bool orphaned = false; + }; + + struct dispatcher_handler + { + dispatcher_handler(dispatched_handler_state* state) : m_state(state) { } + dispatcher_handler(dispatcher_handler&& other) noexcept : m_state(std::exchange(other.m_state, {})) {} + + ~dispatcher_handler() + { + if (m_state && m_state->handle) + { + m_state->orphaned = true; + Complete(); + } + } + void operator()() + { + Complete(); + } + + void Complete() + { + auto state = std::exchange(m_state, nullptr); + std::exchange(state->handle, {}).resume(); + } + + dispatched_handler_state* m_state; + }; +} +/// @endcond + +namespace wil +{ + //! Resumes coroutine execution on the thread associated with the dispatcher, or throws + //! an exception (from an arbitrary thread) if unable. Supported dispatchers are + //! Windows.System.DispatcherQueue, Microsoft.System.DispatcherQueue, + //! Microsoft.UI.Dispatching.DispatcherQueue, and Windows.UI.Core.CoreDispatcher, + //! but you must include the corresponding header before including + //! wil\cppwinrt_helpers.h. It is okay to include wil\cppwinrt_helpers.h multiple times: + //! support will be enabled for any winrt/Namespace.h headers that were included since + //! the previous inclusion of wil\cppwinrt_headers.h. + template + [[nodiscard]] auto resume_foreground(Dispatcher const& dispatcher, + typename details::dispatcher_traits::Priority priority = details::dispatcher_traits::Priority::Normal) + { + using Traits = details::dispatcher_traits; + using Priority = typename Traits::Priority; + using Handler = typename Traits::Handler; + + struct awaitable + { + awaitable(Dispatcher const& dispatcher, Priority priority) noexcept : + m_dispatcher(dispatcher), + m_priority(priority) + { + } + bool await_ready() const noexcept { return false; } + + void await_suspend(details::coroutine_handle<> handle) + { + m_state.handle = handle; + Handler handler{ details::dispatcher_handler(&m_state) }; + try + { + // The return value of Schedule is not reliable. Use the dispatcher_handler destructor + // to detect whether the work item failed to run. + Traits::Scheduler::Schedule(m_dispatcher, m_priority, handler); + } + catch (...) + { + m_state.handle = nullptr; // the exception will resume the coroutine, so the handler shouldn't do it + throw; + } + } + + void await_resume() const + { + if (m_state.orphaned) + { + throw winrt::hresult_error(static_cast(0x800701ab)); // HRESULT_FROM_WIN32(ERROR_NO_TASK_QUEUE) + } + } + + private: + Dispatcher const& m_dispatcher; + Priority const m_priority; + details::dispatched_handler_state m_state; + }; + return awaitable{ dispatcher, priority }; + } +} +#endif // Coroutines are supported + +#endif // __WIL_CPPWINRT_HELPERS_DEFINED + +/// @cond +#if defined(WINRT_Windows_UI_Core_H) && !defined(__WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS) +#define __WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS +namespace wil::details +{ + template<> + struct dispatcher_traits + { + using Priority = winrt::Windows::UI::Core::CoreDispatcherPriority; + using Handler = winrt::Windows::UI::Core::DispatchedHandler; + using Scheduler = dispatcher_RunAsync; + }; +} +#endif // __WIL_CPPWINRT_WINDOWS_UI_CORE_HELPERS + +#if defined(WINRT_Windows_System_H) && !defined(__WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS) +#define __WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS +namespace wil::details +{ + template<> + struct dispatcher_traits + { + using Priority = winrt::Windows::System::DispatcherQueuePriority; + using Handler = winrt::Windows::System::DispatcherQueueHandler; + using Scheduler = dispatcher_TryEnqueue; + }; +} +#endif // __WIL_CPPWINRT_WINDOWS_SYSTEM_HELPERS + +#if defined(WINRT_Microsoft_System_H) && !defined(__WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS) +#define __WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS +namespace wil::details +{ + template<> + struct dispatcher_traits + { + using Priority = winrt::Microsoft::System::DispatcherQueuePriority; + using Handler = winrt::Microsoft::System::DispatcherQueueHandler; + using Scheduler = dispatcher_TryEnqueue; + }; +} +#endif // __WIL_CPPWINRT_MICROSOFT_SYSTEM_HELPERS + +#if defined(WINRT_Microsoft_UI_Dispatching_H) && !defined(__WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS) +#define __WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS +namespace wil::details +{ + template<> + struct dispatcher_traits + { + using Priority = winrt::Microsoft::UI::Dispatching::DispatcherQueuePriority; + using Handler = winrt::Microsoft::UI::Dispatching::DispatcherQueueHandler; + using Scheduler = dispatcher_TryEnqueue; + }; +} +#endif // __WIL_CPPWINRT_MICROSOFT_UI_DISPATCHING_HELPERS +/// @endcond + +#if defined(WINRT_Windows_Foundation_Collections_H) && !defined(__WIL_CPPWINRT_WINDOWS_FOUNDATION_COLLECTION_HELPERS) +#define __WIL_CPPWINRT_WINDOWS_FOUNDATION_COLLECTION_HELPERS +namespace wil +{ + /// @cond + namespace details + { + template struct is_winrt_vector_like { + private: + template ().GetMany(std::declval().Size(), + winrt::array_view().GetAt(0))>{}))> + static constexpr bool get_value(int) { return true; } + template static constexpr bool get_value(...) { return false; } + public: + static constexpr bool value = get_value(0); + }; + + template struct is_winrt_iterator_like { + private: + template ().GetMany(winrt::array_view().Current())>{}))> + static constexpr bool get_value(int) { return true; } + template static constexpr bool get_value(...) { return false; } + public: + static constexpr bool value = get_value(0); + }; + + template constexpr T empty() noexcept + { + if constexpr (std::is_base_of_v) + { + return nullptr; + } + else + { + return {}; + } + } + } + /// @endcond + + /** Converts C++ / WinRT vectors, iterators, and iterables to std::vector by requesting the + collection's data in bulk. This can be more efficient in terms of IPC cost than iteratively + processing the collection. + ~~~ + winrt::IVector collection = GetCollection(); + std::vector allData = wil::to_vector(collection); // read all data from collection + for (winrt::hstring const& item : allData) + { + // use item + } + ~~~ + Can be used for IVector, IVectorView, IIterable, IIterator, and any type or + interface that C++/WinRT projects those interfaces for (PropertySet, IMap, etc.) + Iterable-only types fetch content in units of 64. When used with an iterator, the returned + vector contains the iterator's current position and any others after it. + */ + template auto to_vector(TSrc const& src) + { + if constexpr (details::is_winrt_vector_like::value) + { + using T = decltype(src.GetAt(0)); + std::vector result; + if (auto expected = src.Size()) + { + result.resize(expected + 1, details::empty()); + auto actual = src.GetMany(0, result); + if (actual > expected) + { + throw winrt::hresult_changed_state(); + } + result.resize(actual); + } + return result; + } + else if constexpr (details::is_winrt_iterator_like::value) + { + using T = decltype(src.Current()); + std::vector result; + constexpr uint32_t chunkSize = 64; + while (true) + { + auto const lastSize = result.size(); + result.resize(lastSize + chunkSize, details::empty()); + auto fetched = src.GetMany({result.data() + lastSize, result.data() + lastSize + chunkSize }); + if (fetched < chunkSize) + { + result.resize(lastSize + fetched); + break; + } + } + return result; + } + else + { + return to_vector(src.First()); + } + } +} +#endif + +#if defined(WINRT_Windows_UI_H) && defined(_WINDOWS_UI_INTEROP_H_) && !defined(__WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS) +#define __WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS +#if !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__) && !defined(MIDL_NS_PREFIX) +#pragma push_macro("ABI") +#undef ABI +#define ABI +#endif + +namespace wil +{ +#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_WIN10_CU) + //! The following methods require that you include both + //! before including wil/cppwinrt_helpers.h, and that NTDDI_VERSION + //! is at least NTDDI_WIN10_CU. It is okay to include wil\cppwinrt_helpers.h multiple times: + //! support will be enabled for any headers that were included since the previous inclusion + //! of wil\cppwinrt_headers.h. + inline winrt::Windows::UI::WindowId GetWindowIdFromWindow(HWND hwnd) + { + ABI::Windows::UI::WindowId abiWindowId; + winrt::check_hresult(::GetWindowIdFromWindow(hwnd, &abiWindowId)); + return winrt::Windows::UI::WindowId{ abiWindowId.Value }; + } + + inline HWND GetWindowFromWindowId(winrt::Windows::UI::WindowId windowId) + { + HWND hwnd; + winrt::check_hresult(::GetWindowFromWindowId({ windowId.Value }, &hwnd)); + return hwnd; + } +#endif /*defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_WIN10_CU)*/ +} + +#if !defined(____x_ABI_CWindows_CFoundation_CIClosable_FWD_DEFINED__) && !defined(MIDL_NS_PREFIX) +#pragma pop_macro("ABI") +#endif +#endif // __WIL_CPPWINRT_WINDOWS_UI_INTEROP_HELPERS diff --git a/Externals/WIL/include/wil/cppwinrt_wrl.h b/Externals/WIL/include/wil/cppwinrt_wrl.h new file mode 100644 index 000000000000..4f5fa36eb4cb --- /dev/null +++ b/Externals/WIL/include/wil/cppwinrt_wrl.h @@ -0,0 +1,74 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* +#ifndef __WIL_CPPWINRT_WRL_INCLUDED +#define __WIL_CPPWINRT_WRL_INCLUDED + +#include "cppwinrt.h" +#include + +#include "result_macros.h" +#include + +// wil::wrl_factory_for_winrt_com_class provides interopability between a +// C++/WinRT class and the WRL Module system, allowing the winrt class to be +// CoCreatable. +// +// Usage: +// - In your cpp, add: +// CoCreatableCppWinRtClass(className) +// +// - In the dll.cpp (or equivalent) for the module containing your class, add: +// CoCreatableClassWrlCreatorMapInclude(className) +// +namespace wil +{ + namespace details + { + template + class module_count_wrapper : public TCppWinRTClass + { + public: + module_count_wrapper() + { + if (auto modulePtr = ::Microsoft::WRL::GetModuleBase()) + { + modulePtr->IncrementObjectCount(); + } + } + + virtual ~module_count_wrapper() + { + if (auto modulePtr = ::Microsoft::WRL::GetModuleBase()) + { + modulePtr->DecrementObjectCount(); + } + } + }; + } + + template + class wrl_factory_for_winrt_com_class : public ::Microsoft::WRL::ClassFactory<> + { + public: + IFACEMETHODIMP CreateInstance(_In_opt_ ::IUnknown* unknownOuter, REFIID riid, _COM_Outptr_ void **object) noexcept try + { + *object = nullptr; + RETURN_HR_IF(CLASS_E_NOAGGREGATION, unknownOuter != nullptr); + + return winrt::make>().as(riid, object); + } + CATCH_RETURN() + }; +} + +#define CoCreatableCppWinRtClass(className) CoCreatableClassWithFactory(className, ::wil::wrl_factory_for_winrt_com_class) + +#endif // __WIL_CPPWINRT_WRL_INCLUDED diff --git a/Externals/WIL/include/wil/filesystem.h b/Externals/WIL/include/wil/filesystem.h index b74cd4308670..b2bd2e7283e3 100644 --- a/Externals/WIL/include/wil/filesystem.h +++ b/Externals/WIL/include/wil/filesystem.h @@ -31,6 +31,7 @@ namespace wil return wcsncmp(path, L"\\\\?\\", 4) == 0; } +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) //! Find the last segment of a path. Matches the behavior of shlwapi!PathFindFileNameW() //! note, does not support streams being specified like PathFindFileNameW(), is that a bug or a feature? inline PCWSTR find_last_path_segment(_In_ PCWSTR path) @@ -51,6 +52,7 @@ namespace wil } return result; } +#endif //! Determine if the file name is one of the special "." or ".." names. inline bool path_is_dot_or_dotdot(_In_ PCWSTR fileName) @@ -83,7 +85,7 @@ namespace wil return false; } -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7) // PathCch.h APIs are only in desktop API for now. @@ -111,7 +113,7 @@ namespace wil { if (::CreateDirectoryW(path, nullptr) == FALSE) { - DWORD const lastError = ::GetLastError(); + DWORD lastError = ::GetLastError(); if (lastError == ERROR_PATH_NOT_FOUND) { size_t parentLength; @@ -120,9 +122,16 @@ namespace wil wistd::unique_ptr parent(new (std::nothrow) wchar_t[parentLength + 1]); RETURN_IF_NULL_ALLOC(parent.get()); RETURN_IF_FAILED(StringCchCopyNW(parent.get(), parentLength + 1, path, parentLength)); - CreateDirectoryDeepNoThrow(parent.get()); // recurs + RETURN_IF_FAILED(CreateDirectoryDeepNoThrow(parent.get())); // recurs + } + if (::CreateDirectoryW(path, nullptr) == FALSE) + { + lastError = ::GetLastError(); + if (lastError != ERROR_ALREADY_EXISTS) + { + RETURN_WIN32(lastError); + } } - RETURN_IF_WIN32_BOOL_FALSE(::CreateDirectoryW(path, nullptr)); } else if (lastError != ERROR_ALREADY_EXISTS) { @@ -183,13 +192,53 @@ namespace wil enum class RemoveDirectoryOptions { None = 0, - KeepRootDirectory = 0x1 + KeepRootDirectory = 0x1, + RemoveReadOnly = 0x2, }; DEFINE_ENUM_FLAG_OPERATORS(RemoveDirectoryOptions); + namespace details + { + // Reparse points should not be traversed in most recursive walks of the file system, + // unless allowed through the appropriate reparse tag. + inline bool CanRecurseIntoDirectory(const FILE_ATTRIBUTE_TAG_INFO& info) + { + return (WI_IsFlagSet(info.FileAttributes, FILE_ATTRIBUTE_DIRECTORY) && + (WI_IsFlagClear(info.FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT) || + (IsReparseTagDirectory(info.ReparseTag) || (info.ReparseTag == IO_REPARSE_TAG_WCI)))); + } + } + + // Retrieve a handle to a directory only if it is safe to recurse into. + inline wil::unique_hfile TryCreateFileCanRecurseIntoDirectory(PCWSTR path, PWIN32_FIND_DATAW fileFindData, DWORD access = GENERIC_READ | /*DELETE*/ 0x00010000L, DWORD share = FILE_SHARE_READ) + { + wil::unique_hfile result(CreateFileW(path, access, share, + nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr)); + if (result) + { + FILE_ATTRIBUTE_TAG_INFO fati; + if (GetFileInformationByHandleEx(result.get(), FileAttributeTagInfo, &fati, sizeof(fati)) && + details::CanRecurseIntoDirectory(fati)) + { + if (fileFindData) + { + // Refresh the found file's data now that we have secured the directory from external manipulation. + fileFindData->dwFileAttributes = fati.FileAttributes; + fileFindData->dwReserved0 = fati.ReparseTag; + } + } + else + { + result.reset(); + } + } + + return result; + } + // If inputPath is a non-normalized name be sure to pass an extended length form to ensure // it can be addressed and deleted. - inline HRESULT RemoveDirectoryRecursiveNoThrow(PCWSTR inputPath, RemoveDirectoryOptions options = RemoveDirectoryOptions::None) WI_NOEXCEPT + inline HRESULT RemoveDirectoryRecursiveNoThrow(PCWSTR inputPath, RemoveDirectoryOptions options = RemoveDirectoryOptions::None, HANDLE deleteHandle = INVALID_HANDLE_VALUE) WI_NOEXCEPT { wil::unique_hlocal_string path; PATHCCH_OPTIONS combineOptions = PATHCCH_NONE; @@ -228,14 +277,50 @@ namespace wil PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH | PATHCCH_DO_NOT_NORMALIZE_SEGMENTS, &pathToDelete)); if (WI_IsFlagSet(fd.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY)) { - RemoveDirectoryOptions localOptions = options; - RETURN_IF_FAILED(RemoveDirectoryRecursiveNoThrow(pathToDelete.get(), WI_ClearFlag(localOptions, RemoveDirectoryOptions::KeepRootDirectory))); + // Get a handle to the directory to delete, preventing it from being replaced to prevent writes which could be used + // to bypass permission checks, and verify that it is not a name surrogate (e.g. symlink, mount point, etc). + wil::unique_hfile recursivelyDeletableDirectoryHandle = TryCreateFileCanRecurseIntoDirectory(pathToDelete.get(), &fd); + if (recursivelyDeletableDirectoryHandle) + { + RemoveDirectoryOptions localOptions = options; + RETURN_IF_FAILED(RemoveDirectoryRecursiveNoThrow(pathToDelete.get(), WI_ClearFlag(localOptions, RemoveDirectoryOptions::KeepRootDirectory), recursivelyDeletableDirectoryHandle.get())); + } + else if (WI_IsFlagSet(fd.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) + { + // This is a directory reparse point that should not be recursed. Delete it without traversing into it. + RETURN_IF_WIN32_BOOL_FALSE(::RemoveDirectoryW(pathToDelete.get())); + } + else + { + // Failed to grab a handle to the file or to read its attributes. This is not safe to recurse. + RETURN_WIN32(::GetLastError()); + } } else { - // note: if pathToDelete is read-only this will fail, consider adding - // RemoveDirectoryOptions::RemoveReadOnly to enable this behavior. - RETURN_IF_WIN32_BOOL_FALSE(::DeleteFileW(pathToDelete.get())); + // Try a DeleteFile. Some errors may be recoverable. + if (!::DeleteFileW(pathToDelete.get())) + { + // Fail for anything other than ERROR_ACCESS_DENIED with option to RemoveReadOnly available + bool potentiallyFixableReadOnlyProblem = + WI_IsFlagSet(options, RemoveDirectoryOptions::RemoveReadOnly) && ::GetLastError() == ERROR_ACCESS_DENIED; + RETURN_LAST_ERROR_IF(!potentiallyFixableReadOnlyProblem); + + // Fail if the file does not have read-only set, likely just an ACL problem + DWORD fileAttr = ::GetFileAttributesW(pathToDelete.get()); + RETURN_LAST_ERROR_IF(!WI_IsFlagSet(fileAttr, FILE_ATTRIBUTE_READONLY)); + + // Remove read-only flag, setting to NORMAL if completely empty + WI_ClearFlag(fileAttr, FILE_ATTRIBUTE_READONLY); + if (fileAttr == 0) + { + fileAttr = FILE_ATTRIBUTE_NORMAL; + } + + // Set the new attributes and try to delete the file again, returning any failure + ::SetFileAttributesW(pathToDelete.get(), fileAttr); + RETURN_IF_WIN32_BOOL_FALSE(::DeleteFileW(pathToDelete.get())); + } } } @@ -252,7 +337,35 @@ namespace wil if (WI_IsFlagClear(options, RemoveDirectoryOptions::KeepRootDirectory)) { - RETURN_IF_WIN32_BOOL_FALSE(::RemoveDirectoryW(path.get())); + if (deleteHandle != INVALID_HANDLE_VALUE) + { +#if (NTDDI_VERSION >= NTDDI_WIN10_RS1) + // DeleteFile and RemoveDirectory use POSIX delete, falling back to non-POSIX on most errors. Do the same here. + FILE_DISPOSITION_INFO_EX fileInfoEx{}; + fileInfoEx.Flags = FILE_DISPOSITION_FLAG_DELETE | FILE_DISPOSITION_FLAG_POSIX_SEMANTICS; + if (!SetFileInformationByHandle(deleteHandle, FileDispositionInfoEx, &fileInfoEx, sizeof(fileInfoEx))) + { + auto const err = ::GetLastError(); + // The real error we're looking for is STATUS_CANNOT_DELETE, but that's mapped to ERROR_ACCESS_DENIED. + if (err != ERROR_ACCESS_DENIED) + { +#endif + FILE_DISPOSITION_INFO fileInfo{}; + fileInfo.DeleteFile = TRUE; + RETURN_IF_WIN32_BOOL_FALSE(SetFileInformationByHandle(deleteHandle, FileDispositionInfo, &fileInfo, sizeof(fileInfo))); +#if (NTDDI_VERSION >= NTDDI_WIN10_RS1) + } + else + { + RETURN_WIN32(err); + } + } +#endif + } + else + { + RETURN_IF_WIN32_BOOL_FALSE(::RemoveDirectoryW(path.get())); + } } return S_OK; } @@ -552,7 +665,7 @@ namespace wil OVERLAPPED m_overlapped{}; TP_IO *m_tpIo = __nullptr; srwlock m_cancelLock; - char m_readBuffer[4096]; // Consider alternative buffer sizes. With 512 byte buffer i was not able to observe overflow. + unsigned char m_readBuffer[4096]; // Consider alternative buffer sizes. With 512 byte buffer i was not able to observe overflow. }; inline void delete_folder_change_reader_state(_In_opt_ folder_change_reader_state *storage) { delete storage; } @@ -596,7 +709,6 @@ namespace wil auto readerState = static_cast(context); // WI_ASSERT(overlapped == &readerState->m_overlapped); - bool requeue = true; if (result == ERROR_SUCCESS) { for (auto const& info : create_next_entry_offset_iterator(reinterpret_cast(readerState->m_readBuffer))) @@ -613,19 +725,17 @@ namespace wil } else { - requeue = false; + // No need to requeue + return; } - if (requeue) + // If the lock is held non-shared or the TP IO is nullptr, this + // structure is being torn down. Otherwise, monitor for further + // changes. + auto autoLock = readerState->m_cancelLock.try_lock_shared(); + if (autoLock && readerState->m_tpIo) { - // If the lock is held non-shared or the TP IO is nullptr, this - // structure is being torn down. Otherwise, monitor for further - // changes. - auto autoLock = readerState->m_cancelLock.try_lock_shared(); - if (autoLock && readerState->m_tpIo) - { - readerState->StartIo(); // ignoring failure here - } + readerState->StartIo(); // ignoring failure here } } @@ -798,7 +908,7 @@ namespace wil // Type unsafe version used in the implementation to avoid template bloat. inline HRESULT GetFileInfo(HANDLE fileHandle, FILE_INFO_BY_HANDLE_CLASS infoClass, size_t allocationSize, - _Outptr_result_nullonfailure_ void **result) + _Outptr_result_maybenull_ void **result) { *result = nullptr; @@ -875,6 +985,36 @@ namespace wil return S_OK; } + // Verifies that the given file path is not a hard or a soft link. If the file is present at the path, returns + // a handle to it without delete permissions to block an attacker from swapping the file. + inline HRESULT CreateFileAndEnsureNotLinked(PCWSTR path, wil::unique_hfile& fileHandle) + { + // Open handles to the original path and to the final path and compare each file's information + // to verify they are the same file. If they are different, the file is a soft link. + fileHandle.reset(CreateFileW(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr)); + RETURN_LAST_ERROR_IF(!fileHandle); + BY_HANDLE_FILE_INFORMATION fileInfo; + RETURN_IF_WIN32_BOOL_FALSE(GetFileInformationByHandle(fileHandle.get(), &fileInfo)); + + // Open a handle without the reparse point flag to get the final path in case it is a soft link. + wil::unique_hfile finalPathHandle(CreateFileW(path, 0, 0, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr)); + RETURN_LAST_ERROR_IF(!finalPathHandle); + BY_HANDLE_FILE_INFORMATION finalFileInfo; + RETURN_IF_WIN32_BOOL_FALSE(GetFileInformationByHandle(finalPathHandle.get(), &finalFileInfo)); + finalPathHandle.reset(); + + // The low and high indices and volume serial number uniquely identify a file. These must match if they are the same file. + const bool isSoftLink = + ((fileInfo.nFileIndexLow != finalFileInfo.nFileIndexLow) || + (fileInfo.nFileIndexHigh != finalFileInfo.nFileIndexHigh) || + (fileInfo.dwVolumeSerialNumber != finalFileInfo.dwVolumeSerialNumber)); + + // Return failure if it is a soft link or a hard link (number of links greater than 1). + RETURN_HR_IF(HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), (isSoftLink || fileInfo.nNumberOfLinks > 1)); + + return S_OK; + } + #ifdef _CPPUNWIND /** Get file information for a fixed sized structure, throws on failure. ~~~ @@ -902,7 +1042,7 @@ namespace wil return result; } #endif // _CPPUNWIND -#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7) } #endif // __WIL_FILESYSTEM_INCLUDED diff --git a/Externals/WIL/include/wil/nt_result_macros.h b/Externals/WIL/include/wil/nt_result_macros.h new file mode 100644 index 000000000000..ddb9740b7b87 --- /dev/null +++ b/Externals/WIL/include/wil/nt_result_macros.h @@ -0,0 +1,168 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* +#ifndef __WIL_NT_RESULTMACROS_INCLUDED +#define __WIL_NT_RESULTMACROS_INCLUDED + +#include "result_macros.h" + +// Helpers for return macros +#define __NT_RETURN_NTSTATUS(status, str) __WI_SUPPRESS_4127_S do { NTSTATUS __status = (status); if (FAILED_NTSTATUS(__status)) { __R_FN(Return_NtStatus)(__R_INFO(str) __status); } return __status; } __WI_SUPPRESS_4127_E while ((void)0, 0) +#define __NT_RETURN_NTSTATUS_MSG(status, str, fmt, ...) __WI_SUPPRESS_4127_S do { NTSTATUS __status = (status); if (FAILED_NTSTATUS(__status)) { __R_FN(Return_NtStatusMsg)(__R_INFO(str) __status, fmt, ##__VA_ARGS__); } return __status; } __WI_SUPPRESS_4127_E while ((void)0, 0) + +//***************************************************************************** +// Macros for returning failures as NTSTATUS +//***************************************************************************** + +// Always returns a known result (NTSTATUS) - always logs failures +#define NT_RETURN_NTSTATUS(status) __NT_RETURN_NTSTATUS(wil::verify_ntstatus(status), #status) + +// Always returns a known failure (NTSTATUS) - always logs a var-arg message on failure +#define NT_RETURN_NTSTATUS_MSG(status, fmt, ...) __NT_RETURN_NTSTATUS_MSG(wil::verify_ntstatus(status), #status, fmt, ##__VA_ARGS__) + +// Conditionally returns failures (NTSTATUS) - always logs failures +#define NT_RETURN_IF_NTSTATUS_FAILED(status) __WI_SUPPRESS_4127_S do { const auto __statusRet = wil::verify_ntstatus(status); if (FAILED_NTSTATUS(__statusRet)) { __NT_RETURN_NTSTATUS(__statusRet, #status); }} __WI_SUPPRESS_4127_E while ((void)0, 0) + +// Conditionally returns failures (NTSTATUS) - always logs a var-arg message on failure +#define NT_RETURN_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) __WI_SUPPRESS_4127_S do { const auto __statusRet = wil::verify_ntstatus(status); if (FAILED_NTSTATUS(__statusRet)) { __NT_RETURN_NTSTATUS_MSG(__statusRet, #status, fmt, ##__VA_ARGS__); }} __WI_SUPPRESS_4127_E while((void)0, 0) + +//***************************************************************************** +// Macros to catch and convert exceptions on failure +//***************************************************************************** + +// Use these macros *within* a catch (...) block to handle exceptions +#define NT_RETURN_CAUGHT_EXCEPTION() return __R_FN(Nt_Return_CaughtException)(__R_INFO_ONLY(nullptr)) +#define NT_RETURN_CAUGHT_EXCEPTION_MSG(fmt, ...) return __R_FN(Nt_Return_CaughtExceptionMsg)(__R_INFO(nullptr) fmt, ##__VA_ARGS__) + +// Use these macros in place of a catch block to handle exceptions +#define NT_CATCH_RETURN() catch (...) { NT_RETURN_CAUGHT_EXCEPTION(); } +#define NT_CATCH_RETURN_MSG(fmt, ...) catch (...) { NT_RETURN_CAUGHT_EXCEPTION_MSG(fmt, ##__VA_ARGS__); } + + +namespace wil +{ + //***************************************************************************** + // Public Helpers that catch -- mostly only enabled when exceptions are enabled + //***************************************************************************** + + // StatusFromCaughtException is a function that is meant to be called from within a catch(...) block. Internally + // it re-throws and catches the exception to convert it to an NTSTATUS. If an exception is of an unrecognized type + // the function will fail fast. + // + // try + // { + // // Code + // } + // catch (...) + // { + // status = wil::StatusFromCaughtException(); + // } + _Always_(_Post_satisfies_(return < 0)) + __declspec(noinline) inline NTSTATUS StatusFromCaughtException() WI_NOEXCEPT + { + bool isNormalized = false; + NTSTATUS status = STATUS_SUCCESS; + if (details::g_pfnResultFromCaughtExceptionInternal) + { + status = details::g_pfnResultFromCaughtExceptionInternal(nullptr, 0, &isNormalized).status; + } + if (FAILED_NTSTATUS(status)) + { + return status; + } + + // Caller bug: an unknown exception was thrown + __WIL_PRIVATE_FAIL_FAST_HR_IF(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), g_fResultFailFastUnknownExceptions); + return wil::details::HrToNtStatus(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); + } + + namespace details + { + template + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported = SupportedExceptions::Default); + template + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList); + + namespace __R_NS_NAME + { +#ifdef WIL_ENABLE_EXCEPTIONS + __R_DIRECT_METHOD(NTSTATUS, Nt_Return_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT + { + __R_FN_LOCALS; + return wil::details::ReportStatus_CaughtException(__R_DIRECT_FN_CALL_ONLY); + } + + __R_DIRECT_METHOD(NTSTATUS, Nt_Return_CaughtExceptionMsg)(__R_DIRECT_FN_PARAMS _Printf_format_string_ PCSTR formatString, ...) WI_NOEXCEPT + { + va_list argList; + va_start(argList, formatString); + __R_FN_LOCALS; + return wil::details::ReportStatus_CaughtExceptionMsg(__R_DIRECT_FN_CALL formatString, argList); + } +#endif + } + + template + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) + { + wchar_t message[2048]; + message[0] = L'\0'; + return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status; + } + + template<> + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) + { + wchar_t message[2048]; + message[0] = L'\0'; + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status); + } + + template<> + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) + { + wchar_t message[2048]; + message[0] = L'\0'; + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).status); + } + + template + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) + { + // Pre-populate the buffer with our message, the exception message will be added to it... + wchar_t message[2048]; + PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); + StringCchCatW(message, ARRAYSIZE(message), L" -- "); + return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).status; + } + + template<> + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) + { + // Pre-populate the buffer with our message, the exception message will be added to it... + wchar_t message[2048]; + PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); + StringCchCatW(message, ARRAYSIZE(message), L" -- "); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).status); + } + + template<> + __declspec(noinline) inline NTSTATUS ReportStatus_CaughtExceptionMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) + { + // Pre-populate the buffer with our message, the exception message will be added to it... + wchar_t message[2048]; + PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); + StringCchCatW(message, ARRAYSIZE(message), L" -- "); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).status); + } + } +} + +#endif // __WIL_NT_RESULTMACROS_INCLUDED diff --git a/Externals/WIL/include/wil/resource.h b/Externals/WIL/include/wil/resource.h index a0e5741b096a..192f25ad7076 100644 --- a/Externals/WIL/include/wil/resource.h +++ b/Externals/WIL/include/wil/resource.h @@ -46,7 +46,7 @@ namespace wil //! to that value when it is destroyed. //! //! This is useful in library code that runs during a value's destructor. If the library code could - //! inadvertantly change the value of GetLastError (by calling a Win32 API or similar), it should + //! inadvertently change the value of GetLastError (by calling a Win32 API or similar), it should //! instantiate a value of this type before calling the library function in order to preserve the //! GetLastError value the user would expect. //! @@ -63,12 +63,15 @@ namespace wil class last_error_context { #ifndef WIL_KERNEL_MODE - bool m_dismissed; - DWORD m_error; + bool m_dismissed = false; + DWORD m_error = 0; public: - last_error_context() WI_NOEXCEPT : - m_dismissed(false), - m_error(::GetLastError()) + last_error_context() WI_NOEXCEPT : last_error_context(::GetLastError()) + { + } + + explicit last_error_context(DWORD error) WI_NOEXCEPT : + m_error(error) { } @@ -77,7 +80,7 @@ namespace wil operator=(wistd::move(other)); } - last_error_context & operator=(last_error_context&& other) WI_NOEXCEPT + last_error_context& operator=(last_error_context&& other) WI_NOEXCEPT { m_dismissed = wistd::exchange(other.m_dismissed, true); m_error = other.m_error; @@ -100,6 +103,11 @@ namespace wil WI_ASSERT(!m_dismissed); m_dismissed = true; } + + auto value() const WI_NOEXCEPT + { + return m_error; + } #else public: void release() WI_NOEXCEPT { } @@ -113,46 +121,63 @@ namespace wil typedef wistd::integral_constant pointer_access_noaddress; // get() and release() are available typedef wistd::integral_constant pointer_access_none; // the raw pointer is not available - template // nullptr_t if the invalid handle value is compatible with nullptr, otherwise pointer - struct resource_policy - { - typedef pointer_storage pointer_storage; - typedef pointer pointer; - typedef pointer_invalid pointer_invalid; - typedef pointer_access pointer_access; - __forceinline static pointer_storage invalid_value() WI_NOEXCEPT { return (pointer)invalid; } - __forceinline static bool is_valid(pointer_storage value) WI_NOEXCEPT { return (static_cast(value) != (pointer)invalid); } - __forceinline static void close(pointer_storage value) WI_NOEXCEPT { wistd::invoke(close_fn, value); } - - inline static void close_reset(pointer_storage value) WI_NOEXCEPT + template struct close_invoke_helper + { + __forceinline static void close(pointer_storage_t value) WI_NOEXCEPT { wistd::invoke(close_fn, value); } + inline static void close_reset(pointer_storage_t value) WI_NOEXCEPT { auto preserveError = last_error_context(); wistd::invoke(close_fn, value); } }; + template struct close_invoke_helper + { + __forceinline static void close(pointer_storage_t value) WI_NOEXCEPT { close_fn(value); } + inline static void close_reset(pointer_storage_t value) WI_NOEXCEPT + { + auto preserveError = last_error_context(); + close_fn(value); + } + }; + + template using close_invoker = + close_invoke_helper ? wistd::is_function_v> : false, close_fn_t, close_fn, pointer_storage_t>; + + template // nullptr_t if the invalid handle value is compatible with nullptr, otherwise pointer + struct resource_policy : close_invoker + { + typedef pointer_storage_t pointer_storage; + typedef pointer_t pointer; + typedef pointer_invalid_t pointer_invalid; + typedef pointer_access_t pointer_access; + __forceinline static pointer_storage invalid_value() { return (pointer)invalid; } + __forceinline static bool is_valid(pointer_storage value) WI_NOEXCEPT { return (static_cast(value) != (pointer)invalid); } + }; + // This class provides the pointer storage behind the implementation of unique_any_t utilizing the given // resource_policy. It is separate from unique_any_t to allow a type-specific specialization class to plug // into the inheritance chain between unique_any_t and unique_storage. This allows classes like unique_event // to be a unique_any formed class, but also expose methods like SetEvent directly. - template + template class unique_storage { protected: - typedef policy policy; + typedef Policy policy; typedef typename policy::pointer_storage pointer_storage; typedef typename policy::pointer pointer; typedef unique_storage base_storage; + public: unique_storage() WI_NOEXCEPT : m_ptr(policy::invalid_value()) { @@ -177,13 +202,6 @@ namespace wil } } - void replace(unique_storage &&other) WI_NOEXCEPT - { - reset(other.m_ptr); - other.m_ptr = policy::invalid_value(); - } - - public: bool is_valid() const WI_NOEXCEPT { return policy::is_valid(m_ptr); @@ -223,6 +241,13 @@ namespace wil return &m_ptr; } + protected: + void replace(unique_storage &&other) WI_NOEXCEPT + { + reset(other.m_ptr); + other.m_ptr = policy::invalid_value(); + } + private: pointer_storage m_ptr; }; @@ -252,7 +277,8 @@ namespace wil // forwarding constructor: forwards all 'explicit' and multi-arg constructors to the base class template - explicit unique_any_t(arg1 && first, args_t&&... args) : // should not be WI_NOEXCEPT (may forward to a throwing constructor) + explicit unique_any_t(arg1 && first, args_t&&... args) + __WI_NOEXCEPT_((wistd::is_nothrow_constructible_v)) : storage_t(wistd::forward(first), wistd::forward(args)...) { static_assert(wistd::is_same::value || @@ -410,7 +436,7 @@ namespace wil typename pointer_access = details::pointer_access_all, // all, noaddress or none to control pointer method access typename pointer_storage = pointer, // The type used to store the handle (usually the same as the handle itself) typename invalid_t = pointer, // The invalid handle value type - invalid_t invalid = invalid_t(), // * and its value (default ZERO value) + invalid_t invalid = invalid_t{}, // * and its value (default ZERO value) typename pointer_invalid = wistd::nullptr_t> // nullptr_t if the invalid handle value is compatible with nullptr, otherwise pointer using unique_any = unique_any_t>>; @@ -663,7 +689,7 @@ namespace wil { } - out_param_t(out_param_t&& other) : + out_param_t(out_param_t&& other) WI_NOEXCEPT : wrapper(other.wrapper), pRaw(other.pRaw) { @@ -703,7 +729,7 @@ namespace wil { } - out_param_ptr_t(out_param_ptr_t&& other) : + out_param_ptr_t(out_param_ptr_t&& other) WI_NOEXCEPT : wrapper(other.wrapper), pRaw(other.pRaw) { @@ -741,7 +767,7 @@ namespace wil } /** Use to retrieve raw out parameter pointers (with a required cast) into smart pointers that do not support the '&' operator. - Use only when the smart pointer's &handle is not equal to the output type a function requries, necessitating a cast. + Use only when the smart pointer's &handle is not equal to the output type a function requires, necessitating a cast. Example: `wil::out_param_ptr(securityDescriptor)` */ template details::out_param_ptr_t out_param_ptr(T& p) @@ -766,7 +792,7 @@ namespace wil ~~~ typedef wil::unique_struct unique_prop_variant_default_init; - unique_prop_variant propvariant; + unique_prop_variant_default_init propvariant; SomeFunction(&propvariant); ~~~ @@ -781,6 +807,7 @@ namespace wil template class unique_struct : public struct_t { + using closer = details::close_invoker; public: //! Initializes the managed struct using the user-provided initialization function, or ZeroMemory if no function is specified unique_struct() @@ -813,7 +840,7 @@ namespace wil //! Calls the custom close function ~unique_struct() WI_NOEXCEPT { - wistd::invoke(close_fn, this); + closer::close(this); } void reset(const unique_struct&) = delete; @@ -821,10 +848,7 @@ namespace wil //! Resets this managed struct by calling the custom close function and begins management of the other struct void reset(const struct_t& other) WI_NOEXCEPT { - { - auto preserveError = last_error_context(); - wistd::invoke(close_fn, this); - } + closer::close_reset(this); struct_t::operator=(other); } @@ -832,7 +856,7 @@ namespace wil //! Then initializes this managed struct using the user-provided initialization function, or ZeroMemory if no function is specified void reset() WI_NOEXCEPT { - wistd::invoke(close_fn, this); + closer::close(this); call_init(use_default_init_fn()); } @@ -1142,7 +1166,7 @@ namespace wil { } - size_address_ptr(size_address_ptr&& other) : + size_address_ptr(size_address_ptr&& other) WI_NOEXCEPT : wrapper(other.wrapper), size(other.size) { @@ -1215,7 +1239,7 @@ namespace wil template void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T& p) const { - wistd::invoke(close_fn, &p); + close_invoker::close(&p); } }; @@ -1524,7 +1548,7 @@ namespace wil } if (oldSource) { - wistd::invoke(close_fn, oldSource); + details::close_invoker::close(oldSource); oldSource->Release(); } } @@ -1636,7 +1660,7 @@ namespace wil m_call = false; if (call) { - wistd::invoke(close_fn); + close_fn(); } } @@ -1770,7 +1794,7 @@ namespace wil RETURN_IF_FAILED(maker.make(nullptr, lengthRequiredWithoutNull)); auto buffer = maker.buffer(); - RETURN_IF_FAILED(::StringCchVPrintfExW(buffer, lengthRequiredWithoutNull + 1, nullptr, nullptr, STRSAFE_NULL_ON_FAILURE, pszFormat, argsVL)); + RETURN_IF_FAILED(StringCchVPrintfExW(buffer, lengthRequiredWithoutNull + 1, nullptr, nullptr, STRSAFE_NULL_ON_FAILURE, pszFormat, argsVL)); result = maker.release(); return S_OK; @@ -1780,7 +1804,7 @@ namespace wil // Wraps StringCchPrintFExW and stores it in an automatically allocated string. Takes a buffer followed by the same format arguments // that StringCchPrintfExW takes. template - HRESULT str_printf_nothrow(string_type& result, _Printf_format_string_ PCWSTR pszFormat, _In_ ...) + HRESULT str_printf_nothrow(string_type& result, _Printf_format_string_ PCWSTR pszFormat, ...) { va_list argsVL; va_start(argsVL, pszFormat); @@ -1793,7 +1817,7 @@ namespace wil // Wraps StringCchPrintFExW and stores it in an automatically allocated string. Takes a buffer followed by the same format arguments // that StringCchPrintfExW takes. template - string_type str_printf(_Printf_format_string_ PCWSTR pszFormat, _In_ ...) + string_type str_printf(_Printf_format_string_ PCWSTR pszFormat, ...) { string_type result; va_list argsVL; @@ -1808,7 +1832,7 @@ namespace wil // Wraps StringCchPrintFExW and stores it in an automatically allocated string. Takes a buffer followed by the same format arguments // that StringCchPrintfExW takes. template - string_type str_printf_failfast(_Printf_format_string_ PCWSTR pszFormat, _In_ ...) + string_type str_printf_failfast(_Printf_format_string_ PCWSTR pszFormat, ...) { string_type result; va_list argsVL; @@ -1855,16 +1879,17 @@ namespace wil { // into the inheritance chain between shared_any_t and shared_storage. This allows classes like shared_event // to be a shared_any formed class, but also expose methods like SetEvent directly. - template + template class shared_storage { protected: - typedef unique_t unique_t; + typedef UniqueT unique_t; typedef typename unique_t::policy policy; typedef typename policy::pointer_storage pointer_storage; typedef typename policy::pointer pointer; typedef shared_storage base_storage; + public: shared_storage() = default; explicit shared_storage(pointer_storage ptr) @@ -1904,12 +1929,6 @@ namespace wil { { } - void replace(shared_storage &&other) WI_NOEXCEPT - { - m_ptr = wistd::move(other.m_ptr); - } - - public: bool is_valid() const WI_NOEXCEPT { return (m_ptr && m_ptr->is_valid()); @@ -1959,6 +1978,12 @@ namespace wil { return m_ptr.use_count(); } + protected: + void replace(shared_storage &&other) WI_NOEXCEPT + { + m_ptr = wistd::move(other.m_ptr); + } + private: template friend class ::wil::weak_any; @@ -1983,7 +2008,8 @@ namespace wil { // default and forwarding constructor: forwards default, all 'explicit' and multi-arg constructors to the base class template - explicit shared_any_t(args_t&&... args) : // should not be WI_NOEXCEPT (may forward to a throwing constructor) + explicit shared_any_t(args_t&&... args) + __WI_NOEXCEPT_((wistd::is_nothrow_constructible_v)) : storage_t(wistd::forward(args)...) { } @@ -2147,11 +2173,11 @@ namespace wil { // This class provides weak_ptr<> support for shared_any<>, bringing the same weak reference counting and lock() acquire semantics // to shared_any. - template + template class weak_any { public: - typedef shared_t shared_t; + typedef SharedT shared_t; weak_any() WI_NOEXCEPT { @@ -2407,7 +2433,7 @@ namespace wil // Non-RTL implementation for threadpool_t parameter of DestroyThreadPoolTimer<> struct SystemThreadPoolMethods { - static void WINAPI SetThreadpoolTimer(_Inout_ PTP_TIMER Timer, _In_opt_ PFILETIME DueTime, _In_ DWORD Period, _In_opt_ DWORD WindowLength) WI_NOEXCEPT + static void WINAPI SetThreadpoolTimer(_Inout_ PTP_TIMER Timer, _In_opt_ PFILETIME DueTime, _In_ DWORD Period, _In_ DWORD WindowLength) WI_NOEXCEPT { ::SetThreadpoolTimer(Timer, DueTime, Period, WindowLength); } @@ -2509,6 +2535,22 @@ namespace wil #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) typedef unique_any unique_sid; + typedef unique_any_handle_null_only unique_boundary_descriptor; + + namespace details + { + template + inline void __stdcall ClosePrivateNamespaceHelper(HANDLE h) WI_NOEXCEPT + { + ::ClosePrivateNamespace(h, flags); + } + } + + template + using unique_private_namespace = unique_any_handle_null_only), &details::ClosePrivateNamespaceHelper>; + + using unique_private_namespace_close = unique_private_namespace<>; + using unique_private_namespace_destroy = unique_private_namespace; #endif using unique_tool_help_snapshot = unique_hfile; @@ -2561,10 +2603,10 @@ namespace wil } // Waits on the given handle for the specified duration - inline bool handle_wait(HANDLE hEvent, DWORD dwMilliseconds = INFINITE) WI_NOEXCEPT + inline bool handle_wait(HANDLE hEvent, DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) WI_NOEXCEPT { - DWORD status = ::WaitForSingleObjectEx(hEvent, dwMilliseconds, FALSE); - __FAIL_FAST_ASSERT__((status == WAIT_TIMEOUT) || (status == WAIT_OBJECT_0)); + DWORD status = ::WaitForSingleObjectEx(hEvent, dwMilliseconds, bAlertable); + __FAIL_FAST_ASSERT__((status == WAIT_TIMEOUT) || (status == WAIT_OBJECT_0) || (bAlertable && (status == WAIT_IO_COMPLETION))); return (status == WAIT_OBJECT_0); } @@ -2626,29 +2668,29 @@ namespace wil } // Basic WaitForSingleObject on the event handle with the given timeout - bool wait(DWORD dwMilliseconds = INFINITE) const WI_NOEXCEPT + bool wait(DWORD dwMilliseconds = INFINITE, BOOL bAlertable = FALSE) const WI_NOEXCEPT { - return wil::handle_wait(storage_t::get(), dwMilliseconds); + return wil::handle_wait(storage_t::get(), dwMilliseconds, bAlertable); } // Tries to create a named event -- returns false if unable to do so (gle may still be inspected with return=false) - bool try_create(EventOptions options, PCWSTR name, _In_opt_ LPSECURITY_ATTRIBUTES pSecurity = nullptr, _Out_opt_ bool *pAlreadyExists = nullptr) + bool try_create(EventOptions options, PCWSTR name, _In_opt_ LPSECURITY_ATTRIBUTES securityAttributes = nullptr, _Out_opt_ bool *alreadyExists = nullptr) { - auto handle = ::CreateEventExW(pSecurity, name, (WI_IsFlagSet(options, EventOptions::ManualReset) ? CREATE_EVENT_MANUAL_RESET : 0) | (WI_IsFlagSet(options, EventOptions::Signaled) ? CREATE_EVENT_INITIAL_SET : 0), EVENT_ALL_ACCESS); + auto handle = ::CreateEventExW(securityAttributes, name, (WI_IsFlagSet(options, EventOptions::ManualReset) ? CREATE_EVENT_MANUAL_RESET : 0) | (WI_IsFlagSet(options, EventOptions::Signaled) ? CREATE_EVENT_INITIAL_SET : 0), EVENT_ALL_ACCESS); if (!handle) { - assign_to_opt_param(pAlreadyExists, false); + assign_to_opt_param(alreadyExists, false); return false; } - assign_to_opt_param(pAlreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS)); + assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS)); storage_t::reset(handle); return true; } // Returns HRESULT for unique_event_nothrow, void with exceptions for shared_event and unique_event - result create(EventOptions options = EventOptions::None, PCWSTR name = nullptr, _In_opt_ LPSECURITY_ATTRIBUTES pSecurity = nullptr, _Out_opt_ bool *pAlreadyExists = nullptr) + result create(EventOptions options = EventOptions::None, PCWSTR name = nullptr, _In_opt_ LPSECURITY_ATTRIBUTES securityAttributes = nullptr, _Out_opt_ bool *alreadyExists = nullptr) { - return err_policy::LastErrorIfFalse(try_create(options, name, pSecurity, pAlreadyExists)); + return err_policy::LastErrorIfFalse(try_create(options, name, securityAttributes, alreadyExists)); } // Tries to open the named event -- returns false if unable to do so (gle may still be inspected with return=false) @@ -2676,7 +2718,7 @@ namespace wil typedef unique_any_t, err_exception_policy>> unique_event; #endif -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && ((_WIN32_WINNT >= _WIN32_WINNT_WIN8) || (__WIL_RESOURCE_ENABLE_QUIRKS && (_WIN32_WINNT >= _WIN32_WINNT_WIN7))) enum class SlimEventType { AutoReset, @@ -2843,7 +2885,7 @@ namespace wil /** An alias for `wil::slim_event_auto_reset`. */ using slim_event = slim_event_auto_reset; -#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && (_WIN32_WINNT >= _WIN32_WINNT_WIN8) typedef unique_any mutex_release_scope_exit; @@ -2892,21 +2934,25 @@ namespace wil } // Tries to create a named mutex -- returns false if unable to do so (gle may still be inspected with return=false) - bool try_create(_In_opt_ PCWSTR name, DWORD dwFlags = 0, DWORD desiredAccess = MUTEX_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pMutexAttributes = nullptr) + bool try_create(_In_opt_ PCWSTR name, DWORD dwFlags = 0, DWORD desiredAccess = MUTEX_ALL_ACCESS, + _In_opt_ PSECURITY_ATTRIBUTES mutexAttributes = nullptr, _Out_opt_ bool* alreadyExists = nullptr) { - auto handle = ::CreateMutexExW(pMutexAttributes, name, dwFlags, desiredAccess); + auto handle = ::CreateMutexExW(mutexAttributes, name, dwFlags, desiredAccess); if (handle == nullptr) { + assign_to_opt_param(alreadyExists, false); return false; } + assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS)); storage_t::reset(handle); return true; } // Returns HRESULT for unique_mutex_nothrow, void with exceptions for shared_mutex and unique_mutex - result create(_In_opt_ PCWSTR name = nullptr, DWORD dwFlags = 0, DWORD desiredAccess = MUTEX_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pMutexAttributes = nullptr) + result create(_In_opt_ PCWSTR name = nullptr, DWORD dwFlags = 0, DWORD desiredAccess = MUTEX_ALL_ACCESS, + _In_opt_ PSECURITY_ATTRIBUTES mutexAttributes = nullptr, _Out_opt_ bool* alreadyExists = nullptr) { - return err_policy::LastErrorIfFalse(try_create(name, dwFlags, desiredAccess, pMutexAttributes)); + return err_policy::LastErrorIfFalse(try_create(name, dwFlags, desiredAccess, mutexAttributes, alreadyExists)); } // Tries to open a named mutex -- returns false if unable to do so (gle may still be inspected with return=false) @@ -2983,21 +3029,23 @@ namespace wil } // Tries to create a named event -- returns false if unable to do so (gle may still be inspected with return=false) - bool try_create(LONG lInitialCount, LONG lMaximumCount, _In_opt_ PCWSTR name, DWORD desiredAccess = SEMAPHORE_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr) + bool try_create(LONG lInitialCount, LONG lMaximumCount, _In_opt_ PCWSTR name, DWORD desiredAccess = SEMAPHORE_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr, _Out_opt_ bool *alreadyExists = nullptr) { auto handle = ::CreateSemaphoreExW(pSemaphoreAttributes, lInitialCount, lMaximumCount, name, 0, desiredAccess); if (handle == nullptr) { + assign_to_opt_param(alreadyExists, false); return false; } + assign_to_opt_param(alreadyExists, (::GetLastError() == ERROR_ALREADY_EXISTS)); storage_t::reset(handle); return true; } // Returns HRESULT for unique_semaphore_nothrow, void with exceptions for shared_event and unique_event - result create(LONG lInitialCount, LONG lMaximumCount, _In_opt_ PCWSTR name = nullptr, DWORD desiredAccess = SEMAPHORE_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr) + result create(LONG lInitialCount, LONG lMaximumCount, _In_opt_ PCWSTR name = nullptr, DWORD desiredAccess = SEMAPHORE_ALL_ACCESS, _In_opt_ PSECURITY_ATTRIBUTES pSemaphoreAttributes = nullptr, _Out_opt_ bool *alreadyExists = nullptr) { - return err_policy::LastErrorIfFalse(try_create(lInitialCount, lMaximumCount, name, desiredAccess, pSemaphoreAttributes)); + return err_policy::LastErrorIfFalse(try_create(lInitialCount, lMaximumCount, name, desiredAccess, pSemaphoreAttributes, alreadyExists)); } // Tries to open the named semaphore -- returns false if unable to do so (gle may still be inspected with return=false) @@ -3287,11 +3335,10 @@ namespace wil _When_((source != nullptr) && length == static_cast(-1), _In_z_) PCSTR source, size_t length = static_cast(-1)) WI_NOEXCEPT { - // guard against invalid parameters (null source with -1 length) - FAIL_FAST_IF(!source && (length == static_cast(-1))); - if (length == static_cast(-1)) { + // guard against invalid parameters (null source with -1 length) + FAIL_FAST_IF(!source); length = strlen(source); } const size_t cb = (length + 1) * sizeof(*source); @@ -3385,6 +3432,9 @@ namespace wil wchar_t* buffer() { WI_ASSERT(m_value.get()); return m_value.get(); } + // By default, assume string_type is a null-terminated string and therefore does not require trimming. + HRESULT trim_at_existing_null(size_t /* length */) { return S_OK; } + string_type release() { return wistd::move(m_value); } // Utility to abstract access to the null terminated m_value of all string types. @@ -3430,7 +3480,7 @@ namespace wil struct process_heap_deleter { template - void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const + void operator()(_Pre_valid_ _Frees_ptr_ T* p) const { details::FreeProcessHeap(p); } @@ -3439,7 +3489,7 @@ namespace wil struct virtualalloc_deleter { template - void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const + void operator()(_Pre_valid_ _Frees_ptr_ T* p) const { ::VirtualFree(p, 0, MEM_RELEASE); } @@ -3448,7 +3498,7 @@ namespace wil struct mapview_deleter { template - void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ T* p) const + void operator()(_Pre_valid_ _Frees_ptr_ T* p) const { ::UnmapViewOfFile(p); } @@ -3481,7 +3531,7 @@ namespace wil /** Manages a typed pointer allocated with MapViewOfFile A specialization of wistd::unique_ptr<> that frees via UnmapViewOfFile(p). */ - template + template using unique_mapview_ptr = wistd::unique_ptr; #endif // __WIL_WINBASE_ @@ -3558,8 +3608,8 @@ namespace wil typedef typename err_policy::result result; // Exception-based constructors - template - event_watcher_t(unique_any_t, err_policy>> &&eventHandle, wistd::function &&callback) + template + event_watcher_t(unique_any_t, from_err_policy>> &&eventHandle, wistd::function &&callback) { static_assert(wistd::is_same::value, "this constructor requires exceptions or fail fast; use the create method"); create(wistd::move(eventHandle), wistd::move(callback)); @@ -4211,6 +4261,14 @@ namespace wil #if !defined(NOWINABLE) typedef unique_any unique_hwineventhook; #endif +#if !defined(NOCLIPBOARD) + using unique_close_clipboard_call = unique_call; + + inline unique_close_clipboard_call open_clipboard(HWND hwnd) + { + return unique_close_clipboard_call { OpenClipboard(hwnd) != FALSE }; + } +#endif #endif // __WIL__WINUSER_ #if !defined(NOGDI) && !defined(NODESKTOP) @@ -4317,7 +4375,7 @@ namespace wil WI_NODISCARD inline unique_couninitialize_call CoInitializeEx_failfast(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/) { FAIL_FAST_IF_FAILED(::CoInitializeEx(nullptr, coinitFlags)); - return unique_couninitialize_call(); + return {}; } #endif // __WIL__COMBASEAPI_H_APP #if defined(__WIL__COMBASEAPI_H_APP) && defined(WIL_ENABLE_EXCEPTIONS) && !defined(__WIL__COMBASEAPI_H_APPEXCEPTIONAL) @@ -4325,7 +4383,7 @@ namespace wil WI_NODISCARD inline unique_couninitialize_call CoInitializeEx(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/) { THROW_IF_FAILED(::CoInitializeEx(nullptr, coinitFlags)); - return unique_couninitialize_call(); + return {}; } #endif @@ -4460,6 +4518,8 @@ namespace wil if (source) { RETURN_IF_FAILED(WindowsCreateString(source, static_cast(length), &m_value)); + m_charBuffer = nullptr; + m_bufferHandle.reset(); // do this after WindowsCreateString so we can trim_at_existing_null() from our own buffer } else { @@ -4473,6 +4533,8 @@ namespace wil wchar_t* buffer() { WI_ASSERT(m_charBuffer != nullptr); return m_charBuffer; } const wchar_t* buffer() const { return m_charBuffer; } + HRESULT trim_at_existing_null(size_t length) { return make(buffer(), length); } + unique_hstring release() { m_charBuffer = nullptr; @@ -4554,6 +4616,33 @@ namespace wil } #endif // WIL_ENABLE_EXCEPTIONS + inline wil::unique_variant make_variant_bstr_nothrow(PCWSTR source) WI_NOEXCEPT + { + wil::unique_variant result{}; + V_UNION(result.addressof(), bstrVal) = ::SysAllocString(source); + if (V_UNION(result.addressof(), bstrVal) != nullptr) + { + V_VT(result.addressof()) = VT_BSTR; + } + return result; + } + + inline wil::unique_variant make_variant_bstr_failfast(PCWSTR source) WI_NOEXCEPT + { + auto result{make_variant_bstr_nothrow(source)}; + FAIL_FAST_HR_IF(E_OUTOFMEMORY, V_VT(result.addressof()) == VT_EMPTY); + return result; + } + +#ifdef WIL_ENABLE_EXCEPTIONS + inline wil::unique_variant make_variant_bstr(PCWSTR source) + { + auto result{make_variant_bstr_nothrow(source)}; + THROW_HR_IF(E_OUTOFMEMORY, V_VT(result.addressof()) == VT_EMPTY); + return result; + } +#endif // WIL_ENABLE_EXCEPTIONS + #endif // __WIL_OLEAUTO_H_ #if defined(__WIL_OLEAUTO_H_) && !defined(__WIL_OLEAUTO_H_STL) && defined(WIL_RESOURCE_STL) #define __WIL_OLEAUTO_H_STL @@ -4727,12 +4816,47 @@ namespace wil } /// @endcond - typedef unique_any unique_cert_context; + struct cert_context_t : details::unique_storage> + { + // forward all base class constructors... + template + explicit cert_context_t(args_t&&... args) WI_NOEXCEPT : unique_storage(wistd::forward(args)...) {} + + /** A wrapper around CertEnumCertificatesInStore. + CertEnumCertificatesInStore takes ownership of its second paramter in an unclear fashion, + making it error-prone to use in combination with unique_cert_context. This wrapper helps + manage the resource correctly while ensuring the GetLastError state set by CertEnumCertificatesInStore. + is not lost. See MSDN for more information on `CertEnumCertificatesInStore`. + ~~~~ + void MyMethod(HCERTSTORE certStore) + { + wil::unique_cert_context enumCert; + while (enumCert.CertEnumCertificatesInStore(certStore)) + { + UseTheCertToDoTheThing(enumCert); + } + } + ~~~~ + @param certStore A handle of a certificate store. + @param 'true' if a certificate was enumerated by this call, false otherwise. + */ + bool CertEnumCertificatesInStore(HCERTSTORE certStore) WI_NOEXCEPT + { + reset(::CertEnumCertificatesInStore(certStore, release())); + return is_valid(); + } + }; + + // Warning - ::CertEnumCertificatesInStore takes ownership of its parameter. Prefer the + // .CertEnumCertificatesInStore method of the unique_cert_context or else use .release + // when calling ::CertEnumCertificatesInStore directly. + typedef unique_any_t unique_cert_context; typedef unique_any unique_cert_chain_context; typedef unique_any unique_hcertstore; typedef unique_any unique_hcryptprov; typedef unique_any unique_hcryptkey; typedef unique_any unique_hcrypthash; + typedef unique_any unique_hcryptmsg; #endif // __WIL__WINCRYPT_H__ #if defined(__WIL__WINCRYPT_H__) && !defined(__WIL__WINCRYPT_H__STL) && defined(WIL_RESOURCE_STL) #define __WIL__WINCRYPT_H__STL @@ -4742,6 +4866,7 @@ namespace wil typedef shared_any shared_hcryptprov; typedef shared_any shared_hcryptkey; typedef shared_any shared_hcrypthash; + typedef shared_any shared_hcryptmsg; typedef weak_any weak_cert_context; typedef weak_any weak_cert_chain_context; @@ -4749,6 +4874,7 @@ namespace wil typedef weak_any weak_hcryptprov; typedef weak_any weak_hcryptkey; typedef weak_any weak_hcrypthash; + typedef weak_any weak_hcryptmsg; #endif // __WIL__WINCRYPT_H__STL @@ -5249,10 +5375,6 @@ namespace wil } } - explicit unique_hglobal_locked(unique_hglobal& global) : unique_hglobal_locked(global.get()) - { - } - explicit unique_hglobal_locked(STGMEDIUM& medium) : unique_hglobal_locked(medium.hGlobal) { } @@ -5305,6 +5427,14 @@ namespace wil typedef unique_any unique_htheme; #endif // __WIL_INC_UXTHEME +#pragma warning(push) +#pragma warning(disable:4995) +#if defined(_INC_USERENV) && !defined(__WIL_INC_USERENV) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && !defined(WIL_KERNEL_MODE) +#define __WIL_INC_USERENV + typedef unique_any unique_environment_block; +#endif // __WIL_INC_USERENV +#pragma warning(pop) + #if defined(_WINSVC_) && !defined(__WIL_HANDLE_H_WINSVC) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(WIL_KERNEL_MODE) #define __WIL_HANDLE_H_WINSVC typedef unique_any unique_schandle; @@ -5328,6 +5458,16 @@ namespace wil typedef weak_any weak_file; #endif // __WIL__INC_STDIO_STL +#if defined(_INC_LOCALE) && !defined(__WIL_INC_LOCALE) && !defined(WIL_KERNEL_MODE) +#define __WIL_INC_LOCALE + typedef unique_any<_locale_t, decltype(&::_free_locale), ::_free_locale> unique_locale; +#endif // __WIL_INC_LOCALE +#if defined(__WIL_INC_LOCALE) && !defined(__WIL__INC_LOCALE_STL) && defined(WIL_RESOURCE_STL) +#define __WIL__INC_LOCALE_STL + typedef shared_any shared_locale; + typedef weak_any weak_locale; +#endif // __WIL__INC_LOCALE_STL + #if defined(_NTLSA_) && !defined(__WIL_NTLSA_) && !defined(WIL_KERNEL_MODE) #define __WIL_NTLSA_ typedef unique_any unique_hlsa; @@ -5497,7 +5637,7 @@ namespace wil ~~~ unique_process_information process; CreateProcessW(..., CREATE_SUSPENDED, ..., &process); - THROW_IF_WIN32_BOOL_FALSE(ResumeThread(process.hThread)); + THROW_LAST_ERROR_IF(ResumeThread(process.hThread) == -1); THROW_LAST_ERROR_IF(WaitForSingleObject(process.hProcess, INFINITE) != WAIT_OBJECT_0); ~~~ */ @@ -5628,7 +5768,6 @@ namespace wil using wdf_lock_storage_t = unique_wdf_lock_storage; public: - using pointer = wdf_lock_storage_t::pointer; // Forward all base class constructors, but have it be explicit. @@ -5654,7 +5793,6 @@ namespace wil using wdf_lock_storage_t = unique_wdf_lock_storage; public: - using pointer = wdf_lock_storage_t::pointer; // Forward all base class constructors, but have it be explicit. @@ -5685,127 +5823,455 @@ namespace wil using unique_wdf_wait_lock = unique_any_t; using unique_wdf_spin_lock = unique_any_t; - template - struct wdf_object_reference + //! unique_wdf_object_reference is a RAII type for managing WDF object references acquired using + //! the WdfObjectReference* family of APIs. The behavior of this class is exactly identical to + //! wil::unique_any but a few methods have some WDF-object-reference-specific enhancements. + //! + //! * The constructor takes not only a WDFOBJECT-compatible type or a wil::unique_wdf_any, but + //! optionally also a tag with which the reference was acquired. + //! * A get_tag() method is provided to retrieve the tag. + //! * reset() is similar to the constructor in that it also optionally takes a tag. + //! * release() optionally takes an out-param that returns the tag. + //! + //! These subtle differences make it impossible to reuse the wil::unique_any_t template for its implementation. + template + class unique_wdf_object_reference { - TWDFOBJECT wdfObject = WDF_NO_HANDLE; - PVOID tag = nullptr; + public: + unique_wdf_object_reference() WI_NOEXCEPT = default; + + //! Wrap a WDF object reference that has already been acquired into this RAII type. If you + //! want to acquire a new reference instead, use WI_WdfObjectReferenceIncrement. + explicit unique_wdf_object_reference(wdf_object_t wdfObject, void* tag = nullptr) WI_NOEXCEPT + : m_wdfObject(wdfObject), m_tag(tag) + { + } + + //! This is similar to the constructor that takes a raw WDF handle but is enlightened to + //! take a const-ref to a wil::unique_wdf_any<> instead, obviating the need to call .get() + //! on it. As with the other constructor, the expectation is that the raw reference has + //! already been acquired and ownership is being transferred into this RAII object. + explicit unique_wdf_object_reference(const wil::unique_wdf_any& wdfObject, void* tag = nullptr) WI_NOEXCEPT + : unique_wdf_object_reference(wdfObject.get(), tag) + { + } + + unique_wdf_object_reference(const unique_wdf_object_reference&) = delete; + unique_wdf_object_reference& operator=(const unique_wdf_object_reference&) = delete; + + unique_wdf_object_reference(unique_wdf_object_reference&& other) + : m_wdfObject(other.m_wdfObject), m_tag(other.m_tag) + { + other.m_wdfObject = WDF_NO_HANDLE; + other.m_tag = nullptr; + } + + unique_wdf_object_reference& operator=(unique_wdf_object_reference&& other) + { + if (this != wistd::addressof(other)) + { + reset(other.m_wdfObject, other.m_tag); + other.m_wdfObject = WDF_NO_HANDLE; + other.m_tag = nullptr; + } + + return *this; + } + + ~unique_wdf_object_reference() WI_NOEXCEPT + { + reset(); + } + + explicit operator bool() const WI_NOEXCEPT + { + return m_wdfObject != WDF_NO_HANDLE; + } + + wdf_object_t get() const WI_NOEXCEPT + { + return m_wdfObject; + } + + void* get_tag() const WI_NOEXCEPT + { + return m_tag; + } - wdf_object_reference() WI_NOEXCEPT = default; + //! Replaces the current instance (releasing it if it exists) with a new WDF object + //! reference that has already been acquired by the caller. + void reset(wdf_object_t wdfObject = WDF_NO_HANDLE, void* tag = nullptr) WI_NOEXCEPT + { + if (m_wdfObject != WDF_NO_HANDLE) + { + // We don't use WdfObjectDereferenceActual because there is no way to provide the + // correct __LINE__ and __FILE__, but if you use RAII all the way, you shouldn't have to + // worry about where it was released, only where it was acquired. + WdfObjectDereferenceWithTag(m_wdfObject, m_tag); + } + + m_wdfObject = wdfObject; + m_tag = tag; + } - wdf_object_reference(TWDFOBJECT wdfObject, PVOID tag = nullptr) WI_NOEXCEPT - : wdfObject(wdfObject), tag(tag) + void reset(const wil::unique_wdf_any& wdfObject, void* tag = nullptr) WI_NOEXCEPT { + reset(wdfObject.get(), tag); } - operator TWDFOBJECT() const WI_NOEXCEPT + wdf_object_t release(_Outptr_opt_ void** tag = nullptr) WI_NOEXCEPT { + const auto wdfObject = m_wdfObject; + wil::assign_to_opt_param(tag, m_tag); + m_wdfObject = WDF_NO_HANDLE; + m_tag = nullptr; return wdfObject; } - static void close(const wdf_object_reference& wdfObjectReference) WI_NOEXCEPT + void swap(unique_wdf_object_reference& other) WI_NOEXCEPT { - // We don't use WdfObjectDereferenceActual because there is no way to provide the - // correct __LINE__ and __FILE__, but if you use RAII all the way, you shouldn't have to - // worry about where it was released, only where it was acquired. - WdfObjectDereferenceWithTag(wdfObjectReference.wdfObject, wdfObjectReference.tag); + wistd::swap_wil(m_wdfObject, other.m_wdfObject); + wistd::swap_wil(m_tag, other.m_tag); } - }; - template - using unique_wdf_object_reference = unique_any::close), - &wdf_object_reference::close, details::pointer_access_noaddress, wdf_object_reference>; + //! Drops the current reference if any, and returns a pointer to a WDF handle which can + //! receive a newly referenced WDF handle. The tag is assumed to be nullptr. If a different + //! tag needs to be used, a temporary variable will need to be used to receive the WDF + //! handle and a unique_wdf_object_reference will need to be constructed with it. + //! + //! The quintessential use-case for this method is WdfIoQueueFindRequest. + wdf_object_t* put() WI_NOEXCEPT + { + reset(); + return &m_wdfObject; + } + + wdf_object_t* operator&() WI_NOEXCEPT + { + return put(); + } + + private: + wdf_object_t m_wdfObject = WDF_NO_HANDLE; + void* m_tag = nullptr; + }; - // Increment the ref-count on a WDF object a unique_wdf_object_reference for it. Use + // Increment the ref-count on a WDF object and return a unique_wdf_object_reference for it. Use // WI_WdfObjectReferenceIncrement to automatically use the call-site source location. Use this // function only if the call-site source location is obtained from elsewhere (i.e., plumbed // through other abstractions). - template - inline WI_NODISCARD unique_wdf_object_reference wdf_object_reference_increment( - TWDFOBJECT wdfObject, PVOID tag, LONG lineNumber, PCSTR fileName) WI_NOEXCEPT + template + inline WI_NODISCARD unique_wdf_object_reference wdf_object_reference_increment( + wdf_object_t wdfObject, PVOID tag, LONG lineNumber, PCSTR fileName) WI_NOEXCEPT { // Parameter is incorrectly marked as non-const, so the const-cast is required. ::WdfObjectReferenceActual(wdfObject, tag, lineNumber, const_cast(fileName)); - return unique_wdf_object_reference{ wdf_object_reference{ wdfObject, tag } }; + return unique_wdf_object_reference{ wdfObject, tag }; + } + + template + inline WI_NODISCARD unique_wdf_object_reference wdf_object_reference_increment( + const wil::unique_wdf_any& wdfObject, PVOID tag, LONG lineNumber, PCSTR fileName) WI_NOEXCEPT + { + return wdf_object_reference_increment(wdfObject.get(), tag, lineNumber, fileName); } // A macro so that we can capture __LINE__ and __FILE__. #define WI_WdfObjectReferenceIncrement(wdfObject, tag) \ wil::wdf_object_reference_increment(wdfObject, tag, __LINE__, __FILE__) -#endif + //! wdf_request_completer is a unique_any-like RAII class for managing completion of a + //! WDFREQUEST. On destruction or explicit reset() it completes the WDFREQUEST with parameters + //! (status, information, priority boost) previously set using methods on this class. + //! + //! This class does not use the unique_any_t template primarily because the release() and put() + //! methods need to return a WDFREQUEST/WDFREQUEST*, as opposed to the internal storage type. + class wdf_request_completer + { + public: -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && \ - defined(_CFGMGR32_H_) && \ - (WINVER >= _WIN32_WINNT_WIN8) && \ - !defined(__WIL_CFGMGR32_H_) -#define __WIL_CFGMGR32_H_ - typedef unique_any unique_hcmnotification; + explicit wdf_request_completer(WDFREQUEST wdfRequest = WDF_NO_HANDLE) WI_NOEXCEPT + : m_wdfRequest(wdfRequest) + { + } + + wdf_request_completer(const wdf_request_completer&) = delete; + wdf_request_completer& operator=(const wdf_request_completer&) = delete; + + wdf_request_completer(wdf_request_completer&& other) WI_NOEXCEPT + : m_wdfRequest(other.m_wdfRequest), m_status(other.m_status), m_information(other.m_information), +#if defined(WIL_KERNEL_MODE) + m_priorityBoost(other.m_priorityBoost), #endif + m_completionFlags(other.m_completionFlags) + { + clear_state(other); + } -#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && \ - defined(_SWDEVICE_H_) && \ - (WINVER >= _WIN32_WINNT_WIN8) && \ - !defined(__WIL_SWDEVICE_H_) -#define __WIL_SWDEVICE_H_ - typedef unique_any unique_hswdevice; + wdf_request_completer& operator=(wdf_request_completer&& other) WI_NOEXCEPT + { + if (this != wistd::addressof(other)) + { + reset(); + m_wdfRequest = other.m_wdfRequest; + m_status = other.m_status; + m_information = other.m_information; +#if defined(WIL_KERNEL_MODE) + m_priorityBoost = other.m_priorityBoost; #endif + m_completionFlags = other.m_completionFlags; + clear_state(other); + } -#if defined(WIL_KERNEL_MODE) && (defined(_WDMDDK_) || defined(_NTDDK_)) && !defined(__WIL_RESOURCE_WDM) -#define __WIL_RESOURCE_WDM + return *this; + } - namespace details - { - struct kspin_lock_saved_irql + ~wdf_request_completer() WI_NOEXCEPT { - PKSPIN_LOCK spinLock = nullptr; - KIRQL savedIrql = PASSIVE_LEVEL; - - kspin_lock_saved_irql() = default; + reset(); + } - kspin_lock_saved_irql(PKSPIN_LOCK /* spinLock */) - { - // This constructor exists simply to allow conversion of the pointer type to - // pointer_storage type when constructing an invalid instance. The spinLock pointer - // is expected to be nullptr. - } + WDFREQUEST get() const WI_NOEXCEPT + { + return m_wdfRequest; + } - // Exists to satisfy the interconvertibility requirement for pointer_storage and - // pointer. - explicit operator PKSPIN_LOCK() const - { - return spinLock; - } + //! Set the NTSTATUS value with with the WDFREQUEST will be completed when the RAII object + //! goes out of scope or .reset() is called explicitly. Calling this method does *not* + //! complete the request right away. No effect if this object currently does not have + //! ownership of a WDFREQUEST. The expected usage pattern is that set_status() is called + //! only after ownership of a WDFREQUEST is transferred to this object. + void set_status(NTSTATUS status) WI_NOEXCEPT + { + // The contract is that this method has no effect if we currently do not have a + // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is + // attached, not by explicitly checking for that condition here. - _IRQL_requires_(DISPATCH_LEVEL) - static - void Release(_In_ _IRQL_restores_ const kspin_lock_saved_irql& spinLockSavedIrql) - { - KeReleaseSpinLock(spinLockSavedIrql.spinLock, spinLockSavedIrql.savedIrql); - } - }; + m_status = status; + } - // On some architectures KeReleaseSpinLockFromDpcLevel is a macro, and we need a thunk - // function we can take the address of. - inline - _IRQL_requires_min_(DISPATCH_LEVEL) - void __stdcall ReleaseSpinLockFromDpcLevel(_Inout_ PKSPIN_LOCK spinLock) WI_NOEXCEPT + //! Set the IO_STATUS_BLOCK.Information value with which the WDFREQUEST will be completed. + //! Note that the Information value is not stored directly in the WDFREQUEST using + //! WdfRequestSetInformation. It is only used at the time of completion. No effect if this + //! object currently does not have ownership of a WDFREQUEST. The expected usage pattern is + //! that set_information() is called only after ownership of a WDFREQUEST is transferred to + //! this object. + void set_information(ULONG_PTR information) WI_NOEXCEPT { - KeReleaseSpinLockFromDpcLevel(spinLock); + // The contract is that this method has no effect if we currently do not have a + // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is + // attached, not by explicitly checking for that condition here. + + m_completionFlags.informationSet = 1; + m_information = information; } - } - using kspin_lock_guard = unique_any; +#if defined(WIL_KERNEL_MODE) + //! Set the priority boost with which the WDFREQUEST will be completed. If this method is + //! called, the WDFREQUEST will eventually be completed with + //! WdfRequestCompleteWithPriorityBoost. No effect if this object currently does not have + //! ownership of a WDFREQUEST. The expected usage pattern is that set_priority_boost() is + //! called only after ownership of a WDFREQUEST is transferred to this object. + void set_priority_boost(CCHAR priorityBoost) WI_NOEXCEPT + { + // The contract is that this method has no effect if we currently do not have a + // m_wdfRequest. But that is enforced by discarding all state when a WDFREQUEST is + // attached, not by explicitly checking for that condition here. - using kspin_lock_at_dpc_guard = unique_any; + m_completionFlags.priorityBoostSet = 1; + m_priorityBoost = priorityBoost; + } +#endif - inline - WI_NODISCARD - _IRQL_requires_max_(DISPATCH_LEVEL) - _IRQL_saves_ - _IRQL_raises_(DISPATCH_LEVEL) + explicit operator bool() const WI_NOEXCEPT + { + return m_wdfRequest != WDF_NO_HANDLE; + } + + WDFREQUEST* put() WI_NOEXCEPT + { + reset(); + return &m_wdfRequest; + } + + WDFREQUEST* operator&() WI_NOEXCEPT + { + return put(); + } + + //! Relinquishes completion responsibility for the WDFREQUEST. Note that any state + //! (information, priority boost, status) set on this object is lost. This design choice was + //! made because it is atypical to set an information or priority boost value upfront; they + //! are typically set at the point where the request is going to be completed. Hence a + //! use-case wherein release() is called will typically not have set an information or + //! priority boost. + WDFREQUEST release() WI_NOEXCEPT + { + const auto wdfRequest = m_wdfRequest; + clear_state(*this); + return wdfRequest; + } + + void swap(wdf_request_completer& other) WI_NOEXCEPT + { + wistd::swap_wil(m_wdfRequest, other.m_wdfRequest); + wistd::swap_wil(m_information, other.m_information); + wistd::swap_wil(m_status, other.m_status); +#if defined(WIL_KERNEL_MODE) + wistd::swap_wil(m_priorityBoost, other.m_priorityBoost); +#endif + wistd::swap_wil(m_completionFlags, other.m_completionFlags); + } + + void reset(WDFREQUEST newWdfRequest = WDF_NO_HANDLE) + { + if (m_wdfRequest != WDF_NO_HANDLE) + { + // We try to match the usage patterns that the driver would have typically used in the + // various scenarios. For instance, if the driver has set the information field, we'll + // call WdfRequestCompleteWithInformation instead of calling WdfRequestSetInformation + // followed by WdfRequestComplete. + +#if defined(WIL_KERNEL_MODE) + if (m_completionFlags.priorityBoostSet) + { + if (m_completionFlags.informationSet) + { + WdfRequestSetInformation(m_wdfRequest, m_information); + } + + WdfRequestCompleteWithPriorityBoost(m_wdfRequest, m_status, m_priorityBoost); + } + else +#endif + if (m_completionFlags.informationSet) + { + WdfRequestCompleteWithInformation(m_wdfRequest, m_status, m_information); + } + else + { + WdfRequestComplete(m_wdfRequest, m_status); + } + } + + // We call clear_state unconditionally just in case some parameters (status, + // information, etc.) were set prior to attaching a WDFREQUEST to this object. Those + // parameters are not considered relevant to the WDFREQUEST being attached to this + // object now. + clear_state(*this, newWdfRequest); + } + + private: + + static void clear_state(wdf_request_completer& completer, WDFREQUEST newWdfRequest = WDF_NO_HANDLE) WI_NOEXCEPT + { + completer.m_wdfRequest = newWdfRequest; + completer.m_status = STATUS_UNSUCCESSFUL; + completer.m_information = 0; +#if defined(WIL_KERNEL_MODE) + completer.m_priorityBoost = 0; +#endif + completer.m_completionFlags = {}; + } + + // Members are ordered in decreasing size to minimize padding. + + WDFREQUEST m_wdfRequest = WDF_NO_HANDLE; + + // This will not be used unless m_completionFlags.informationSet is set. + ULONG_PTR m_information = 0; + + // There is no reasonably default NTSTATUS value. Callers are expected to explicitly set a + // status value at the point where it is decided that the request needs to be completed. + NTSTATUS m_status = STATUS_UNSUCCESSFUL; + +// UMDF does not support WdfRequestCompleteWithPriorityBoost. +#if defined(WIL_KERNEL_MODE) + // This will not be used unless m_completionFlags.priorityBoostSet is set. + CCHAR m_priorityBoost = 0; +#endif + + struct + { + UINT8 informationSet : 1; +#if defined(WIL_KERNEL_MODE) + UINT8 priorityBoostSet : 1; +#endif + } m_completionFlags = {}; + }; +#endif + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && \ + defined(_CFGMGR32_H_) && \ + (WINVER >= _WIN32_WINNT_WIN8) && \ + !defined(__WIL_CFGMGR32_H_) +#define __WIL_CFGMGR32_H_ + typedef unique_any unique_hcmnotification; +#endif + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) && \ + defined(_SWDEVICE_H_) && \ + (WINVER >= _WIN32_WINNT_WIN8) && \ + !defined(__WIL_SWDEVICE_H_) +#define __WIL_SWDEVICE_H_ + typedef unique_any unique_hswdevice; +#endif + +#if defined(WIL_KERNEL_MODE) && (defined(_WDMDDK_) || defined(_NTDDK_)) && !defined(__WIL_RESOURCE_WDM) +#define __WIL_RESOURCE_WDM + + namespace details + { + struct kspin_lock_saved_irql + { + PKSPIN_LOCK spinLock = nullptr; + KIRQL savedIrql = PASSIVE_LEVEL; + + kspin_lock_saved_irql() = default; + + kspin_lock_saved_irql(PKSPIN_LOCK /* spinLock */) + { + // This constructor exists simply to allow conversion of the pointer type to + // pointer_storage type when constructing an invalid instance. The spinLock pointer + // is expected to be nullptr. + } + + // Exists to satisfy the interconvertibility requirement for pointer_storage and + // pointer. + explicit operator PKSPIN_LOCK() const + { + return spinLock; + } + + _IRQL_requires_(DISPATCH_LEVEL) + static + void Release(_In_ _IRQL_restores_ const kspin_lock_saved_irql& spinLockSavedIrql) + { + KeReleaseSpinLock(spinLockSavedIrql.spinLock, spinLockSavedIrql.savedIrql); + } + }; + + // On some architectures KeReleaseSpinLockFromDpcLevel is a macro, and we need a thunk + // function we can take the address of. + inline + _IRQL_requires_min_(DISPATCH_LEVEL) + void __stdcall ReleaseSpinLockFromDpcLevel(_Inout_ PKSPIN_LOCK spinLock) WI_NOEXCEPT + { + KeReleaseSpinLockFromDpcLevel(spinLock); + } + } + + using kspin_lock_guard = unique_any; + + using kspin_lock_at_dpc_guard = unique_any; + + WI_NODISCARD + inline + _IRQL_requires_max_(DISPATCH_LEVEL) + _IRQL_saves_ + _IRQL_raises_(DISPATCH_LEVEL) kspin_lock_guard acquire_kspin_lock(_In_ PKSPIN_LOCK spinLock) { @@ -5815,8 +6281,8 @@ namespace wil return kspin_lock_guard(spinLockSavedIrql); } - inline WI_NODISCARD + inline _IRQL_requires_min_(DISPATCH_LEVEL) kspin_lock_at_dpc_guard acquire_kspin_lock_at_dpc(_In_ PKSPIN_LOCK spinLock) @@ -5828,7 +6294,6 @@ namespace wil class kernel_spin_lock { public: - kernel_spin_lock() WI_NOEXCEPT { ::KeInitializeSpinLock(&m_kSpinLock); @@ -5859,7 +6324,6 @@ namespace wil } private: - KSPIN_LOCK m_kSpinLock; }; @@ -5869,7 +6333,6 @@ namespace wil class kernel_event_t { public: - explicit kernel_event_t(bool isSignaled = false) WI_NOEXCEPT { ::KeInitializeEvent(&m_kernelEvent, static_cast(eventType), isSignaled ? TRUE : FALSE); @@ -5926,7 +6389,6 @@ namespace wil } private: - bool wait_for_single_object(_In_opt_ LARGE_INTEGER* waitDuration) WI_NOEXCEPT { auto status = ::KeWaitForSingleObject(&m_kernelEvent, Executive, KernelMode, FALSE, waitDuration); @@ -5945,6 +6407,224 @@ namespace wil using kernel_event_manual_reset = details::kernel_event_t; using kernel_event = kernel_event_auto_reset; // For parity with the default for other WIL event types. + /** + RAII class and lock-guards for a kernel FAST_MUTEX. + */ + + using fast_mutex_guard = unique_any; + + WI_NODISCARD + inline + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_guard acquire_fast_mutex(FAST_MUTEX* fastMutex) WI_NOEXCEPT + { + ::ExAcquireFastMutex(fastMutex); + return fast_mutex_guard(fastMutex); + } + + WI_NODISCARD + inline + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_guard try_acquire_fast_mutex(FAST_MUTEX* fastMutex) WI_NOEXCEPT + { + if (::ExTryToAcquireFastMutex(fastMutex)) + { + return fast_mutex_guard(fastMutex); + } + else + { + return fast_mutex_guard(); + } + } + + class fast_mutex + { + public: + fast_mutex() WI_NOEXCEPT + { + ::ExInitializeFastMutex(&m_fastMutex); + } + + ~fast_mutex() WI_NOEXCEPT = default; + + // Cannot change memory location. + fast_mutex(const fast_mutex&) = delete; + fast_mutex& operator=(const fast_mutex&) = delete; + fast_mutex(fast_mutex&&) = delete; + fast_mutex& operator=(fast_mutex&&) = delete; + + // Calls ExAcquireFastMutex. Returned wil::unique_any object calls ExReleaseFastMutex on + // destruction. + WI_NODISCARD + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_guard acquire() WI_NOEXCEPT + { + return acquire_fast_mutex(&m_fastMutex); + } + + // Calls ExTryToAcquireFastMutex. Returned wil::unique_any may be empty. If non-empty, it + // calls ExReleaseFastMutex on destruction. + WI_NODISCARD + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_guard try_acquire() WI_NOEXCEPT + { + return try_acquire_fast_mutex(&m_fastMutex); + } + + private: + FAST_MUTEX m_fastMutex; + }; + + namespace details + { + _IRQL_requires_max_(APC_LEVEL) + inline void release_fast_mutex_with_critical_region(FAST_MUTEX* fastMutex) WI_NOEXCEPT + { + ::ExReleaseFastMutexUnsafe(fastMutex); + ::KeLeaveCriticalRegion(); + } + } + + using fast_mutex_with_critical_region_guard = + unique_any; + + WI_NODISCARD + inline + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_with_critical_region_guard acquire_fast_mutex_with_critical_region(FAST_MUTEX* fastMutex) WI_NOEXCEPT + { + ::KeEnterCriticalRegion(); + ::ExAcquireFastMutexUnsafe(fastMutex); + return fast_mutex_with_critical_region_guard(fastMutex); + } + + // A FAST_MUTEX lock class that calls KeEnterCriticalRegion and then ExAcquireFastMutexUnsafe. + // Returned wil::unique_any lock-guard calls ExReleaseFastMutexUnsafe and KeLeaveCriticalRegion + // on destruction. This is useful if calling code wants to stay at PASSIVE_LEVEL. + class fast_mutex_with_critical_region + { + public: + fast_mutex_with_critical_region() WI_NOEXCEPT + { + ::ExInitializeFastMutex(&m_fastMutex); + } + + ~fast_mutex_with_critical_region() WI_NOEXCEPT = default; + + // Cannot change memory location. + fast_mutex_with_critical_region(const fast_mutex_with_critical_region&) = delete; + fast_mutex_with_critical_region& operator=(const fast_mutex_with_critical_region&) = delete; + fast_mutex_with_critical_region(fast_mutex_with_critical_region&&) = delete; + fast_mutex_with_critical_region& operator=(fast_mutex_with_critical_region&&) = delete; + + WI_NODISCARD + _IRQL_requires_max_(APC_LEVEL) + fast_mutex_with_critical_region_guard acquire() WI_NOEXCEPT + { + return acquire_fast_mutex_with_critical_region(&m_fastMutex); + } + + private: + FAST_MUTEX m_fastMutex; + }; + + //! A type that calls KeLeaveCriticalRegion on destruction (or reset()). + using unique_leave_critical_region_call = unique_call; + + //! Disables user APCs and normal kernel APCs; returns an RAII object that reverts + WI_NODISCARD inline unique_leave_critical_region_call enter_critical_region() + { + KeEnterCriticalRegion(); + return{}; + } + + //! A type that calls KeLeaveGuardedRegion on destruction (or reset()). + using unique_leave_guarded_region_call = unique_call; + + //! Disables all APCs; returns an RAII object that reverts + WI_NODISCARD inline unique_leave_guarded_region_call enter_guarded_region() + { + KeEnterGuardedRegion(); + return{}; + } + + namespace details + { + _IRQL_requires_max_(APC_LEVEL) + inline void release_push_lock_exclusive(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT + { + ::ExReleasePushLockExclusive(pushLock); + ::KeLeaveCriticalRegion(); + } + + _IRQL_requires_max_(APC_LEVEL) + inline void release_push_lock_shared(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT + { + ::ExReleasePushLockShared(pushLock); + ::KeLeaveCriticalRegion(); + } + } + + using push_lock_exclusive_guard = + unique_any; + + using push_lock_shared_guard = + unique_any; + + WI_NODISCARD + inline + _IRQL_requires_max_(APC_LEVEL) + push_lock_exclusive_guard acquire_push_lock_exclusive(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT + { + ::KeEnterCriticalRegion(); + ::ExAcquirePushLockExclusive(pushLock); + return push_lock_exclusive_guard(pushLock); + } + + WI_NODISCARD + inline + _IRQL_requires_max_(APC_LEVEL) + push_lock_shared_guard acquire_push_lock_shared(EX_PUSH_LOCK* pushLock) WI_NOEXCEPT + { + ::KeEnterCriticalRegion(); + ::ExAcquirePushLockShared(pushLock); + return push_lock_shared_guard(pushLock); + } + + class push_lock + { + public: + push_lock() WI_NOEXCEPT + { + ::ExInitializePushLock(&m_pushLock); + } + + ~push_lock() WI_NOEXCEPT = default; + + // Cannot change memory location. + push_lock(const push_lock&) = delete; + push_lock& operator=(const push_lock&) = delete; + push_lock(push_lock&&) = delete; + push_lock& operator=(push_lock&&) = delete; + + WI_NODISCARD + _IRQL_requires_max_(APC_LEVEL) + push_lock_exclusive_guard acquire_exclusive() WI_NOEXCEPT + { + return acquire_push_lock_exclusive(&m_pushLock); + } + + WI_NODISCARD + _IRQL_requires_max_(APC_LEVEL) + push_lock_shared_guard acquire_shared() WI_NOEXCEPT + { + return acquire_push_lock_shared(&m_pushLock); + } + + private: + EX_PUSH_LOCK m_pushLock; + }; + namespace details { // Define a templated type for pool functions in order to satisfy overload resolution below @@ -5979,6 +6659,422 @@ namespace wil #endif // __WIL_RESOURCE_ZWAPI +#if defined(WINTRUST_H) && defined(SOFTPUB_H) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(__WIL_WINTRUST) +#define __WIL_WINTRUST + namespace details + { + inline void __stdcall CloseWintrustData(_Inout_ WINTRUST_DATA* wtData) WI_NOEXCEPT + { + GUID guidV2 = WINTRUST_ACTION_GENERIC_VERIFY_V2; + wtData->dwStateAction = WTD_STATEACTION_CLOSE; + WinVerifyTrust(static_cast(INVALID_HANDLE_VALUE), &guidV2, wtData); + } + } + typedef wil::unique_struct unique_wintrust_data; +#endif // __WIL_WINTRUST + +#if defined(MSCAT_H) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && !defined(__WIL_MSCAT) +#define __WIL_MSCAT + namespace details + { + inline void __stdcall CryptCATAdminReleaseContextNoFlags(_Pre_opt_valid_ _Frees_ptr_opt_ HCATADMIN handle) WI_NOEXCEPT + { + CryptCATAdminReleaseContext(handle, 0); + } + } + typedef wil::unique_any unique_hcatadmin; + +#if defined(WIL_RESOURCE_STL) + typedef shared_any shared_hcatadmin; + struct hcatinfo_deleter + { + hcatinfo_deleter(wil::shared_hcatadmin handle) WI_NOEXCEPT : m_hCatAdmin(wistd::move(handle)) {} + void operator()(_Pre_opt_valid_ _Frees_ptr_opt_ HCATINFO handle) const WI_NOEXCEPT + { + CryptCATAdminReleaseCatalogContext(m_hCatAdmin.get(), handle, 0); + } + wil::shared_hcatadmin m_hCatAdmin; + }; + // This stores HCATINFO, i.e. HANDLE (void *) + typedef wistd::unique_ptr unique_hcatinfo; + + namespace details + { + class crypt_catalog_enumerator + { + wil::unique_hcatinfo m_hCatInfo; + const BYTE * m_hash; + DWORD m_hashLen; + bool m_initialized = false; + + struct ref + { + explicit ref(crypt_catalog_enumerator &r) WI_NOEXCEPT : + m_r(r) + {} + + operator HCATINFO() const WI_NOEXCEPT + { + return m_r.current(); + } + + wil::unique_hcatinfo move_from_unique_hcatinfo() WI_NOEXCEPT + { + wil::unique_hcatinfo info(wistd::move(m_r.m_hCatInfo)); + return info; + } + + bool operator==(wistd::nullptr_t) const WI_NOEXCEPT + { + return m_r.m_hCatInfo == nullptr; + } + + bool operator!=(wistd::nullptr_t) const WI_NOEXCEPT + { + return !(*this == nullptr); + } + + private: + crypt_catalog_enumerator &m_r; + }; + + struct iterator + { +#ifdef _XUTILITY_ + // muse be input_iterator_tag as use of one instance invalidates the other. + typedef ::std::input_iterator_tag iterator_category; +#endif + + explicit iterator(crypt_catalog_enumerator *r) WI_NOEXCEPT : + m_r(r) + {} + + iterator(const iterator &) = default; + iterator(iterator &&) = default; + iterator &operator=(const iterator &) = default; + iterator &operator=(iterator &&) = default; + + bool operator==(const iterator &rhs) const WI_NOEXCEPT + { + if (rhs.m_r == m_r) + { + return true; + } + + return (*this == nullptr) && (rhs == nullptr); + } + + bool operator!=(const iterator &rhs) const WI_NOEXCEPT + { + return !(rhs == *this); + } + + bool operator==(wistd::nullptr_t) const WI_NOEXCEPT + { + return nullptr == m_r || nullptr == m_r->current(); + } + + bool operator!=(wistd::nullptr_t) const WI_NOEXCEPT + { + return !(*this == nullptr); + } + + iterator &operator++() WI_NOEXCEPT + { + if (m_r != nullptr) + { + m_r->next(); + } + + return *this; + } + + ref operator*() const WI_NOEXCEPT + { + return ref(*m_r); + } + + private: + crypt_catalog_enumerator *m_r; + }; + + shared_hcatadmin &hcatadmin() WI_NOEXCEPT + { + return m_hCatInfo.get_deleter().m_hCatAdmin; + } + + bool move_next() WI_NOEXCEPT + { + HCATINFO prevCatInfo = m_hCatInfo.release(); + m_hCatInfo.reset( + ::CryptCATAdminEnumCatalogFromHash( + hcatadmin().get(), + const_cast(m_hash), + m_hashLen, + 0, + &prevCatInfo)); + return !!m_hCatInfo; + } + + HCATINFO next() WI_NOEXCEPT + { + if (m_initialized && m_hCatInfo) + { + move_next(); + } + + return current(); + } + + HCATINFO init() WI_NOEXCEPT + { + if (!m_initialized) + { + m_initialized = true; + move_next(); + } + + return current(); + } + + HCATINFO current() WI_NOEXCEPT + { + return m_hCatInfo.get(); + } + + public: + crypt_catalog_enumerator(wil::shared_hcatadmin &hCatAdmin, + const BYTE *hash, + DWORD hashLen) WI_NOEXCEPT : + m_hCatInfo(nullptr, hCatAdmin), + m_hash(hash), + m_hashLen(hashLen) + // , m_initialized(false) // redundant + {} + + iterator begin() WI_NOEXCEPT + { + init(); + return iterator(this); + } + + iterator end() const WI_NOEXCEPT + { + return iterator(nullptr); + } + + crypt_catalog_enumerator(crypt_catalog_enumerator &&) = default; + crypt_catalog_enumerator &operator=(crypt_catalog_enumerator &&) = default; + + crypt_catalog_enumerator(const crypt_catalog_enumerator &) = delete; + crypt_catalog_enumerator &operator=(const crypt_catalog_enumerator &) = delete; + }; + } + + /** Use to enumerate catalogs containing a hash with a range-based for. + This avoids handling a raw resource to call CryptCATAdminEnumCatalogFromHash correctly. + Example: + `for (auto&& cat : wil::make_catalog_enumerator(hCatAdmin, hash, hashLen)) + { CryptCATCatalogInfoFromContext(cat, &catInfo, 0); }` */ + inline details::crypt_catalog_enumerator make_crypt_catalog_enumerator(wil::shared_hcatadmin &hCatAdmin, + _In_count_(hashLen) const BYTE *hash, DWORD hashLen) WI_NOEXCEPT + { + return details::crypt_catalog_enumerator(hCatAdmin, hash, hashLen); + } + + template + details::crypt_catalog_enumerator make_crypt_catalog_enumerator(wil::shared_hcatadmin &hCatAdmin, + const BYTE (&hash)[Size]) WI_NOEXCEPT + { + static_assert(Size <= static_cast(0xffffffffUL), "Array size truncated"); + return details::crypt_catalog_enumerator(hCatAdmin, hash, static_cast(Size)); + } + +#endif // WI_RESOURCE_STL + +#endif // __WIL_MSCAT + + +#if !defined(__WIL_RESOURCE_LOCK_ENFORCEMENT) +#define __WIL_RESOURCE_LOCK_ENFORCEMENT + + /** + Functions that need an exclusive lock use can use write_lock_required as a parameter to enforce lock + safety at compile time. Similarly, read_lock_required may stand as a parameter where shared ownership + of a lock is required. These are empty structs that will never be used, other than passing them on to + another function that requires them. + + These types are implicitly convertible from various lock holding types, enabling callers to provide them as + proof of the lock that they hold. + + The following example is intentially contrived to demonstrate multiple use cases: + - Methods that require only shared/read access + - Methods that require only exclusive write access + - Methods that pass their proof-of-lock to a helper + ~~~ + class RemoteControl + { + public: + void VolumeUp(); + int GetVolume(); + private: + int GetCurrentVolume(wil::read_lock_required); + void AdjustVolume(int delta, wil::write_lock_required); + void SetNewVolume(int newVolume, wil::write_lock_required); + + int m_currentVolume = 0; + wil::srwlock m_lock; + }; + + void RemoteControl::VolumeUp() + { + auto writeLock = m_lock.lock_exclusive(); + AdjustVolume(1, writeLock); + } + + int RemoteControl::GetVolume() + { + auto readLock = m_lock.lock_shared(); + return GetCurrentVolume(readLock); + } + + int RemoteControl::GetCurrentVolume(wil::read_lock_required) + { + return m_currentVolume; + } + + void AdjustVolume(int delta, wil::write_lock_required lockProof) + { + const auto currentVolume = GetCurrentVolume(lockProof); + SetNewVolume(currentVolume + delta, lockProof); + } + + void RemoteControl::SetNewVolume(int newVolume, wil::write_lock_required) + { + m_currentVolume = newVolume; + } + ~~~ + + In this design it is impossible to not meet the "lock must be held" precondition and the function parameter types + help you understand which one. + + Cases not handled: + - Functions that need the lock held, but fail to specify this fact by requiring a lock required parameter need + to be found via code inspection. + - Recursively taking a lock, when it is already held, is not avoided in this pattern + - Readers will learn to be suspicious of acquiring a lock in functions with lock required parameters. + - Designs with multiple locks, that must be careful to take them in the same order every time, are not helped + by this pattern. + - Locking the wrong object + - Use of a std::lock type that has not actually be secured yet (such as by std::try_to_lock or std::defer_lock) + - or use of a lock type that had been acquired but has since been released, reset, or otherwise unlocked + + These utility types are not fool-proof against all lock misuse, anti-patterns, or other complex yet valid + scenarios. However on the net, their usage in typical cases can assist in creating clearer, self-documenting + code that catches the common issues of forgetting to hold a lock or forgetting whether a lock is required to + call another method safely. + */ + struct write_lock_required; + + /** + Stands as proof that a shared lock has been acquired. See write_lock_required for more information. + */ + struct read_lock_required; + + namespace details + { + // Only those lock types specialized by lock_proof_traits will allow either a write_lock_required or + // read_lock_required to be constructed. The allows_exclusive value indicates if the type represents an exclusive, + // write-safe lock aquisition, or a shared, read-only lock acquisition. + template + struct lock_proof_traits { }; + + // Base for specializing lock_proof_traits where the lock type is shared + struct shared_lock_proof + { + static constexpr bool allows_shared = true; + }; + + // Base for specializing lock_proof_traits where the lock type is exclusive (super-set of shared_lock_proof) + struct exclusive_lock_proof : shared_lock_proof + { + static constexpr bool allows_exclusive = true; + }; + } + + struct write_lock_required + { + /** + Construct a new write_lock_required object for use as proof that an exclusive lock has been acquired. + */ + template + write_lock_required(const TLockProof&, wistd::enable_if_t::allows_exclusive, int> = 0) {} + + write_lock_required() = delete; // No default construction + }; + + struct read_lock_required + { + /** + Construct a new read_lock_required object for use as proof that a shared lock has been acquired. + */ + template + read_lock_required(const TLockProof&, wistd::enable_if_t::allows_shared, int> = 0) {} + + /** + Uses a prior write_lock_required object to construct a read_lock_required object as proof that at shared lock + has been acquired. (Exclusive locks held are presumed to suffice for proof of a read lock) + */ + read_lock_required(const write_lock_required&) {} + + read_lock_required() = delete; // No default construction + }; +#endif // __WIL_RESOURCE_LOCK_ENFORCEMENT + +#if defined(__WIL_WINBASE_) && !defined(__WIL__RESOURCE_LOCKPROOF_WINBASE) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT) +#define __WIL__RESOURCE_LOCKPROOF_WINBASE + + namespace details + { + // Specializations for srwlock + template<> + struct lock_proof_traits : shared_lock_proof {}; + + template<> + struct lock_proof_traits : exclusive_lock_proof {}; + + // Specialization for critical_section + template<> + struct lock_proof_traits : exclusive_lock_proof {}; + } + +#endif //__WIL__RESOURCE_LOCKPROOF_WINBASE + +#if defined(_MUTEX_) && !defined(__WIL__RESOURCE_LOCKPROOF_MUTEX) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT) +#define __WIL__RESOURCE_LOCKPROOF_MUTEX + + namespace details + { + template + struct lock_proof_traits> : exclusive_lock_proof {}; + + template + struct lock_proof_traits> : exclusive_lock_proof {}; + } + +#endif //__WIL__RESOURCE_LOCKPROOF_MUTEX + +#if defined(_SHARED_MUTEX_) && !defined(__WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX) && defined(__WIL_RESOURCE_LOCK_ENFORCEMENT) +#define __WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX + + namespace details + { + template + struct lock_proof_traits> : shared_lock_proof {}; + } + +#endif //__WIL__RESOURCE_LOCKPROOF_SHAREDMUTEX + } // namespace wil #pragma warning(pop) diff --git a/Externals/WIL/include/wil/result.h b/Externals/WIL/include/wil/result.h index f3b61e60549f..9a768bc4048f 100644 --- a/Externals/WIL/include/wil/result.h +++ b/Externals/WIL/include/wil/result.h @@ -252,7 +252,8 @@ namespace wil if (ProcessShutdownInProgress()) { // There are no other threads to contend with. - if (--m_refCount == 0) + m_refCount = m_refCount - 1; + if (m_refCount == 0) { m_data.ProcessShutdown(); } @@ -260,7 +261,8 @@ namespace wil else { auto lock = m_mutex.acquire(); - if (--m_refCount == 0) + m_refCount = m_refCount - 1; + if (m_refCount == 0) { // We must explicitly destroy our semaphores while holding the mutex m_value.Destroy(); @@ -281,7 +283,7 @@ namespace wil const DWORD size = static_cast(sizeof(ProcessLocalStorageData)); wchar_t name[MAX_PATH]; - WI_VERIFY(SUCCEEDED(StringCchPrintfW(name, ARRAYSIZE(name), L"Local\\SM0:%d:%d:%hs", ::GetCurrentProcessId(), size, staticNameWithVersion))); + WI_VERIFY(SUCCEEDED(StringCchPrintfW(name, ARRAYSIZE(name), L"Local\\SM0:%lu:%lu:%hs", ::GetCurrentProcessId(), size, staticNameWithVersion))); unique_mutex_nothrow mutex; mutex.reset(::CreateMutexExW(nullptr, name, 0, MUTEX_ALL_ACCESS)); @@ -295,7 +297,7 @@ namespace wil if (pointer) { *data = reinterpret_cast*>(pointer); - (*data)->m_refCount++; + (*data)->m_refCount = (*data)->m_refCount + 1; } else { @@ -312,13 +314,13 @@ namespace wil SemaphoreValue m_value; T m_data; - static HRESULT MakeAndInitialize(PCWSTR name, unique_mutex_nothrow&& mutex, ProcessLocalStorageData** data) + static HRESULT MakeAndInitialize(PCWSTR name, unique_mutex_nothrow&& mutex, _Outptr_result_nullonfailure_ ProcessLocalStorageData** data) { *data = nullptr; const DWORD size = static_cast(sizeof(ProcessLocalStorageData)); - unique_process_heap_ptr> dataAlloc(static_cast*>(::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, size))); + unique_process_heap_ptr> dataAlloc(static_cast*>(details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, size))); __WIL_PRIVATE_RETURN_IF_NULL_ALLOC(dataAlloc); SemaphoreValue semaphoreValue; @@ -406,10 +408,9 @@ namespace wil if (shouldAllocate) { - Node *pNew = reinterpret_cast(::HeapAlloc(::GetProcessHeap(), 0, sizeof(Node))); - if (pNew != nullptr) + if (auto pNewRaw = details::ProcessHeapAlloc(0, sizeof(Node))) { - new(pNew)Node{ threadId }; + auto pNew = new (pNewRaw) Node{ threadId }; Node *pFirst; do @@ -428,7 +429,7 @@ namespace wil struct Node { - DWORD threadId; + DWORD threadId = ULONG_MAX; Node* pNext = nullptr; T value{}; }; @@ -487,7 +488,7 @@ namespace wil if (!stringBuffer || (stringBufferSize < neededSize)) { - auto newBuffer = ::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, neededSize); + auto newBuffer = details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, neededSize); if (newBuffer) { ::HeapFree(::GetProcessHeap(), 0, stringBuffer); @@ -508,7 +509,7 @@ namespace wil } } - void Get(FailureInfo& info) + void Get(FailureInfo& info) const { ::ZeroMemory(&info, sizeof(info)); @@ -565,7 +566,7 @@ namespace wil if (!errors && create) { const unsigned short errorCount = 5; - errors = reinterpret_cast(::HeapAlloc(::GetProcessHeap(), HEAP_ZERO_MEMORY, errorCount * sizeof(ThreadLocalFailureInfo))); + errors = reinterpret_cast(details::ProcessHeapAlloc(HEAP_ZERO_MEMORY, errorCount * sizeof(ThreadLocalFailureInfo))); if (errors) { errorAllocCount = errorCount; @@ -611,7 +612,7 @@ namespace wil errors[errorCurrentIndex].Set(info, ::InterlockedIncrementNoFence(failureSequenceId)); } - bool GetLastError(_Inout_ wil::FailureInfo& info, unsigned int minSequenceId, HRESULT matchRequirement) + bool GetLastError(_Inout_ wil::FailureInfo& info, unsigned int minSequenceId, HRESULT matchRequirement) const { if (!errors) { @@ -678,7 +679,7 @@ namespace wil // NOTE: FailureType::Log as it's only informative (no action) and SupportedExceptions::All as it's not a barrier, only recognition. wchar_t message[2048]; message[0] = L'\0'; - const HRESULT hr = details::ReportFailure_CaughtExceptionCommon(__R_DIAGNOSTICS_RA(source, returnAddress), message, ARRAYSIZE(message), SupportedExceptions::All); + const HRESULT hr = details::ReportFailure_CaughtExceptionCommon(__R_DIAGNOSTICS_RA(source, returnAddress), message, ARRAYSIZE(message), SupportedExceptions::All).hr; // Now that the exception was logged, we should be able to fetch it. return GetLastError(info, minSequenceId, hr); @@ -958,7 +959,7 @@ namespace wil m_ppThreadList = nullptr; } - bool IsWatching() + bool IsWatching() const { return (m_threadId != 0); } @@ -1044,7 +1045,9 @@ namespace wil if (g_pfnTelemetryCallback != nullptr) { - g_pfnTelemetryCallback(reportedTelemetry, *pFailure); + // If the telemetry was requested to be suppressed, + // pretend like it has already been reported to the fallback callback + g_pfnTelemetryCallback(reportedTelemetry || WI_IsFlagSet(pFailure->flags, FailureFlags::RequestSuppressTelemetry), *pFailure); } } @@ -1079,7 +1082,7 @@ namespace wil { } - bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT + bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override { return m_errorFunction(failure); } @@ -1251,7 +1254,7 @@ namespace wil return (FAILED(m_failure.GetFailureInfo().hr) ? &(m_failure.GetFailureInfo()) : nullptr); } - bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT + bool NotifyFailure(FailureInfo const &failure) WI_NOEXCEPT override { // When we "cache" a failure, we bias towards trying to find the origin of the last HRESULT // generated, so we ignore subsequent failures on the same error code (assuming propagation). diff --git a/Externals/WIL/include/wil/result_macros.h b/Externals/WIL/include/wil/result_macros.h index d96bf6c5b711..6cb8e30de65f 100644 --- a/Externals/WIL/include/wil/result_macros.h +++ b/Externals/WIL/include/wil/result_macros.h @@ -20,9 +20,11 @@ #include #endif -// Setup the debug behavior +// Setup the debug behavior. For kernel-mode, we ignore NDEBUG because that gets set automatically +// for driver projects. We mimic the behavior of NT_ASSERT which checks only for DBG. +// RESULT_NO_DEBUG is provided as an opt-out mechanism. #ifndef RESULT_DEBUG -#if (DBG || defined(DEBUG) || defined(_DEBUG)) && !defined(NDEBUG) +#if (DBG || defined(DEBUG) || defined(_DEBUG)) && !defined(RESULT_NO_DEBUG) && (defined(WIL_KERNEL_MODE) || !defined(NDEBUG)) #define RESULT_DEBUG #endif #endif @@ -38,7 +40,7 @@ // constructible. Therefore, use 'sizeof' for syntax validation. We don't do this universally for all compilers // since lambdas are not allowed in unevaluated contexts prior to C++20, which does not appear to affect __noop #if !defined(_MSC_VER) || defined(__clang__) -#define __WI_ANALYSIS_ASSUME(_exp) ((void)sizeof(_exp)) // Validate syntax on non-debug builds +#define __WI_ANALYSIS_ASSUME(_exp) ((void)sizeof(!(_exp))) // Validate syntax on non-debug builds #else #define __WI_ANALYSIS_ASSUME(_exp) __noop(_exp) #endif @@ -83,6 +85,9 @@ typedef _Return_type_success_(return >= 0) LONG NTSTATUS; #ifndef STATUS_UNSUCCESSFUL #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) #endif +#ifndef __NTSTATUS_FROM_WIN32 +#define __NTSTATUS_FROM_WIN32(x) ((NTSTATUS)(x) <= 0 ? ((NTSTATUS)(x)) : ((NTSTATUS) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | ERROR_SEVERITY_ERROR))) +#endif #ifndef WIL_AllocateMemory #ifdef _KERNEL_MODE @@ -227,6 +232,9 @@ WI_ODR_PRAGMA("WIL_FreeMemory", "0") #ifndef RESULT_NORETURN_NULL #define RESULT_NORETURN_NULL _Ret_notnull_ #endif +#ifndef RESULT_NORETURN_RESULT +#define RESULT_NORETURN_RESULT(expr) (void)(expr); +#endif //***************************************************************************** // Helpers to setup the macros and functions used below... do not directly use. @@ -917,6 +925,16 @@ namespace wil FailFast // FAIL_FAST_... }; + enum class FailureFlags + { + None = 0x00, + RequestFailFast = 0x01, + RequestSuppressTelemetry = 0x02, + RequestDebugBreak = 0x04, + NtStatus = 0x08, + }; + DEFINE_ENUM_FLAG_OPERATORS(FailureFlags); + /** Use with functions and macros that allow customizing which kinds of exceptions are handled. This is used with methods like wil::ResultFromException and wil::ResultFromExceptionDebug. */ enum class SupportedExceptions @@ -943,7 +961,9 @@ namespace wil struct FailureInfo { FailureType type; + FailureFlags flags; HRESULT hr; + NTSTATUS status; long failureId; // incrementing ID for this specific failure (unique across an individual module load within process) PCWSTR pszMessage; // Message is only present for _MSG logging (it's the Sprintf message) DWORD threadId; // the thread this failure was originally encountered on @@ -1038,6 +1058,9 @@ namespace wil // True if g_pfnResultLoggingCallback is set (allows cutting off backwards compat calls to the function) __declspec(selectany) bool g_resultMessageCallbackSet = false; + // On Desktop/System WINAPI family: convert NTSTATUS error codes to friendly name strings. + __declspec(selectany) void(__stdcall *g_pfnFormatNtStatusMsg)(NTSTATUS, PWSTR, DWORD) = nullptr; + _Success_(true) _Ret_range_(dest, destEnd) inline PWSTR LogStringPrintf(_Out_writes_to_ptr_(destEnd) _Always_(_Post_z_) PWSTR dest, _Pre_satisfies_(destEnd >= dest) PCWSTR destEnd, _In_ _Printf_format_string_ PCWSTR format, ...) { @@ -1081,10 +1104,24 @@ namespace wil pszType = "Exception"; break; case FailureType::Return: - pszType = "ReturnHr"; + if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus)) + { + pszType = "ReturnNt"; + } + else + { + pszType = "ReturnHr"; + } break; case FailureType::Log: - pszType = "LogHr"; + if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus)) + { + pszType = "LogNt"; + } + else + { + pszType = "LogHr"; + } break; case FailureType::FailFast: pszType = "FailFast"; @@ -1093,7 +1130,21 @@ namespace wil wchar_t szErrorText[256]; szErrorText[0] = L'\0'; - FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, failure.hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szErrorText, ARRAYSIZE(szErrorText), nullptr); + LONG errorCode = 0; + + if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus)) + { + errorCode = failure.status; + if (wil::details::g_pfnFormatNtStatusMsg) + { + wil::details::g_pfnFormatNtStatusMsg(failure.status, szErrorText, ARRAYSIZE(szErrorText)); + } + } + else + { + errorCode = failure.hr; + FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, failure.hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szErrorText, ARRAYSIZE(szErrorText), nullptr); + } // %FILENAME(%LINE): %TYPE(%count) tid(%threadid) %HRESULT %SystemMessage // %Caller_MSG [%CODE(%FUNCTION)] @@ -1115,7 +1166,7 @@ namespace wil dest = details::LogStringPrintf(dest, destEnd, L"(caller: %p) ", failure.callerReturnAddress); } - dest = details::LogStringPrintf(dest, destEnd, L"%hs(%d) tid(%x) %08X %ws", pszType, failure.cFailureCount, ::GetCurrentThreadId(), failure.hr, szErrorText); + dest = details::LogStringPrintf(dest, destEnd, L"%hs(%d) tid(%x) %08X %ws", pszType, failure.cFailureCount, ::GetCurrentThreadId(), errorCode, szErrorText); if ((failure.pszMessage != nullptr) || (failure.pszCallContext != nullptr) || (failure.pszFunction != nullptr)) { @@ -1166,10 +1217,35 @@ namespace wil virtual HRESULT ExceptionThrown(void* returnAddress) = 0; }; + __declspec(noinline) inline HRESULT NtStatusToHr(NTSTATUS status) WI_NOEXCEPT; + __declspec(noinline) inline NTSTATUS HrToNtStatus(HRESULT) WI_NOEXCEPT; + + struct ResultStatus + { + enum Kind : unsigned int { HResult, NtStatus }; + + static ResultStatus FromResult(const HRESULT _hr) + { + return { _hr, wil::details::HrToNtStatus(_hr), Kind::HResult }; + } + static ResultStatus FromStatus(const NTSTATUS _status) + { + return { wil::details::NtStatusToHr(_status), _status, Kind::NtStatus }; + } + static ResultStatus FromFailureInfo(const FailureInfo& _failure) + { + return { _failure.hr, _failure.status, WI_IsFlagSet(_failure.flags, FailureFlags::NtStatus) ? Kind::NtStatus : Kind::HResult }; + } + HRESULT hr = S_OK; + NTSTATUS status = STATUS_SUCCESS; + Kind kind = Kind::NtStatus; + }; + // Fallback telemetry provider callback (set with wil::SetResultTelemetryFallback) __declspec(selectany) void(__stdcall *g_pfnTelemetryCallback)(bool alreadyReported, wil::FailureInfo const &failure) WI_PFN_NOEXCEPT = nullptr; // Result.h plug-in (WIL use only) + __declspec(selectany) void(__stdcall* g_pfnNotifyFailure)(_Inout_ FailureInfo* pFailure) WI_PFN_NOEXCEPT = nullptr; __declspec(selectany) void(__stdcall *g_pfnGetContextAndNotifyFailure)(_Inout_ FailureInfo *pFailure, _Out_writes_(callContextStringLength) _Post_z_ PSTR callContextString, _Pre_satisfies_(callContextStringLength > 0) size_t callContextStringLength) WI_PFN_NOEXCEPT = nullptr; // Observe all errors flowing through the system with this callback (set with wil::SetResultLoggingCallback); use with custom logging @@ -1205,7 +1281,7 @@ namespace wil __declspec(selectany) HRESULT(__stdcall *g_pfnRunFunctorWithExceptionFilter)(IFunctor& functor, IFunctorHost& host, void* returnAddress) = nullptr; __declspec(selectany) void(__stdcall *g_pfnRethrow)() = nullptr; __declspec(selectany) void(__stdcall *g_pfnThrowResultException)(const FailureInfo& failure) = nullptr; - extern "C" __declspec(selectany) HRESULT(__stdcall *g_pfnResultFromCaughtExceptionInternal)(_Out_writes_opt_(debugStringChars) PWSTR debugString, _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars, _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr; + extern "C" __declspec(selectany) ResultStatus(__stdcall *g_pfnResultFromCaughtExceptionInternal)(_Out_writes_opt_(debugStringChars) PWSTR debugString, _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars, _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr; // C++/WinRT additions extern "C" __declspec(selectany) HRESULT(__stdcall *g_pfnResultFromCaughtException_CppWinRt)(_Out_writes_opt_(debugStringChars) PWSTR debugString, _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars, _Out_ bool* isNormalized) WI_PFN_NOEXCEPT = nullptr; @@ -1218,6 +1294,40 @@ namespace wil // Plugin to call RoOriginateError (WIL use only) __declspec(selectany) void(__stdcall *g_pfnOriginateCallback)(wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr; + // Plugin to call RoFailFastWithErrorContext (WIL use only) + __declspec(selectany) void(__stdcall* g_pfnFailfastWithContextCallback)(wil::FailureInfo const& failure) WI_PFN_NOEXCEPT = nullptr; + + + // Allocate and disown the allocation so that Appverifier does not complain about a false leak + inline PVOID ProcessHeapAlloc(_In_ DWORD flags, _In_ size_t size) WI_NOEXCEPT + { + const HANDLE processHeap = ::GetProcessHeap(); + const PVOID allocation = ::HeapAlloc(processHeap, flags, size); + + static bool fetchedRtlDisownModuleHeapAllocation = false; + static NTSTATUS (__stdcall *pfnRtlDisownModuleHeapAllocation)(HANDLE, PVOID) WI_PFN_NOEXCEPT = nullptr; + + if (pfnRtlDisownModuleHeapAllocation) + { + (void)pfnRtlDisownModuleHeapAllocation(processHeap, allocation); + } + else if (!fetchedRtlDisownModuleHeapAllocation) + { + if (auto ntdllModule = ::GetModuleHandleW(L"ntdll.dll")) + { + pfnRtlDisownModuleHeapAllocation = reinterpret_cast(::GetProcAddress(ntdllModule, "RtlDisownModuleHeapAllocation")); + } + fetchedRtlDisownModuleHeapAllocation = true; + + if (pfnRtlDisownModuleHeapAllocation) + { + (void)pfnRtlDisownModuleHeapAllocation(processHeap, allocation); + } + } + + return allocation; + } + enum class ReportFailureOptions { None = 0x00, @@ -1294,25 +1404,25 @@ namespace wil template struct return_type { - typedef tag_return_other type; + using type = tag_return_other; }; template <> struct return_type { - typedef tag_return_HRESULT type; + using type = tag_return_HRESULT; }; template <> struct return_type { - typedef tag_return_void type; + using type = tag_return_void; }; template <> struct return_type { - typedef tag_return_void type; + using type = tag_return_void; }; template @@ -1334,18 +1444,18 @@ namespace wil _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_) __RFF_CONDITIONAL_METHOD(bool, FailFastImmediate_If)(bool condition) WI_NOEXCEPT; } - __declspec(noreturn) inline void __stdcall WilFailFast(const FailureInfo& info); - inline void LogFailure(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr, _In_opt_ PCWSTR message, + RESULT_NORETURN inline void __stdcall WilFailFast(const FailureInfo& info); + inline void LogFailure(__R_FN_PARAMS_FULL, FailureType type, const ResultStatus& resultPair, _In_opt_ PCWSTR message, bool fWantDebugString, _Out_writes_(debugStringSizeChars) _Post_z_ PWSTR debugString, _Pre_satisfies_(debugStringSizeChars > 0) size_t debugStringSizeChars, _Out_writes_(callContextStringSizeChars) _Post_z_ PSTR callContextString, _Pre_satisfies_(callContextStringSizeChars > 0) size_t callContextStringSizeChars, _Out_ FailureInfo *failure) WI_NOEXCEPT; - __declspec(noinline) inline void ReportFailure(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr, _In_opt_ PCWSTR message = nullptr, ReportFailureOptions options = ReportFailureOptions::None); - template - __declspec(noinline) inline void ReportFailure(__R_FN_PARAMS_FULL, HRESULT hr, _In_opt_ PCWSTR message = nullptr, ReportFailureOptions options = ReportFailureOptions::None); + __declspec(noinline) inline void ReportFailure(__R_FN_PARAMS_FULL, FailureType type, const ResultStatus& resultPair, _In_opt_ PCWSTR message = nullptr, ReportFailureOptions options = ReportFailureOptions::None); + template + __declspec(noinline) inline void ReportFailure_Base(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, _In_opt_ PCWSTR message = nullptr, ReportFailureOptions options = ReportFailureOptions::None); template inline void ReportFailure_ReplaceMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, ...); - __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr); + __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr); template __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr); template @@ -1645,7 +1755,10 @@ namespace wil // 1) Provide a unique count and last error code per-type // 2) Avoid merging the types to allow easy debugging (breakpoints, conditional breakpoints based // upon count of errors from a particular type, etc) - +__WI_PUSH_WARNINGS +#if __clang_major__ >= 13 +__WI_CLANG_DISABLE_WARNING(-Wunused-but-set-variable) // s_hrErrorLast used for debugging. We intentionally only assign to it +#endif __declspec(noinline) inline int RecordException(HRESULT hr) WI_NOEXCEPT { static HRESULT volatile s_hrErrorLast = S_OK; @@ -1676,8 +1789,9 @@ namespace wil s_hrErrorLast = hr; return 1; } +__WI_POP_WARNINGS - inline __declspec(noreturn) void __stdcall WilRaiseFailFastException(_In_ PEXCEPTION_RECORD er, _In_opt_ PCONTEXT cr, _In_ DWORD flags) + inline RESULT_NORETURN void __stdcall WilRaiseFailFastException(_In_ PEXCEPTION_RECORD er, _In_opt_ PCONTEXT cr, _In_ DWORD flags) { // if we managed to load the pointer either through WilDynamicRaiseFailFastException (PARTITION_DESKTOP etc.) // or via direct linkage (e.g. UWP apps), then use it. @@ -1796,6 +1910,117 @@ namespace wil return HRESULT_FROM_NT(status); } + __declspec(noinline) inline NTSTATUS HrToNtStatus(HRESULT hr) WI_NOEXCEPT + { + // Constants taken from ntstatus.h + static constexpr NTSTATUS WIL_STATUS_INVALID_PARAMETER = 0xC000000D; + static constexpr NTSTATUS WIL_STATUS_INTERNAL_ERROR = 0xC00000E5; + static constexpr NTSTATUS WIL_STATUS_INTEGER_OVERFLOW = 0xC0000095; + static constexpr NTSTATUS WIL_STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A; + static constexpr NTSTATUS WIL_STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034; + static constexpr NTSTATUS WIL_STATUS_NOT_IMPLEMENTED = 0xC0000002; + static constexpr NTSTATUS WIL_STATUS_BUFFER_OVERFLOW = 0x80000005; + static constexpr NTSTATUS WIL_STATUS_IMPLEMENTATION_LIMIT = 0xC000042B; + static constexpr NTSTATUS WIL_STATUS_NO_MORE_MATCHES = 0xC0000273; + static constexpr NTSTATUS WIL_STATUS_ILLEGAL_CHARACTER = 0xC0000161; + static constexpr NTSTATUS WIL_STATUS_UNDEFINED_CHARACTER = 0xC0000163; + static constexpr NTSTATUS WIL_STATUS_BUFFER_TOO_SMALL = 0xC0000023; + static constexpr NTSTATUS WIL_STATUS_DISK_FULL = 0xC000007F; + static constexpr NTSTATUS WIL_STATUS_OBJECT_NAME_INVALID = 0xC0000033; + static constexpr NTSTATUS WIL_STATUS_DLL_NOT_FOUND = 0xC0000135; + static constexpr NTSTATUS WIL_STATUS_REVISION_MISMATCH = 0xC0000059; + static constexpr NTSTATUS WIL_STATUS_XML_PARSE_ERROR = 0xC000A083; + static constexpr HRESULT WIL_E_FAIL = 0x80004005; + + NTSTATUS status = STATUS_SUCCESS; + + switch (hr) + { + case S_OK: + status = STATUS_SUCCESS; + break; + case E_INVALIDARG: + status = WIL_STATUS_INVALID_PARAMETER; + break; + case __HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR): + status = WIL_STATUS_INTERNAL_ERROR; + break; + case E_OUTOFMEMORY: + status = STATUS_NO_MEMORY; + break; + case __HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW): + status = WIL_STATUS_INTEGER_OVERFLOW; + break; + case __HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND): + status = WIL_STATUS_OBJECT_PATH_NOT_FOUND; + break; + case __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND): + status = WIL_STATUS_OBJECT_NAME_NOT_FOUND; + break; + case __HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION): + status = WIL_STATUS_NOT_IMPLEMENTED; + break; + case __HRESULT_FROM_WIN32(ERROR_MORE_DATA): + status = WIL_STATUS_BUFFER_OVERFLOW; + break; + case __HRESULT_FROM_WIN32(ERROR_IMPLEMENTATION_LIMIT): + status = WIL_STATUS_IMPLEMENTATION_LIMIT; + break; + case __HRESULT_FROM_WIN32(ERROR_NO_MORE_MATCHES): + status = WIL_STATUS_NO_MORE_MATCHES; + break; + case __HRESULT_FROM_WIN32(ERROR_ILLEGAL_CHARACTER): + status = WIL_STATUS_ILLEGAL_CHARACTER; + break; + case __HRESULT_FROM_WIN32(ERROR_UNDEFINED_CHARACTER): + status = WIL_STATUS_UNDEFINED_CHARACTER; + break; + case __HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER): + status = WIL_STATUS_BUFFER_TOO_SMALL; + break; + case __HRESULT_FROM_WIN32(ERROR_DISK_FULL): + status = WIL_STATUS_DISK_FULL; + break; + case __HRESULT_FROM_WIN32(ERROR_INVALID_NAME): + status = WIL_STATUS_OBJECT_NAME_INVALID; + break; + case __HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND): + status = WIL_STATUS_DLL_NOT_FOUND; + break; + case __HRESULT_FROM_WIN32(ERROR_OLD_WIN_VERSION): + status = WIL_STATUS_REVISION_MISMATCH; + break; + case WIL_E_FAIL: + status = STATUS_UNSUCCESSFUL; + break; + case __HRESULT_FROM_WIN32(ERROR_XML_PARSE_ERROR): + status = WIL_STATUS_XML_PARSE_ERROR; + break; + case __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION): + status = STATUS_NONCONTINUABLE_EXCEPTION; + break; + default: + if ((hr & FACILITY_NT_BIT) != 0) + { + status = (hr & ~FACILITY_NT_BIT); + } + else if (HRESULT_FACILITY(hr) == FACILITY_WIN32) + { + status = __NTSTATUS_FROM_WIN32(HRESULT_CODE(hr)); + } + else if (HRESULT_FACILITY(hr) == FACILITY_SSPI) + { + status = ((NTSTATUS)(hr) <= 0 ? ((NTSTATUS)(hr)) : ((NTSTATUS)(((hr) & 0x0000FFFF) | (FACILITY_SSPI << 16) | ERROR_SEVERITY_ERROR))); + } + else + { + status = WIL_STATUS_INTERNAL_ERROR; + } + break; + } + return status; + } + // The following set of functions all differ only based upon number of arguments. They are unified in their handling // of data from each of the various error-handling types (fast fail, exceptions, etc.). _Post_equals_last_error_ @@ -1821,6 +2046,12 @@ namespace wil return err; } + inline __declspec(noinline) DWORD GetLastErrorFail() WI_NOEXCEPT + { + __R_FN_LOCALS_FULL_RA; + return GetLastErrorFail(__R_FN_CALL_FULL); + } + _Translates_last_error_to_HRESULT_ inline HRESULT GetLastErrorFailHr(__R_FN_PARAMS_FULL) WI_NOEXCEPT { @@ -1888,7 +2119,7 @@ namespace wil _Must_inspect_result_ STRSAFEAPI StringCchLengthA(_In_reads_or_z_(cchMax) STRSAFE_PCNZCH psz, _In_ _In_range_(1, STRSAFE_MAX_CCH) size_t cchMax, _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<= , _String_length_(psz)) size_t* pcchLength) { HRESULT hr; - if ((psz == NULL) || (cchMax > STRSAFE_MAX_CCH)) + if ((psz == nullptr) || (cchMax > STRSAFE_MAX_CCH)) { hr = STRSAFE_E_INVALID_PARAMETER; } @@ -1918,11 +2149,10 @@ namespace wil { HRESULT hr = S_OK; int iRet; - size_t cchMax; - size_t cchNewDestLength = 0; // leave the last space for the null terminator - cchMax = cchDest - 1; + size_t cchMax = cchDest - 1; + size_t cchNewDestLength = 0; #undef STRSAFE_USE_SECURE_CRT #define STRSAFE_USE_SECURE_CRT 1 #if (STRSAFE_USE_SECURE_CRT == 1) && !defined(STRSAFE_LIB_IMPL) @@ -1975,7 +2205,7 @@ namespace wil { va_list argList; va_start(argList, pszFormat); - hr = wil::details::WilStringVPrintfWorkerA(pszDest, cchDest, NULL, pszFormat, argList); + hr = wil::details::WilStringVPrintfWorkerA(pszDest, cchDest, nullptr, pszFormat, argList); va_end(argList); } else if (cchDest > 0) @@ -2031,7 +2261,7 @@ namespace wil { size_t cchLen = UntrustedStringLength(reinterpret_cast(pStart), (pEnd - pStart) / sizeof((*ppszBufferString)[0])); *ppszBufferString = (cchLen > 0) ? reinterpret_cast(pStart) : nullptr; - auto pReturn = min(pEnd, pStart + ((cchLen + 1) * sizeof((*ppszBufferString)[0]))); + auto pReturn = (wistd::min)(pEnd, pStart + ((cchLen + 1) * sizeof((*ppszBufferString)[0]))); __analysis_assume((pReturn >= pStart) && (pReturn <= pEnd)); return pReturn; } @@ -2112,6 +2342,10 @@ namespace wil class manually_managed_shutdown_aware_object { public: + manually_managed_shutdown_aware_object() = default; + manually_managed_shutdown_aware_object(manually_managed_shutdown_aware_object const&) = delete; + void operator=(manually_managed_shutdown_aware_object const&) = delete; + void construct() { void* var = &m_raw; @@ -2157,6 +2391,9 @@ namespace wil m_object.destroy(); } + shutdown_aware_object(shutdown_aware_object const&) = delete; + void operator=(shutdown_aware_object const&) = delete; + //! Retrieves a reference to the contained object T& get() WI_NOEXCEPT { @@ -2186,6 +2423,9 @@ namespace wil } } + object_without_destructor_on_shutdown(object_without_destructor_on_shutdown const&) = delete; + void operator=(object_without_destructor_on_shutdown const&) = delete; + //! Retrieves a reference to the contained object T& get() WI_NOEXCEPT { @@ -2264,6 +2504,17 @@ namespace wil details::g_pfnOriginateCallback = callbackFunction; } + // [optionally] Plug in failfast callback + // This provides the ability for a module to call RoFailFastWithErrorContext in the failfast handler -if- there is stowed + // exception data available. Normally, the callback is owned by including result_originate.h in the including module. + // Alternatively a module could re-route to its own implementation. + inline void SetFailfastWithContextCallback(_In_opt_ decltype(details::g_pfnFailfastWithContextCallback) callbackFunction) + { + // Only ONE function can own the failfast with context callback + __FAIL_FAST_IMMEDIATE_ASSERT__((details::g_pfnFailfastWithContextCallback == nullptr) || (callbackFunction == nullptr) || (details::g_pfnFailfastWithContextCallback == callbackFunction)); + details::g_pfnFailfastWithContextCallback = callbackFunction; + } + // A RAII wrapper around the storage of a FailureInfo struct (which is normally meant to be consumed // on the stack or from the caller). The storage of FailureInfo needs to copy some data internally // for lifetime purposes. @@ -2364,6 +2615,14 @@ namespace wil return hr; } + //! Returns the failed NTSTATUS that this exception represents. + _Always_(_Post_satisfies_(return < 0)) NTSTATUS GetStatusCode() const WI_NOEXCEPT + { + NTSTATUS const status = m_failure.GetFailureInfo().status; + __analysis_assume(status < 0); + return status; + } + //! Get a reference to the stored FailureInfo. FailureInfo const & GetFailureInfo() const WI_NOEXCEPT { @@ -2431,7 +2690,7 @@ namespace wil HRESULT hr = S_OK; if (details::g_pfnResultFromCaughtExceptionInternal) { - hr = details::g_pfnResultFromCaughtExceptionInternal(nullptr, 0, &isNormalized); + hr = details::g_pfnResultFromCaughtExceptionInternal(nullptr, 0, &isNormalized).hr; } if (FAILED(hr)) { @@ -2474,7 +2733,7 @@ namespace wil // Private helpers to catch and propagate exceptions //***************************************************************************** - __declspec(noreturn) inline void TerminateAndReportError(_In_opt_ PEXCEPTION_POINTERS) + RESULT_NORETURN inline void TerminateAndReportError(_In_opt_ PEXCEPTION_POINTERS) { // This is an intentional fail-fast that was caught by an exception guard with WIL. Look back up the callstack to determine // the source of the actual exception being thrown. The exception guard used by the calling code did not expect this @@ -2506,7 +2765,7 @@ namespace wil message[0] = L'\0'; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); auto hr = exception.GetErrorCode(); - wil::details::ReportFailure(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), hr, message); + wil::details::ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); return hr; } @@ -2516,7 +2775,7 @@ namespace wil message[0] = L'\0'; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); constexpr auto hr = E_OUTOFMEMORY; - wil::details::ReportFailure(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), hr, message); + wil::details::ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); return hr; } @@ -2526,7 +2785,7 @@ namespace wil message[0] = L'\0'; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); constexpr auto hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION); - ReportFailure(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), hr, message); + ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); return hr; } @@ -2540,7 +2799,7 @@ namespace wil auto hr = g_pfnResultFromCaughtException_CppWinRt(message, ARRAYSIZE(message), &ignored); if (FAILED(hr)) { - ReportFailure(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), hr, message); + ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); return hr; } } @@ -2572,6 +2831,7 @@ namespace wil } catch (...) { + // Fall through to returning 'hr' below } } @@ -2624,7 +2884,7 @@ namespace wil message[0] = L'\0'; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); auto hr = exception->HResult; - wil::details::ReportFailure(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), hr, message); + wil::details::ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); return hr; } @@ -2644,6 +2904,9 @@ namespace wil catch (Platform::Exception^ exception) { *isNormalized = true; + // We need to call __abi_translateCurrentException so that the CX runtime will pull the originated error information + // out of the exception object and place it back into thread-local storage. + __abi_translateCurrentException(false); MaybeGetExceptionString(exception, debugString, debugStringChars); return exception->HResult; } @@ -2675,6 +2938,9 @@ namespace wil catch (Platform::Exception^ exception) { *isNormalized = true; + // We need to call __abi_translateCurrentException so that the CX runtime will pull the originated error information + // out of the exception object and place it back into thread-local storage. + __abi_translateCurrentException(false); MaybeGetExceptionString(exception, debugString, debugStringChars); return exception->HResult; } @@ -2804,7 +3070,7 @@ namespace wil throw ResultException(failure); } - __declspec(noinline) inline HRESULT __stdcall ResultFromCaughtExceptionInternal(_Out_writes_opt_(debugStringChars) PWSTR debugString, _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars, _Out_ bool* isNormalized) WI_NOEXCEPT + __declspec(noinline) inline ResultStatus __stdcall ResultFromCaughtExceptionInternal(_Out_writes_opt_(debugStringChars) PWSTR debugString, _When_(debugString != nullptr, _Pre_satisfies_(debugStringChars > 0)) size_t debugStringChars, _Out_ bool* isNormalized) WI_NOEXCEPT { if (debugString) { @@ -2814,12 +3080,17 @@ namespace wil if (details::g_pfnResultFromCaughtException_CppWinRt != nullptr) { - RETURN_IF_FAILED_EXPECTED(details::g_pfnResultFromCaughtException_CppWinRt(debugString, debugStringChars, isNormalized)); + const auto hr = details::g_pfnResultFromCaughtException_CppWinRt(debugString, debugStringChars, isNormalized); + if (FAILED(hr)) + { + return ResultStatus::FromResult(hr); + } } if (details::g_pfnResultFromCaughtException_WinRt != nullptr) { - return details::g_pfnResultFromCaughtException_WinRt(debugString, debugStringChars, isNormalized); + const auto hr = details::g_pfnResultFromCaughtException_WinRt(debugString, debugStringChars, isNormalized); + return ResultStatus::FromResult(hr); } if (g_pfnResultFromCaughtException) @@ -2832,19 +3103,19 @@ namespace wil { *isNormalized = true; MaybeGetExceptionString(exception, debugString, debugStringChars); - return exception.GetErrorCode(); + return ResultStatus::FromFailureInfo(exception.GetFailureInfo()); } catch (const std::bad_alloc& exception) { MaybeGetExceptionString(exception, debugString, debugStringChars); - return E_OUTOFMEMORY; + return ResultStatus::FromResult(E_OUTOFMEMORY); } catch (...) { auto hr = RecognizeCaughtExceptionFromCallback(debugString, debugStringChars); if (FAILED(hr)) { - return hr; + return ResultStatus::FromResult(hr); } } } @@ -2858,17 +3129,17 @@ namespace wil { *isNormalized = true; MaybeGetExceptionString(exception, debugString, debugStringChars); - return exception.GetErrorCode(); + return ResultStatus::FromFailureInfo(exception.GetFailureInfo()); } catch (const std::bad_alloc& exception) { MaybeGetExceptionString(exception, debugString, debugStringChars); - return E_OUTOFMEMORY; + return ResultStatus::FromResult(E_OUTOFMEMORY); } catch (std::exception& exception) { MaybeGetExceptionString(exception, debugString, debugStringChars); - return __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION); + return ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); } catch (...) { @@ -2877,7 +3148,7 @@ namespace wil } // Tell the caller that we were unable to map the exception by succeeding... - return S_OK; + return ResultStatus::FromResult(S_OK); } // Runs the given functor, converting any exceptions of the supported types that are known to HRESULTs and returning @@ -2981,6 +3252,7 @@ namespace wil __except (wil::details::TerminateAndReportError(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH) { WI_ASSERT(false); + RESULT_NORETURN_RESULT(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); } } @@ -3209,7 +3481,7 @@ namespace wil // Shared Reporting -- all reporting macros bubble up through this codepath //***************************************************************************** - inline void LogFailure(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr, _In_opt_ PCWSTR message, + inline void LogFailure(__R_FN_PARAMS_FULL, FailureType type, const ResultStatus& resultPair, _In_opt_ PCWSTR message, bool fWantDebugString, _Out_writes_(debugStringSizeChars) _Post_z_ PWSTR debugString, _Pre_satisfies_(debugStringSizeChars > 0) size_t debugStringSizeChars, _Out_writes_(callContextStringSizeChars) _Post_z_ PSTR callContextString, _Pre_satisfies_(callContextStringSizeChars > 0) size_t callContextStringSizeChars, _Out_ FailureInfo *failure) WI_NOEXCEPT @@ -3219,17 +3491,20 @@ namespace wil static long volatile s_failureId = 0; + failure->hr = resultPair.hr; + failure->status = resultPair.status; + int failureCount = 0; switch (type) { case FailureType::Exception: - failureCount = RecordException(hr); + failureCount = RecordException(failure->hr); break; case FailureType::Return: - failureCount = RecordReturn(hr); + failureCount = RecordReturn(failure->hr); break; case FailureType::Log: - if (SUCCEEDED(hr)) + if (SUCCEEDED(failure->hr)) { // If you hit this assert (or are reviewing this failure telemetry), then most likely you are trying to log success // using one of the WIL macros. Example: @@ -3238,17 +3513,19 @@ namespace wil // LOG_IF_FAILED(hr); WI_USAGE_ERROR_FORWARD("CALLER BUG: Macro usage error detected. Do not LOG_XXX success."); - hr = __HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE); + failure->hr = __HRESULT_FROM_WIN32(ERROR_ASSERTION_FAILURE); + failure->status = wil::details::HrToNtStatus(failure->hr); } - failureCount = RecordLog(hr); + failureCount = RecordLog(failure->hr); break; case FailureType::FailFast: - failureCount = RecordFailFast(hr); + failureCount = RecordFailFast(failure->hr); break; }; failure->type = type; - failure->hr = hr; + failure->flags = FailureFlags::None; + WI_SetFlagIf(failure->flags, FailureFlags::NtStatus, resultPair.kind == ResultStatus::Kind::NtStatus); failure->failureId = ::InterlockedIncrementNoFence(&s_failureId); failure->pszMessage = ((message != nullptr) && (message[0] != L'\0')) ? message : nullptr; failure->threadId = ::GetCurrentThreadId(); @@ -3264,6 +3541,12 @@ namespace wil ::ZeroMemory(&failure->callContextOriginating, sizeof(failure->callContextOriginating)); failure->pszModule = (g_pfnGetModuleName != nullptr) ? g_pfnGetModuleName() : nullptr; + // Process failure notification / adjustments + if (details::g_pfnNotifyFailure) + { + details::g_pfnNotifyFailure(failure); + } + // Completes filling out failure, notifies thread-based callbacks and the telemetry callback if (details::g_pfnGetContextAndNotifyFailure) { @@ -3277,8 +3560,9 @@ namespace wil } // If the hook is enabled then it will be given the opportunity to call RoOriginateError to greatly improve the diagnostic experience - // for uncaught exceptions. - if (details::g_pfnOriginateCallback) + // for uncaught exceptions. In cases where we will be throwing a C++/CX Platform::Exception we should avoid originating because the + // CX runtime will be doing that for us. fWantDebugString is only set to true when the caller will be throwing a Platform::Exception. + if (details::g_pfnOriginateCallback && !fWantDebugString && WI_IsFlagClear(failure->flags, FailureFlags::RequestSuppressTelemetry)) { details::g_pfnOriginateCallback(*failure); } @@ -3288,9 +3572,10 @@ namespace wil // Caller bug: Leaking a success code into a failure-only function FAIL_FAST_IMMEDIATE_IF(type != FailureType::FailFast); failure->hr = E_UNEXPECTED; + failure->status = wil::details::HrToNtStatus(failure->hr); } - bool const fUseOutputDebugString = IsDebuggerPresent() && g_fResultOutputDebugString; + bool const fUseOutputDebugString = IsDebuggerPresent() && g_fResultOutputDebugString && WI_IsFlagClear(failure->flags, FailureFlags::RequestSuppressTelemetry); // We need to generate the logging message if: // * We're logging to OutputDebugString @@ -3328,13 +3613,13 @@ namespace wil } } - if (g_fBreakOnFailure && (g_pfnDebugBreak != nullptr)) + if ((WI_IsFlagSet(failure->flags, FailureFlags::RequestDebugBreak) || g_fBreakOnFailure) && (g_pfnDebugBreak != nullptr)) { g_pfnDebugBreak(); } } - inline __declspec(noreturn) void __stdcall WilFailFast(const wil::FailureInfo& failure) + inline RESULT_NORETURN void __stdcall WilFailFast(const wil::FailureInfo& failure) { if (g_pfnWilFailFast) { @@ -3346,13 +3631,19 @@ namespace wil RESULT_RAISE_FAST_FAIL_EXCEPTION; #endif + // Before we fail fast in this method, give the [optional] RoFailFastWithErrorContext a try. + if (g_pfnFailfastWithContextCallback) + { + g_pfnFailfastWithContextCallback(failure); + } + // parameter 0 is the !analyze code (FAST_FAIL_FATAL_APP_EXIT) EXCEPTION_RECORD er{}; er.NumberParameters = 1; // default to be safe, see below er.ExceptionCode = static_cast(STATUS_STACK_BUFFER_OVERRUN); // 0xC0000409 er.ExceptionFlags = EXCEPTION_NONCONTINUABLE; er.ExceptionInformation[0] = FAST_FAIL_FATAL_APP_EXIT; // see winnt.h, generated from minkernel\published\base\ntrtl_x.w - if (failure.returnAddress == 0) // FailureInfo does not have _ReturnAddress, have RaiseFailFastException generate it + if (failure.returnAddress == nullptr) // FailureInfo does not have _ReturnAddress, have RaiseFailFastException generate it { // passing ExceptionCode 0xC0000409 and one param with FAST_FAIL_APP_EXIT will use existing // !analyze functionality to crawl the stack looking for the HRESULT @@ -3373,7 +3664,7 @@ namespace wil } template - inline __declspec(noinline) void ReportFailureBaseReturn(__R_FN_PARAMS_FULL, HRESULT hr, PCWSTR message, ReportFailureOptions options) + inline __declspec(noinline) void ReportFailure_Return(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options) { bool needPlatformException = ((T == FailureType::Exception) && WI_IsFlagClear(options, ReportFailureOptions::MayRethrow) && @@ -3384,18 +3675,23 @@ namespace wil wchar_t debugString[2048]; char callContextString[1024]; - LogFailure(__R_FN_CALL_FULL, T, hr, message, needPlatformException, + LogFailure(__R_FN_CALL_FULL, T, resultPair, message, needPlatformException, debugString, ARRAYSIZE(debugString), callContextString, ARRAYSIZE(callContextString), &failure); + + if (WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast)) + { + WilFailFast(failure); + } } template - inline __declspec(noinline) void ReportFailure(__R_FN_PARAMS_FULL, HRESULT hr, PCWSTR message, ReportFailureOptions options) + inline __declspec(noinline) void ReportFailure_Base(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options) { - ReportFailureBaseReturn(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_Return(__R_FN_CALL_FULL, resultPair, message, options); } template - inline __declspec(noinline) RESULT_NORETURN void ReportFailureBaseNoReturn(__R_FN_PARAMS_FULL, HRESULT hr, PCWSTR message, ReportFailureOptions options) + inline __declspec(noinline) RESULT_NORETURN void ReportFailure_NoReturn(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options) { bool needPlatformException = ((T == FailureType::Exception) && WI_IsFlagClear(options, ReportFailureOptions::MayRethrow) && @@ -3406,10 +3702,10 @@ namespace wil wchar_t debugString[2048]; char callContextString[1024]; - LogFailure(__R_FN_CALL_FULL, T, hr, message, needPlatformException, + LogFailure(__R_FN_CALL_FULL, T, resultPair, message, needPlatformException, debugString, ARRAYSIZE(debugString), callContextString, ARRAYSIZE(callContextString), &failure); __WI_SUPPRESS_4127_S - if (T == FailureType::FailFast) + if ((T == FailureType::FailFast) || WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast)) { WilFailFast(const_cast(failure)); } @@ -3434,52 +3730,52 @@ __WI_SUPPRESS_4127_E } template<> - inline __declspec(noinline) RESULT_NORETURN void ReportFailure(__R_FN_PARAMS_FULL, HRESULT hr, PCWSTR message, ReportFailureOptions options) + inline __declspec(noinline) RESULT_NORETURN void ReportFailure_Base(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options) { - ReportFailureBaseNoReturn(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_NoReturn(__R_FN_CALL_FULL, resultPair, message, options); } template<> - inline __declspec(noinline) RESULT_NORETURN void ReportFailure(__R_FN_PARAMS_FULL, HRESULT hr, PCWSTR message, ReportFailureOptions options) + inline __declspec(noinline) RESULT_NORETURN void ReportFailure_Base(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, PCWSTR message, ReportFailureOptions options) { - ReportFailureBaseNoReturn(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_NoReturn(__R_FN_CALL_FULL, resultPair, message, options); } - __declspec(noinline) inline void ReportFailure(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr, _In_opt_ PCWSTR message, ReportFailureOptions options) + __declspec(noinline) inline void ReportFailure(__R_FN_PARAMS_FULL, FailureType type, const ResultStatus& resultPair, _In_opt_ PCWSTR message, ReportFailureOptions options) { switch(type) { case FailureType::Exception: - ReportFailure(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message, options); break; case FailureType::FailFast: - ReportFailure(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message, options); break; case FailureType::Log: - ReportFailure(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message, options); break; case FailureType::Return: - ReportFailure(__R_FN_CALL_FULL, hr, message, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message, options); break; } } template - inline HRESULT ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) + inline ResultStatus ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) { bool isNormalized = false; auto length = wcslen(debugString); WI_ASSERT(length < debugStringChars); - HRESULT hr = S_OK; + ResultStatus resultPair; if (details::g_pfnResultFromCaughtExceptionInternal) { - hr = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized); + resultPair = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized); } - const bool known = (FAILED(hr)); + const bool known = (FAILED(resultPair.hr)); if (!known) { - hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION); + resultPair = ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); } ReportFailureOptions options = ReportFailureOptions::ForcePlatformException; @@ -3494,32 +3790,32 @@ __WI_SUPPRESS_4127_E // types and Platform::Exception^, so there aren't too many valid exception types which could cause this. Those that are valid, should be handled // by remapping the exception callback. Those that are not valid should be found and fixed (meaningless accidents like 'throw hr;'). // The caller may also be requesting non-default behavior to fail-fast more frequently (primarily for debugging unknown exceptions). - ReportFailure(__R_FN_CALL_FULL, hr, debugString, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, debugString, options); } else { - ReportFailure(__R_FN_CALL_FULL, hr, debugString, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, debugString, options); } - return hr; + return resultPair; } template - inline HRESULT RESULT_NORETURN ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) + inline ResultStatus RESULT_NORETURN ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) { bool isNormalized = false; const auto length = wcslen(debugString); WI_ASSERT(length < debugStringChars); - HRESULT hr = S_OK; + ResultStatus resultPair; if (details::g_pfnResultFromCaughtExceptionInternal) { - hr = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized); + resultPair = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized); } - const bool known = (FAILED(hr)); + const bool known = (FAILED(resultPair.hr)); if (!known) { - hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION); + resultPair = ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); } ReportFailureOptions options = ReportFailureOptions::ForcePlatformException; @@ -3534,48 +3830,50 @@ __WI_SUPPRESS_4127_E // types and Platform::Exception^, so there aren't too many valid exception types which could cause this. Those that are valid, should be handled // by remapping the exception callback. Those that are not valid should be found and fixed (meaningless accidents like 'throw hr;'). // The caller may also be requesting non-default behavior to fail-fast more frequently (primarily for debugging unknown exceptions). - ReportFailure(__R_FN_CALL_FULL, hr, debugString, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, debugString, options); } else { - ReportFailure(__R_FN_CALL_FULL, hr, debugString, options); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, debugString, options); } + + RESULT_NORETURN_RESULT(resultPair); } template<> - inline RESULT_NORETURN HRESULT ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) + inline RESULT_NORETURN ResultStatus ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) { - ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_CALL_FULL, debugString, debugStringChars, supported); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_CALL_FULL, debugString, debugStringChars, supported)); } template<> - inline RESULT_NORETURN HRESULT ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) + inline RESULT_NORETURN ResultStatus ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported) { - ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_CALL_FULL, debugString, debugStringChars, supported); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommonNoReturnBase(__R_FN_CALL_FULL, debugString, debugStringChars, supported)); } template - inline void ReportFailure_Msg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) + inline void ReportFailure_Msg(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList) { wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); - ReportFailure(__R_FN_CALL_FULL, hr, message); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message); } template<> - inline RESULT_NORETURN void ReportFailure_Msg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) + inline RESULT_NORETURN void ReportFailure_Msg(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList) { wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); - ReportFailure(__R_FN_CALL_FULL, hr, message); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message); } template<> - inline RESULT_NORETURN void ReportFailure_Msg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) + inline RESULT_NORETURN void ReportFailure_Msg(__R_FN_PARAMS_FULL, const ResultStatus& resultPair, _Printf_format_string_ PCSTR formatString, va_list argList) { wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); - ReportFailure(__R_FN_CALL_FULL, hr, message); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair, message); } template @@ -3583,25 +3881,25 @@ __WI_SUPPRESS_4127_E { va_list argList; va_start(argList, formatString); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); } template __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr) { - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); } template<> __declspec(noinline) inline RESULT_NORETURN void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr) { - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); } template<> __declspec(noinline) inline RESULT_NORETURN void ReportFailure_Hr(__R_FN_PARAMS_FULL, HRESULT hr) { - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); } __declspec(noinline) inline void ReportFailure_Hr(__R_FN_PARAMS_FULL, FailureType type, HRESULT hr) @@ -3629,17 +3927,18 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline HRESULT ReportFailure_Win32(__R_FN_PARAMS_FULL, DWORD err) { const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); return hr; } - + template<> _Success_(true) _Translates_Win32_to_HRESULT_(err) __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32(__R_FN_PARAMS_FULL, DWORD err) { const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(hr); } template<> @@ -3648,7 +3947,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32(__R_FN_PARAMS_FULL, DWORD err) { const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(hr); } template @@ -3656,7 +3956,8 @@ __WI_SUPPRESS_4127_E { const auto err = GetLastErrorFail(__R_FN_CALL_FULL); const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + ::SetLastError(err); return err; } @@ -3665,7 +3966,8 @@ __WI_SUPPRESS_4127_E { const auto err = GetLastErrorFail(__R_FN_CALL_FULL); const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(err); } template<> @@ -3673,7 +3975,8 @@ __WI_SUPPRESS_4127_E { const auto err = GetLastErrorFail(__R_FN_CALL_FULL); const auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(err); } template @@ -3682,7 +3985,7 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline HRESULT ReportFailure_GetLastErrorHr(__R_FN_PARAMS_FULL) { const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); return hr; } @@ -3692,7 +3995,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHr(__R_FN_PARAMS_FULL) { const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(hr); } template<> @@ -3701,7 +4005,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHr(__R_FN_PARAMS_FULL) { const auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure(__R_FN_CALL_FULL, hr); + ReportFailure_Base(__R_FN_CALL_FULL, ResultStatus::FromResult(hr)); + RESULT_NORETURN_RESULT(hr); } template @@ -3709,9 +4014,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline HRESULT ReportFailure_NtStatus(__R_FN_PARAMS_FULL, NTSTATUS status) { - const auto hr = wil::details::NtStatusToHr(status); - ReportFailure(__R_FN_CALL_FULL, hr); - return hr; + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair); + return resultPair.hr; } template<> @@ -3719,8 +4024,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatus(__R_FN_PARAMS_FULL, NTSTATUS status) { - const auto hr = wil::details::NtStatusToHr(status); - ReportFailure(__R_FN_CALL_FULL, hr); + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair); + RESULT_NORETURN_RESULT(resultPair.hr); } template<> @@ -3728,8 +4034,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatus(__R_FN_PARAMS_FULL, NTSTATUS status) { - const auto hr = wil::details::NtStatusToHr(status); - ReportFailure(__R_FN_CALL_FULL, hr); + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Base(__R_FN_CALL_FULL, resultPair); + RESULT_NORETURN_RESULT(resultPair.hr); } template @@ -3737,7 +4044,7 @@ __WI_SUPPRESS_4127_E { wchar_t message[2048]; message[0] = L'\0'; - return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported); + return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr; } template<> @@ -3745,7 +4052,7 @@ __WI_SUPPRESS_4127_E { wchar_t message[2048]; message[0] = L'\0'; - ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr); } template<> @@ -3753,25 +4060,25 @@ __WI_SUPPRESS_4127_E { wchar_t message[2048]; message[0] = L'\0'; - ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr); } template __declspec(noinline) inline void ReportFailure_HrMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) { - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); } template<> __declspec(noinline) inline RESULT_NORETURN void ReportFailure_HrMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) { - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); } template<> __declspec(noinline) inline RESULT_NORETURN void ReportFailure_HrMsg(__R_FN_PARAMS_FULL, HRESULT hr, _Printf_format_string_ PCSTR formatString, va_list argList) { - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); } template @@ -3780,7 +4087,7 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline HRESULT ReportFailure_Win32Msg(__R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); return hr; } @@ -3790,7 +4097,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32Msg(__R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(hr); } template<> @@ -3799,7 +4107,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_Win32Msg(__R_FN_PARAMS_FULL, DWORD err, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(hr); } template @@ -3807,7 +4116,8 @@ __WI_SUPPRESS_4127_E { auto err = GetLastErrorFail(__R_FN_CALL_FULL); auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + ::SetLastError(err); return err; } @@ -3816,7 +4126,8 @@ __WI_SUPPRESS_4127_E { auto err = GetLastErrorFail(__R_FN_CALL_FULL); auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(err); } template<> @@ -3824,7 +4135,8 @@ __WI_SUPPRESS_4127_E { auto err = GetLastErrorFail(__R_FN_CALL_FULL); auto hr = __HRESULT_FROM_WIN32(err); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(err); } template @@ -3833,7 +4145,7 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline HRESULT ReportFailure_GetLastErrorHrMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); return hr; } @@ -3843,7 +4155,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHrMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(hr); } template<> @@ -3852,7 +4165,8 @@ __WI_SUPPRESS_4127_E __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_GetLastErrorHrMsg(__R_FN_PARAMS_FULL, _Printf_format_string_ PCSTR formatString, va_list argList) { auto hr = GetLastErrorFailHr(__R_FN_CALL_FULL); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + ReportFailure_Msg(__R_FN_CALL_FULL, ResultStatus::FromResult(hr), formatString, argList); + RESULT_NORETURN_RESULT(hr); } template @@ -3860,9 +4174,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline HRESULT ReportFailure_NtStatusMsg(__R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList) { - auto hr = wil::details::NtStatusToHr(status); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); - return hr; + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Msg(__R_FN_CALL_FULL, resultPair, formatString, argList); + return resultPair.hr; } template<> @@ -3870,8 +4184,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatusMsg(__R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList) { - auto hr = wil::details::NtStatusToHr(status); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Msg(__R_FN_CALL_FULL, resultPair, formatString, argList); + RESULT_NORETURN_RESULT(resultPair.hr); } template<> @@ -3879,8 +4194,9 @@ __WI_SUPPRESS_4127_E _Translates_NTSTATUS_to_HRESULT_(status) __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_NtStatusMsg(__R_FN_PARAMS_FULL, NTSTATUS status, _Printf_format_string_ PCSTR formatString, va_list argList) { - auto hr = wil::details::NtStatusToHr(status); - ReportFailure_Msg(__R_FN_CALL_FULL, hr, formatString, argList); + const auto resultPair = ResultStatus::FromStatus(status); + ReportFailure_Msg(__R_FN_CALL_FULL, resultPair, formatString, argList); + RESULT_NORETURN_RESULT(resultPair.hr); } template @@ -3890,7 +4206,7 @@ __WI_SUPPRESS_4127_E wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); StringCchCatW(message, ARRAYSIZE(message), L" -- "); - return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default); + return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).hr; } template<> @@ -3900,7 +4216,7 @@ __WI_SUPPRESS_4127_E wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); StringCchCatW(message, ARRAYSIZE(message), L" -- "); - ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).hr); } template<> @@ -3910,7 +4226,7 @@ __WI_SUPPRESS_4127_E wchar_t message[2048]; PrintLoggingMessage(message, ARRAYSIZE(message), formatString, argList); StringCchCatW(message, ARRAYSIZE(message), L" -- "); - ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default); + RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), SupportedExceptions::Default).hr); } @@ -3943,7 +4259,7 @@ __WI_SUPPRESS_4127_E #endif template - __declspec(noreturn) inline void ReportFailure_CustomExceptionHelper(_Inout_ T &exception, __R_FN_PARAMS_FULL, _In_opt_ PCWSTR message = nullptr) + RESULT_NORETURN inline void ReportFailure_CustomExceptionHelper(_Inout_ T &exception, __R_FN_PARAMS_FULL, _In_opt_ PCWSTR message = nullptr) { // When seeing the error: "cannot convert parameter 1 from 'XXX' to 'wil::ResultException &'" // Custom exceptions must be based upon either ResultException or Platform::Exception^ to be used with ResultException.h. @@ -3954,9 +4270,14 @@ __WI_SUPPRESS_4127_E wchar_t debugString[2048]; char callContextString[1024]; - LogFailure(__R_FN_CALL_FULL, FailureType::Exception, hr, message, false, // false = does not need debug string + LogFailure(__R_FN_CALL_FULL, FailureType::Exception, ResultStatus::FromResult(hr), message, false, // false = does not need debug string debugString, ARRAYSIZE(debugString), callContextString, ARRAYSIZE(callContextString), &failure); + if (WI_IsFlagSet(failure.flags, FailureFlags::RequestFailFast)) + { + WilFailFast(failure); + } + // push the failure info context into the custom exception class SetFailureInfo(failure, exception); @@ -4147,8 +4468,9 @@ __WI_SUPPRESS_4127_E wil::details::ReportFailure_NtStatus(__R_INTERNAL_FN_CALL status); } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == hr) - __R_CONDITIONAL_METHOD(HRESULT, Log_IfFailed)(__R_CONDITIONAL_FN_PARAMS HRESULT hr) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(HRESULT, Log_IfFailed)(__R_CONDITIONAL_FN_PARAMS HRESULT hr) { if (FAILED(hr)) { @@ -4184,8 +4506,9 @@ __WI_SUPPRESS_4127_E return hr; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == ret) - __R_CONDITIONAL_METHOD(BOOL, Log_IfWin32BoolFalse)(__R_CONDITIONAL_FN_PARAMS BOOL ret) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(BOOL, Log_IfWin32BoolFalse)(__R_CONDITIONAL_FN_PARAMS BOOL ret) { if (!ret) { @@ -4194,8 +4517,9 @@ __WI_SUPPRESS_4127_E return ret; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == err) - __R_CONDITIONAL_METHOD(DWORD, Log_IfWin32Error)(__R_CONDITIONAL_FN_PARAMS DWORD err) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(DWORD, Log_IfWin32Error)(__R_CONDITIONAL_FN_PARAMS DWORD err) { if (FAILED_WIN32(err)) { @@ -4204,8 +4528,9 @@ __WI_SUPPRESS_4127_E return err; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == handle) - __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleInvalid)(__R_CONDITIONAL_FN_PARAMS HANDLE handle) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleInvalid)(__R_CONDITIONAL_FN_PARAMS HANDLE handle) { if (handle == INVALID_HANDLE_VALUE) { @@ -4214,8 +4539,9 @@ __WI_SUPPRESS_4127_E return handle; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == handle) - __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleNull)(__R_CONDITIONAL_FN_PARAMS HANDLE handle) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(HANDLE, Log_IfHandleNull)(__R_CONDITIONAL_FN_PARAMS HANDLE handle) { if (handle == nullptr) { @@ -4244,8 +4570,9 @@ __WI_SUPPRESS_4127_E } } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == condition) - __R_CONDITIONAL_METHOD(bool, Log_HrIf)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(bool, Log_HrIf)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) { if (condition) { @@ -4254,8 +4581,9 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == condition) - __R_CONDITIONAL_METHOD(bool, Log_HrIfFalse)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(bool, Log_HrIfFalse)(__R_CONDITIONAL_FN_PARAMS HRESULT hr, bool condition) { if (!condition) { @@ -4284,8 +4612,9 @@ __WI_SUPPRESS_4127_E } } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == condition) - __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIf)(__R_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIf)(__R_CONDITIONAL_FN_PARAMS bool condition) { if (condition) { @@ -4294,8 +4623,9 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == condition) - __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIfFalse)(__R_CONDITIONAL_FN_PARAMS bool condition) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(bool, Log_GetLastErrorIfFalse)(__R_CONDITIONAL_FN_PARAMS bool condition) { if (!condition) { @@ -4324,8 +4654,9 @@ __WI_SUPPRESS_4127_E } } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == status) - __R_CONDITIONAL_METHOD(NTSTATUS, Log_IfNtStatusFailed)(__R_CONDITIONAL_FN_PARAMS NTSTATUS status) WI_NOEXCEPT + __R_CONDITIONAL_METHOD(NTSTATUS, Log_IfNtStatusFailed)(__R_CONDITIONAL_FN_PARAMS NTSTATUS status) { if (FAILED_NTSTATUS(status)) { @@ -4693,8 +5024,9 @@ __WI_SUPPRESS_4127_E return ret; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. _Post_satisfies_(return == err) _When_(FAILED_WIN32(err), _Analysis_noreturn_) - __RFF_CONDITIONAL_METHOD(DWORD, FailFast_IfWin32Error)(__RFF_CONDITIONAL_FN_PARAMS DWORD err) WI_NOEXCEPT + __RFF_CONDITIONAL_METHOD(DWORD, FailFast_IfWin32Error)(__RFF_CONDITIONAL_FN_PARAMS DWORD err) { if (FAILED_WIN32(err)) { @@ -4723,9 +5055,10 @@ __WI_SUPPRESS_4127_E return handle; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)> _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_) - __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNullAlloc)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNullAlloc)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) { if (pointer == nullptr) { @@ -4734,8 +5067,9 @@ __WI_SUPPRESS_4127_E return pointer; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)> - __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNullAlloc)(__RFF_CONDITIONAL_FN_PARAMS const PointerT& pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNullAlloc)(__RFF_CONDITIONAL_FN_PARAMS const PointerT& pointer) { if (pointer == nullptr) { @@ -4763,9 +5097,10 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)> _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_) - __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_HrIfNull)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_HrIfNull)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _Pre_maybenull_ PointerT pointer) { if (pointer == nullptr) { @@ -4774,8 +5109,9 @@ __WI_SUPPRESS_4127_E return pointer; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)> - __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_HrIfNull)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_HrIfNull)(__RFF_CONDITIONAL_FN_PARAMS HRESULT hr, _In_opt_ const PointerT& pointer) { if (pointer == nullptr) { @@ -4803,9 +5139,10 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)> _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_) - __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_GetLastErrorIfNull)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_GetLastErrorIfNull)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) { if (pointer == nullptr) { @@ -4814,8 +5151,9 @@ __WI_SUPPRESS_4127_E return pointer; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)> - __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_GetLastErrorIfNull)(__RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_GetLastErrorIfNull)(__RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer) { if (pointer == nullptr) { @@ -5129,10 +5467,11 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)> __WI_SUPPRESS_NULLPTR_ANALYSIS _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_) - __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNull)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFast_IfNull)(__RFF_CONDITIONAL_FN_PARAMS _Pre_maybenull_ PointerT pointer) { if (pointer == nullptr) { @@ -5141,9 +5480,10 @@ __WI_SUPPRESS_4127_E return pointer; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)> __WI_SUPPRESS_NULLPTR_ANALYSIS - __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNull)(__RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFast_IfNull)(__RFF_CONDITIONAL_FN_PARAMS _In_opt_ const PointerT& pointer) { if (pointer == nullptr) { @@ -5257,9 +5597,10 @@ __WI_SUPPRESS_4127_E return condition; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_NOT_CLASS(PointerT)> _Post_satisfies_(return == pointer) _When_(pointer == nullptr, _Analysis_noreturn_) - __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFastImmediate_IfNull)(_Pre_maybenull_ PointerT pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(RESULT_NORETURN_NULL PointerT, FailFastImmediate_IfNull)(_Pre_maybenull_ PointerT pointer) { if (pointer == nullptr) { @@ -5268,8 +5609,9 @@ __WI_SUPPRESS_4127_E return pointer; } + // Should be decorated WI_NOEXCEPT, but conflicts with forceinline. template <__RFF_CONDITIONAL_PARTIAL_TEMPLATE typename PointerT, __R_ENABLE_IF_IS_CLASS(PointerT)> - __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFastImmediate_IfNull)(_In_opt_ const PointerT& pointer) WI_NOEXCEPT + __RFF_CONDITIONAL_TEMPLATE_METHOD(void, FailFastImmediate_IfNull)(_In_opt_ const PointerT& pointer) { if (pointer == nullptr) { @@ -5803,7 +6145,7 @@ __WI_SUPPRESS_4127_E // Intentionally removed logging from this policy as logging is more useful at the caller. struct err_returncode_policy { - typedef HRESULT result; + using result = HRESULT; __forceinline static HRESULT Win32BOOL(BOOL fReturn) { RETURN_IF_WIN32_BOOL_FALSE_EXPECTED(fReturn); return S_OK; } __forceinline static HRESULT Win32Handle(HANDLE h, _Out_ HANDLE *ph) { *ph = h; RETURN_LAST_ERROR_IF_NULL_EXPECTED(h); return S_OK; } diff --git a/Externals/WIL/include/wil/result_originate.h b/Externals/WIL/include/wil/result_originate.h index 328a817778b0..15b92354ec88 100644 --- a/Externals/WIL/include/wil/result_originate.h +++ b/Externals/WIL/include/wil/result_originate.h @@ -31,7 +31,6 @@ #include "com.h" #include -#ifndef __cplusplus_winrt // The CX runtime likes to originate errors already so we would conflict with them. namespace wil { namespace details @@ -82,6 +81,36 @@ namespace wil } } } + + // This method will check for the presence of stowed exception data on the current thread. If such data exists, and the HRESULT + // matches the current failure, then we will call RoFailFastWithErrorContext. RoFailFastWithErrorContext in this situation will + // result in -VASTLY- improved crash bucketing. It is hard to express just how much better. In other cases we just return and + // the calling method fails fast the same way it always has. + inline void __stdcall FailfastWithContextCallback(wil::FailureInfo const& failure) WI_NOEXCEPT + { + wil::com_ptr_nothrow restrictedErrorInformation; + if (GetRestrictedErrorInfo(&restrictedErrorInformation) == S_OK) + { + wil::unique_bstr descriptionUnused; + HRESULT existingHr = failure.hr; + wil::unique_bstr restrictedDescriptionUnused; + wil::unique_bstr capabilitySidUnused; + if (SUCCEEDED(restrictedErrorInformation->GetErrorDetails(&descriptionUnused, &existingHr, &restrictedDescriptionUnused, &capabilitySidUnused)) && + (existingHr == failure.hr)) + { + // GetRestrictedErrorInfo returns ownership of the error information. We want it to be available for RoFailFastWithErrorContext + // so we must restore it via SetRestrictedErrorInfo first. + SetRestrictedErrorInfo(restrictedErrorInformation.get()); + RoFailFastWithErrorContext(existingHr); + } + else + { + // The error didn't match the current failure. Put it back in thread-local storage even though we aren't failing fast + // in this method, so it is available in the debugger just-in-case. + SetRestrictedErrorInfo(restrictedErrorInformation.get()); + } + } + } } // namespace details } // namespace wil @@ -89,8 +118,8 @@ namespace wil WI_HEADER_INITITALIZATION_FUNCTION(ResultStowedExceptionInitialize, [] { ::wil::SetOriginateErrorCallback(::wil::details::RaiseRoOriginateOnWilExceptions); + ::wil::SetFailfastWithContextCallback(::wil::details::FailfastWithContextCallback); return 1; -}); -#endif // __cplusplus_winrt +}) #endif // __WIL_RESULT_ORIGINATE_INCLUDED diff --git a/Externals/WIL/include/wil/safecast.h b/Externals/WIL/include/wil/safecast.h index 8d477698ed31..d443f99d499c 100644 --- a/Externals/WIL/include/wil/safecast.h +++ b/Externals/WIL/include/wil/safecast.h @@ -121,76 +121,76 @@ namespace wil // Mappings of all conversions defined in intsafe.h to intsafe_conversion // Note: Uppercase types (UINT, DWORD, SIZE_T, etc) and architecture dependent types resolve // to the base types. The base types are used since they do not vary based on architecture. - template<> constexpr auto intsafe_conversion<__int64, char> = LongLongToChar; - template<> constexpr auto intsafe_conversion<__int64, int> = LongLongToInt; - template<> constexpr auto intsafe_conversion<__int64, long> = LongLongToLong; - template<> constexpr auto intsafe_conversion<__int64, short> = LongLongToShort; - template<> constexpr auto intsafe_conversion<__int64, signed char> = LongLongToInt8; - template<> constexpr auto intsafe_conversion<__int64, unsigned __int64> = LongLongToULongLong; - template<> constexpr auto intsafe_conversion<__int64, unsigned char> = LongLongToUChar; - template<> constexpr auto intsafe_conversion<__int64, unsigned int> = LongLongToUInt; - template<> constexpr auto intsafe_conversion<__int64, unsigned long> = LongLongToULong; - template<> constexpr auto intsafe_conversion<__int64, unsigned short> = LongLongToUShort; - template<> constexpr auto intsafe_conversion = IntToChar; - template<> constexpr auto intsafe_conversion = IntToShort; - template<> constexpr auto intsafe_conversion = IntToInt8; - template<> constexpr auto intsafe_conversion = IntToULongLong; - template<> constexpr auto intsafe_conversion = IntToUChar; - template<> constexpr auto intsafe_conversion = IntToUInt; - template<> constexpr auto intsafe_conversion = IntToULong; - template<> constexpr auto intsafe_conversion = IntToUShort; - template<> constexpr auto intsafe_conversion = LongToChar; - template<> constexpr auto intsafe_conversion = LongToInt; - template<> constexpr auto intsafe_conversion = LongToShort; - template<> constexpr auto intsafe_conversion = LongToInt8; - template<> constexpr auto intsafe_conversion = LongToULongLong; - template<> constexpr auto intsafe_conversion = LongToUChar; - template<> constexpr auto intsafe_conversion = LongToUInt; - template<> constexpr auto intsafe_conversion = LongToULong; - template<> constexpr auto intsafe_conversion = LongToUShort; - template<> constexpr auto intsafe_conversion = ShortToChar; - template<> constexpr auto intsafe_conversion = ShortToInt8; - template<> constexpr auto intsafe_conversion = ShortToULongLong; - template<> constexpr auto intsafe_conversion = ShortToUChar; - template<> constexpr auto intsafe_conversion = ShortToUInt; - template<> constexpr auto intsafe_conversion = ShortToULong; - template<> constexpr auto intsafe_conversion = ShortToUShort; - template<> constexpr auto intsafe_conversion = Int8ToULongLong; - template<> constexpr auto intsafe_conversion = Int8ToUChar; - template<> constexpr auto intsafe_conversion = Int8ToUInt; - template<> constexpr auto intsafe_conversion = Int8ToULong; - template<> constexpr auto intsafe_conversion = Int8ToUShort; - template<> constexpr auto intsafe_conversion = ULongLongToLongLong; - template<> constexpr auto intsafe_conversion = ULongLongToChar; - template<> constexpr auto intsafe_conversion = ULongLongToInt; - template<> constexpr auto intsafe_conversion = ULongLongToLong; - template<> constexpr auto intsafe_conversion = ULongLongToShort; - template<> constexpr auto intsafe_conversion = ULongLongToInt8; - template<> constexpr auto intsafe_conversion = ULongLongToUChar; - template<> constexpr auto intsafe_conversion = ULongLongToUInt; - template<> constexpr auto intsafe_conversion = ULongLongToULong; - template<> constexpr auto intsafe_conversion = ULongLongToUShort; - template<> constexpr auto intsafe_conversion = UInt8ToChar; - template<> constexpr auto intsafe_conversion = UIntToInt8; - template<> constexpr auto intsafe_conversion = UIntToChar; - template<> constexpr auto intsafe_conversion = UIntToInt; - template<> constexpr auto intsafe_conversion = UIntToLong; - template<> constexpr auto intsafe_conversion = UIntToShort; - template<> constexpr auto intsafe_conversion = UIntToInt8; - template<> constexpr auto intsafe_conversion = UIntToUChar; - template<> constexpr auto intsafe_conversion = UIntToUShort; - template<> constexpr auto intsafe_conversion = ULongToChar; - template<> constexpr auto intsafe_conversion = ULongToInt; - template<> constexpr auto intsafe_conversion = ULongToLong; - template<> constexpr auto intsafe_conversion = ULongToShort; - template<> constexpr auto intsafe_conversion = ULongToInt8; - template<> constexpr auto intsafe_conversion = ULongToUChar; - template<> constexpr auto intsafe_conversion = ULongToUInt; - template<> constexpr auto intsafe_conversion = ULongToUShort; - template<> constexpr auto intsafe_conversion = UShortToChar; - template<> constexpr auto intsafe_conversion = UShortToShort; - template<> constexpr auto intsafe_conversion = UShortToInt8; - template<> constexpr auto intsafe_conversion = UShortToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, char> = LongLongToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, int> = LongLongToInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, long> = LongLongToLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, short> = LongLongToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, signed char> = LongLongToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned __int64> = LongLongToULongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned char> = LongLongToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned int> = LongLongToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned long> = LongLongToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion<__int64, unsigned short> = LongLongToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToULongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = IntToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToULongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = LongToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToULongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ShortToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = Int8ToULongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = Int8ToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = Int8ToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = Int8ToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = Int8ToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToLongLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToULong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongLongToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UInt8ToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UIntToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToLong; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToUChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToUInt; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = ULongToUShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UShortToChar; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UShortToShort; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UShortToInt8; + template<> __WI_LIBCPP_INLINE_VAR constexpr auto intsafe_conversion = UShortToUChar; } // Unsafe conversion where failure results in fail fast. diff --git a/Externals/WIL/include/wil/stl.h b/Externals/WIL/include/wil/stl.h index 56e95f454482..3f45eba2b267 100644 --- a/Externals/WIL/include/wil/stl.h +++ b/Externals/WIL/include/wil/stl.h @@ -15,19 +15,17 @@ #include "resource.h" #include #include +#include +#include +#if _HAS_CXX17 +#include +#endif -#if defined(WIL_ENABLE_EXCEPTIONS) -namespace std -{ - template - class vector; +#ifndef WI_STL_FAIL_FAST_IF +#define WI_STL_FAIL_FAST_IF FAIL_FAST_IF +#endif - template - struct char_traits; - - template - class basic_string; -} // namespace std +#if defined(WIL_ENABLE_EXCEPTIONS) namespace wil { @@ -42,7 +40,7 @@ namespace wil template struct rebind { - typedef secure_allocator other; + using other = secure_allocator; }; secure_allocator() @@ -100,6 +98,8 @@ namespace wil wchar_t* buffer() { return &m_value[0]; } + HRESULT trim_at_existing_null(size_t length) { m_value.erase(length); return S_OK; } + std::wstring release() { return std::wstring(std::move(m_value)); } static PCWSTR get(const std::wstring& value) { return value.c_str(); } @@ -117,6 +117,78 @@ namespace wil return str.c_str(); } +#if _HAS_CXX17 + /** + zstring_view. A zstring_view is identical to a std::string_view except it is always nul-terminated (unless empty). + * zstring_view can be used for storing string literals without "forgetting" the length or that it is nul-terminated. + * A zstring_view can be converted implicitly to a std::string_view because it is always safe to use a nul-terminated + string_view as a plain string view. + * A zstring_view can be constructed from a std::string because the data in std::string is nul-terminated. + */ + template + class basic_zstring_view : public std::basic_string_view + { + using size_type = typename std::basic_string_view::size_type; + + public: + constexpr basic_zstring_view() noexcept = default; + constexpr basic_zstring_view(const basic_zstring_view&) noexcept = default; + constexpr basic_zstring_view& operator=(const basic_zstring_view&) noexcept = default; + + constexpr basic_zstring_view(const TChar* pStringData, size_type stringLength) noexcept + : std::basic_string_view(pStringData, stringLength) + { + if (pStringData[stringLength] != 0) { WI_STL_FAIL_FAST_IF(true); } + } + + template + constexpr basic_zstring_view(const TChar(&stringArray)[stringArrayLength]) noexcept + : std::basic_string_view(&stringArray[0], length_n(&stringArray[0], stringArrayLength)) + { + } + + // Construct from nul-terminated char ptr. To prevent this from overshadowing array construction, + // we disable this constructor if the value is an array (including string literal). + template::value && !std::is_array::value>* = nullptr> + constexpr basic_zstring_view(TPtr&& pStr) noexcept + : std::basic_string_view(std::forward(pStr)) {} + + constexpr basic_zstring_view(const std::basic_string& str) noexcept + : std::basic_string_view(&str[0], str.size()) {} + + // basic_string_view [] precondition won't let us read view[view.size()]; so we define our own. + constexpr const TChar& operator[](size_type idx) const noexcept + { + WI_ASSERT(idx <= this->size() && this->data() != nullptr); + return this->data()[idx]; + } + + constexpr const TChar* c_str() const noexcept + { + WI_ASSERT(this->data() == nullptr || this->data()[this->size()] == 0); + return this->data(); + } + + private: + // Bounds-checked version of char_traits::length, like strnlen. Requires that the input contains a null terminator. + static constexpr size_type length_n(_In_reads_opt_(buf_size) const TChar* str, size_type buf_size) noexcept + { + const std::basic_string_view view(str, buf_size); + auto pos = view.find_first_of(TChar()); + if (pos == view.npos) { WI_STL_FAIL_FAST_IF(true); } + return pos; + } + + // The following basic_string_view methods must not be allowed because they break the nul-termination. + using std::basic_string_view::swap; + using std::basic_string_view::remove_suffix; + }; + + using zstring_view = basic_zstring_view; + using zwstring_view = basic_zstring_view; +#endif // _HAS_CXX17 + } // namespace wil #endif // WIL_ENABLE_EXCEPTIONS diff --git a/Externals/WIL/include/wil/token_helpers.h b/Externals/WIL/include/wil/token_helpers.h index 746a13ef7aea..aec3952b2dc8 100644 --- a/Externals/WIL/include/wil/token_helpers.h +++ b/Externals/WIL/include/wil/token_helpers.h @@ -21,7 +21,9 @@ #include // for GetUserNameEx() +#ifndef SECURITY_WIN32 #define SECURITY_WIN32 +#endif #include namespace wil @@ -34,25 +36,25 @@ namespace wil // be an info class value that uses the same structure. That is the case for the file // system information. template struct MapTokenStructToInfoClass; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenAccessInformation; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenAppContainerSid; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenDefaultDacl; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenGroupsAndPrivileges; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenIntegrityLevel; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenOwner; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenPrimaryGroup; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenPrivileges; static const bool FixedSize = false; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenUser; static const bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenAccessInformation; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenAppContainerSid; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenDefaultDacl; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenGroupsAndPrivileges; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenIntegrityLevel; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenOwner; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenPrimaryGroup; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenPrivileges; static constexpr bool FixedSize = false; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenUser; static constexpr bool FixedSize = false; }; // fixed size cases - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenElevationType; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenMandatoryPolicy; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenOrigin; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenSource; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenStatistics; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenType; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenImpersonationLevel; static const bool FixedSize = true; }; - template<> struct MapTokenStructToInfoClass { static const TOKEN_INFORMATION_CLASS infoClass = TokenElevation; static const bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenElevationType; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenMandatoryPolicy; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenOrigin; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenSource; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenStatistics; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenType; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenImpersonationLevel; static constexpr bool FixedSize = true; }; + template<> struct MapTokenStructToInfoClass { static constexpr TOKEN_INFORMATION_CLASS infoClass = TokenElevation; static constexpr bool FixedSize = true; }; } /// @endcond @@ -85,13 +87,12 @@ namespace wil or privilege-adjustment are examples of uses. ~~~~ wil::unique_handle callerToken; - RETURN_IF_FAILED(wil::open_current_access_token_nothrow(&theToken, TOKEN_QUERY | TOKEN_IMPERSONATE, true)); + RETURN_IF_FAILED(wil::open_current_access_token_nothrow(&theToken, TOKEN_QUERY | TOKEN_IMPERSONATE, OpenThreadTokenAs::Self)); ~~~~ @param tokenHandle Receives the token opened during the operation. Must be CloseHandle'd by the caller, or (preferably) stored in a wil::unique_handle @param access Bits from the TOKEN_* access mask which are passed to OpenThreadToken/OpenProcessToken - @param asSelf When true, and if the thread is impersonating, the thread token is opened using the - process token's rights. + @param openAs Current to use current thread security context, or Self to use process security context. */ inline HRESULT open_current_access_token_nothrow(_Out_ HANDLE* tokenHandle, unsigned long access = TOKEN_QUERY, OpenThreadTokenAs openAs = OpenThreadTokenAs::Current) { @@ -122,6 +123,7 @@ namespace wil } #endif // WIL_ENABLE_EXCEPTIONS +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) // Returns tokenHandle or the effective thread token if tokenHandle is null. // Note, this returns an token handle who's lifetime is managed independently // and it may be a pseudo token, don't free it! @@ -287,11 +289,12 @@ namespace wil return tokenInfo; } #endif +#endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8 /// @cond namespace details { - inline void RevertImpersonateToken(_Pre_opt_valid_ _Frees_ptr_opt_ HANDLE oldToken) + inline void RevertImpersonateToken(_In_ _Post_ptr_invalid_ HANDLE oldToken) { FAIL_FAST_IMMEDIATE_IF(!::SetThreadToken(nullptr, oldToken)); @@ -524,6 +527,7 @@ namespace wil return S_OK; } +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) /** Determine whether a token represents an app container This method uses the passed in token and emits a boolean indicating that whether TokenIsAppContainer is true. @@ -573,6 +577,7 @@ namespace wil return value; } #endif // WIL_ENABLE_EXCEPTIONS +#endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8 template bool test_token_membership_failfast(_In_opt_ HANDLE token, const SID_IDENTIFIER_AUTHORITY& sidAuthority, Ts&&... subAuthorities) diff --git a/Externals/WIL/include/wil/traceloggingconfig.h b/Externals/WIL/include/wil/traceloggingconfig.h new file mode 100644 index 000000000000..e252d41da50d --- /dev/null +++ b/Externals/WIL/include/wil/traceloggingconfig.h @@ -0,0 +1,71 @@ +#pragma once +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* + +#ifndef __WIL_TRACELOGGING_CONFIG_H +#define __WIL_TRACELOGGING_CONFIG_H + +// Configuration macro for use in TRACELOGGING_DEFINE_PROVIDER. The definition +// in this file configures the provider as a normal (non-telemetry) provider. +#define TraceLoggingOptionMicrosoftTelemetry() \ + // Empty definition for TraceLoggingOptionMicrosoftTelemetry + +// Configuration macro for use in TRACELOGGING_DEFINE_PROVIDER. The definition +// in this file configures the provider as a normal (non-telemetry) provider. +#define TraceLoggingOptionWindowsCoreTelemetry() \ + // Empty definition for TraceLoggingOptionWindowsCoreTelemetry + +// Event privacy tags. Use the PDT macro values for the tag parameter, e.g.: +// TraceLoggingWrite(..., +// TelemetryPrivacyDataTag(PDT_BrowsingHistory | PDT_ProductAndServiceUsage), +// ...); +#define TelemetryPrivacyDataTag(tag) TraceLoggingUInt64((tag), "PartA_PrivTags") +#define PDT_BrowsingHistory 0x0000000000000002u +#define PDT_DeviceConnectivityAndConfiguration 0x0000000000000800u +#define PDT_InkingTypingAndSpeechUtterance 0x0000000000020000u +#define PDT_ProductAndServicePerformance 0x0000000001000000u +#define PDT_ProductAndServiceUsage 0x0000000002000000u +#define PDT_SoftwareSetupAndInventory 0x0000000080000000u + +// Event categories specified via keywords, e.g.: +// TraceLoggingWrite(..., +// TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES), +// ...); +#define MICROSOFT_KEYWORD_CRITICAL_DATA 0x0000800000000000 // Bit 47 +#define MICROSOFT_KEYWORD_MEASURES 0x0000400000000000 // Bit 46 +#define MICROSOFT_KEYWORD_TELEMETRY 0x0000200000000000 // Bit 45 +#define MICROSOFT_KEYWORD_RESERVED_44 0x0000100000000000 // Bit 44 (reserved for future assignment) + +// Event categories specified via event tags, e.g.: +// TraceLoggingWrite(..., +// TraceLoggingEventTag(MICROSOFT_EVENTTAG_REALTIME_LATENCY), +// ...); +#define MICROSOFT_EVENTTAG_DROP_USER_IDS 0x00008000 +#define MICROSOFT_EVENTTAG_AGGREGATE 0x00010000 +#define MICROSOFT_EVENTTAG_DROP_PII_EXCEPT_IP 0x00020000 +#define MICROSOFT_EVENTTAG_COSTDEFERRED_LATENCY 0x00040000 +#define MICROSOFT_EVENTTAG_CORE_DATA 0x00080000 +#define MICROSOFT_EVENTTAG_INJECT_XTOKEN 0x00100000 +#define MICROSOFT_EVENTTAG_REALTIME_LATENCY 0x00200000 +#define MICROSOFT_EVENTTAG_NORMAL_LATENCY 0x00400000 +#define MICROSOFT_EVENTTAG_CRITICAL_PERSISTENCE 0x00800000 +#define MICROSOFT_EVENTTAG_NORMAL_PERSISTENCE 0x01000000 +#define MICROSOFT_EVENTTAG_DROP_PII 0x02000000 +#define MICROSOFT_EVENTTAG_HASH_PII 0x04000000 +#define MICROSOFT_EVENTTAG_MARK_PII 0x08000000 + +// Field categories specified via field tags, e.g.: +// TraceLoggingWrite(..., +// TraceLoggingString(szUser, "UserName", "User's name", MICROSOFT_FIELDTAG_HASH_PII), +// ...); +#define MICROSOFT_FIELDTAG_DROP_PII 0x04000000 +#define MICROSOFT_FIELDTAG_HASH_PII 0x08000000 +#endif // __WIL_TRACELOGGING_CONFIG_H \ No newline at end of file diff --git a/Externals/WIL/include/wil/win32_helpers.h b/Externals/WIL/include/wil/win32_helpers.h index 0184cf2accee..12fd5bcb5734 100644 --- a/Externals/WIL/include/wil/win32_helpers.h +++ b/Externals/WIL/include/wil/win32_helpers.h @@ -15,33 +15,177 @@ #include // GetSystemTimeAsFileTime #include // GetProcAddress #include // GetModuleFileNameExW (macro), K32GetModuleFileNameExW -#include +#include #include +// detect std::bit_cast +#ifdef __has_include +# if (__cplusplus >= 202002L || _MSVC_LANG >= 202002L) && __has_include() +# include +# endif +#endif + +#if __cpp_lib_bit_cast >= 201806L +# define __WI_CONSTEXPR_BIT_CAST constexpr +#else +# define __WI_CONSTEXPR_BIT_CAST inline +#endif + #include "result.h" #include "resource.h" #include "wistd_functional.h" #include "wistd_type_traits.h" +#if _HAS_CXX20 && defined(_STRING_VIEW_) && defined(_COMPARE_) +// If we're using c++20, then must be included to use the string ordinal functions +# define __WI_DEFINE_STRING_ORDINAL_FUNCTIONS +#elif !_HAS_CXX20 && defined(_STRING_VIEW_) +# define __WI_DEFINE_STRING_ORDINAL_FUNCTIONS +#endif + +namespace wistd +{ +#if defined(__WI_DEFINE_STRING_ORDINAL_FUNCTIONS) + +#if _HAS_CXX20 + + using weak_ordering = std::weak_ordering; + +#else // _HAS_CXX20 + + struct weak_ordering + { + static const weak_ordering less; + static const weak_ordering equivalent; + static const weak_ordering greater; + + [[nodiscard]] friend constexpr bool operator==(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value == 0; + } + + [[nodiscard]] friend constexpr bool operator!=(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value != 0; + } + + [[nodiscard]] friend constexpr bool operator<(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value < 0; + } + + [[nodiscard]] friend constexpr bool operator>(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value > 0; + } + + [[nodiscard]] friend constexpr bool operator<=(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value <= 0; + } + + [[nodiscard]] friend constexpr bool operator>=(const weak_ordering left, std::nullptr_t) noexcept + { + return left.m_value >= 0; + } + + [[nodiscard]] friend constexpr bool operator==(std::nullptr_t, const weak_ordering right) noexcept + { + return right == 0; + } + + [[nodiscard]] friend constexpr bool operator!=(std::nullptr_t, const weak_ordering right) noexcept + { + return right != 0; + } + + [[nodiscard]] friend constexpr bool operator<(std::nullptr_t, const weak_ordering right) noexcept + { + return right > 0; + } + + [[nodiscard]] friend constexpr bool operator>(std::nullptr_t, const weak_ordering right) noexcept + { + return right < 0; + } + + [[nodiscard]] friend constexpr bool operator<=(std::nullptr_t, const weak_ordering right) noexcept + { + return right >= 0; + } + + [[nodiscard]] friend constexpr bool operator>=(std::nullptr_t, const weak_ordering right) noexcept + { + return right <= 0; + } + + signed char m_value; + }; + + inline constexpr weak_ordering weak_ordering::less{static_cast(-1)}; + inline constexpr weak_ordering weak_ordering::equivalent{static_cast(0)}; + inline constexpr weak_ordering weak_ordering::greater{static_cast(1)}; + +#endif // !_HAS_CXX20 + +#endif // defined(__WI_DEFINE_STRING_ORDINAL_FUNCTIONS) + +} + namespace wil { //! Strictly a function of the file system but this is the value for all known file system, NTFS, FAT. //! CDFs has a limit of 254. - size_t const max_path_segment_length = 255; + constexpr size_t max_path_segment_length = 255; //! Character length not including the null, MAX_PATH (260) includes the null. - size_t const max_path_length = 259; + constexpr size_t max_path_length = 259; //! 32743 Character length not including the null. This is a system defined limit. //! The 24 is for the expansion of the roots from "C:" to "\Device\HarddiskVolume4" //! It will be 25 when there are more than 9 disks. - size_t const max_extended_path_length = 0x7FFF - 24; + constexpr size_t max_extended_path_length = 0x7FFF - 24; //! For {guid} string form. Includes space for the null terminator. - size_t const guid_string_buffer_length = 39; + constexpr size_t guid_string_buffer_length = 39; //! For {guid} string form. Not including the null terminator. - size_t const guid_string_length = 38; + constexpr size_t guid_string_length = 38; + +#pragma region String and identifier comparisons + // Using CompareStringOrdinal functions: + // + // Indentifiers require a locale-less (ordinal), and often case-insensitive, comparison (filenames, registry keys, XML node names, etc). + // DO NOT use locale-sensitive (lexical) comparisons for resource identifiers (e.g.wcs*() functions in the CRT). + +#if defined(__WI_DEFINE_STRING_ORDINAL_FUNCTIONS) + + namespace details + { + [[nodiscard]] inline int CompareStringOrdinal(std::wstring_view left, std::wstring_view right, bool caseInsensitive) WI_NOEXCEPT + { + // Casting from size_t (unsigned) to int (signed) should be safe from overrun to a negative, + // merely truncating the string. CompareStringOrdinal should be resilient to negatives. + return ::CompareStringOrdinal(left.data(), static_cast(left.size()), right.data(), static_cast(right.size()), caseInsensitive); + } + } + + [[nodiscard]] inline wistd::weak_ordering compare_string_ordinal(std::wstring_view left, std::wstring_view right, bool caseInsensitive) WI_NOEXCEPT + { + switch (wil::details::CompareStringOrdinal(left, right, caseInsensitive)) + { + case CSTR_LESS_THAN: + return wistd::weak_ordering::less; + case CSTR_GREATER_THAN: + return wistd::weak_ordering::greater; + default: + return wistd::weak_ordering::equivalent; + } + } + +#endif // defined(__WI_DEFINE_STRING_ORDINAL_FUNCTIONS) + +#pragma endregion #pragma region FILETIME helpers // FILETIME duration values. FILETIME is in 100 nanosecond units. @@ -56,36 +200,126 @@ namespace wil namespace filetime { - inline unsigned long long to_int64(const FILETIME &ft) + constexpr unsigned long long to_int64(const FILETIME &ft) WI_NOEXCEPT { +#if __cpp_lib_bit_cast >= 201806L + return std::bit_cast(ft); +#else // Cannot reinterpret_cast FILETIME* to unsigned long long* // due to alignment differences. return (static_cast(ft.dwHighDateTime) << 32) + ft.dwLowDateTime; +#endif } - inline FILETIME from_int64(unsigned long long i64) + __WI_CONSTEXPR_BIT_CAST FILETIME from_int64(unsigned long long i64) WI_NOEXCEPT { +#if __cpp_lib_bit_cast >= 201806L + return std::bit_cast(i64); +#else static_assert(sizeof(i64) == sizeof(FILETIME), "sizes don't match"); static_assert(__alignof(unsigned long long) >= __alignof(FILETIME), "alignment not compatible with type pun"); return *reinterpret_cast(&i64); +#endif } - inline FILETIME add(_In_ FILETIME const &ft, long long delta) + __WI_CONSTEXPR_BIT_CAST FILETIME add(_In_ FILETIME const &ft, long long delta100ns) WI_NOEXCEPT { - return from_int64(to_int64(ft) + delta); + return from_int64(to_int64(ft) + delta100ns); } - inline bool is_empty(const FILETIME &ft) + constexpr bool is_empty(const FILETIME &ft) WI_NOEXCEPT { return (ft.dwHighDateTime == 0) && (ft.dwLowDateTime == 0); } - inline FILETIME get_system_time() + inline FILETIME get_system_time() WI_NOEXCEPT { FILETIME ft; GetSystemTimeAsFileTime(&ft); return ft; } + + /// Convert time as units of 100 nanoseconds to milliseconds. Fractional milliseconds are truncated. + constexpr unsigned long long convert_100ns_to_msec(unsigned long long time100ns) WI_NOEXCEPT + { + return time100ns / filetime_duration::one_millisecond; + } + + /// Convert time as milliseconds to units of 100 nanoseconds. + constexpr unsigned long long convert_msec_to_100ns(unsigned long long timeMsec) WI_NOEXCEPT + { + return timeMsec * filetime_duration::one_millisecond; + } + +#if defined(_APISETREALTIME_) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7) + /// Returns the current unbiased interrupt-time count, in units of 100 nanoseconds. The unbiased interrupt-time count does not include time the system spends in sleep or hibernation. + /// + /// This API avoids prematurely shortcircuiting timing loops due to system sleep/hibernation. + /// + /// This is equivalent to GetTickCount64() except it returns units of 100 nanoseconds instead of milliseconds, and it doesn't include time the system spends in sleep or hibernation. + /// For example + /// + /// start = GetTickCount64(); + /// hibernate(); + /// ...wake from hibernation 30 minutes later...; + /// elapsed = GetTickCount64() - start; + /// // elapsed = 30min + /// + /// Do the same using unbiased interrupt-time and elapsed is 0 (or nearly so). + /// + /// @note This is identical to QueryUnbiasedInterruptTime() but returns the value as a return value (rather than an out parameter). + /// @see https://msdn.microsoft.com/en-us/library/windows/desktop/ee662307(v=vs.85).aspx + inline unsigned long long QueryUnbiasedInterruptTimeAs100ns() WI_NOEXCEPT + { + ULONGLONG now{}; + QueryUnbiasedInterruptTime(&now); + return now; + } + + /// Returns the current unbiased interrupt-time count, in units of milliseconds. The unbiased interrupt-time count does not include time the system spends in sleep or hibernation. + /// @see QueryUnbiasedInterruptTimeAs100ns + inline unsigned long long QueryUnbiasedInterruptTimeAsMSec() WI_NOEXCEPT + { + return convert_100ns_to_msec(QueryUnbiasedInterruptTimeAs100ns()); + } +#endif // _APISETREALTIME_ + } +#pragma endregion + +#pragma region RECT helpers + template + constexpr auto rect_width(rect_type const& rect) + { + return rect.right - rect.left; + } + + template + constexpr auto rect_height(rect_type const& rect) + { + return rect.bottom - rect.top; + } + + template + constexpr auto rect_is_empty(rect_type const& rect) + { + return (rect.left >= rect.right) || (rect.top >= rect.bottom); + } + + template + constexpr auto rect_contains_point(rect_type const& rect, point_type const& point) + { + return (point.x >= rect.left) && (point.x < rect.right) && (point.y >= rect.top) && (point.y < rect.bottom); + } + + template + constexpr rect_type rect_from_size(length_type x, length_type y, length_type width, length_type height) + { + rect_type rect; + rect.left = x; + rect.top = y; + rect.right = x + width; + rect.bottom = y + height; + return rect; } #pragma endregion @@ -95,7 +329,7 @@ namespace wil // Adjust stackBufferLength based on typical result sizes to optimize use and // to test the boundary cases. template - HRESULT AdaptFixedSizeToAllocatedResult(string_type& result, wistd::function callback) + HRESULT AdaptFixedSizeToAllocatedResult(string_type& result, wistd::function callback) WI_NOEXCEPT { details::string_maker maker; @@ -112,14 +346,24 @@ namespace wil else { // Did not fit in the stack allocated buffer, need to do 2 phase construction. - // valueLengthNeededWithNull includes the null so subtract that as make() will add space for it. - RETURN_IF_FAILED(maker.make(nullptr, valueLengthNeededWithNull - 1)); - - size_t secondLength{}; - RETURN_IF_FAILED(callback(maker.buffer(), valueLengthNeededWithNull, &secondLength)); - - // Ensure callback produces consistent result. - FAIL_FAST_IF(valueLengthNeededWithNull != secondLength); + // May need to loop more than once if external conditions cause the value to change. + size_t bufferLength; + do + { + bufferLength = valueLengthNeededWithNull; + // bufferLength includes the null so subtract that as make() will add space for it. + RETURN_IF_FAILED(maker.make(nullptr, bufferLength - 1)); + + RETURN_IF_FAILED_EXPECTED(callback(maker.buffer(), bufferLength, &valueLengthNeededWithNull)); + WI_ASSERT(valueLengthNeededWithNull > 0); + + // If the value shrunk, then adjust the string to trim off the excess buffer. + if (valueLengthNeededWithNull < bufferLength) + { + RETURN_IF_FAILED(maker.trim_at_existing_null(valueLengthNeededWithNull - 1)); + } + } + while (valueLengthNeededWithNull > bufferLength); } result = maker.release(); return S_OK; @@ -167,9 +411,6 @@ namespace wil }); } - // This function does not work beyond the default stack buffer size (255). - // Needs to to retry in a loop similar to wil::GetModuleFileNameExW - // These updates and unit tests are tracked by https://github.com/Microsoft/wil/issues/3 template HRESULT QueryFullProcessImageNameW(HANDLE processHandle, _In_ DWORD flags, string_type& result) WI_NOEXCEPT { @@ -179,8 +420,9 @@ namespace wil DWORD lengthToUse = static_cast(valueLength); BOOL const success = ::QueryFullProcessImageNameW(processHandle, flags, value, &lengthToUse); RETURN_LAST_ERROR_IF((success == FALSE) && (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)); - // On both success or insufficient buffer case, add +1 for the null-terminating character - *valueLengthNeededWithNul = lengthToUse + 1; + + // On success, return the amount used; on failure, try doubling + *valueLengthNeededWithNul = success ? (lengthToUse + 1) : (lengthToUse * 2); return S_OK; }); } @@ -201,13 +443,11 @@ namespace wil } #endif - /** Looks up the environment variable 'key' and fails if it is not found. - 'key' should not have '%' prefix and suffix. - Dangerous since environment variable generally are optional. */ - template + /** Looks up the environment variable 'key' and fails if it is not found. */ + template inline HRESULT GetEnvironmentVariableW(_In_ PCWSTR key, string_type& result) WI_NOEXCEPT { - return wil::AdaptFixedSizeToAllocatedResult(result, + return wil::AdaptFixedSizeToAllocatedResult(result, [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT { // If the function succeeds, the return value is the number of characters stored in the buffer @@ -232,12 +472,11 @@ namespace wil }); } - /** Looks up the environment variable 'key' and returns null if it is not found. - 'key' should not have '%' prefix and suffix. */ - template + /** Looks up the environment variable 'key' and returns null if it is not found. */ + template HRESULT TryGetEnvironmentVariableW(_In_ PCWSTR key, string_type& result) WI_NOEXCEPT { - const auto hr = wil::GetEnvironmentVariableW(key, result); + const auto hr = wil::GetEnvironmentVariableW(key, result); RETURN_HR_IF(hr, FAILED(hr) && (hr != HRESULT_FROM_WIN32(ERROR_ENVVAR_NOT_FOUND))); return S_OK; } @@ -245,68 +484,44 @@ namespace wil /** Retrieves the fully qualified path for the file containing the specified module loaded by a given process. Note GetModuleFileNameExW is a macro.*/ template - HRESULT GetModuleFileNameExW(_In_opt_ HANDLE process, _In_opt_ HMODULE module, string_type& path) + HRESULT GetModuleFileNameExW(_In_opt_ HANDLE process, _In_opt_ HMODULE module, string_type& path) WI_NOEXCEPT { - // initialBufferLength is a template parameter to allow for testing. It creates some waste for - // shorter paths, but avoids iteration through the loop in common cases where paths are less - // than 128 characters. - // wil::max_extended_path_length + 1 (for the null char) - // + 1 (to be certain GetModuleFileNameExW didn't truncate) - size_t const ensureNoTrucation = (process != nullptr) ? 1 : 0; - size_t const maxExtendedPathLengthWithNull = wil::max_extended_path_length + 1 + ensureNoTrucation; - - details::string_maker maker; - - for (size_t lengthWithNull = initialBufferLength; - lengthWithNull <= maxExtendedPathLengthWithNull; - lengthWithNull = (wistd::min)(lengthWithNull * 2, maxExtendedPathLengthWithNull)) + auto adapter = [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT { - // make() adds space for the trailing null - RETURN_IF_FAILED(maker.make(nullptr, lengthWithNull - 1)); - DWORD copiedCount; + size_t valueUsedWithNul; bool copyFailed; bool copySucceededWithNoTruncation; - if (process != nullptr) { // GetModuleFileNameExW truncates and provides no error or other indication it has done so. - // The only way to be sure it didn't truncate is if it didn't need the whole buffer. - copiedCount = ::GetModuleFileNameExW(process, module, maker.buffer(), static_cast(lengthWithNull)); + // The only way to be sure it didn't truncate is if it didn't need the whole buffer. The + // count copied to the buffer includes the nul-character as well. + copiedCount = ::GetModuleFileNameExW(process, module, value, static_cast(valueLength)); + valueUsedWithNul = copiedCount + 1; copyFailed = (0 == copiedCount); - copySucceededWithNoTruncation = !copyFailed && (copiedCount < lengthWithNull - 1); + copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength - 1); } else { // In cases of insufficient buffer, GetModuleFileNameW will return a value equal to lengthWithNull - // and set the last error to ERROR_INSUFFICIENT_BUFFER. - copiedCount = ::GetModuleFileNameW(module, maker.buffer(), static_cast(lengthWithNull)); + // and set the last error to ERROR_INSUFFICIENT_BUFFER. The count returned does not include + // the nul-character + copiedCount = ::GetModuleFileNameW(module, value, static_cast(valueLength)); + valueUsedWithNul = copiedCount + 1; copyFailed = (0 == copiedCount); - copySucceededWithNoTruncation = !copyFailed && (copiedCount < lengthWithNull); + copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength); } - if (copyFailed) - { - RETURN_LAST_ERROR(); - } - else if (copySucceededWithNoTruncation) - { - path = maker.release(); - return S_OK; - } + RETURN_LAST_ERROR_IF(copyFailed); - WI_ASSERT((process != nullptr) || (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)); + // When the copy truncated, request another try with more space. + *valueLengthNeededWithNul = copySucceededWithNoTruncation ? valueUsedWithNul : (valueLength * 2); - if (lengthWithNull == maxExtendedPathLengthWithNull) - { - // If we've reached this point, there's no point in trying a larger buffer size. - break; - } - } + return S_OK; + }; - // Any path should fit into the maximum max_extended_path_length. If we reached here, something went - // terribly wrong. - FAIL_FAST(); + return wil::AdaptFixedSizeToAllocatedResult(path, wistd::move(adapter)); } /** Retrieves the fully qualified path for the file that contains the specified module. @@ -314,7 +529,7 @@ namespace wil same format that was specified when the module was loaded. Therefore, the path can be a long or short file name, and can have the prefix '\\?\'. */ template - HRESULT GetModuleFileNameW(HMODULE module, string_type& path) + HRESULT GetModuleFileNameW(HMODULE module, string_type& path) WI_NOEXCEPT { return wil::GetModuleFileNameExW(nullptr, module, path); } @@ -357,50 +572,134 @@ namespace wil } #endif - /** Looks up the environment variable 'key' and fails if it is not found. - 'key' should not have '%' prefix and suffix. - Dangerous since environment variable generally are optional. */ - template + /** Looks up the environment variable 'key' and fails if it is not found. */ + template string_type GetEnvironmentVariableW(_In_ PCWSTR key) { string_type result; - THROW_IF_FAILED(wil::GetEnvironmentVariableW(key, result)); + THROW_IF_FAILED((wil::GetEnvironmentVariableW(key, result))); return result; } - /** Looks up the environment variable 'key' and returns null if it is not found. - 'key' should not have '%' prefix and suffix. */ - template + /** Looks up the environment variable 'key' and returns null if it is not found. */ + template string_type TryGetEnvironmentVariableW(_In_ PCWSTR key) { string_type result; - THROW_IF_FAILED(wil::TryGetEnvironmentVariableW(key, result)); + THROW_IF_FAILED((wil::TryGetEnvironmentVariableW(key, result))); return result; } - template - string_type GetModuleFileNameW(HMODULE module) + template + string_type GetModuleFileNameW(HMODULE module = nullptr /* current process module */) { string_type result; - THROW_IF_FAILED(wil::GetModuleFileNameW(module, result)); + THROW_IF_FAILED((wil::GetModuleFileNameW(module, result))); return result; } - template + template string_type GetModuleFileNameExW(HANDLE process, HMODULE module) { string_type result; - THROW_IF_FAILED(wil::GetModuleFileNameExW(process, module, result)); + THROW_IF_FAILED((wil::GetModuleFileNameExW(process, module, result))); return result; } + template + string_type QueryFullProcessImageNameW(HANDLE processHandle = GetCurrentProcess(), DWORD flags = 0) + { + string_type result; + THROW_IF_FAILED((wil::QueryFullProcessImageNameW(processHandle, flags, result))); + return result; + } + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) + + // Lookup a DWORD value under HKLM\...\Image File Execution Options\ + inline DWORD GetCurrentProcessExecutionOption(PCWSTR valueName, DWORD defaultValue = 0) + { + auto filePath = wil::GetModuleFileNameW(); + if (auto lastSlash = wcsrchr(filePath.get(), L'\\')) + { + const auto fileName = lastSlash + 1; + auto keyPath = wil::str_concat(LR"(SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\)", + fileName); + DWORD value{}, sizeofValue = sizeof(value); + if (::RegGetValueW(HKEY_LOCAL_MACHINE, keyPath.get(), valueName, +#ifdef RRF_SUBKEY_WOW6464KEY + RRF_RT_REG_DWORD | RRF_SUBKEY_WOW6464KEY, +#else + RRF_RT_REG_DWORD, +#endif + nullptr, &value, &sizeofValue) == ERROR_SUCCESS) + { + return value; + } + } + return defaultValue; + } + + // Waits for a debugger to attach to the current process based on registry configuration. + // + // Example: + // HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe + // WaitForDebuggerPresent=1 + // + // REG_DWORD value of + // missing or 0 -> don't break + // 1 -> wait for the debugger, continue execution once it is attached + // 2 -> wait for the debugger, break here once attached. + inline void WaitForDebuggerPresent(bool checkRegistryConfig = true) + { + for (;;) + { + auto configValue = checkRegistryConfig ? GetCurrentProcessExecutionOption(L"WaitForDebuggerPresent") : 1; + if (configValue == 0) + { + return; // not configured, don't wait + } + + if (IsDebuggerPresent()) + { + if (configValue == 2) + { + DebugBreak(); // debugger attached, SHIFT+F11 to return to the caller + } + return; // debugger now attached, continue executing + } + Sleep(500); + } + } +#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) + #endif /** Retrieve the HINSTANCE for the current DLL or EXE using this symbol that the linker provides for every module. This avoids the need for a global HINSTANCE variable and provides access to this value for static libraries. */ EXTERN_C IMAGE_DOS_HEADER __ImageBase; - inline HINSTANCE GetModuleInstanceHandle() { return reinterpret_cast(&__ImageBase); } + inline HINSTANCE GetModuleInstanceHandle() WI_NOEXCEPT { return reinterpret_cast(&__ImageBase); } + + // GetModuleHandleExW was added to the app partition in version 22000 of the SDK +#if defined(NTDDI_WIN10_CO) ? \ + WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) : \ + WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) + // Use this in threads that can outlive the object or API call that created them. + // Without this COM, or the API caller, can unload the DLL, resulting in a crash. + // It is very important that this be the first object created in the thread proc + // as when this runs down the thread exits and no destructors of objects created before + // it will run. + [[nodiscard]] inline auto get_module_reference_for_thread() noexcept + { + HMODULE thisModule{}; + FAIL_FAST_IF(!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, L"", &thisModule)); + return wil::scope_exit([thisModule] + { + FreeLibraryAndExitThread(thisModule, 0); + }); + } +#endif /// @cond namespace details @@ -410,19 +709,19 @@ namespace wil INIT_ONCE& m_once; unsigned long m_flags = INIT_ONCE_INIT_FAILED; public: - init_once_completer(_In_ INIT_ONCE& once) : m_once(once) + init_once_completer(_In_ INIT_ONCE& once) WI_NOEXCEPT : m_once(once) { } #pragma warning(push) #pragma warning(disable:4702) // https://github.com/Microsoft/wil/issues/2 - void success() + void success() WI_NOEXCEPT { m_flags = 0; } #pragma warning(pop) - ~init_once_completer() + ~init_once_completer() WI_NOEXCEPT { ::InitOnceComplete(&m_once, m_flags, nullptr); } diff --git a/Externals/WIL/include/wil/win32_result_macros.h b/Externals/WIL/include/wil/win32_result_macros.h new file mode 100644 index 000000000000..947db33260c3 --- /dev/null +++ b/Externals/WIL/include/wil/win32_result_macros.h @@ -0,0 +1,104 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* +#ifndef __WIL_WIN32_RESULTMACROS_INCLUDED +#define __WIL_WIN32_RESULTMACROS_INCLUDED + +#include "result_macros.h" + +// Helpers for return macros +#define __WIN32_RETURN_WIN32(error, str) __WI_SUPPRESS_4127_S do { const auto __error = (error); if (FAILED_WIN32(__error)) { __R_FN(Return_Win32)(__R_INFO(str) __error); } return __error; } __WI_SUPPRESS_4127_E while ((void)0, 0) +#define __WIN32_RETURN_GLE_FAIL(str) return __R_FN(Win32_Return_GetLastError)(__R_INFO_ONLY(str)) + +FORCEINLINE long __WIN32_FROM_HRESULT(HRESULT hr) +{ + if (SUCCEEDED(hr)) + { + return ERROR_SUCCESS; + } + return HRESULT_FACILITY(hr) == FACILITY_WIN32 ? HRESULT_CODE(hr) : hr; +} + +//***************************************************************************** +// Macros for returning failures as WIN32 error codes +//***************************************************************************** + +// Always returns a known result (WIN32 error code) - always logs failures +#define WIN32_RETURN_WIN32(error) __WIN32_RETURN_WIN32(wil::verify_win32(error), #error) +#define WIN32_RETURN_LAST_ERROR() __WIN32_RETURN_GLE_FAIL(nullptr) + +// Conditionally returns failures (WIN32 error code) - always logs failures +#define WIN32_RETURN_IF_WIN32_ERROR(error) __WI_SUPPRESS_4127_S do { const auto __errorRet = wil::verify_win32(error); if (FAILED_WIN32(__errorRet)) { __WIN32_RETURN_WIN32(__errorRet, #error); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_WIN32_IF(error, condition) __WI_SUPPRESS_4127_S do { if (wil::verify_bool(condition)) { __WIN32_RETURN_WIN32(wil::verify_win32(error), #condition); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_WIN32_IF_NULL(error, ptr) __WI_SUPPRESS_4127_S do { if ((ptr) == nullptr) { __WIN32_RETURN_WIN32(wil::verify_win32(error), #ptr); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_LAST_ERROR_IF(condition) __WI_SUPPRESS_4127_S do { if (wil::verify_bool(condition)) { __WIN32_RETURN_GLE_FAIL(#condition); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_LAST_ERROR_IF_NULL(ptr) __WI_SUPPRESS_4127_S do { if ((ptr) == nullptr) { __WIN32_RETURN_GLE_FAIL(#ptr); }} __WI_SUPPRESS_4127_E while ((void)0, 0) + +// Conditionally returns failures (WIN32 error code) - use for failures that are expected in common use - failures are not logged - macros are only for control flow pattern +#define WIN32_RETURN_IF_WIN32_ERROR_EXPECTED(error) __WI_SUPPRESS_4127_S do { const auto __errorRet = wil::verify_win32(error); if (FAILED_WIN32(__errorRet)) { return __errorRet; }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_WIN32_IF_EXPECTED(error, condition) __WI_SUPPRESS_4127_S do { if (wil::verify_bool(condition)) { return wil::verify_win32(error); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_WIN32_IF_NULL_EXPECTED(error, ptr) __WI_SUPPRESS_4127_S do { if ((ptr) == nullptr) { return wil::verify_win32(error); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_LAST_ERROR_IF_EXPECTED(condition) __WI_SUPPRESS_4127_S do { if (wil::verify_bool(condition)) { return wil::verify_win32(wil::details::GetLastErrorFail()); }} __WI_SUPPRESS_4127_E while ((void)0, 0) +#define WIN32_RETURN_LAST_ERROR_IF_NULL_EXPECTED(ptr) __WI_SUPPRESS_4127_S do { if ((ptr) == nullptr) { return wil::verify_win32(wil::details::GetLastErrorFail()); }} __WI_SUPPRESS_4127_E while ((void)0, 0) + + +//***************************************************************************** +// Macros to catch and convert exceptions on failure +//***************************************************************************** + +// Use these macros *within* a catch (...) block to handle exceptions +#define WIN32_RETURN_CAUGHT_EXCEPTION() return __R_FN(Win32_Return_CaughtException)(__R_INFO_ONLY(nullptr)) + +// Use these macros in place of a catch block to handle exceptions +#define WIN32_CATCH_RETURN() catch (...) { WIN32_RETURN_CAUGHT_EXCEPTION(); } + +namespace wil +{ + //***************************************************************************** + // Public Helpers that catch -- mostly only enabled when exceptions are enabled + //***************************************************************************** + + // Win32ErrorFromCaughtException is a function that is meant to be called from within a catch(...) block. Internally + // it re-throws and catches the exception to convert it to a WIN32 error code. If an exception is of an unrecognized type + // the function will fail fast. + // + // try + // { + // // Code + // } + // catch (...) + // { + // status = wil::Win32ErrorFromCaughtException(); + // } + _Always_(_Post_satisfies_(return > 0)) + __declspec(noinline) inline long Win32ErrorFromCaughtException() WI_NOEXCEPT + { + return __WIN32_FROM_HRESULT(ResultFromCaughtException()); + } + + namespace details::__R_NS_NAME + { +#ifdef WIL_ENABLE_EXCEPTIONS + __R_DIRECT_METHOD(long, Win32_Return_CaughtException)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT + { + __R_FN_LOCALS; + return __WIN32_FROM_HRESULT(wil::details::ReportFailure_CaughtException(__R_DIRECT_FN_CALL_ONLY)); + } +#endif + + __R_DIRECT_METHOD(long, Win32_Return_GetLastError)(__R_DIRECT_FN_PARAMS_ONLY) WI_NOEXCEPT + { + __R_FN_LOCALS; + return __WIN32_FROM_HRESULT(wil::details::ReportFailure_GetLastErrorHr(__R_DIRECT_FN_CALL_ONLY)); + } + } +} + +#endif // __WIL_WIN32_RESULTMACROS_INCLUDED diff --git a/Externals/WIL/include/wil/winrt.h b/Externals/WIL/include/wil/winrt.h index c2456b27a5f5..3ce91019ce20 100644 --- a/Externals/WIL/include/wil/winrt.h +++ b/Externals/WIL/include/wil/winrt.h @@ -19,24 +19,40 @@ #include "result.h" #include "com.h" #include "resource.h" +#include #include #ifdef __cplusplus_winrt #include // bring in the CRT iterator for support for C++ CX code #endif -#ifdef WIL_ENABLE_EXCEPTIONS /// @cond +#if defined(WIL_ENABLE_EXCEPTIONS) && !defined(__WI_HAS_STD_LESS) +#ifdef __has_include +#if __has_include() +#define __WI_HAS_STD_LESS 1 +#include +#endif // Otherwise, not using STL; don't specialize std::less +#else +// Fall back to the old way of forward declaring std::less +#define __WI_HAS_STD_LESS 1 +#pragma warning(push) +#pragma warning(disable:4643) // Forward declaring '...' in namespace std is not permitted by the C++ Standard. namespace std { - template - class basic_string; - template struct less; } -/// @endcond +#pragma warning(pop) +#endif +#endif +#if defined(WIL_ENABLE_EXCEPTIONS) && defined(__has_include) +#if __has_include() +#define __WI_HAS_STD_VECTOR 1 +#include #endif +#endif +/// @endcond // This enables this code to be used in code that uses the ABI prefix or not. // Code using the public SDK and C++ CX code has the ABI prefix, windows internal @@ -50,10 +66,9 @@ namespace std namespace wil { -#ifdef _INC_TIME // time_t is the number of 1 - second intervals since January 1, 1970. - long long const SecondsToStartOf1970 = 0x2b6109100; - long long const HundredNanoSecondsInSecond = 10000000LL; + constexpr long long SecondsToStartOf1970 = 0x2b6109100; + constexpr long long HundredNanoSecondsInSecond = 10000000LL; inline __time64_t DateTime_to_time_t(ABI::Windows::Foundation::DateTime dateTime) { @@ -67,7 +82,6 @@ namespace wil dateTime.UniversalTime = (timeT + SecondsToStartOf1970) * HundredNanoSecondsInSecond; return dateTime; } -#endif // _INC_TIME #pragma region HSTRING Helpers /// @cond @@ -145,16 +159,17 @@ namespace wil return str; } -#ifdef WIL_ENABLE_EXCEPTIONS - template - static const wchar_t* get_buffer( - const std::basic_string& str, - UINT32* length) WI_NOEXCEPT + // Overload for std::wstring, or at least things that behave like std::wstring, without adding a dependency + // on STL headers + template + static wistd::enable_if_t().c_str())>, + wistd::is_same().length())>>, + const wchar_t*> get_buffer(const StringT& str, UINT32* length) WI_NOEXCEPT { *length = static_cast(str.length()); return str.c_str(); } -#endif template static auto compare(LhsT&& lhs, RhsT&& rhs) -> @@ -224,8 +239,8 @@ namespace wil //! Detects if one or more embedded null is present in an HSTRING. inline bool HasEmbeddedNull(_In_opt_ HSTRING value) { - BOOL hasEmbeddedNull; - WindowsStringHasEmbeddedNull(value, &hasEmbeddedNull); + BOOL hasEmbeddedNull = FALSE; + (void)WindowsStringHasEmbeddedNull(value, &hasEmbeddedNull); return hasEmbeddedNull != FALSE; } @@ -429,14 +444,14 @@ namespace wil #pragma warning(disable:4702) // https://github.com/Microsoft/wil/issues/2 struct type // T holder { - type() {}; - type(T&& value) : m_value(wistd::forward(value)) {}; + type() = default; + type(T&& value) : m_value(wistd::forward(value)) {} operator T() const { return m_value; } type& operator=(T&& value) { m_value = wistd::forward(value); return *this; } T Get() const { return m_value; } // Returning T&& to support move only types - // In case of absense of T::operator=(T&&) a call to T::operator=(const T&) will happen + // In case of absence of T::operator=(T&&) a call to T::operator=(const T&) will happen T&& Get() { return wistd::move(m_value); } HRESULT CopyTo(T* result) const { *result = m_value; return S_OK; } @@ -730,7 +745,7 @@ namespace wil vector_range_nothrow(const vector_range_nothrow&) = delete; vector_range_nothrow& operator=(const vector_range_nothrow&) = delete; - vector_range_nothrow(vector_range_nothrow&& other) : + vector_range_nothrow(vector_range_nothrow&& other) WI_NOEXCEPT : m_v(other.m_v), m_size(other.m_size), m_result(other.m_result), m_resultStorage(other.m_resultStorage), m_currentElement(wistd::move(other.m_currentElement)) { @@ -985,6 +1000,39 @@ namespace wil }; #pragma endregion +#if defined(__WI_HAS_STD_VECTOR) + /** Converts WinRT vectors to std::vector by requesting the collection's data in a single + operation. This can be more efficient in terms of IPC cost than iteratively processing it. + ~~~ + ComPtr> values = GetValues(); + std::vector> allData = wil::to_vector(values); + for (ComPtr const& item : allData) + { + // use item + } + Can be used for ABI::Windows::Foundation::Collections::IVector and + ABI::Windows::Foundation::Collections::IVectorView + */ + template auto to_vector(VectorType* src) + { + using TResult = typename details::MapVectorResultType::type; + using TSmart = typename details::MapToSmartType::type; + static_assert(sizeof(TResult) == sizeof(TSmart), "result and smart sizes are different"); + std::vector output; + UINT32 expected = 0; + THROW_IF_FAILED(src->get_Size(&expected)); + if (expected > 0) + { + output.resize(expected + 1); + UINT32 fetched = 0; + THROW_IF_FAILED(src->GetMany(0, static_cast(output.size()), reinterpret_cast(output.data()), &fetched)); + THROW_HR_IF(E_CHANGED_STATE, fetched > expected); + output.resize(fetched); + } + return output; + } +#endif + #pragma region error code base IIterable<> template class iterable_range_nothrow @@ -998,7 +1046,7 @@ namespace wil iterable_range_nothrow& operator=(const iterable_range_nothrow&) = delete; iterable_range_nothrow& operator=(iterable_range_nothrow &&) = delete; - iterable_range_nothrow(iterable_range_nothrow&& other) : + iterable_range_nothrow(iterable_range_nothrow&& other) WI_NOEXCEPT : m_iterator(wistd::move(other.m_iterator)), m_element(wistd::move(other.m_element)), m_resultStorage(other.m_resultStorage) { @@ -1274,9 +1322,9 @@ namespace details // LastType::type boolValue; template struct LastType { - template struct LastTypeOfTs + template struct LastTypeOfTs { - typedef typename LastTypeOfTs::type type; + typedef typename LastTypeOfTs::type type; }; template struct LastTypeOfTs @@ -1284,8 +1332,8 @@ namespace details typedef T type; }; - template - static typename LastTypeOfTs::type LastTypeOfTsFunc() {} + template + static typename LastTypeOfTs::type LastTypeOfTsFunc() {} typedef decltype(LastTypeOfTsFunc()) type; }; @@ -1315,14 +1363,28 @@ namespace details typedef wistd::remove_pointer_t TIDelegate; auto callback = Callback, TIDelegate, TBaseAgility>>( - [func = wistd::forward(func)](TIOperation operation, AsyncStatus status) mutable -> HRESULT + [func = wistd::forward(func)](TIOperation operation, ABI::Windows::Foundation::AsyncStatus status) mutable -> HRESULT { HRESULT hr = S_OK; - if (status != AsyncStatus::Completed) // avoid a potentially costly marshaled QI / call if we completed successfully + if (status != ABI::Windows::Foundation::AsyncStatus::Completed) // avoid a potentially costly marshaled QI / call if we completed successfully { - ComPtr asyncInfo; - operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); // All must implement IAsyncInfo - asyncInfo->get_ErrorCode(&hr); + // QI to the IAsyncInfo interface. While all operations implement this, it is + // possible that the stub has disconnected, causing the QI to fail. + ComPtr asyncInfo; + hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); + if (SUCCEEDED(hr)) + { + // Save the error code result in a temporary variable to allow us + // to also retrieve the result of the COM call. If the stub has + // disconnected, this call may fail. + HRESULT errorCode = E_UNEXPECTED; + hr = asyncInfo->get_ErrorCode(&errorCode); + if (SUCCEEDED(hr)) + { + // Return the operations error code to the caller. + hr = errorCode; + } + } } return CallAndHandleErrors(func, hr); @@ -1340,21 +1402,35 @@ namespace details typedef wistd::remove_pointer_t TIDelegate; auto callback = Callback, TIDelegate, TBaseAgility>>( - [func = wistd::forward(func)](TIOperation operation, AsyncStatus status) mutable -> HRESULT + [func = wistd::forward(func)](TIOperation operation, ABI::Windows::Foundation::AsyncStatus status) mutable -> HRESULT { typename details::MapToSmartType::type::TResult_complex>::type>::type result; HRESULT hr = S_OK; - if (status == AsyncStatus::Completed) + // avoid a potentially costly marshaled QI / call if we completed successfully + if (status == ABI::Windows::Foundation::AsyncStatus::Completed) { hr = operation->GetResults(result.GetAddressOf()); } else { - // avoid a potentially costly marshaled QI / call if we completed successfully - ComPtr asyncInfo; - operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); // all must implement this - asyncInfo->get_ErrorCode(&hr); + // QI to the IAsyncInfo interface. While all operations implement this, it is + // possible that the stub has disconnected, causing the QI to fail. + ComPtr asyncInfo; + hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); + if (SUCCEEDED(hr)) + { + // Save the error code result in a temporary variable to allow us + // to also retrieve the result of the COM call. If the stub has + // disconnected, this call may fail. + HRESULT errorCode = E_UNEXPECTED; + hr = asyncInfo->get_ErrorCode(&errorCode); + if (SUCCEEDED(hr)) + { + // Return the operations error code to the caller. + hr = errorCode; + } + } } return CallAndHandleErrors(func, hr, result.Get()); @@ -1378,7 +1454,7 @@ namespace details RETURN_HR(m_completedEventHandle.create()); } - HRESULT STDMETHODCALLTYPE Invoke(_In_ TIOperation, AsyncStatus status) override + HRESULT STDMETHODCALLTYPE Invoke(_In_ TIOperation, ABI::Windows::Foundation::AsyncStatus status) override { m_status = status; m_completedEventHandle.SetEvent(); @@ -1390,13 +1466,13 @@ namespace details return m_completedEventHandle.get(); } - AsyncStatus GetStatus() const + ABI::Windows::Foundation::AsyncStatus GetStatus() const { return m_status; } private: - volatile AsyncStatus m_status = AsyncStatus::Started; + volatile ABI::Windows::Foundation::AsyncStatus m_status = ABI::Windows::Foundation::AsyncStatus::Started; wil::unique_event_nothrow m_completedEventHandle; }; @@ -1419,12 +1495,25 @@ namespace details } RETURN_IF_FAILED(hr); - if (completedDelegate->GetStatus() != AsyncStatus::Completed) + if (completedDelegate->GetStatus() != ABI::Windows::Foundation::AsyncStatus::Completed) { - Microsoft::WRL::ComPtr asyncInfo; - operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); // all must implement this - hr = E_UNEXPECTED; - asyncInfo->get_ErrorCode(&hr); // error return ignored, ok? + // QI to the IAsyncInfo interface. While all operations implement this, it is + // possible that the stub has disconnected, causing the QI to fail. + Microsoft::WRL::ComPtr asyncInfo; + hr = operation->QueryInterface(IID_PPV_ARGS(&asyncInfo)); + if (SUCCEEDED(hr)) + { + // Save the error code result in a temporary variable to allow us + // to also retrieve the result of the COM call. If the stub has + // disconnected, this call may fail. + HRESULT errorCode = E_UNEXPECTED; + hr = asyncInfo->get_ErrorCode(&errorCode); + if (SUCCEEDED(hr)) + { + // Return the operations error code to the caller. + hr = errorCode; + } + } return hr; // leave it to the caller to log failures. } return S_OK; @@ -1669,7 +1758,7 @@ namespace details IFACEMETHODIMP put_Completed(ABI::Windows::Foundation::IAsyncOperationCompletedHandler* competed) override { - competed->Invoke(this, AsyncStatus::Completed); + competed->Invoke(this, ABI::Windows::Foundation::AsyncStatus::Completed); return S_OK; } @@ -1708,7 +1797,7 @@ namespace details public: IFACEMETHODIMP put_Completed(ABI::Windows::Foundation::IAsyncActionCompletedHandler* competed) override { - competed->Invoke(this, AsyncStatus::Completed); + competed->Invoke(this, ABI::Windows::Foundation::AsyncStatus::Completed); return S_OK; } @@ -1866,7 +1955,19 @@ class unique_winrt_event_token_cx } else { - auto resolvedSender = m_weakSender.Resolve(); + auto resolvedSender = [&]() + { + try + { + return m_weakSender.Resolve(); + } + catch (...) + { + // Ignore RPC or other failures that are unavoidable in some cases + // matching wil::unique_winrt_event_token and winrt::event_revoker + return static_cast(nullptr); + } + }(); if (resolvedSender) { (resolvedSender->*m_removalFunction)(m_token); @@ -2205,7 +2306,7 @@ struct ABI::Windows::Foundation::IAsyncOperationWithProgressCompletedHandler // For size_t and other necessary types +#include // For size_t and other necessary types /// @cond #if defined(_MSC_VER) && !defined(__clang__) @@ -107,6 +107,29 @@ # define __WI_LIBCPP_COMPILER_IBM #endif +#if defined(__WI_LIBCPP_COMPILER_MSVC) +#define __WI_PUSH_WARNINGS __pragma(warning(push)) +#define __WI_POP_WARNINGS __pragma(warning(pop)) +#elif defined(__WI_LIBCPP_COMPILER_CLANG) +#define __WI_PUSH_WARNINGS __pragma(clang diagnostic push) +#define __WI_POP_WARNINGS __pragma(clang diagnostic pop) +#else +#define __WI_PUSH_WARNINGS +#define __WI_POP_WARNINGS +#endif + +#ifdef __WI_LIBCPP_COMPILER_MSVC +#define __WI_MSVC_DISABLE_WARNING(id) __pragma(warning(disable: id)) +#else +#define __WI_MSVC_DISABLE_WARNING(id) +#endif + +#ifdef __WI_LIBCPP_COMPILER_CLANG +#define __WI_CLANG_DISABLE_WARNING(warning) __pragma(clang diagnostic ignored #warning) +#else +#define __WI_CLANG_DISABLE_WARNING(warning) +#endif + // NOTE: MSVC, which is what we primarily target, is severly underrepresented in libc++ and checks such as // __has_feature(...) are always false for MSVC, even when the feature being tested _is_ present in MSVC. Therefore, we // instead modify all checks to be __WI_HAS_FEATURE_IS_UNION, etc., which provides the correct value for MSVC and falls @@ -448,7 +471,7 @@ namespace wistd // ("Windows Implementation" std) { - typedef decltype(__nullptr) nullptr_t; + using nullptr_t = decltype(__nullptr); template struct __less @@ -531,18 +554,18 @@ namespace wistd // ("Windows Implementation" std) template struct __WI_LIBCPP_TEMPLATE_VIS unary_function { - typedef _Arg argument_type; - typedef _Result result_type; + using argument_type = _Arg; + using result_type = _Result; }; template struct __WI_LIBCPP_TEMPLATE_VIS binary_function { - typedef _Arg1 first_argument_type; - typedef _Arg2 second_argument_type; - typedef _Result result_type; + using first_argument_type = _Arg1; + using second_argument_type = _Arg2; + using result_type = _Result; }; } /// @endcond -#endif _WISTD_CONFIG_H_ +#endif // _WISTD_CONFIG_H_ diff --git a/Externals/WIL/include/wil/wistd_functional.h b/Externals/WIL/include/wil/wistd_functional.h index f664385e6434..7f86ee958f5d 100644 --- a/Externals/WIL/include/wil/wistd_functional.h +++ b/Externals/WIL/include/wil/wistd_functional.h @@ -46,6 +46,7 @@ #pragma warning(push) #pragma warning(disable: 4324) +#pragma warning(disable: 4800) /// @cond namespace wistd // ("Windows Implementation" std) @@ -249,25 +250,28 @@ namespace wistd // ("Windows Implementation" std) return _Invoker::__call(__f_, wistd::forward<_ArgTypes>(__arg)...); } + // 'wistd::function' is most similar to 'inplace_function' in that it _only_ permits holding function objects + // that can fit within its internal buffer. Therefore, we expand this size to accommodate space for at least 12 + // pointers (__base vtable takes an additional one). + constexpr const size_t __buffer_size = 13 * sizeof(void*); + } // __function + // NOTE: The extra 'alignas' here is to work around the x86 compiler bug mentioned in + // https://github.com/microsoft/STL/issues/1533 to force alignment on the stack template - class __WI_LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)> + class __WI_LIBCPP_TEMPLATE_VIS __WI_ALIGNAS(typename aligned_storage<__function::__buffer_size>::type) + function<_Rp(_ArgTypes...)> : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>, public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)> { - // 'wistd::function' is most similar to 'inplace_function' in that it _only_ permits holding function objects - // that can fit within its internal buffer. Therefore, we expand this size to accommodate space for at least 12 - // pointers (__base vtable takes an additional one). - static constexpr size_t __buffer_size = 13 * sizeof(void*); - - typedef __function::__base<_Rp(_ArgTypes...)> __base; + using __base = __function::__base<_Rp(_ArgTypes...)>; __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS - typename aligned_storage<__buffer_size>::type __buf_; + typename aligned_storage<__function::__buffer_size>::type __buf_; __base* __f_; __WI_LIBCPP_NO_CFI static __base *__as_base(void *p) { - return reinterpret_cast<__base*>(p); + return static_cast<__base*>(p); } template @@ -281,7 +285,7 @@ namespace wistd // ("Windows Implementation" std) template struct __callable_imp<_Fp, false> { - static const bool value = false; + static constexpr bool value = false; }; template @@ -296,11 +300,12 @@ namespace wistd // ("Windows Implementation" std) template using _EnableIfCallable = typename enable_if<__callable<_Fp>::value>::type; public: - typedef _Rp result_type; + using result_type = _Rp; // construct/copy/destroy: __WI_LIBCPP_INLINE_VISIBILITY __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function() WI_NOEXCEPT : __f_(0) {} + __WI_LIBCPP_INLINE_VISIBILITY function(nullptr_t) WI_NOEXCEPT : __f_(0) {} function(const function&); @@ -340,7 +345,7 @@ namespace wistd // ("Windows Implementation" std) __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function<_Rp(_ArgTypes...)>::function(const function& __f) { - if (__f.__f_ == 0) + if (__f.__f_ == nullptr) __f_ = 0; else { @@ -353,7 +358,7 @@ namespace wistd // ("Windows Implementation" std) __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS __WI_LIBCPP_SUPPRESS_NOEXCEPT_ANALYSIS function<_Rp(_ArgTypes...)>::function(function&& __f) { - if (__f.__f_ == 0) + if (__f.__f_ == nullptr) __f_ = 0; else { @@ -368,14 +373,14 @@ namespace wistd // ("Windows Implementation" std) template __WI_LIBCPP_SUPPRESS_NONINIT_ANALYSIS function<_Rp(_ArgTypes...)>::function(_Fp __f) - : __f_(0) + : __f_(nullptr) { if (__function::__not_null(__f)) { typedef __function::__func<_Fp, _Rp(_ArgTypes...)> _FF; static_assert(sizeof(_FF) <= sizeof(__buf_), "The sizeof(wistd::function) has grown too large for the reserved buffer (12 pointers). Refactor to reduce size of the capture."); - __f_ = ::new((void*)&__buf_) _FF(wistd::move(__f)); + __f_ = ::new(static_cast(&__buf_)) _FF(wistd::move(__f)); } } @@ -429,7 +434,7 @@ namespace wistd // ("Windows Implementation" std) typedef __function::__func::type, _Rp(_ArgTypes...)> _FF; static_assert(sizeof(_FF) <= sizeof(__buf_), "The sizeof(wistd::function) has grown too large for the reserved buffer (12 pointers). Refactor to reduce size of the capture."); - __f_ = ::new((void*)&__buf_) _FF(wistd::move(__f)); + __f_ = ::new(static_cast(&__buf_)) _FF(wistd::move(__f)); } return *this; @@ -483,7 +488,7 @@ namespace wistd // ("Windows Implementation" std) _Rp function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const { - if (__f_ == 0) + if (__f_ == nullptr) __throw_bad_function_call(); return (*__f_)(wistd::forward<_ArgTypes>(__arg)...); } diff --git a/Externals/WIL/include/wil/wistd_memory.h b/Externals/WIL/include/wil/wistd_memory.h index 48031c57606b..0a5be288251c 100644 --- a/Externals/WIL/include/wil/wistd_memory.h +++ b/Externals/WIL/include/wil/wistd_memory.h @@ -60,13 +60,13 @@ namespace wistd // ("Windows Implementation" std) template ::value> struct __pointer_type { - typedef typename _Dp::pointer type; + using type = typename _Dp::pointer; }; template struct __pointer_type<_Tp, _Dp, false> { - typedef _Tp* type; + using type = _Tp*; }; } // __pointer_type_imp @@ -74,16 +74,16 @@ namespace wistd // ("Windows Implementation" std) template struct __pointer_type { - typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; + using type = typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type; }; template ::value && !__libcpp_is_final<_Tp>::value> struct __compressed_pair_elem { - typedef _Tp _ParamT; - typedef _Tp& reference; - typedef const _Tp& const_reference; + using _ParamT = _Tp; + using reference = _Tp&; + using const_reference = const _Tp&; #ifndef __WI_LIBCPP_CXX03_LANG __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() : __value_() {} @@ -115,10 +115,10 @@ namespace wistd // ("Windows Implementation" std) template struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp { - typedef _Tp _ParamT; - typedef _Tp& reference; - typedef const _Tp& const_reference; - typedef _Tp __value_type; + using _ParamT = _Tp; + using reference = _Tp&; + using const_reference = const _Tp&; + using __value_type = _Tp; #ifndef __WI_LIBCPP_CXX03_LANG __WI_LIBCPP_INLINE_VISIBILITY constexpr __compressed_pair_elem() = default; @@ -149,10 +149,10 @@ namespace wistd // ("Windows Implementation" std) struct __second_tag {}; template - class __compressed_pair : private __compressed_pair_elem<_T1, 0>, - private __compressed_pair_elem<_T2, 1> { - typedef __compressed_pair_elem<_T1, 0> _Base1; - typedef __compressed_pair_elem<_T2, 1> _Base2; + class __declspec(empty_bases) __compressed_pair : private __compressed_pair_elem<_T1, 0>, + private __compressed_pair_elem<_T2, 1> { + using _Base1 = __compressed_pair_elem<_T1, 0>; + using _Base2 = __compressed_pair_elem<_T2, 1>; // NOTE: This static assert should never fire because __compressed_pair // is *almost never* used in a scenario where it's possible for T1 == T2. @@ -271,7 +271,7 @@ namespace wistd // ("Windows Implementation" std) __WI_LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, typename enable_if::value>::type* = - 0) WI_NOEXCEPT {} + nullptr) WI_NOEXCEPT {} __WI_LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __ptr) const WI_NOEXCEPT { static_assert(sizeof(_Tp) > 0, @@ -299,7 +299,7 @@ namespace wistd // ("Windows Implementation" std) template __WI_LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, - typename _EnableIfConvertible<_Up>::type* = 0) WI_NOEXCEPT {} + typename _EnableIfConvertible<_Up>::type* = nullptr) WI_NOEXCEPT {} template __WI_LIBCPP_INLINE_VISIBILITY @@ -319,32 +319,32 @@ namespace wistd // ("Windows Implementation" std) template struct __unique_ptr_deleter_sfinae { static_assert(!is_reference<_Deleter>::value, "incorrect specialization"); - typedef const _Deleter& __lval_ref_type; - typedef _Deleter&& __good_rval_ref_type; - typedef true_type __enable_rval_overload; + using __lval_ref_type = const _Deleter&; + using __good_rval_ref_type = _Deleter&&; + using __enable_rval_overload = true_type; }; template struct __unique_ptr_deleter_sfinae<_Deleter const&> { - typedef const _Deleter& __lval_ref_type; - typedef const _Deleter&& __bad_rval_ref_type; - typedef false_type __enable_rval_overload; + using __lval_ref_type = const _Deleter&; + using __bad_rval_ref_type = const _Deleter&&; + using __enable_rval_overload = false_type; }; template struct __unique_ptr_deleter_sfinae<_Deleter&> { - typedef _Deleter& __lval_ref_type; - typedef _Deleter&& __bad_rval_ref_type; - typedef false_type __enable_rval_overload; + using __lval_ref_type = _Deleter&; + using __bad_rval_ref_type = _Deleter&&; + using __enable_rval_overload = false_type; }; #endif // !defined(__WI_LIBCPP_CXX03_LANG) template > class __WI_LIBCPP_TEMPLATE_VIS unique_ptr { public: - typedef _Tp element_type; - typedef _Dp deleter_type; - typedef typename __pointer_type<_Tp, deleter_type>::type pointer; + using element_type = _Tp; + using deleter_type = _Dp; + using pointer = typename __pointer_type<_Tp, deleter_type>::type; static_assert(!is_rvalue_reference::value, "the specified deleter type cannot be an rvalue reference"); @@ -355,7 +355,7 @@ namespace wistd // ("Windows Implementation" std) struct __nat { int __for_bool_; }; #ifndef __WI_LIBCPP_CXX03_LANG - typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; + using _DeleterSFINAE = __unique_ptr_deleter_sfinae<_Dp>; template using _LValRefType = @@ -582,9 +582,9 @@ namespace wistd // ("Windows Implementation" std) template class __WI_LIBCPP_TEMPLATE_VIS unique_ptr<_Tp[], _Dp> { public: - typedef _Tp element_type; - typedef _Dp deleter_type; - typedef typename __pointer_type<_Tp, deleter_type>::type pointer; + using element_type = _Tp; + using deleter_type = _Dp; + using pointer = typename __pointer_type<_Tp, deleter_type>::type; private: __compressed_pair __ptr_; @@ -602,7 +602,7 @@ namespace wistd // ("Windows Implementation" std) {}; #ifndef __WI_LIBCPP_CXX03_LANG - typedef __unique_ptr_deleter_sfinae<_Dp> _DeleterSFINAE; + using _DeleterSFINAE = __unique_ptr_deleter_sfinae<_Dp>; template using _LValRefType = diff --git a/Externals/WIL/include/wil/wrl.h b/Externals/WIL/include/wil/wrl.h index e7f7c6c08c12..6e95f1713fcc 100644 --- a/Externals/WIL/include/wil/wrl.h +++ b/Externals/WIL/include/wil/wrl.h @@ -14,6 +14,11 @@ #include #include "result.h" #include "common.h" // wistd type_traits helpers +#include // GetModuleHandleW + +/// @cond +EXTERN_C IMAGE_DOS_HEADER __ImageBase; +/// @endcond namespace wil { @@ -79,6 +84,44 @@ namespace wil return result; } #endif // WIL_ENABLE_EXCEPTIONS + + /** Holds a reference to the host WRL module to prevent it from being unloaded. + Normally, the reference is held implicitly because you are a member function + of a DLL-hosted COM object, or because you retain a strong reference + to some DLL-hosted COM object, but if those do not apply to you, then you + will need to hold a reference explicitly. For examples (and for the C++/WinRT + equivalent), see winrt_module_reference. + */ + struct [[nodiscard]] wrl_module_reference + { + wrl_module_reference() + { + if (auto modulePtr = ::Microsoft::WRL::GetModuleBase()) + { + modulePtr->IncrementObjectCount(); + } + else + { +#ifdef GET_MODULE_HANDLE_EX_FLAG_PIN + // If this assertion fails, then you are using wrl_module_reference + // from a DLL that does not host WRL objects, and the module reference + // has no effect. + WI_ASSERT(reinterpret_cast(&__ImageBase) == GetModuleHandleW(nullptr)); +#endif + } + } + + wrl_module_reference(wrl_module_reference const&) : wrl_module_reference() {} + + ~wrl_module_reference() + { + if (auto modulePtr = ::Microsoft::WRL::GetModuleBase()) + { + modulePtr->DecrementObjectCount(); + } + } + }; + } // namespace wil #endif // __WIL_WRL_INCLUDED diff --git a/Externals/WIL/natvis/wil.natvis b/Externals/WIL/natvis/wil.natvis new file mode 100644 index 000000000000..c42fdafec823 --- /dev/null +++ b/Externals/WIL/natvis/wil.natvis @@ -0,0 +1,114 @@ + + + + + {_Callee._Object} + + + + + + empty + {*_Impl} + + *_Impl + + + + + empty + {*_Myptr} + _Myptr + + _Myptr + + + + + empty + {_Myptr,su} + _Myptr + + _Myptr + wcslen(_Myptr) + + + + + empty + {_Myptr,s} + _Myptr + + _Myptr + strlen(_Myptr) + + + + + empty + {*m_ptr} + m_ptr + + m_ptr + + + + + empty + {m_ptr} + + + + + empty + {m_ptr} + + + + + empty + {m_ptr} + m_ptr + + + + + empty + {m_ptr,su} + m_ptr + + wcslen(m_ptr) + + + + empty + {m_ptr,s} + m_ptr + + strlen(m_ptr) + + + + + {m_ptr} + + m_ptr + + + + + + + {_Mydata,[_Mysize]} + + size() + + + \ No newline at end of file diff --git a/Externals/WIL/packaging/nuget/CMakeLists.txt b/Externals/WIL/packaging/nuget/CMakeLists.txt index f3fd938b2270..8f5c65e1c5d7 100644 --- a/Externals/WIL/packaging/nuget/CMakeLists.txt +++ b/Externals/WIL/packaging/nuget/CMakeLists.txt @@ -7,6 +7,7 @@ file(TO_NATIVE_PATH "${nupkg_dir}/Microsoft.Windows.ImplementationLibrary.${WIL_ file(DOWNLOAD https://dist.nuget.org/win-x86-commandline/latest/nuget.exe ${nuget_exe}) file(GLOB_RECURSE wil_headers ${CMAKE_SOURCE_DIR}/include/*.h) +file(GLOB_RECURSE wil_natvis ${CMAKE_SOURCE_DIR}/natvis/*.natvis) add_custom_command(OUTPUT ${wil_nupkg} COMMAND ${nuget_exe} pack ${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Windows.ImplementationLibrary.nuspec -OutputDirectory ${nupkg_dir} -Version ${WIL_BUILD_VERSION} -NonInteractive @@ -14,6 +15,7 @@ add_custom_command(OUTPUT ${wil_nupkg} ${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Windows.ImplementationLibrary.nuspec ${CMAKE_CURRENT_SOURCE_DIR}/Microsoft.Windows.ImplementationLibrary.targets ${wil_headers} + ${wil_natvis} ${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_SOURCE_DIR}/ThirdPartyNotices.txt) diff --git a/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.nuspec b/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.nuspec index be709b9ca08f..885f8b083472 100644 --- a/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.nuspec +++ b/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.nuspec @@ -16,6 +16,7 @@ + \ No newline at end of file diff --git a/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.targets b/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.targets index 29d756a9f9ee..77d21ca684a4 100644 --- a/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.targets +++ b/Externals/WIL/packaging/nuget/Microsoft.Windows.ImplementationLibrary.targets @@ -5,4 +5,7 @@ $(MSBuildThisFileDirectory)..\..\include\;%(AdditionalIncludeDirectories) + + + diff --git a/Externals/WIL/scripts/azure-pipelines.yml b/Externals/WIL/scripts/azure-pipelines.yml index 4b428d87486a..8e0a4f7391eb 100644 --- a/Externals/WIL/scripts/azure-pipelines.yml +++ b/Externals/WIL/scripts/azure-pipelines.yml @@ -8,7 +8,7 @@ jobs: timeoutInMinutes: 360 pool: - vmImage: 'windows-2019' + vmImage: 'windows-2022' steps: - script: | @@ -18,7 +18,7 @@ jobs: displayName: 'Install Clang' - script: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat" + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsamd64_x86.bat" if %ERRORLEVEL% NEQ 0 goto :eof call scripts\init_all.cmd --fast @@ -28,7 +28,7 @@ jobs: displayName: 'Build x86' - script: | - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" if %ERRORLEVEL% NEQ 0 goto :eof call scripts\init_all.cmd --fast @@ -37,5 +37,9 @@ jobs: call scripts\build_all.cmd displayName: 'Build x64' - - script: call scripts\runtests.cmd + # NOTE: We run the tests in the 32-bit cross-tools window out of convenience as this adds all necessary directories to + # the PATH that are necessary for finding the ASan/UBSan DLLs + - script: | + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsamd64_x86.bat"" + call scripts\runtests.cmd ~[LocalOnly] displayName: 'Run Tests' diff --git a/Externals/WIL/scripts/build_all.cmd b/Externals/WIL/scripts/build_all.cmd index 32d88f4c9987..3b9489623bdd 100644 --- a/Externals/WIL/scripts/build_all.cmd +++ b/Externals/WIL/scripts/build_all.cmd @@ -1,4 +1,5 @@ @echo off +setlocal setlocal EnableDelayedExpansion set BUILD_ROOT=%~dp0\..\build @@ -15,23 +16,15 @@ if "%Platform%"=="x64" ( exit /B 1 ) -call :build clang debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build clang release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build clang relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build clang minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) - -call :build msvc debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build msvc release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build msvc relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :build msvc minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) +set COMPILERS=clang msvc +set BUILD_TYPES=debug release relwithdebinfo minsizerel + +for %%c in (%COMPILERS%) do ( + for %%b in (%BUILD_TYPES%) do ( + call :build %%c %%b + if !ERRORLEVEL! NEQ 0 ( goto :eof ) + ) +) echo All build completed successfully! @@ -47,5 +40,6 @@ if not exist %BUILD_DIR% ( pushd %BUILD_DIR% echo Building from %CD% ninja +set EXIT_CODE=%ERRORLEVEL% popd -goto :eof +exit /B %EXIT_CODE% diff --git a/Externals/WIL/scripts/init.cmd b/Externals/WIL/scripts/init.cmd index cc8efbfbe7d2..fc2ba016c99e 100644 --- a/Externals/WIL/scripts/init.cmd +++ b/Externals/WIL/scripts/init.cmd @@ -10,8 +10,8 @@ goto :init :usage echo USAGE: echo init.cmd [--help] [-c^|--compiler ^] [-g^|--generator ^] - echo [-b^|--build-type ^] [-l^|--linker link^|lld-link] - echo [--fast] [-v^|--version X.Y.Z] + echo [-b^|--build-type ^] [-v^|--version X.Y.Z] + echo [--cppwinrt ^] [--fast] echo. echo ARGUMENTS echo -c^|--compiler Controls the compiler used, either 'clang' (the default) or 'msvc' @@ -20,6 +20,7 @@ goto :init echo 'relwithdebinfo', or 'minsizerel' echo -v^|--version Specifies the version of the NuGet package produced. Primarily only used by the CI echo build and is typically not necessary when building locally + echo --cppwinrt Manually specifies the version of C++/WinRT to use for generating headers echo --fast Used to (slightly) reduce compile times and build output size. This is primarily echo used by the CI build machines where resources are more constrained. This switch is echo temporary and will be removed once https://github.com/microsoft/wil/issues/9 is fixed @@ -30,10 +31,10 @@ goto :init set COMPILER= set GENERATOR= set BUILD_TYPE= - set LINKER= set CMAKE_ARGS= set BITNESS= set VERSION= + set CPPWINRT_VERSION= set FAST_BUILD=0 :parse @@ -88,29 +89,25 @@ goto :init goto :parse ) - set LINKER_SET=0 - if /I "%~1"=="-l" set LINKER_SET=1 - if /I "%~1"=="--linker" set LINKER_SET=1 - if %LINKER_SET%==1 ( - if "%LINKER%" NEQ "" echo ERROR: Linker already specified & call :usage & exit /B 1 + set VERSION_SET=0 + if /I "%~1"=="-v" set VERSION_SET=1 + if /I "%~1"=="--version" set VERSION_SET=1 + if %VERSION_SET%==1 ( + if "%VERSION%" NEQ "" echo ERROR: Version already specified & call :usage & exit /B 1 + if /I "%~2"=="" echo ERROR: Version string missing & call :usage & exit /B 1 - if /I "%~2"=="link" set LINKER=link - if /I "%~2"=="lld-link" set LINKER=lld-link - if "!LINKER!"=="" echo ERROR: Unrecognized/missing linker %~2 & call :usage & exit /B 1 + set VERSION=%~2 shift shift goto :parse ) - set VERSION_SET=0 - if /I "%~1"=="-v" set VERSION_SET=1 - if /I "%~1"=="--version" set VERSION_SET=1 - if %VERSION_SET%==1 ( - if "%VERSION%" NEQ "" echo ERROR: Version alread specified & call :usage & exit /B 1 - if /I "%~2"=="" echo ERROR: Version string missing & call :usage & exit /B 1 + if /I "%~1"=="--cppwinrt" ( + if "%CPPWINRT_VERSION%" NEQ "" echo ERROR: C++/WinRT version already specified & call :usage & exit /B 1 + if /I "%~2"=="" echo ERROR: C++/WinRT version string missing & call :usage & exit /B 1 - set VERSION=%~2 + set CPPWINRT_VERSION=%~2 shift shift @@ -132,9 +129,6 @@ goto :init :: Check for conflicting arguments if "%GENERATOR%"=="msbuild" ( if "%COMPILER%"=="clang" echo ERROR: Cannot use Clang with MSBuild & exit /B 1 - - :: While CMake won't give an error, specifying the linker won't actually have any effect with the VS generator - if "%LINKER%"=="lld-link" echo ERROR: Cannot use lld-link with MSBuild & exit /B 1 ) :: Select defaults @@ -145,8 +139,6 @@ goto :init if "%BUILD_TYPE%"=="" set BUILD_TYPE=debug - if "%LINKER%"=="" set LINKER=link - :: Formulate CMake arguments if %GENERATOR%==ninja set CMAKE_ARGS=%CMAKE_ARGS% -G Ninja @@ -167,14 +159,14 @@ goto :init set CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_SYSTEM_VERSION=10.0 ) - if %LINKER%==lld-link ( - set CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_LINKER=lld-link - ) - if "%VERSION%" NEQ "" set CMAKE_ARGS=%CMAKE_ARGS% -DWIL_BUILD_VERSION=%VERSION% + if "%CPPWINRT_VERSION%" NEQ "" set CMAKE_ARGS=%CMAKE_ARGS% -DCPPWINRT_VERSION=%CPPWINRT_VERSION% + if %FAST_BUILD%==1 set CMAKE_ARGS=%CMAKE_ARGS% -DFAST_BUILD=ON + set CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + :: Figure out the platform if "%Platform%"=="" echo ERROR: The init.cmd script must be run from a Visual Studio command window & exit /B 1 if "%Platform%"=="x86" ( @@ -191,7 +183,6 @@ goto :init :: Run CMake pushd %BUILD_DIR% echo Using compiler....... %COMPILER% - echo Using linker......... %LINKER% echo Using architecture... %Platform% echo Using build type..... %BUILD_TYPE% echo Using build root..... %CD% diff --git a/Externals/WIL/scripts/init_all.cmd b/Externals/WIL/scripts/init_all.cmd index 9fc14175561e..a179755154ce 100644 --- a/Externals/WIL/scripts/init_all.cmd +++ b/Externals/WIL/scripts/init_all.cmd @@ -1,13 +1,14 @@ @echo off +setlocal +setlocal EnableDelayedExpansion :: NOTE: Architecture is picked up from the command window, so we can't control that here :( +set COMPILERS=clang msvc +set BUILD_TYPES=debug relwithdebinfo -call %~dp0\init.cmd -c clang -g ninja -b debug %* -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call %~dp0\init.cmd -c clang -g ninja -b relwithdebinfo %* -if %ERRORLEVEL% NEQ 0 ( goto :eof ) - -call %~dp0\init.cmd -c msvc -g ninja -b debug %* -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call %~dp0\init.cmd -c msvc -g ninja -b relwithdebinfo %* -if %ERRORLEVEL% NEQ 0 ( goto :eof ) +for %%c in (%COMPILERS%) do ( + for %%b in (%BUILD_TYPES%) do ( + call %~dp0\init.cmd -c %%c -g ninja -b %%b %* + if !ERRORLEVEL! NEQ 0 ( goto :eof ) + ) +) diff --git a/Externals/WIL/scripts/runtests.cmd b/Externals/WIL/scripts/runtests.cmd index e9282fbbce82..c0d3002f110a 100644 --- a/Externals/WIL/scripts/runtests.cmd +++ b/Externals/WIL/scripts/runtests.cmd @@ -1,44 +1,24 @@ @echo off +setlocal setlocal EnableDelayedExpansion +set TEST_ARGS=%* + set BUILD_ROOT=%~dp0\..\build :: Unlike building, we don't need to limit ourselves to the Platform of the command window -call :execute_tests clang64debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang64release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang64relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang64minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) - -call :execute_tests clang32debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang32release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang32relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests clang32minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) - -call :execute_tests msvc64debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc64release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc64relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc64minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) - -call :execute_tests msvc32debug -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc32release -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc32relwithdebinfo -if %ERRORLEVEL% NEQ 0 ( goto :eof ) -call :execute_tests msvc32minsizerel -if %ERRORLEVEL% NEQ 0 ( goto :eof ) +set COMPILERS=clang msvc +set ARCHITECTURES=32 64 +set BUILD_TYPES=debug release relwithdebinfo minsizerel + +for %%c in (%COMPILERS%) do ( + for %%a in (%ARCHITECTURES%) do ( + for %%b in (%BUILD_TYPES%) do ( + call :execute_tests %%c%%a%%b + if !ERRORLEVEL! NEQ 0 ( goto :eof ) + ) + ) +) goto :eof @@ -49,19 +29,27 @@ if not exist %BUILD_DIR% ( goto :eof ) pushd %BUILD_DIR% echo Running tests from %CD% call :execute_test app witest.app.exe -if %ERRORLEVEL% NEQ 0 ( popd && goto :eof ) +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) call :execute_test cpplatest witest.cpplatest.exe -if %ERRORLEVEL% NEQ 0 ( popd && goto :eof ) +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) call :execute_test noexcept witest.noexcept.exe -if %ERRORLEVEL% NEQ 0 ( popd && goto :eof ) +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) call :execute_test normal witest.exe -if %ERRORLEVEL% NEQ 0 ( popd && goto :eof ) +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) +call :execute_test sanitize-address witest.asan.exe +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) +call :execute_test sanitize-undefined-behavior witest.ubsan.exe +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) +call :execute_test win7 witest.win7.exe +if %ERRORLEVEL% NEQ 0 ( goto :execute_tests_done ) + +:execute_tests_done +set EXIT_CODE=%ERRORLEVEL% popd - -goto :eof +exit /B %EXIT_CODE% :execute_test if not exist tests\%1\%2 ( goto :eof ) echo Running %1 tests... -tests\%1\%2 +tests\%1\%2 %TEST_ARGS% goto :eof diff --git a/Externals/WIL/tests/CMakeLists.txt b/Externals/WIL/tests/CMakeLists.txt index a9c0fae159f5..897379dbef69 100644 --- a/Externals/WIL/tests/CMakeLists.txt +++ b/Externals/WIL/tests/CMakeLists.txt @@ -1,19 +1,98 @@ -include(${CMAKE_SOURCE_DIR}/cmake/common_build_flags.cmake) +include(${PROJECT_SOURCE_DIR}/cmake/common_build_flags.cmake) # All projects need to reference the WIL headers -include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${PROJECT_SOURCE_DIR}/include) # TODO: Might be worth trying to conditionally do this on SDK version, assuming there's a semi-easy way to detect that include_directories(BEFORE SYSTEM ./workarounds/wrl) +# Because we don't always use msbuild, we need to run nuget manually +find_program(NUGET nuget) +if (NOT NUGET) + message(FATAL_ERROR "Unable to find the nuget CLI tool. Please install it from https://www.nuget.org/downloads and ensure it has been added to the PATH") +endif() + +execute_process(COMMAND + ${NUGET} install Microsoft.Windows.CppWinRT -Version ${CPPWINRT_VERSION} -OutputDirectory packages + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE ret) +if (NOT ret EQUAL 0) + message(FATAL_ERROR "Failed to install nuget package Microsoft.Windows.CppWinRT.${CPPWINRT_VERSION}") +endif() + +set(CPPWINRT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT.${CPPWINRT_VERSION}/bin/cppwinrt.exe) +execute_process(COMMAND + ${CPPWINRT} -input sdk -output include + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + RESULT_VARIABLE ret) +if (NOT ret EQUAL 0) + message(FATAL_ERROR "Failed to run cppwinrt.exe") +endif() + +include_directories(BEFORE SYSTEM ${CMAKE_BINARY_DIR}/include) + # The build pipelines have limitations that local development environments do not, so turn a few knobs if (${FAST_BUILD}) replace_cxx_flag("/GR" "/GR-") # Disables RTTI add_definitions(-DCATCH_CONFIG_FAST_COMPILE -DWIL_FAST_BUILD) endif() +# For some unknown reason, 'RelWithDebInfo' compiles with '/Ob1' as opposed to '/Ob2' which prevents inlining of +# functions not marked 'inline'. The reason we prefer 'RelWithDebInfo' over 'Release' is to get debug info, so manually +# revert to the desired (and default) inlining behavior as that exercises more interesting code paths +if (${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo") + # TODO: This is currently blocked by an apparent Clang bug: https://github.com/llvm/llvm-project/issues/59690 + # replace_cxx_flag("/Ob1" "/Ob2") +endif() + +set(COMMON_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/CommonTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ComTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/FileSystemTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/NTResultTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ResourceTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ResultTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Rpc.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/SafeCastTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TraceLoggingTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/WistdTests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/wiTest.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../natvis/wil.natvis + ) + add_subdirectory(app) add_subdirectory(cpplatest) add_subdirectory(noexcept) add_subdirectory(normal) +add_subdirectory(win7) + +set(DEBUG_BUILD FALSE) +set(HAS_DEBUG_INFO FALSE) + +if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") + set(DEBUG_BUILD TRUE) + set(HAS_DEBUG_INFO TRUE) +elseif(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo") + set(HAS_DEBUG_INFO TRUE) +endif() + +set(ASAN_AVAILABLE FALSE) +set(UBSAN_AVAILABLE FALSE) +if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # Address Sanitizer is available for all architectures and build types, but warns/errors if debug info is not enabled + set(ASAN_AVAILABLE ${HAS_DEBUG_INFO}) +elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # Address Sanitizer is not available with debug libraries + set(ASAN_AVAILABLE NOT ${DEBUG_BUILD}) + set(UBSAN_AVAILABLE NOT ${DEBUG_BUILD}) +endif() + +if (${ASAN_AVAILABLE}) + add_subdirectory(sanitize-address) +endif() + +if (${UBSAN_AVAILABLE}) + add_subdirectory(sanitize-undefined-behavior) +endif() diff --git a/Externals/WIL/tests/ComApartmentVariableTests.cpp b/Externals/WIL/tests/ComApartmentVariableTests.cpp new file mode 100644 index 000000000000..ddc6148c07f1 --- /dev/null +++ b/Externals/WIL/tests/ComApartmentVariableTests.cpp @@ -0,0 +1,401 @@ +#include +#include +#include + +#include "common.h" + +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) + +template +inline void LogOutput(_Printf_format_string_ PCWSTR format, args_t&&... args) +{ + OutputDebugStringW(wil::str_printf_failfast(format, wistd::forward(args)...).get()); +} + +inline bool IsComInitialized() +{ + APTTYPE type{}; APTTYPEQUALIFIER qualifier{}; + return CoGetApartmentType(&type, &qualifier) == S_OK; +} + +inline void WaitForAllComApartmentsToRundown() +{ + while (IsComInitialized()) + { + Sleep(0); + } +} + +void co_wait(const wil::unique_event& e) +{ + HANDLE raw[] = { e.get() }; + ULONG index{}; + REQUIRE_SUCCEEDED(CoWaitForMultipleHandles(COWAIT_DISPATCH_CALLS, INFINITE, static_cast(std::size(raw)), raw, &index)); +} + +void RunApartmentVariableTest(void(*test)()) +{ + test(); + // Apartment variable rundown is async, wait for the last COM apartment + // to rundown before proceeding to the next test. + WaitForAllComApartmentsToRundown(); +} + +struct mock_platform +{ + static unsigned long long GetApartmentId() + { + APTTYPE type; APTTYPEQUALIFIER qualifer; + REQUIRE_SUCCEEDED(CoGetApartmentType(&type, &qualifer)); // ensure COM is inited + + // Approximate apartment Id + if (type == APTTYPE_STA) + { + REQUIRE_FALSE(GetCurrentThreadId() < APTTYPE_MAINSTA); + return GetCurrentThreadId(); + } + else + { + // APTTYPE_MTA (1), APTTYPE_NA (2), APTTYPE_MAINSTA (3) + return type; + } + } + + static auto RegisterForApartmentShutdown(IApartmentShutdown* observer) + { + const auto id = GetApartmentId(); + auto apt_observers = m_observers.find(id); + if (apt_observers == m_observers.end()) + { + m_observers.insert({ id, { observer} }); + } + else + { + apt_observers->second.emplace_back(observer); + } + return shutdown_type{ reinterpret_cast(id) }; + } + + static void UnRegisterForApartmentShutdown(APARTMENT_SHUTDOWN_REGISTRATION_COOKIE cookie) + { + auto id = reinterpret_cast(cookie); + m_observers.erase(id); + } + + using shutdown_type = wil::unique_any; + + // This is needed to simulate the platform for unit testing. + static auto CoInitializeEx(DWORD coinitFlags = 0 /*COINIT_MULTITHREADED*/) + { + return wil::scope_exit([aptId = GetCurrentThreadId(), init = wil::CoInitializeEx(coinitFlags)]() + { + const auto id = GetApartmentId(); + auto apt_observers = m_observers.find(id); + if (apt_observers != m_observers.end()) + { + const auto& observers = apt_observers->second; + for (auto& observer : observers) + { + observer->OnUninitialize(id); + } + m_observers.erase(apt_observers); + } + }); + } + + // Enable the test hook to force losing the race + inline static constexpr unsigned long AsyncRundownDelayForTestingRaces = 1; // enable test hook + inline static std::unordered_map>> m_observers; +}; + +auto fn() { return 42; }; +auto fn2() { return 43; }; + +wil::apartment_variable g_v1; +wil::apartment_variable g_v2; + +template +void TestApartmentVariableAllMethods() +{ + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + std::ignore = g_v1.get_or_create(fn); + + wil::apartment_variable v1; + + REQUIRE(v1.get_if() == nullptr); + REQUIRE(v1.get_or_create(fn) == 42); + int value = 43; + v1.set(value); + REQUIRE(v1.get_or_create(fn) == 43); + REQUIRE(v1.get_existing() == 43); + v1.clear(); + REQUIRE(v1.get_if() == nullptr); +} + +template +void TestApartmentVariableGetOrCreateForms() +{ + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + wil::apartment_variable v1; + REQUIRE(v1.get_or_create(fn) == 42); + v1.clear(); + REQUIRE(v1.get_or_create([&] + { + return 1; + }) == 1); + v1.clear(); + REQUIRE(v1.get_or_create() == 0); +} + +template +void TestApartmentVariableLifetimes() +{ + wil::apartment_variable av1, av2; + + { + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + auto v1 = av1.get_or_create(fn); + REQUIRE(av1.storage().size() == 1); + auto v2 = av1.get_existing(); + REQUIRE(av1.current_apartment_variable_count() == 1); + REQUIRE(v1 == v2); + } + + { + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + auto v1 = av1.get_or_create(fn); + auto v2 = av2.get_or_create(fn2); + REQUIRE((av1.current_apartment_variable_count() == 2)); + REQUIRE(v1 != v2); + REQUIRE(av1.storage().size() == 1); + } + + REQUIRE(av1.storage().size() == 0); + + { + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + auto v = av1.get_or_create(fn); + REQUIRE(av1.current_apartment_variable_count() == 1); + + std::thread([&]() // join below makes this ok + { + SetThreadDescription(GetCurrentThread(), L"STA"); + auto coUninit = platform::CoInitializeEx(COINIT_APARTMENTTHREADED); + std::ignore = av1.get_or_create(fn); + REQUIRE(av1.storage().size() == 2); + REQUIRE(av1.current_apartment_variable_count() == 1); + }).join(); + REQUIRE(av1.storage().size() == 1); + + av1.get_or_create(fn)++; + v = av1.get_existing(); + REQUIRE(v == 43); + } + + { + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + std::ignore = av1.get_or_create(fn); + REQUIRE(av1.current_apartment_variable_count() == 1); + int i = 1; + av1.set(i); + av1.clear(); + REQUIRE(av1.current_apartment_variable_count() == 0); + + // will fail fast since clear() was called. + // av1.set(1); + av1.clear_all_apartments_async().get(); + } + + REQUIRE(av1.storage().size() == 0); +} + +template +void TestMultipleApartments() +{ + wil::apartment_variable av1, av2; + + wil::unique_event t1Created{ wil::EventOptions::None }, t2Created{ wil::EventOptions::None }; + wil::unique_event t1Shutdown{ wil::EventOptions::None }, t2Shutdown{ wil::EventOptions::None }; + + auto apt1_thread = std::thread([&]() // join below makes this ok + { + SetThreadDescription(GetCurrentThread(), L"STA 1"); + auto coUninit = platform::CoInitializeEx(COINIT_APARTMENTTHREADED); + std::ignore = av1.get_or_create(fn); + std::ignore = av2.get_or_create(fn); + t1Created.SetEvent(); + co_wait(t1Shutdown); + }); + + auto apt2_thread = std::thread([&]() // join below makes this ok + { + SetThreadDescription(GetCurrentThread(), L"STA 2"); + auto coUninit = platform::CoInitializeEx(COINIT_APARTMENTTHREADED); + std::ignore = av1.get_or_create(fn); + std::ignore = av2.get_or_create(fn); + t2Created.SetEvent(); + co_wait(t2Shutdown); + }); + + t1Created.wait(); + t2Created.wait(); + av1.clear_all_apartments_async().get(); + av2.clear_all_apartments_async().get(); + + t1Shutdown.SetEvent(); + t2Shutdown.SetEvent(); + + apt1_thread.join(); + apt2_thread.join(); + + REQUIRE((wil::apartment_variable::storage().size() == 0)); +} + +template +void TestWinningApartmentAlreadyRundownRace() +{ + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + wil::apartment_variable av; + + std::ignore = av.get_or_create(fn); + const auto& storage = av.storage(); // for viewing the storage in the debugger + + wil::unique_event otherAptVarCreated{ wil::EventOptions::None }; + wil::unique_event startApartmentRundown{ wil::EventOptions::None }; + wil::unique_event comRundownComplete{ wil::EventOptions::None }; + + auto apt_thread = std::thread([&]() // join below makes this ok + { + SetThreadDescription(GetCurrentThread(), L"STA"); + auto coUninit = platform::CoInitializeEx(COINIT_APARTMENTTHREADED); + std::ignore = av.get_or_create(fn); + otherAptVarCreated.SetEvent(); + co_wait(startApartmentRundown); + }); + + otherAptVarCreated.wait(); + // we now have av in this apartment and in the STA + REQUIRE(storage.size() == 2); + // wait for async clean to complete + av.clear_all_apartments_async().get(); + startApartmentRundown.SetEvent(); + + REQUIRE(av.storage().size() == 0); + apt_thread.join(); +} + +template +void TestLosingApartmentAlreadyRundownRace() +{ + auto coUninit = platform::CoInitializeEx(COINIT_MULTITHREADED); + + wil::apartment_variable av; + + std::ignore = av.get_or_create(fn); + const auto& storage = av.storage(); // for viewing the storage in the debugger + + wil::unique_event otherAptVarCreated{ wil::EventOptions::None }; + wil::unique_event startApartmentRundown{ wil::EventOptions::None }; + wil::unique_event comRundownComplete{ wil::EventOptions::None }; + + auto apt_thread = std::thread([&]() // join below makes this ok + { + SetThreadDescription(GetCurrentThread(), L"STA"); + auto coUninit = platform::CoInitializeEx(COINIT_APARTMENTTHREADED); + std::ignore = av.get_or_create(fn); + otherAptVarCreated.SetEvent(); + co_wait(startApartmentRundown); + coUninit.reset(); + comRundownComplete.SetEvent(); + }); + + otherAptVarCreated.wait(); + // we now have av in this apartment and in the STA + REQUIRE(storage.size() == 2); + auto clearAllOperation = av.clear_all_apartments_async(); + startApartmentRundown.SetEvent(); + comRundownComplete.wait(); + clearAllOperation.get(); // wait for the async rundowns to complete + + REQUIRE(av.storage().size() == 0); + apt_thread.join(); +} + +TEST_CASE("ComApartmentVariable::ShutdownRegistration", "[LocalOnly][com][unique_apartment_shutdown_registration]") +{ + { + wil::unique_apartment_shutdown_registration r; + } + + { + auto coUninit = wil::CoInitializeEx(COINIT_MULTITHREADED); + + struct ApartmentObserver : public winrt::implements + { + void STDMETHODCALLTYPE OnUninitialize(unsigned long long apartmentId) noexcept override + { + LogOutput(L"OnUninitialize %ull\n", apartmentId); + } + }; + + wil::unique_apartment_shutdown_registration apt_shutdown_registration; + unsigned long long id{}; + REQUIRE_SUCCEEDED(::RoRegisterForApartmentShutdown(winrt::make().get(), &id, apt_shutdown_registration.put())); + LogOutput(L"RoRegisterForApartmentShutdown %p\r\n", apt_shutdown_registration.get()); + // don't unregister and let the pending COM apartment rundown invoke the callback. + apt_shutdown_registration.release(); + } +} + +TEST_CASE("ComApartmentVariable::CallAllMethods", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestApartmentVariableAllMethods); +} + +TEST_CASE("ComApartmentVariable::GetOrCreateForms", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestApartmentVariableGetOrCreateForms); +} + +TEST_CASE("ComApartmentVariable::VariableLifetimes", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestApartmentVariableLifetimes); +} + +TEST_CASE("ComApartmentVariable::WinningApartmentAlreadyRundownRace", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestWinningApartmentAlreadyRundownRace); +} + +TEST_CASE("ComApartmentVariable::LosingApartmentAlreadyRundownRace", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestLosingApartmentAlreadyRundownRace); +} + +TEST_CASE("ComApartmentVariable::MultipleApartments", "[com][apartment_variable]") +{ + RunApartmentVariableTest(TestMultipleApartments); +} + +TEST_CASE("ComApartmentVariable::UseRealPlatformRunAllTests", "[com][apartment_variable]") +{ + if (!wil::are_apartment_variables_supported()) + { + return; + } + + RunApartmentVariableTest(TestApartmentVariableAllMethods); + RunApartmentVariableTest(TestApartmentVariableGetOrCreateForms); + RunApartmentVariableTest(TestApartmentVariableLifetimes); + RunApartmentVariableTest(TestWinningApartmentAlreadyRundownRace); + RunApartmentVariableTest(TestLosingApartmentAlreadyRundownRace); + RunApartmentVariableTest(TestMultipleApartments); +} + +#endif diff --git a/Externals/WIL/tests/ComTests.cpp b/Externals/WIL/tests/ComTests.cpp index 009d9d700792..bccb92be26f3 100644 --- a/Externals/WIL/tests/ComTests.cpp +++ b/Externals/WIL/tests/ComTests.cpp @@ -6,6 +6,8 @@ #include "common.h" +#include + using namespace Microsoft::WRL; // avoid including #include , it fails to compile in noprivateapis @@ -130,6 +132,25 @@ TEST_CASE("ComTests::Test_Constructors", "[com][com_ptr]") REQUIRE(ptrMove2.get() == &helper4); REQUIRE(ptr2.get() == nullptr); } + +#if defined(__cpp_deduction_guides) && (__cpp_deduction_guides >= 201907L) + SECTION("CTAD pointer construction") + { + wil::com_ptr_nothrow ptr(&helper); // explicit + REQUIRE(IUnknownFake::GetAddRef() == 1); + REQUIRE(ptr.get() == &helper); + } +#endif +} + +TEST_CASE("ComTests::Test_Make", "[com][com_ptr]") +{ + IUnknownFake::Clear(); + IUnknownFake helper; + + auto ptr = wil::make_com_ptr_nothrow(&helper); // CTAD workaround for pre-C++20 + REQUIRE(IUnknownFake::GetAddRef() == 1); + REQUIRE(ptr.get() == &helper); } TEST_CASE("ComTests::Test_Assign", "[com][com_ptr]") @@ -2231,6 +2252,90 @@ TEST_CASE("ComTests::VerifyCoGetClassObject", "[com][CoGetClassObject]") } #endif +#if defined(__IBackgroundCopyManager_INTERFACE_DEFINED__) && (__WI_LIBCPP_STD_VER >= 17) +TEST_CASE("ComTests::VerifyCoCreateEx", "[com][CoCreateInstance]") +{ + auto init = wil::CoInitializeEx_failfast(); + + { +#ifdef WIL_ENABLE_EXCEPTIONS + auto [sp1, ps1] = wil::CoCreateInstanceEx(__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE((sp1 && ps1)); +#endif + auto [hr, unk] = wil::CoCreateInstanceExNoThrow(__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE_SUCCEEDED(hr); + auto sp = std::get<0>(unk); + auto ps = std::get<1>(unk); + REQUIRE((sp && ps)); + auto [sp3, ps3] = wil::CoCreateInstanceExFailFast(__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE((sp3 && ps3)); + } + +#ifdef WIL_ENABLE_EXCEPTIONS + { + auto [ps, pf] = wil::CoCreateInstanceEx(__uuidof(ShellLink), CLSCTX_INPROC_SERVER); + std::ignore = ps->IsDirty(); + std::ignore = pf->IsDirty(); + } +#endif +} + +TEST_CASE("ComTests::VerifyCoCreateInstanceExNoThrowMissingInterface", "[com][CoCreateInstance]") +{ + auto init = wil::CoInitializeEx_failfast(); + + { + // IPropertyBag is not implemented + auto [error, result] = wil::CoCreateInstanceExNoThrow + (__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE(error == E_NOINTERFACE); + REQUIRE(std::get<0>(result).get() == nullptr); + REQUIRE(std::get<1>(result).get() == nullptr); + REQUIRE(std::get<2>(result).get() == nullptr); + } +} + +TEST_CASE("ComTests::VerifyTryCoCreateInstanceMissingInterface", "[com][CoCreateInstance]") +{ + auto init = wil::CoInitializeEx_failfast(); + + // request some implemented, one not (IPropertyBag), partial results enabled + { + auto [sp, pb] = wil::TryCoCreateInstanceEx + (__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE(sp != nullptr); + REQUIRE(pb == nullptr); + } + { + auto [sp, pb] = wil::TryCoCreateInstanceExNoThrow + (__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE(sp != nullptr); + REQUIRE(pb == nullptr); + } + { + auto [sp, pb] = wil::TryCoCreateInstanceExFailFast + (__uuidof(BackgroundCopyManager), CLSCTX_LOCAL_SERVER); + REQUIRE(sp != nullptr); + REQUIRE(pb == nullptr); + } +} + +#ifdef WIL_ENABLE_EXCEPTIONS +TEST_CASE("ComTests::VerifyQueryMultipleInterfaces", "[com][com_multi_query]") +{ + auto init = wil::CoInitializeEx_failfast(); + + auto mgr = wil::CoCreateInstance(CLSCTX_LOCAL_SERVER); + auto [sp, ps] = wil::com_multi_query(mgr.get()); + REQUIRE(sp); + REQUIRE(ps); + auto [sp1, pb] = wil::try_com_multi_query(mgr.get()); + REQUIRE(sp1); + REQUIRE(!pb); +} +#endif +#endif // __IBackgroundCopyManager_INTERFACE_DEFINED__ + #ifdef __IObjectWithSite_INTERFACE_DEFINED__ TEST_CASE("ComTests::VerifyComSetSiteNullIsMoveOnly", "[com][com_set_site]") { diff --git a/Externals/WIL/tests/CommonTests.cpp b/Externals/WIL/tests/CommonTests.cpp index d8eb4b4a6faa..7027a79903c3 100644 --- a/Externals/WIL/tests/CommonTests.cpp +++ b/Externals/WIL/tests/CommonTests.cpp @@ -159,7 +159,7 @@ enum class EClassTest }; DEFINE_ENUM_FLAG_OPERATORS(EClassTest); -enum ERawTest +enum ERawTest : unsigned int { ER_None = 0x0, ER_One = 0x1, diff --git a/Externals/WIL/tests/CppWinRT20Tests.cpp b/Externals/WIL/tests/CppWinRT20Tests.cpp index 2b911ad80e78..2a4ef68c8c8e 100644 --- a/Externals/WIL/tests/CppWinRT20Tests.cpp +++ b/Externals/WIL/tests/CppWinRT20Tests.cpp @@ -3,6 +3,8 @@ // However, since we're going to link into the same executable as 'CppWinRTTests.cpp', the 'winrt_to_hresult_handler' // global function pointer should be set, so these should all run successfully +#include // Must be included before base.h + #include #include diff --git a/Externals/WIL/tests/CppWinRTTests.cpp b/Externals/WIL/tests/CppWinRTTests.cpp index 199f7fd2babc..c8ad1834763d 100644 --- a/Externals/WIL/tests/CppWinRTTests.cpp +++ b/Externals/WIL/tests/CppWinRTTests.cpp @@ -1,5 +1,10 @@ #include +#include +#include +#include +#include +#include // Verify can include a second time to unlock more features #include "catch.hpp" @@ -22,6 +27,145 @@ static const HRESULT cppwinrt_mapped_hresults[] = E_OUTOFMEMORY, }; +template auto copy_thing(T const& src) +{ + return std::decay_t(src); +} + +template +void CheckMapVector(std::vector> const& test, std::map const& src) +{ + REQUIRE(test.size() == src.size()); + for (auto&& i : test) + { + REQUIRE(i.Value() == src.at(i.Key())); + } +} + +struct vector_like +{ + uint32_t Size() const { return 100; } + int GetAt(uint32_t) const { return 15; } + + uint32_t GetMany(uint32_t start, winrt::array_view items) const + { + if (start > 0) + { + throw winrt::hresult_out_of_bounds(); + } + uint32_t const to_fill = (std::min)(items.size(), Size()); + std::fill_n(items.begin(), to_fill, GetAt(0)); + return to_fill; + } +}; + +struct iterator_like +{ + static const uint32_t total = 20; + mutable uint32_t remaining = total; + int Current() const { return 3; } + + uint32_t GetMany(winrt::array_view items) const + { + auto to_copy = (std::min)(items.size(), remaining); + std::fill_n(items.begin(), to_copy, Current()); + remaining -= to_copy; + return to_copy; + } +}; + + +struct iterable_like +{ + auto First() const { return iterator_like{}; } +}; + +struct unstable_vector : winrt::implements> +{ + auto Size() { return 4; } + int GetAt(uint32_t) { return 7; } + + uint32_t GetMany(uint32_t, winrt::array_view items) + { + std::fill(items.begin(), items.end(), GetAt(0)); + return items.size(); + } + + bool IndexOf(int, uint32_t) { throw winrt::hresult_not_implemented(); } +}; + +TEST_CASE("CppWinRTTests::VectorToVector", "[cppwinrt]") +{ + winrt::init_apartment(); + { + std::vector src_vector = { L"foo", L"bar", L"bas" }; + auto sv = winrt::single_threaded_vector(copy_thing(src_vector)); + REQUIRE(wil::to_vector(sv) == src_vector); + REQUIRE(wil::to_vector(sv.GetView()) == src_vector); + REQUIRE(wil::to_vector(sv.First()) == src_vector); + REQUIRE(wil::to_vector(sv.First()) == src_vector); + REQUIRE(wil::to_vector(sv.as>()) == src_vector); + } + { + std::vector src_vector = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; + auto sv = winrt::single_threaded_vector(copy_thing(src_vector)); + REQUIRE(wil::to_vector(sv) == src_vector); + REQUIRE(wil::to_vector(sv.GetView()) == src_vector); + REQUIRE(wil::to_vector(sv.First()) == src_vector); + REQUIRE(wil::to_vector(sv.as>()) == src_vector); + } + { + std::vector src_vector; + auto sv = winrt::single_threaded_vector(copy_thing(src_vector)); + REQUIRE(wil::to_vector(sv) == src_vector); + REQUIRE(wil::to_vector(sv.GetView()) == src_vector); + REQUIRE(wil::to_vector(sv.First()) == src_vector); + REQUIRE(wil::to_vector(sv.as>()) == src_vector); + } + { + std::map src_map{{L"kittens", L"fluffy"}, {L"puppies", L"cute"}}; + auto sm = winrt::single_threaded_map(copy_thing(src_map)); + CheckMapVector(wil::to_vector(sm), src_map); + CheckMapVector(wil::to_vector(sm.GetView()), src_map); + CheckMapVector(wil::to_vector(sm.First()), src_map); + } + { + winrt::Windows::Foundation::Collections::PropertySet props; + props.Insert(L"kitten", winrt::box_value(L"fluffy")); + props.Insert(L"puppy", winrt::box_value(25)); + auto converted = wil::to_vector(props); + REQUIRE(converted.size() == props.Size()); + for (auto&& kv : converted) + { + if (kv.Key() == L"kitten") + { + REQUIRE(kv.Value().as() == L"fluffy"); + } + else if (kv.Key() == L"puppy") + { + REQUIRE(kv.Value().as() == 25); + } + else + { + REQUIRE(false); + } + } + } + + REQUIRE_THROWS(wil::to_vector(winrt::make())); + + auto ilike = wil::to_vector(iterable_like{}); + REQUIRE(ilike.size() == iterator_like::total); + for (auto&& i : ilike) REQUIRE(i == iterator_like{}.Current()); + + auto vlike = wil::to_vector(vector_like{}); + REQUIRE(vlike.size() == vector_like{}.Size()); + for (auto&& i : vlike) REQUIRE(i == vector_like{}.GetAt(0)); + + winrt::clear_factory_cache(); + winrt::uninit_apartment(); +} + TEST_CASE("CppWinRTTests::WilToCppWinRTExceptionTranslationTest", "[cppwinrt]") { auto test = [](HRESULT hr) @@ -142,3 +286,159 @@ TEST_CASE("CppWinRTTests::CppWinRTConsistencyTest", "[cppwinrt]") // NOTE: C++/WinRT maps other 'std::exception' derived exceptions to E_FAIL, however we preserve the WIL behavior // that such exceptions become HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION) } + +TEST_CASE("CppWinRTTests::ModuleReference", "[cppwinrt]") +{ + auto peek_module_ref_count = []() + { + ++winrt::get_module_lock(); + return --winrt::get_module_lock(); + }; + + auto initial = peek_module_ref_count(); + + // Basic test: Construct and destruct. + { + auto module_ref = wil::winrt_module_reference(); + REQUIRE(peek_module_ref_count() == initial + 1); + } + REQUIRE(peek_module_ref_count() == initial); + + // Fancy test: Copy object with embedded reference. + { + struct object_with_ref + { + wil::winrt_module_reference ref; + }; + object_with_ref o1; + REQUIRE(peek_module_ref_count() == initial + 1); + auto o2 = o1; + REQUIRE(peek_module_ref_count() == initial + 2); + o1 = o2; + REQUIRE(peek_module_ref_count() == initial + 2); + o2 = std::move(o1); + REQUIRE(peek_module_ref_count() == initial + 2); + } + REQUIRE(peek_module_ref_count() == initial); +} + +#if (!defined(__clang__) && defined(__cpp_lib_coroutine) && (__cpp_lib_coroutine >= 201902L)) || defined(_RESUMABLE_FUNCTIONS_SUPPORTED) + +// Define our own custom dispatcher that we can force it to behave in certain ways. +// wil::resume_foreground supports any dispatcher that has a dispatcher_traits. + +namespace test +{ + enum class TestDispatcherPriority + { + Normal = 0, + Weird = 1, + }; + + using TestDispatcherHandler = winrt::delegate<>; + + enum class TestDispatcherMode + { + Dispatch, + RaceDispatch, + Orphan, + Fail, + }; + + struct TestDispatcher + { + TestDispatcher() = default; + TestDispatcher(TestDispatcher const&) = delete; + + TestDispatcherMode mode = TestDispatcherMode::Dispatch; + TestDispatcherPriority expected_priority = TestDispatcherPriority::Normal; + + void TryEnqueue(TestDispatcherPriority priority, TestDispatcherHandler const& handler) const + { + REQUIRE(priority == expected_priority); + + if (mode == TestDispatcherMode::Fail) + { + throw winrt::hresult_not_implemented(); + } + + if (mode == TestDispatcherMode::RaceDispatch) + { + handler(); + return; + } + + std::ignore = [](auto mode, auto handler) ->winrt::fire_and_forget + { + co_await winrt::resume_background(); + if (mode == TestDispatcherMode::Dispatch) + { + handler(); + } + }(mode, handler); + } + }; +} + +namespace wil::details +{ + template<> + struct dispatcher_traits + { + using Priority = test::TestDispatcherPriority; + using Handler = test::TestDispatcherHandler; + using Scheduler = dispatcher_TryEnqueue; + }; +} + +TEST_CASE("CppWinRTTests::ResumeForegroundTests", "[cppwinrt]") +{ + // Verify that the DispatcherQueue version has been unlocked. + using Verify = decltype(wil::resume_foreground(winrt::Windows::System::DispatcherQueue{ nullptr })); + static_assert(wistd::is_trivial_v || !wistd::is_trivial_v); + + []() -> winrt::Windows::Foundation::IAsyncAction + { + test::TestDispatcher dispatcher; + + // Normal case: Resumes on new thread. + dispatcher.mode = test::TestDispatcherMode::Dispatch; + co_await wil::resume_foreground(dispatcher); + + // Race case: Resumes before TryEnqueue returns. + dispatcher.mode = test::TestDispatcherMode::RaceDispatch; + co_await wil::resume_foreground(dispatcher); + + // Orphan case: Never resumes, detected when handler is destructed without ever being invoked. + dispatcher.mode = test::TestDispatcherMode::Orphan; + bool seen = false; + try + { + co_await wil::resume_foreground(dispatcher); + } + catch (winrt::hresult_error const& e) + { + seen = e.code() == HRESULT_FROM_WIN32(HRESULT_FROM_WIN32(ERROR_NO_TASK_QUEUE)); + } + REQUIRE(seen); + + // Fail case: Can't even schedule the resumption. + dispatcher.mode = test::TestDispatcherMode::Fail; + seen = false; + try + { + co_await wil::resume_foreground(dispatcher); + } + catch (winrt::hresult_not_implemented const&) + { + seen = true; + } + REQUIRE(seen); + + // Custom priority. + dispatcher.mode = test::TestDispatcherMode::Dispatch; + dispatcher.expected_priority = test::TestDispatcherPriority::Weird; + co_await wil::resume_foreground(dispatcher, test::TestDispatcherPriority::Weird); + }().get(); +} +#endif // coroutines diff --git a/Externals/WIL/tests/FakeWinRTTypes.h b/Externals/WIL/tests/FakeWinRTTypes.h index 70e607a2336a..d4aed5943c7e 100644 --- a/Externals/WIL/tests/FakeWinRTTypes.h +++ b/Externals/WIL/tests/FakeWinRTTypes.h @@ -42,7 +42,7 @@ struct WinRTStorage { Microsoft::WRL::Wrappers::HString value; - HRESULT CopyTo(HSTRING* result) + HRESULT CopyTo(HSTRING* result) const { return value.CopyTo(result); } @@ -63,7 +63,7 @@ struct WinRTStorage value = {}; } - bool Equals(HSTRING val) + bool Equals(HSTRING val) const { return value == val; } @@ -207,7 +207,7 @@ struct FakeAsyncOperation : Microsoft::WRL::RuntimeClass< WinRTStorage m_storage; }; -template +template struct FakeVector : Microsoft::WRL::RuntimeClass< ABI::Windows::Foundation::Collections::IVector, ABI::Windows::Foundation::Collections::IVectorView> @@ -292,7 +292,7 @@ struct FakeVector : Microsoft::WRL::RuntimeClass< for (size_t i = index + 1; i < m_size; ++i) { - wistd::swap_wil(m_data[i - 1], m_data[i]); + wistd::swap_wil(m_data[i], m_data[i - 1]); } m_data[--m_size].Reset(); @@ -349,8 +349,8 @@ struct FakeVector : Microsoft::WRL::RuntimeClass< count = (count > capacity) ? capacity : count; HRESULT hr = S_OK; - unsigned i = 0; - for (; (i < count) && SUCCEEDED(hr); ++i) + unsigned i; + for (i = 0; (i < count) && SUCCEEDED(hr); ++i) { hr = m_data[startIndex + i].CopyTo(value + i); } diff --git a/Externals/WIL/tests/FileSystemTests.cpp b/Externals/WIL/tests/FileSystemTests.cpp index 96aae140c47d..a6e8b5caa4f7 100644 --- a/Externals/WIL/tests/FileSystemTests.cpp +++ b/Externals/WIL/tests/FileSystemTests.cpp @@ -34,6 +34,13 @@ bool DirectoryExists(_In_ PCWSTR path) (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); } +bool FileExists(_In_ PCWSTR path) +{ + DWORD dwAttrib = GetFileAttributesW(path); + + return (dwAttrib != INVALID_FILE_ATTRIBUTES); +} + TEST_CASE("FileSystemTests::CreateDirectory", "[filesystem]") { wchar_t basePath[MAX_PATH]; @@ -80,6 +87,99 @@ TEST_CASE("FileSystemTests::CreateDirectory", "[filesystem]") REQUIRE_FALSE(DirectoryExists(absoluteTestPath4)); } +TEST_CASE("FileSystemTests::VerifyRemoveDirectoryRecursiveDoesNotTraverseWithoutAHandle", "[filesystem]") +{ + auto CreateRelativePath = [](PCWSTR root, PCWSTR name) + { + wil::unique_hlocal_string path; + REQUIRE_SUCCEEDED(PathAllocCombine(root, name, PATHCCH_ALLOW_LONG_PATHS, &path)); + return path; + }; + + wil::unique_cotaskmem_string tempPath; + REQUIRE_SUCCEEDED(wil::ExpandEnvironmentStringsW(LR"(%TEMP%)", tempPath)); + const auto basePath = CreateRelativePath(tempPath.get(), L"FileSystemTests"); + REQUIRE_SUCCEEDED(wil::CreateDirectoryDeepNoThrow(basePath.get())); + + auto scopeGuard = wil::scope_exit([&] + { + wil::RemoveDirectoryRecursiveNoThrow(basePath.get()); + }); + + // Try to delete a directory whose handle is already taken. + const auto folderToRecurse = CreateRelativePath(basePath.get(), L"folderToRecurse"); + REQUIRE(::CreateDirectoryW(folderToRecurse.get(), nullptr)); + + const auto subfolderWithHandle = CreateRelativePath(folderToRecurse.get(), L"subfolderWithHandle"); + REQUIRE(::CreateDirectoryW(subfolderWithHandle.get(), nullptr)); + + const auto childOfSubfolder = CreateRelativePath(subfolderWithHandle.get(), L"childOfSubfolder"); + REQUIRE(::CreateDirectoryW(childOfSubfolder.get(), nullptr)); + + // Passing a 0 in share flags only allows metadata query on this file by other processes. + // This should fail with a sharing violation error when any other action is taken. + wil::unique_hfile subFolderHandle(::CreateFileW(subfolderWithHandle.get(), GENERIC_ALL, + 0, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr)); + REQUIRE(subFolderHandle); + + REQUIRE(wil::RemoveDirectoryRecursiveNoThrow(folderToRecurse.get()) == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION)); + + // Release the handle to allow cleanup. + subFolderHandle.reset(); +} + +TEST_CASE("FileSystemTests::VerifyRemoveDirectoryRecursiveCanDeleteReadOnlyFiles", "[filesystem]") +{ + auto CreateRelativePath = [](PCWSTR root, PCWSTR name) + { + wil::unique_hlocal_string path; + REQUIRE_SUCCEEDED(PathAllocCombine(root, name, PATHCCH_ALLOW_LONG_PATHS, &path)); + return path; + }; + + auto CreateReadOnlyFile = [](PCWSTR path) + { + wil::unique_hfile fileHandle(CreateFileW(path, 0, + 0, nullptr, CREATE_ALWAYS, + FILE_ATTRIBUTE_READONLY, nullptr)); + REQUIRE(fileHandle); + }; + + wil::unique_cotaskmem_string tempPath; + REQUIRE_SUCCEEDED(wil::ExpandEnvironmentStringsW(LR"(%TEMP%)", tempPath)); + const auto basePath = CreateRelativePath(tempPath.get(), L"FileSystemTests"); + REQUIRE_SUCCEEDED(wil::CreateDirectoryDeepNoThrow(basePath.get())); + + auto scopeGuard = wil::scope_exit([&] + { + wil::RemoveDirectoryRecursiveNoThrow(basePath.get(), wil::RemoveDirectoryOptions::RemoveReadOnly); + }); + + // Create a reparse point and a target folder that shouldn't get deleted + auto folderToDelete = CreateRelativePath(basePath.get(), L"folderToDelete"); + REQUIRE(::CreateDirectoryW(folderToDelete.get(), nullptr)); + + auto topLevelReadOnly = CreateRelativePath(folderToDelete.get(), L"topLevelReadOnly.txt"); + CreateReadOnlyFile(topLevelReadOnly.get()); + + auto subLevel = CreateRelativePath(folderToDelete.get(), L"subLevel"); + REQUIRE(::CreateDirectoryW(subLevel.get(), nullptr)); + + auto subLevelReadOnly = CreateRelativePath(subLevel.get(), L"subLevelReadOnly.txt"); + CreateReadOnlyFile(subLevelReadOnly.get()); + + // Delete will fail without the RemoveReadOnlyFlag + REQUIRE_FAILED(wil::RemoveDirectoryRecursiveNoThrow(folderToDelete.get())); + REQUIRE_SUCCEEDED(wil::RemoveDirectoryRecursiveNoThrow(folderToDelete.get(), wil::RemoveDirectoryOptions::RemoveReadOnly)); + + // Verify all files have been deleted + REQUIRE_FALSE(FileExists(subLevelReadOnly.get())); + REQUIRE_FALSE(DirectoryExists(subLevel.get())); + + REQUIRE_FALSE(FileExists(topLevelReadOnly.get())); + REQUIRE_FALSE(DirectoryExists(folderToDelete.get())); +} + #ifdef WIL_ENABLE_EXCEPTIONS // Learn about the Win32 API normalization here: https://blogs.msdn.microsoft.com/jeremykuhne/2016/04/21/path-normalization/ // This test verifies the ability of RemoveDirectoryRecursive to be able to delete files @@ -440,8 +540,28 @@ TEST_CASE("FileSystemTests::VerifyGetModuleFileNameW", "[filesystem]") REQUIRE(wcscmp(path.get(), path2.get()) == 0); REQUIRE_FAILED(wil::GetModuleFileNameW((HMODULE)INVALID_HANDLE_VALUE, path)); + +#ifdef WIL_ENABLE_EXCEPTIONS + auto wstringPath = wil::GetModuleFileNameW(nullptr); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); +#endif } +#ifdef WIL_ENABLE_EXCEPTIONS +wil::unique_cotaskmem_string NativeGetModuleFileNameWrap(HANDLE processHandle, HMODULE moduleHandle) +{ + DWORD size = MAX_PATH * 4; + auto path = wil::make_cotaskmem_string_nothrow(nullptr, size); + + DWORD copied = processHandle ? + ::GetModuleFileNameExW(processHandle, moduleHandle, path.get(), size) : + ::GetModuleFileNameW(moduleHandle, path.get(), size); + REQUIRE(copied < size); + + return path; +} +#endif + TEST_CASE("FileSystemTests::VerifyGetModuleFileNameExW", "[filesystem]") { wil::unique_cotaskmem_string path; @@ -455,6 +575,58 @@ TEST_CASE("FileSystemTests::VerifyGetModuleFileNameExW", "[filesystem]") REQUIRE(wcscmp(path.get(), path2.get()) == 0); REQUIRE_FAILED(wil::GetModuleFileNameExW(nullptr, (HMODULE)INVALID_HANDLE_VALUE, path)); + +#ifdef WIL_ENABLE_EXCEPTIONS + auto wstringPath = wil::GetModuleFileNameExW(nullptr, nullptr); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(nullptr, nullptr).get()); + + wstringPath = wil::GetModuleFileNameExW(GetCurrentProcess(), nullptr); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(GetCurrentProcess(), nullptr).get()); + + wstringPath = wil::GetModuleFileNameW(nullptr); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(nullptr, nullptr).get()); + + HMODULE kernel32 = ::GetModuleHandleW(L"kernel32.dll"); + + wstringPath = wil::GetModuleFileNameExW(nullptr, kernel32); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(nullptr, kernel32).get()); + + wstringPath = wil::GetModuleFileNameExW(GetCurrentProcess(), kernel32); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(GetCurrentProcess(), kernel32).get()); + + wstringPath = wil::GetModuleFileNameW(kernel32); + REQUIRE(wstringPath.length() == ::wcslen(wstringPath.c_str())); + REQUIRE(wstringPath == NativeGetModuleFileNameWrap(nullptr, kernel32).get()); +#endif +} + +TEST_CASE("FileSystemTests::QueryFullProcessImageNameW and GetModuleFileNameW", "[filesystem]") +{ +#ifdef WIL_ENABLE_EXCEPTIONS + auto procName = wil::QueryFullProcessImageNameW(); + auto moduleName = wil::GetModuleFileNameW(); + REQUIRE(procName == moduleName); +#endif } +TEST_CASE("FileSystemTests::QueryFullProcessImageNameW", "[filesystem]") +{ + WCHAR fullName[MAX_PATH * 4]; + DWORD fullNameSize = ARRAYSIZE(fullName); + REQUIRE(::QueryFullProcessImageNameW(::GetCurrentProcess(), 0, fullName, &fullNameSize)); + + wil::unique_cotaskmem_string path; + REQUIRE_SUCCEEDED(wil::QueryFullProcessImageNameW(::GetCurrentProcess(), 0, path)); + REQUIRE(wcscmp(fullName, path.get()) == 0); + + wil::unique_cotaskmem nativePath; + REQUIRE_SUCCEEDED((wil::QueryFullProcessImageNameW(::GetCurrentProcess(), 0, path))); +} + + #endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) diff --git a/Externals/WIL/tests/NtResultTests.cpp b/Externals/WIL/tests/NtResultTests.cpp new file mode 100644 index 000000000000..a51119eb995e --- /dev/null +++ b/Externals/WIL/tests/NtResultTests.cpp @@ -0,0 +1,165 @@ + +#include +#include + +#include "common.h" + +#define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS)0xC000003AL) +#define STATUS_INTERNAL_ERROR ((NTSTATUS)0xC00000E5L) +#define STATUS_INVALID_CONNECTION ((NTSTATUS)0xC0000140L) +#define E_LOAD_NAMESERVICE_FAILED ((HRESULT)0x80000140L) + +TEST_CASE("NtResultTests::NtReturn", "[result]") +{ + auto status = []() + { + NT_RETURN_NTSTATUS(STATUS_INVALID_CONNECTION); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + NT_RETURN_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Test NT_RETURN_NTSTATUS_MSG"); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + NT_RETURN_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Test NT_RETURN_NTSTATUS_MSG %s", L"with parameter"); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + NT_RETURN_IF_NTSTATUS_FAILED(STATUS_INVALID_CONNECTION); + return STATUS_SUCCESS; + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + NT_RETURN_IF_NTSTATUS_FAILED_MSG(STATUS_INVALID_CONNECTION, "Test NT_RETURN_NTSTATUS_MSG %s", L"with parameter"); + return STATUS_SUCCESS; + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + NT_RETURN_IF_NTSTATUS_FAILED(STATUS_SUCCESS); + return STATUS_INVALID_CONNECTION; + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); +} + +#ifdef WIL_ENABLE_EXCEPTIONS +TEST_CASE("NtResultTests::NtThrowCatch", "[result]") +{ + // Throw NTSTATUS with immediate conversion to HRESULT. HRESULT would appear in the logs. + auto hr = []() + { + try + { + THROW_NTSTATUS(STATUS_INVALID_CONNECTION); + } + CATCH_RETURN(); + }(); + // THROW_NTSTATUS converts NTSTATUS to HRESULT through WIN32 error code. + REQUIRE(hr == wil::details::NtStatusToHr(STATUS_INVALID_CONNECTION)); + + // Verify that conversion NTSTATUS -> HRESULT -> NTSTATUS is not 1:1. + auto status = []() + { + try + { + THROW_HR(wil::details::NtStatusToHr(STATUS_INVALID_CONNECTION)); + } + NT_CATCH_RETURN(); + }(); + if (wil::details::g_pfnRtlNtStatusToDosErrorNoTeb) + { + REQUIRE(status != STATUS_INVALID_CONNECTION); + } + else + { + REQUIRE(status == STATUS_INVALID_CONNECTION); + } + + // Throw HRESULT with conversion to NTSTATUS on a best effort. NTSTATUS would appear in the logs. + status = []() + { + try + { + THROW_HR(__HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)); + } + NT_CATCH_RETURN(); + }(); + REQUIRE(status == STATUS_OBJECT_PATH_NOT_FOUND); + + // Throw HRESULT with conversion to NTSTATUS on a best effort that maps to generic error. NTSTATUS would appear in the logs. + status = []() + { + try + { + THROW_HR(E_LOAD_NAMESERVICE_FAILED); + } + NT_CATCH_RETURN(); + }(); + REQUIRE(status == STATUS_INTERNAL_ERROR); + + // Throw NTSTATUS without conversion. NTSTATUS would appear in the logs. + status = []() + { + try + { + THROW_NTSTATUS(STATUS_INVALID_CONNECTION); + } + NT_CATCH_RETURN(); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + try + { + THROW_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Throw STATUS_INVALID_CONNECTION as NTSTATUS"); + } + NT_CATCH_RETURN(); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + status = []() + { + try + { + THROW_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Throw STATUS_INVALID_CONNECTION as NTSTATUS with custom catch"); + } + catch (...) + { + LOG_CAUGHT_EXCEPTION(); + + return wil::StatusFromCaughtException(); + } + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); + + hr = []() + { + try + { + THROW_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Throw STATUS_INVALID_CONNECTION as NTSTATUS"); + } + CATCH_RETURN(); + }(); + REQUIRE(hr == wil::details::NtStatusToHr(STATUS_INVALID_CONNECTION)); + + status = []() + { + try + { + THROW_NTSTATUS_MSG(STATUS_INVALID_CONNECTION, "Throw STATUS_INVALID_CONNECTION as NTSTATUS"); + } + NT_CATCH_RETURN_MSG("Catching STATUS_INVALID_CONNECTION thrown by NT_THROW_NTSTATUS_MSG"); + }(); + REQUIRE(status == STATUS_INVALID_CONNECTION); +} +#endif diff --git a/Externals/WIL/tests/ResourceTests.cpp b/Externals/WIL/tests/ResourceTests.cpp index c16daf1b6962..72555f11cb0f 100644 --- a/Externals/WIL/tests/ResourceTests.cpp +++ b/Externals/WIL/tests/ResourceTests.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,14 @@ TEST_CASE("ResourceTests::TestLastErrorContext", "[resource][last_error_context] SetLastError(1); } REQUIRE(GetLastError() == 1); + + // The value in the context is unimpacted by other things changing the last error + { + SetLastError(42); + auto error42 = wil::last_error_context(); + SetLastError(1); + REQUIRE(error42.value() == 42); + } } TEST_CASE("ResourceTests::TestScopeExit", "[resource][scope_exit]") @@ -267,6 +276,40 @@ void UniqueProcessInfo() } #endif +// Compilation only test... +#ifdef WIL_ENABLE_EXCEPTIONS +void NoexceptConstructibleTest() +{ + using BaseStorage = wil::details::unique_storage; + + struct ThrowingConstructor : BaseStorage + { + ThrowingConstructor() = default; + explicit ThrowingConstructor(HANDLE) __WI_NOEXCEPT_(false) {} + }; + + struct ProtectedConstructor : BaseStorage + { + protected: + ProtectedConstructor() = default; + explicit ProtectedConstructor(HANDLE) WI_NOEXCEPT {} + }; + + // wil::unique_handle is one of the many types which are expected to be noexcept + // constructible since they don't perform any "advanced" initialization. + static_assert(wistd::is_nothrow_default_constructible_v, "wil::unique_any_t should always be nothrow default constructible"); + static_assert(wistd::is_nothrow_constructible_v, "wil::unique_any_t should be noexcept if the storage is"); + + // The inverse: A throwing storage constructor. + static_assert(wistd::is_nothrow_default_constructible_v>, "wil::unique_any_t should always be nothrow default constructible"); + static_assert(!wistd::is_nothrow_constructible_v, HANDLE>, "wil::unique_any_t shouldn't be noexcept if the storage isn't"); + + // With a protected constructor wil::unique_any_t will be unable to correctly + // "forward" the noexcept attribute, but the code should still compile. + wil::unique_any_t p{ INVALID_HANDLE_VALUE }; +} +#endif + struct FakeComInterface { void AddRef() @@ -732,4 +775,90 @@ TEST_CASE("DefaultTemplateParamCompiles", "[resource]") wil::unique_midl_ptr<> g; wil::unique_cotaskmem_ptr<> h; + wil::unique_mapview_ptr<> i; +} + +TEST_CASE("UniqueInvokeCleanupMembers", "[resource]") +{ + // Case 1 - unique_ptr<> for a T* that has a "destroy" member + struct ThingWithDestroy + { + bool destroyed = false; + void destroy() { destroyed = true; }; + }; + ThingWithDestroy toDestroy; + wil::unique_any p(&toDestroy); + p.reset(); + REQUIRE(!p); + REQUIRE(toDestroy.destroyed); + + // Case 2 - unique_struct calling a member, like above + struct ThingToDestroy2 + { + bool* destroyed; + void destroy() { *destroyed = true; }; + }; + bool structDestroyed = false; + { + wil::unique_struct other; + other.destroyed = &structDestroyed; + REQUIRE(!structDestroyed); + } + REQUIRE(structDestroyed); +} + +struct ITokenTester : IUnknown +{ + virtual void DirectClose(DWORD_PTR token) = 0; +}; + +struct TokenTester : ITokenTester +{ + IFACEMETHOD_(ULONG, AddRef)() override { return 2; } + IFACEMETHOD_(ULONG, Release)() override { return 1; } + IFACEMETHOD(QueryInterface)(REFIID, void**) { return E_NOINTERFACE; } + void DirectClose(DWORD_PTR token) override { + m_closed = (token == m_closeToken); + } + bool m_closed = false; + DWORD_PTR m_closeToken; +}; + +void MyTokenTesterCloser(ITokenTester* tt, DWORD_PTR token) +{ + tt->DirectClose(token); +} + +TEST_CASE("ComTokenCloser", "[resource]") +{ + using token_tester_t = wil::unique_com_token; + + TokenTester tt; + tt.m_closeToken = 4; + { + token_tester_t tmp{ &tt, 4 }; + } + REQUIRE(tt.m_closed); +} + +TEST_CASE("ComTokenDirectCloser", "[resource]") +{ + using token_tester_t = wil::unique_com_token; + + TokenTester tt; + tt.m_closeToken = 4; + { + token_tester_t tmp{ &tt, 4 }; + } + REQUIRE(tt.m_closed); +} + +TEST_CASE("UniqueCloseClipboardCall", "[resource]") +{ +#if defined(__WIL__WINUSER_) && !defined(NOCLIPBOARD) + if (auto clip = wil::open_clipboard(nullptr)) + { + REQUIRE(::EmptyClipboard()); + } +#endif } diff --git a/Externals/WIL/tests/ResultTests.cpp b/Externals/WIL/tests/ResultTests.cpp index be93719119ad..dc18448e35ad 100644 --- a/Externals/WIL/tests/ResultTests.cpp +++ b/Externals/WIL/tests/ResultTests.cpp @@ -1,7 +1,10 @@ #include #include + +#if (NTDDI_VERSION >= NTDDI_WIN8) #include +#endif #include @@ -323,7 +326,7 @@ TEST_CASE("ResultTests::ExceptionHandling", "[result]") RETURN_CAUGHT_EXCEPTION_EXPECTED(); } }(); - REQUIRE(failures.size() == 0); + REQUIRE(failures.empty()); REQUIRE(hr == E_OUTOFMEMORY); } failures.clear(); @@ -339,7 +342,7 @@ TEST_CASE("ResultTests::ExceptionHandling", "[result]") { throw std::bad_alloc(); }); - REQUIRE(failures.size() == 0); + REQUIRE(failures.empty()); REQUIRE(hr == E_OUTOFMEMORY); } failures.clear(); @@ -436,16 +439,16 @@ void ExceptionHandlingCompilationTest() try { try { throw std::bad_alloc(); } catch (...) { THROW_NORMALIZED_CAUGHT_EXCEPTION(); } } catch (...) {} try { try { throw std::bad_alloc(); } catch (...) { THROW_NORMALIZED_CAUGHT_EXCEPTION_MSG("train: %d", 42); } } catch (...) {} - HRESULT hr = wil::ResultFromExceptionDebug(WI_DIAGNOSTICS_INFO, wil::SupportedExceptions::All, [&] + wil::ResultFromExceptionDebug(WI_DIAGNOSTICS_INFO, wil::SupportedExceptions::All, [&] { THROW_HR(E_FAIL); }); - hr = wil::ResultFromException(WI_DIAGNOSTICS_INFO, wil::SupportedExceptions::None, [&] + wil::ResultFromException(WI_DIAGNOSTICS_INFO, wil::SupportedExceptions::None, [&] { }); - hr = wil::ResultFromException([&] + wil::ResultFromException([&] { }); @@ -479,7 +482,7 @@ TEST_CASE("ResultTests::ErrorMacros", "[result]") } // The originate helper isn't compatible with CX so don't test it in that mode. -#ifndef __cplusplus_winrt +#if !defined(__cplusplus_winrt) && (NTDDI_VERSION >= NTDDI_WIN8) TEST_CASE("ResultTests::NoOriginationByDefault", "[result]") { ::wil::SetOriginateErrorCallback(nullptr); @@ -572,4 +575,17 @@ TEST_CASE("ResultTests::AutomaticOriginationOnFailure", "[result]") }(); REQUIRE(S_FALSE == GetRestrictedErrorInfo(&restrictedErrorInformation)); } -#endif // __cplusplus_winrt +#endif + +TEST_CASE("ResultTests::ReportDoesNotChangeLastError", "[result]") +{ + decltype(wil::details::g_pfnLoggingCallback) oopsie = [](wil::FailureInfo const&) noexcept + { + ::SetLastError(ERROR_ABANDON_HIBERFILE); + }; + auto swap = witest::AssignTemporaryValue(&wil::details::g_pfnLoggingCallback, oopsie); + + ::SetLastError(ERROR_ABIOS_ERROR); + LOG_IF_WIN32_BOOL_FALSE(FALSE); + REQUIRE(::GetLastError() == ERROR_ABIOS_ERROR); +} diff --git a/Externals/WIL/tests/Rpc.cpp b/Externals/WIL/tests/Rpc.cpp index e66a73eaef60..3ffeee89807e 100644 --- a/Externals/WIL/tests/Rpc.cpp +++ b/Externals/WIL/tests/Rpc.cpp @@ -11,8 +11,8 @@ void RpcMethodReturnsVoid(ULONG toRaise) } struct FOO_CONTEXT_T {}; -typedef FOO_CONTEXT_T* FOO_CONTEXT; -typedef FOO_CONTEXT* PFOO_CONTEXT; +using FOO_CONTEXT = FOO_CONTEXT_T*; +using PFOO_CONTEXT = FOO_CONTEXT*; void CloseContextHandle(_Inout_ PFOO_CONTEXT) { diff --git a/Externals/WIL/tests/StlTests.cpp b/Externals/WIL/tests/StlTests.cpp index e006202ea547..db945c5e471e 100644 --- a/Externals/WIL/tests/StlTests.cpp +++ b/Externals/WIL/tests/StlTests.cpp @@ -45,3 +45,140 @@ TEST_CASE("StlTests::TestSecureAllocator", "[stl][secure_allocator]") wil::secure_vector sensitiveBytes(32, dummy{ 'a' }); } } + +#if __WI_LIBCPP_STD_VER >= 17 + +struct CustomNoncopyableString +{ + CustomNoncopyableString() = default; + CustomNoncopyableString(const CustomNoncopyableString&) = delete; + void operator=(const CustomNoncopyableString&) = delete; + + constexpr operator PCSTR() const { return "hello"; } + constexpr operator PCWSTR() const { return L"w-hello"; } +}; + +TEST_CASE("StlTests::TestZStringView", "[stl][zstring_view]") +{ + // Test empty cases + REQUIRE(wil::zstring_view{}.length() == (size_t)0u); + REQUIRE(wil::zstring_view{}.data() == nullptr); + REQUIRE(wil::zstring_view{}.c_str() == nullptr); + + // Test empty string cases + REQUIRE(wil::zstring_view{""}[0] == '\0'); + REQUIRE(wil::zstring_view{""}.c_str()[0] == '\0'); + REQUIRE(wil::zstring_view{""}.length() == 0); + + // Test different constructor equality + constexpr wil::zstring_view fromLiteral = "abc"; + REQUIRE(fromLiteral.length() == strlen("abc")); + + std::string stlString = "abc"; + wil::zstring_view fromString(stlString); + wil::zstring_view fromPtr(stlString.data()); + + static constexpr char charArray[] = "abc"; + constexpr wil::zstring_view fromArray(charArray); + + static constexpr char extendedCharArray[] = "abc\0\0\0\0\0"; + constexpr wil::zstring_view fromExtendedArray(extendedCharArray); + + wil::zstring_view copy = fromLiteral; + + REQUIRE(fromLiteral == stlString); + REQUIRE(fromLiteral == fromString); + REQUIRE(fromLiteral == fromArray); + REQUIRE(fromLiteral == fromExtendedArray); + REQUIRE(fromLiteral == copy); + + // Test decay to std::string_view + std::string_view sv = fromLiteral; + REQUIRE(sv == fromLiteral); + + // Test operator[] + REQUIRE(fromLiteral[0] == 'a'); + REQUIRE(fromLiteral[1] == 'b'); + REQUIRE(fromLiteral[2] == 'c'); + REQUIRE(fromLiteral[3] == '\0'); + + // Test constructing with no NULL in range + static constexpr char badCharArray[2][3] = {{'a', 'b', 'c' }, {'a', 'b', 'c' }}; + REQUIRE_CRASH((wil::zstring_view{ &badCharArray[0][0], _countof(badCharArray[0]) })); + REQUIRE_CRASH((wil::zstring_view{ badCharArray[0] })); + + // Test constructing with a NULL one character past the valid range, guarding against off-by-one errors + // Overloads taking an explicit length trust the user that they ensure valid memory follows the buffer + static constexpr char badCharArrayOffByOne[2][3] = {{'a', 'b', 'c' }, {}}; + const wil::zstring_view fromTerminatedCharArray(&badCharArrayOffByOne[0][0], _countof(badCharArrayOffByOne[0])); + REQUIRE(fromLiteral == fromTerminatedCharArray); + REQUIRE_CRASH((wil::zstring_view{ badCharArrayOffByOne[0] })); + + // Test constructing from custom string type + CustomNoncopyableString customString; + wil::zstring_view fromCustomString(customString); + REQUIRE(fromCustomString == (PCSTR)customString); +} + +TEST_CASE("StlTests::TestZWStringView", "[stl][zstring_view]") +{ + // Test empty cases + REQUIRE(wil::zwstring_view{}.length() == (size_t)0u); + REQUIRE(wil::zwstring_view{}.data() == nullptr); + REQUIRE(wil::zwstring_view{}.c_str() == nullptr); + + // Test empty string cases + REQUIRE(wil::zwstring_view{L""}[0] == L'\0'); + REQUIRE(wil::zwstring_view{L""}.c_str()[0] == L'\0'); + REQUIRE(wil::zwstring_view{L""}.length() == 0); + + // Test different constructor equality + constexpr wil::zwstring_view fromLiteral = L"abc"; + REQUIRE(fromLiteral.length() == wcslen(L"abc")); + + std::wstring stlString = L"abc"; + wil::zwstring_view fromString(stlString); + wil::zwstring_view fromPtr(stlString.data()); + + static constexpr wchar_t charArray[] = L"abc"; + constexpr wil::zwstring_view fromArray(charArray); + + static constexpr wchar_t extendedCharArray[] = L"abc\0\0\0\0\0"; + constexpr wil::zwstring_view fromExtendedArray(extendedCharArray); + + wil::zwstring_view copy = fromLiteral; + + REQUIRE(fromLiteral == stlString); + REQUIRE(fromLiteral == fromString); + REQUIRE(fromLiteral == fromArray); + REQUIRE(fromLiteral == fromExtendedArray); + REQUIRE(fromLiteral == copy); + + // Test decay to std::wstring_view + std::wstring_view sv = fromLiteral; + REQUIRE(sv == fromLiteral); + + // Test operator[] + REQUIRE(fromLiteral[0] == L'a'); + REQUIRE(fromLiteral[1] == L'b'); + REQUIRE(fromLiteral[2] == L'c'); + REQUIRE(fromLiteral[3] == L'\0'); + + // Test constructing with no NULL in range + static constexpr wchar_t badCharArray[2][3] = {{ L'a', L'b', L'c' }, { L'a', L'b', L'c' } }; + REQUIRE_CRASH((wil::zwstring_view{ &badCharArray[0][0], _countof(badCharArray[0]) })); + REQUIRE_CRASH((wil::zwstring_view{ badCharArray[0] })); + + // Test constructing with a NULL one character past the valid range, guarding against off-by-one errors + // Overloads taking an explicit length trust the user that they ensure valid memory follows the buffer + static constexpr wchar_t badCharArrayOffByOne[2][3] = {{ L'a', L'b', L'c' }, {}}; + const wil::zwstring_view fromTerminatedCharArray(&badCharArrayOffByOne[0][0], _countof(badCharArrayOffByOne[0])); + REQUIRE(fromLiteral == fromTerminatedCharArray); + REQUIRE_CRASH((wil::zwstring_view{ badCharArrayOffByOne[0] })); + + // Test constructing from custom string type + CustomNoncopyableString customString; + wil::zwstring_view fromCustomString(customString); + REQUIRE(fromCustomString == (PCWSTR)customString); +} +#endif diff --git a/Externals/WIL/tests/TokenHelpersTests.cpp b/Externals/WIL/tests/TokenHelpersTests.cpp index 39295405bf66..c504ceaf5329 100644 --- a/Externals/WIL/tests/TokenHelpersTests.cpp +++ b/Externals/WIL/tests/TokenHelpersTests.cpp @@ -38,6 +38,7 @@ TEST_CASE("TokenHelpersTests::VerifyOpenCurrentAccessToken", "[token_helpers]") } #endif +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) TEST_CASE("TokenHelpersTests::VerifyGetTokenInformationNoThrow", "[token_helpers]") { SECTION("Passing a null token") @@ -92,6 +93,7 @@ TEST_CASE("TokenHelpersTests::VerifyLinkedToken", "[token_helpers]") #endif } #endif +#endif bool IsImpersonating() { @@ -186,6 +188,7 @@ TEST_CASE("TokenHelpersTests::VerifyResetThreadToken", "[token_helpers]") } #endif // WIL_ENABLE_EXCEPTIONS +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) template ::FixedSize>* = nullptr> void TestGetTokenInfoForCurrentThread() { @@ -251,6 +254,7 @@ TEST_CASE("TokenHelpersTests::VerifyGetTokenInformationSecurityImpersonationLeve RevertToSelf(); } +#endif bool operator==(const SID_IDENTIFIER_AUTHORITY& left, const SID_IDENTIFIER_AUTHORITY& right) { @@ -274,6 +278,7 @@ TEST_CASE("TokenHelpersTests::StaticSid", "[token_helpers]") REQUIRE(*GetSidSubAuthority(staticSid.get(), 1) == DOMAIN_ALIAS_RID_GUESTS); } +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) TEST_CASE("TokenHelpersTests::TestMembership", "[token_helpers]") { bool member; @@ -318,3 +323,4 @@ TEST_CASE("TokenHelpersTests::Verify_impersonate_token", "[token_helpers]") REQUIRE_NOTHROW(wil::get_token_information()); } #endif // WIL_ENABLE_EXCEPTIONS +#endif diff --git a/Externals/WIL/tests/TraceLoggingTests.cpp b/Externals/WIL/tests/TraceLoggingTests.cpp new file mode 100644 index 000000000000..257480306b42 --- /dev/null +++ b/Externals/WIL/tests/TraceLoggingTests.cpp @@ -0,0 +1,3 @@ +#include + +// Just verify that Tracelogging.h compiles. \ No newline at end of file diff --git a/Externals/WIL/tests/WatcherTests.cpp b/Externals/WIL/tests/WatcherTests.cpp index aac41c6dae7e..994c99eab12c 100644 --- a/Externals/WIL/tests/WatcherTests.cpp +++ b/Externals/WIL/tests/WatcherTests.cpp @@ -91,7 +91,7 @@ TEST_CASE("EventWatcherTests::VerifyDelivery", "[resource][event_watcher]") int volatile countObserved = 0; auto watcher = wil::make_event_watcher_nothrow([&] { - countObserved++; + countObserved = countObserved + 1; notificationReceived.SetEvent(); }); REQUIRE(watcher != nullptr); @@ -125,7 +125,7 @@ TEST_CASE("EventWatcherTests::VerifyLastChangeObserved", "[resource][event_watch auto watcher = wil::make_event_watcher_nothrow(make_event(eventOption), [&] { allChangesMade.wait(); - countObserved++; + countObserved = countObserved + 1; lastObservedState = stateToObserve; processedChange.SetEvent(); }); @@ -213,7 +213,7 @@ TEST_CASE("RegistryWatcherTests::VerifyDelivery", "[registry][registry_watcher]" auto volatile observedChangeType = wil::RegistryChangeKind::Delete; auto watcher = wil::make_registry_watcher_nothrow(ROOT_KEY_PAIR, true, [&](wil::RegistryChangeKind changeType) { - countObserved++; + countObserved = countObserved + 1; observedChangeType = changeType; notificationReceived.SetEvent(); }); @@ -252,7 +252,7 @@ TEST_CASE("RegistryWatcherTests::VerifyLastChangeObserved", "[registry][registry called = true; allChangesMade.wait(); - countObserved++; + countObserved = countObserved + 1; lastObservedState = stateToObserve; DWORD value, cbValue = sizeof(value); RegGetValueW(ROOT_KEY_PAIR, L"value", RRF_RT_REG_DWORD, nullptr, &value, &cbValue); @@ -287,7 +287,7 @@ TEST_CASE("RegistryWatcherTests::VerifyDeleteBehavior", "[registry][registry_wat auto volatile observedChangeType = wil::RegistryChangeKind::Modify; auto watcher = wil::make_registry_watcher_nothrow(ROOT_KEY_PAIR, true, [&](wil::RegistryChangeKind changeType) { - countObserved++; + countObserved = countObserved + 1; observedChangeType = changeType; notificationReceived.SetEvent(); }); @@ -318,7 +318,7 @@ TEST_CASE("RegistryWatcherTests::VerifyResetInCallback", "[registry][registry_wa } // Stress test, disabled by default -TEST_CASE("RegistryWatcherTests::VerifyResetInCallbackStress", "[!hide][registry][registry_watcher][stress]") +TEST_CASE("RegistryWatcherTests::VerifyResetInCallbackStress", "[LocalOnly][registry][registry_watcher][stress]") { for (DWORD value = 0; value < 10000; ++value) { @@ -355,12 +355,12 @@ TEST_CASE("RegistryWatcherTests::VerifyResetAfterDelete", "[registry][registry_w auto volatile observedChangeType = wil::RegistryChangeKind::Modify; wil::unique_registry_watcher_nothrow watcher = wil::make_registry_watcher_nothrow(ROOT_KEY_PAIR, true, [&](wil::RegistryChangeKind changeType) { - countObserved++; + countObserved = countObserved + 1; observedChangeType = changeType; notificationReceived.SetEvent(); watcher = wil::make_registry_watcher_nothrow(ROOT_KEY_PAIR, true, [&](wil::RegistryChangeKind changeType) { - countObserved++; + countObserved = countObserved + 1; observedChangeType = changeType; notificationReceived.SetEvent(); }); @@ -394,7 +394,7 @@ TEST_CASE("RegistryWatcherTests::VerifyCallbackFinishesBeforeFreed", "[registry] notificationReceived.SetEvent(); // ensure that the callback is still being executed while the watcher is reset(). deleteNotification.wait(200); - deleteObserved++; + deleteObserved = deleteObserved + 1; notificationReceived.SetEvent(); }); diff --git a/Externals/WIL/tests/WinRTTests.cpp b/Externals/WIL/tests/WinRTTests.cpp index da53ae430e82..4e1ecf2a707f 100644 --- a/Externals/WIL/tests/WinRTTests.cpp +++ b/Externals/WIL/tests/WinRTTests.cpp @@ -1,10 +1,10 @@ -#include // TODO: https://github.com/microsoft/wil/issues/44 #include #ifdef WIL_ENABLE_EXCEPTIONS #include #include +#include #endif // Required for pinterface template specializations that we depend on in this test @@ -240,8 +240,8 @@ void DoHStringDifferentValueComparisonTest(const wchar_t (&lhs)[LhsSize], const DoHStringComparisonTest(lhsUniqueStr, rhsUniqueStr, 1); #ifdef WIL_ENABLE_EXCEPTIONS - std::wstring lhsWstr(lhs, 7); - std::wstring rhsWstr(rhs, 7); + std::wstring lhsWstr(lhs); + std::wstring rhsWstr(rhs); DoHStringComparisonTest(lhsWstr, rhsWstr, 1); DoHStringComparisonTest(lhsWstr, rhs, 1); DoHStringComparisonTest(lhsWstr, rhsNonConstArray, 1); @@ -641,7 +641,7 @@ TEST_CASE("WinRTTests::TimeTTests", "[winrt][time_t]") REQUIRE(time1.UniversalTime == time2.UniversalTime); } -ComPtr> MakeSampleInspectableVector() +ComPtr> MakeSampleInspectableVector(UINT32 count = 5) { auto result = Make>(); REQUIRE(result); @@ -649,7 +649,7 @@ ComPtr> MakeSampleInspectableVector() ComPtr propStatics; REQUIRE_SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_PropertyValue).Get(), &propStatics)); - for (UINT32 i = 0; i < 5; ++i) + for (UINT32 i = 0; i < count; ++i) { ComPtr myProp; REQUIRE_SUCCEEDED(propStatics->CreateUInt32(i, &myProp)); @@ -673,12 +673,12 @@ ComPtr> MakeSampleStringVector() return result; } -ComPtr> MakeSamplePointVector() +ComPtr> MakeSamplePointVector(int count = 5) { auto result = Make>(); REQUIRE(result); - for (int i = 0; i < 5; ++i) + for (int i = 0; i < count; ++i) { auto value = static_cast(i); REQUIRE_SUCCEEDED(result->Append(Point{ value, value })); @@ -687,6 +687,33 @@ ComPtr> MakeSamplePointVector() return result; } +template auto cast_to(ComPtr const& src) +{ + ComPtr> theRef; + T value{}; + THROW_IF_FAILED(src.As(&theRef)); + THROW_IF_FAILED(theRef->get_Value(&value)); + return value; +} + +TEST_CASE("WinRTTests::VectorToVectorTest", "[winrt][to_vector]") +{ +#if defined(WIL_ENABLE_EXCEPTIONS) + auto uninit = wil::RoInitialize_failfast(); + auto ints = MakeSampleInspectableVector(100); + auto vec = wil::to_vector(ints.Get()); + UINT32 size; + THROW_IF_FAILED(ints->get_Size(&size)); + REQUIRE(size == vec.size()); + for (UINT32 i = 0; i < size; ++i) + { + ComPtr oneItem; + THROW_IF_FAILED(ints->GetAt(i, &oneItem)); + REQUIRE(cast_to(vec[i]) == cast_to(oneItem)); + } +#endif +} + TEST_CASE("WinRTTests::VectorRangeTest", "[winrt][vector_range]") { auto uninit = wil::RoInitialize_failfast(); diff --git a/Externals/WIL/tests/WinVerifyTrustTest.cpp b/Externals/WIL/tests/WinVerifyTrustTest.cpp new file mode 100644 index 000000000000..b132d4ae564c --- /dev/null +++ b/Externals/WIL/tests/WinVerifyTrustTest.cpp @@ -0,0 +1,61 @@ + +#include +#include +#include +#include + +#include +#include + +#include + +#include "common.h" + +#pragma comment(lib, "Wintrust.lib") + +TEST_CASE("WilWintrustWrapperTest::VerifyWintrustDataAllocateAndFree", "[resource][wintrust]") +{ + wil::unique_wintrust_data uwvtData; + uwvtData.cbStruct = sizeof(WINTRUST_DATA); + DWORD zero = 0; + REQUIRE(sizeof(WINTRUST_DATA) == uwvtData.cbStruct); + + uwvtData.reset(); + REQUIRE(zero == uwvtData.cbStruct); +} + +TEST_CASE("WilWintrustWrapperTest::VerifyUniqueHCATADMINAllocateAndFree", "[resource][wintrust]") +{ + wil::unique_hcatadmin hCatAdmin; + + REQUIRE( + CryptCATAdminAcquireContext2( + hCatAdmin.addressof(), + nullptr, + BCRYPT_SHA256_ALGORITHM, + nullptr, + 0)); + + REQUIRE(hCatAdmin.get() != nullptr); + hCatAdmin.reset(); + REQUIRE(hCatAdmin.get() == nullptr); +} + +#ifdef WIL_ENABLE_EXCEPTIONS +TEST_CASE("WilWintrustWrapperTest::VerifyUnqiueHCATINFOAllocate", "[resource][wintrust]") +{ + wil::shared_hcatadmin hCatAdmin; + HCATINFO hCatInfo = nullptr; + + REQUIRE( + CryptCATAdminAcquireContext2( + hCatAdmin.addressof(), + nullptr, + BCRYPT_SHA256_ALGORITHM, + nullptr, + 0)); + + wil::unique_hcatinfo hCatInfoWrapper(hCatInfo, hCatAdmin); + REQUIRE(hCatInfoWrapper.get() == nullptr); +} +#endif diff --git a/Externals/WIL/tests/app/CMakeLists.txt b/Externals/WIL/tests/app/CMakeLists.txt index 1118f2353570..97a412e36a73 100644 --- a/Externals/WIL/tests/app/CMakeLists.txt +++ b/Externals/WIL/tests/app/CMakeLists.txt @@ -1,21 +1,13 @@ -project(witest.app) add_executable(witest.app) -add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP) +target_compile_definitions(witest.app PRIVATE + -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP + ) -target_sources(witest.app PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/../main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../CommonTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../ComTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../FileSystemTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../ResourceTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../ResultTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../Rpc.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../SafeCastTests.cpp +target_sources(witest.app PRIVATE + ${COMMON_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../StlTests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../UniqueWinRTEventTokenTests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../WinRTTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../WistdTests.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/../wiTest.cpp ) diff --git a/Externals/WIL/tests/catch.hpp b/Externals/WIL/tests/catch.hpp index 1850fff1252c..9b309bddc6bc 100644 --- a/Externals/WIL/tests/catch.hpp +++ b/Externals/WIL/tests/catch.hpp @@ -1,9 +1,9 @@ /* - * Catch v2.7.0 - * Generated: 2019-03-07 21:34:30.252164 + * Catch v2.13.10 + * Generated: 2022-10-16 11:01:23.452308 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved. + * Copyright (c) 2022 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -14,8 +14,8 @@ #define CATCH_VERSION_MAJOR 2 -#define CATCH_VERSION_MINOR 7 -#define CATCH_VERSION_PATCH 0 +#define CATCH_VERSION_MINOR 13 +#define CATCH_VERSION_PATCH 10 #ifdef __clang__ # pragma clang system_header @@ -66,13 +66,16 @@ #if !defined(CATCH_CONFIG_IMPL_ONLY) // start catch_platform.h +// See e.g.: +// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html #ifdef __APPLE__ -# include -# if TARGET_OS_OSX == 1 -# define CATCH_PLATFORM_MAC -# elif TARGET_OS_IPHONE == 1 -# define CATCH_PLATFORM_IPHONE -# endif +# include +# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \ + (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1) +# define CATCH_PLATFORM_MAC +# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) +# define CATCH_PLATFORM_IPHONE +# endif #elif defined(linux) || defined(__linux) || defined(__linux__) # define CATCH_PLATFORM_LINUX @@ -132,30 +135,51 @@ namespace Catch { #endif -#if defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +// Only GCC compiler should be used in this block, so other compilers trying to +// mask themselves as GCC should be ignored. +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) + +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) + #endif -#ifdef __clang__ +#if defined(__clang__) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) + +// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug +// which results in calls to destructors being emitted for each temporary, +// without a matching initialization. In practice, this can result in something +// like `std::string::~string` being called on an uninitialized value. +// +// For example, this code will likely segfault under IBM XL: +// ``` +// REQUIRE(std::string("12") + "34" == "1234") +// ``` +// +// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. +# if !defined(__ibmxl__) && !defined(__CUDACC__) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ +# endif + +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ + _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ - _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") -# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic pop" ) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) #endif // __clang__ @@ -180,6 +204,7 @@ namespace Catch { // Android somehow still does not support std::to_string #if defined(__ANDROID__) # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE #endif //////////////////////////////////////////////////////////////////////////////// @@ -204,20 +229,16 @@ namespace Catch { // some versions of cygwin (most) do not support std::to_string. Use the libstd check. // https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 # if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ - && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING # endif #endif // __CYGWIN__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ -#ifdef _MSC_VER - -# if _MSC_VER >= 1900 // Visual Studio 2015 or newer -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -# endif +#if defined(_MSC_VER) // Universal Windows platform does not support SEH // Or console colours (or console at all...) @@ -227,13 +248,25 @@ namespace Catch { # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH # endif +# if !defined(__clang__) // Handle Clang masquerading for msvc + // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ // _MSVC_TRADITIONAL == 0 means new conformant preprocessor // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor -# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) -# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -# endif +# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +# endif // MSVC_TRADITIONAL + +// Only do this if we're not using clang on Windows, which uses `diagnostic push` & `diagnostic pop` +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) +# endif // __clang__ + +#endif // _MSC_VER +#if defined(_REENTRANT) || defined(_MSC_VER) +// Enable async processing, as -pthread is specified or no additional linking is required +# define CATCH_INTERNAL_CONFIG_USE_ASYNC #endif // _MSC_VER //////////////////////////////////////////////////////////////////////////////// @@ -266,40 +299,56 @@ namespace Catch { #endif //////////////////////////////////////////////////////////////////////////////// -// Check if string_view is available and usable -// The check is split apart to work around v140 (VS2015) preprocessor issue... -#if defined(__has_include) -#if __has_include() && defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW -#endif + +// RTX is a special version of Windows that is real time. +// This means that it is detected as Windows, but does not provide +// the same set of capabilities as real Windows does. +#if defined(UNDER_RTSS) || defined(RTX64_BUILD) + #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH + #define CATCH_INTERNAL_CONFIG_NO_ASYNC + #define CATCH_CONFIG_COLOUR_NONE #endif -//////////////////////////////////////////////////////////////////////////////// -// Check if optional is available and usable -#if defined(__has_include) -# if __has_include() && defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL -# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) -#endif // __has_include +#if !defined(_GLIBCXX_USE_C99_MATH_TR1) +#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER +#endif -//////////////////////////////////////////////////////////////////////////////// -// Check if variant is available and usable +// Various stdlib support checks that require __has_include #if defined(__has_include) -# if __has_include() && defined(CATCH_CPP17_OR_GREATER) -# if defined(__clang__) && (__clang_major__ < 8) - // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 - // fix should be in clang 8, workaround in libstdc++ 8.2 -# include -# if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) -# define CATCH_CONFIG_NO_CPP17_VARIANT -# else -# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT -# endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) -# else -# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT -# endif // defined(__clang__) && (__clang_major__ < 8) -# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) -#endif // __has_include + // Check if string_view is available and usable + #if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW + #endif + + // Check if optional is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + + // Check if byte is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # include + # if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0) + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + + // Check if variant is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # if defined(__clang__) && (__clang_major__ < 8) + // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 + // fix should be in clang 8, workaround in libstdc++ 8.2 + # include + # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # define CATCH_CONFIG_NO_CPP17_VARIANT + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__clang__) && (__clang_major__ < 8) + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +#endif // defined(__has_include) #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) # define CATCH_CONFIG_COUNTER @@ -324,10 +373,6 @@ namespace Catch { # define CATCH_CONFIG_CPP17_OPTIONAL #endif -#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) -# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) # define CATCH_CONFIG_CPP17_STRING_VIEW #endif @@ -336,6 +381,10 @@ namespace Catch { # define CATCH_CONFIG_CPP17_VARIANT #endif +#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) +# define CATCH_CONFIG_CPP17_BYTE +#endif + #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) # define CATCH_INTERNAL_CONFIG_NEW_CAPTURE #endif @@ -352,17 +401,53 @@ namespace Catch { # define CATCH_CONFIG_POLYFILL_ISNAN #endif +#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) +# define CATCH_CONFIG_USE_ASYNC +#endif + +#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) +# define CATCH_CONFIG_ANDROID_LOGWRITE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) +# define CATCH_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Even if we do not think the compiler has that warning, we still have +// to provide a macro that can be used by the code. +#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS +#endif + +// The goal of this macro is to avoid evaluation of the arguments, but +// still have the compiler warn on problems inside... +#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) +#endif + +#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#elif defined(__clang__) && (__clang_major__ < 5) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS #endif #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -427,7 +512,7 @@ namespace Catch { SourceLineInfo( SourceLineInfo&& ) noexcept = default; SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; - bool empty() const noexcept; + bool empty() const noexcept { return file[0] == '\0'; } bool operator == ( SourceLineInfo const& other ) const noexcept; bool operator < ( SourceLineInfo const& other ) const noexcept; @@ -468,9 +553,10 @@ namespace Catch { } // end namespace Catch #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION // end catch_tag_alias_autoregistrar.h // start catch_test_registry.h @@ -497,6 +583,7 @@ namespace Catch { virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; }; + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); std::vector const& getAllTestCasesSorted( IConfig const& config ); @@ -509,53 +596,30 @@ namespace Catch { #include #include #include +#include namespace Catch { /// A non-owning string class (similar to the forthcoming std::string_view) /// Note that, because a StringRef may be a substring of another string, - /// it may not be null terminated. c_str() must return a null terminated - /// string, however, and so the StringRef will internally take ownership - /// (taking a copy), if necessary. In theory this ownership is not externally - /// visible - but it does mean (substring) StringRefs should not be shared between - /// threads. + /// it may not be null terminated. class StringRef { public: using size_type = std::size_t; + using const_iterator = const char*; private: - friend struct StringRefTestAccess; - - char const* m_start; - size_type m_size; - - char* m_data = nullptr; - - void takeOwnership(); - static constexpr char const* const s_empty = ""; - public: // construction/ assignment - StringRef() noexcept - : StringRef( s_empty, 0 ) - {} - - StringRef( StringRef const& other ) noexcept - : m_start( other.m_start ), - m_size( other.m_size ) - {} + char const* m_start = s_empty; + size_type m_size = 0; - StringRef( StringRef&& other ) noexcept - : m_start( other.m_start ), - m_size( other.m_size ), - m_data( other.m_data ) - { - other.m_data = nullptr; - } + public: // construction + constexpr StringRef() noexcept = default; StringRef( char const* rawChars ) noexcept; - StringRef( char const* rawChars, size_type size ) noexcept + constexpr StringRef( char const* rawChars, size_type size ) noexcept : m_start( rawChars ), m_size( size ) {} @@ -565,101 +629,64 @@ namespace Catch { m_size( stdString.size() ) {} - ~StringRef() noexcept { - delete[] m_data; - } - - auto operator = ( StringRef const &other ) noexcept -> StringRef& { - delete[] m_data; - m_data = nullptr; - m_start = other.m_start; - m_size = other.m_size; - return *this; + explicit operator std::string() const { + return std::string(m_start, m_size); } - operator std::string() const; - - void swap( StringRef& other ) noexcept; - public: // operators auto operator == ( StringRef const& other ) const noexcept -> bool; - auto operator != ( StringRef const& other ) const noexcept -> bool; + auto operator != (StringRef const& other) const noexcept -> bool { + return !(*this == other); + } - auto operator[] ( size_type index ) const noexcept -> char; + auto operator[] ( size_type index ) const noexcept -> char { + assert(index < m_size); + return m_start[index]; + } public: // named queries - auto empty() const noexcept -> bool { + constexpr auto empty() const noexcept -> bool { return m_size == 0; } - auto size() const noexcept -> size_type { + constexpr auto size() const noexcept -> size_type { return m_size; } - auto numberOfCharacters() const noexcept -> size_type; + // Returns the current start pointer. If the StringRef is not + // null-terminated, throws std::domain_exception auto c_str() const -> char const*; public: // substrings and searches - auto substr( size_type start, size_type size ) const noexcept -> StringRef; + // Returns a substring of [start, start + length). + // If start + length > size(), then the substring is [start, size()). + // If start > size(), then the substring is empty. + auto substr( size_type start, size_type length ) const noexcept -> StringRef; - // Returns the current start pointer. - // Note that the pointer can change when if the StringRef is a substring - auto currentData() const noexcept -> char const*; + // Returns the current start pointer. May not be null-terminated. + auto data() const noexcept -> char const*; - private: // ownership queries - may not be consistent between calls - auto isOwned() const noexcept -> bool; - auto isSubstring() const noexcept -> bool; - }; + constexpr auto isNullTerminated() const noexcept -> bool { + return m_start[m_size] == '\0'; + } - auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string; - auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string; - auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string; + public: // iterators + constexpr const_iterator begin() const { return m_start; } + constexpr const_iterator end() const { return m_start + m_size; } + }; auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; - inline auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { return StringRef( rawChars, size ); } - } // namespace Catch -inline auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { +constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { return Catch::StringRef( rawChars, size ); } // end catch_stringref.h -// start catch_type_traits.hpp - - -#include - -namespace Catch{ - -#ifdef CATCH_CPP17_OR_GREATER - template - inline constexpr auto is_unique = std::true_type{}; - - template - inline constexpr auto is_unique = std::bool_constant< - (!std::is_same_v && ...) && is_unique - >{}; -#else - -template -struct is_unique : std::true_type{}; - -template -struct is_unique : std::integral_constant -::value - && is_unique::value - && is_unique::value ->{}; - -#endif -} - -// end catch_type_traits.hpp // start catch_preprocessor.hpp @@ -722,23 +749,170 @@ struct is_unique : std::integral_constant #define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) #endif +#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ +#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) + #define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name, __VA_ARGS__) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name,...) Name " - " #__VA_ARGS__ -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name,...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper()) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) #else -// MSVC is adding extra space and needs more calls to properly remove () -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name,...) Name " -" #__VA_ARGS__ -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, __VA_ARGS__) -#define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper())) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) #endif -#define INTERNAL_CATCH_MAKE_TYPE_LIST(types) Catch::TypeList +#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ + CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) + +#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) +#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) +#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) +#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) +#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) +#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) +#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) +#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) +#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) + +#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N + +#define INTERNAL_CATCH_TYPE_GEN\ + template struct TypeList {};\ + template\ + constexpr auto get_wrapper() noexcept -> TypeList { return {}; }\ + template class...> struct TemplateTypeList{};\ + template class...Cs>\ + constexpr auto get_wrapper() noexcept -> TemplateTypeList { return {}; }\ + template\ + struct append;\ + template\ + struct rewrap;\ + template class, typename...>\ + struct create;\ + template class, typename>\ + struct convert;\ + \ + template \ + struct append { using type = T; };\ + template< template class L1, typename...E1, template class L2, typename...E2, typename...Rest>\ + struct append, L2, Rest...> { using type = typename append, Rest...>::type; };\ + template< template class L1, typename...E1, typename...Rest>\ + struct append, TypeList, Rest...> { using type = L1; };\ + \ + template< template class Container, template class List, typename...elems>\ + struct rewrap, List> { using type = TypeList>; };\ + template< template class Container, template class List, class...Elems, typename...Elements>\ + struct rewrap, List, Elements...> { using type = typename append>, typename rewrap, Elements...>::type>::type; };\ + \ + template