public unsafe int IoOpen(HleIoDrvFileArg HleIoDrvFileArg, string FileName, HleIoFlags Flags, SceMode Mode)
{
// Ignore the filename in "umd0:xxx".
// Using umd0: is always opening the whole UMD in sector block mode,
// ignoring the file name specified after the colon.
if (HleIoDrvFileArg.DriverName.ToLower().StartsWith("umd"))
{
FileName = "";
}
// disc0:/sce_lbn0x5fa0_size0x1428
//Console.WriteLine(":::::::::" + FileName);
if (FileName == "")
{
HleIoDrvFileArg.FileArgument = new IsoFileArgument()
{
IsoNode = null,
StartSector = 0,
Size = Iso.Stream.Length,
Stream = Iso.Stream,
};
return 0;
}
if (FileName.StartsWith("/sce_"))
{
int Sector = 0, Size = 0;
var Parts = FileName.Substring(5).Split('_');
foreach (var Part in Parts)
{
if (Part.StartsWith("lbn"))
{
var Number = Part.Substring(3);
Sector = NumberUtils.ParseIntegerConstant(Number, 16);
}
else if (Part.StartsWith("size"))
{
var Number = Part.Substring(4);
Size = NumberUtils.ParseIntegerConstant(Number, 16);
}
else
{
throw(new NotImplementedException("Can't handle special filename '" + FileName + "' part '" + Part + "'"));
}
//Console.WriteLine(Part);
}
//Console.WriteLine("SPECIAL({0}, {1})", lbn, size);
//Console.WriteLine("SPECIAL!!!!!!!!!!!!!!!!!!!!");
HleIoDrvFileArg.FileArgument = new IsoFileArgument()
{
IsoNode = null,
StartSector = Sector,
Size = Size,
Stream = Iso.Stream.SliceWithLength(Sector * IsoFile.SectorSize, Size),
};
return 0;
}
//Console.WriteLine(FileName);
var IsoNode = Iso.Root.Locate(FileName);
;
HleIoDrvFileArg.FileArgument = new IsoFileArgument()
{
IsoNode = IsoNode,
StartSector = IsoNode.DirectoryRecord.Extent,
Size = IsoNode.DirectoryRecord.Size,
Stream = IsoNode.Open(),
};
return 0;
}