Nintendo Optical Disc traversal and generation
Go to file
Jack Andersen 55ed73b9bb apply CMAKE_CXX_STANDARD 2017-06-17 16:52:39 -10:00
driver Minor progress callback tweak 2017-05-21 23:18:52 -04:00
include/nod fixed functional include 2017-06-07 20:05:21 +02:00
lib Add floating point progress to builder callbacks 2017-05-21 23:12:48 -04:00
logvisor@f8ab0e03ba Update logvisor 2017-01-20 14:20:46 -10:00
.gitignore Add .gitignore 2017-05-29 09:55:27 -10:00
.gitmodules Humungous refactor 2016-03-04 13:04:30 -10:00
CMakeLists.txt apply CMAKE_CXX_STANDARD 2017-06-17 16:52:39 -10:00
LICENSE Update LICENSE date 2016-03-06 17:12:22 -10:00
README.md Update README.md 2016-03-04 17:58:16 -10:00

README.md

NOD

NOD is a library and utility (nodtool) for traversing, dumping, and authoring GameCube and Wii optical disc images.

Library

The primary motivation of NOD is to supply a uniform C++11 API for accessing data from image files directly. nod::DiscBase provides a common interface for traversing partitions and individual files. Files may be individually streamed, or the whole partition may be extracted to the user's filesystem. Raw ISO and WBFS images are supported read sources.

bool isWii; /* Set by reference next line */
std::unique_ptr<nod::DiscBase> disc = nod::OpenDiscFromImage(path, isWii);
if (!disc)
    return FAILURE;

/* Access first data-partition on Wii, or full GameCube disc */
nod::Partition* dataPart = disc->getDataPartition();
if (!dataPart)
    return FAILURE;

/* One-shot extraction to filesystem */
if (!dataPart->extractToDirectory(outDir, ctx))
    return FAILURE;

return SUCCESS;

Image authoring is always done from the user's filesystem and may be integrated into a content pipeline using the nod::DiscBuilderBase interface.

/* Sample logging lambda for progress feedback */
size_t lastIdx = -1;
auto progFunc = [&](size_t idx, const nod::SystemString& name, size_t bytes)
{
    if (idx != lastIdx)
    {
        lastIdx = idx;
        /* NOD provides I/O wrappers using wchar_t on Windows;
         * _S() conditionally makes string-literals wide */
        nod::Printf(_S("\n"));
    }
    if (bytes != -1)
        nod::Printf(_S("\r%s %" PRISize " B"), name.c_str(), bytes);
    else
        nod::Printf(_S("\r%s"), name.c_str());
    fflush(stdout);
};

/* Making a GCN image */
nod::DiscBuilderGCN b(isoOutPath, gameID, gameTitle, dolLoadAddress, progFunc);
ret = b.buildFromDirectory(fsRootDirPath, bootDolPath, apploaderPath);

/* Making a Wii image */
nod::DiscBuilderWii b(isoOutPath, gameID, gameTitle, dualLayer, progFunc);
ret = b.buildFromDirectory(fsRootDirPath, bootDolPath, apploaderPath, partitionHeadPath);

Wii images are fakesigned using a commonly-applied signing bug.

Additionally, any *.dol files added to the disc are patched to bypass the #001 error caused by invalid signature checks. This allows games with multiple .dols to inter-boot without extensive loader-patching.

Tool

The library usage mentioned above is provided by a command-line tool called nodtool.

An extract/repack works like so:

>$ nodtool extract <image-in> [<dir-out>]
>$ cd <dir-out>

# Then one of:
>$ nodtool makegcn <gameid> <game-title> fsroot boot.dol apploader.bin [<image-out>]
>$ nodtool makewiisl <gameid> <game-title> fsroot boot.dol apploader.bin partition_head.bin [<image-out>]
>$ nodtool makewiidl <gameid> <game-title> fsroot boot.dol apploader.bin partition_head.bin [<image-out>]