VolumeDirectory doesn't support necessities like TMDs,
so thanks to 5.0-2172 (18968ab), EmulatedBS2_Wii crashes
when the inserted disc is a VolumeDirectory.
This commit fixes that.
This commit makes our DOL booting code very similar to our
ELF booting code. One exception is that the DOL booting
code still always calls SetupBAT. (Note that EmulatedBS2_GC
calls SetupBAT even if no disc is inserted.) I'm not sure
if there's a point to the difference, but I thought I'd
better avoid changing it so that I don't break anything.
For thread safety reasons, the currently inserted volume must
only be accessed by the DVD thread (or by the CPU thread if it
calls DVDThread::WaitUntilIdle() first). After this commit,
only DVDThread.cpp can access the volume, which prevents code in
other files from accessing the volume in a non-threadsafe way.
It's better to just let the calling code provide a volume
object instead of needing one SetVolume for each way of
creating a volume. This simplifies InsertDiscCallback and
is needed for the following commits.
Just like DeleteTitle, Using CNANDContentManager is overkill,
inefficient and useless. And it results in a few failures in
situations where a delete should just always work.
But here it gets bonus points, because it manages to actually use
the TMD for deleting contents, when IOS does none of that and just
deletes files ending with .app in the title content directory. :)
This enables constructing an IOS instance that is not tied to emulation
and that can be simply used for internal purposes (ES, FS).
NAND root initialisation was moved to IOS since we cannot rely on HW
doing that for us anymore, and technically the NAND is entirely managed
by IOS anyway.
This adds code to update the PPC's UID and GID, which fixes a
regression with the system menu. Ideally, we would simply rely on IOS's
ES_Launch here and not duplicate the logic here, but we cannot do that
properly until the direct WAD launch hack is dropped, *and* until the
IOS changes that would enable internal calls are ready.
Since this fixes a semi-important regression with managing saves from
the SM, and the duplication is not too terrible, I believe it is a good
idea to get this fixed right now to avoid affecting users too much.
I do plan to fix this properly in the future.
* CNANDContentManager does things that are absolutely useless. In
particular, it parses the ticket, the TMD, reads contents, etc.
when we only need to remove the title directory.
* This means it will fail if the ticket cannot be found, when that
should not be the case.
* This also obviously caused DeleteTitle to be incredibly inefficient.
* We are already removing the title directory later in the function,
as CNANDContentManager does not even delete titles correctly.
DeleteTitle != DeleteTitleContents.
* It should take a ticket view, not a title ID.
* It's missing a lot of checks.
* It's not deleting tickets properly.
* It's not deleting only the ticket it needs to delete.
* It should not return -1017 when the ticket doesn't exist.
* It's not returning the proper error code when a read/write fails.
* It's not cleaning up the ticket directory if there is nothing left.
This commit fixes its implementation.
* Supporting other ticket types makes the logic slightly more complex.
* There have been no such non-RSA2048 tickets seen during the Wii's
lifetime.
* The Wii's IOS doesn't even have support for them.