private Psf2DirectoryEntry[] getDirectoryEntries(UInt32 pOffset) { UInt32 numberOfDirectoryEntries; Psf2DirectoryEntry[] ret; System.Text.Encoding enc = System.Text.Encoding.ASCII; using (FileStream fs = File.Open(this.FilePath, FileMode.Open, FileAccess.Read)) { numberOfDirectoryEntries = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(fs, pOffset, 4), 0); ret = new Psf2DirectoryEntry[numberOfDirectoryEntries]; for (UInt32 i = 0; i < numberOfDirectoryEntries; i++) { ret[i].Filename = enc.GetString(FileUtil.ReplaceNullByteWithSpace(ParseFile.ParseSimpleOffset(fs, (pOffset + 4) + (48 * i), 36))).Trim(); ret[i].Offset = Xsf.RESERVED_SECTION_OFFSET + BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(fs, (pOffset + 4) + (48 * i) + 36, 4), 0); ret[i].UncompressedSize = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(fs, (pOffset + 4) + (48 * i) + 40, 4), 0); ret[i].BlockSize = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(fs, (pOffset + 4) + (48 * i) + 44, 4), 0); } } return(ret); }
public static bool IsSubdirectory(Psf2DirectoryEntry pPsf2DirectoryEntry) { return(pPsf2DirectoryEntry.UncompressedSize == 0 && pPsf2DirectoryEntry.BlockSize == 0 && pPsf2DirectoryEntry.Offset != 0); }
public static bool IsEmptyFile(Psf2DirectoryEntry pPsf2DirectoryEntry) { return(pPsf2DirectoryEntry.UncompressedSize == 0 && pPsf2DirectoryEntry.BlockSize == 0 && pPsf2DirectoryEntry.Offset == 0); }
private void extractFile(Psf2DirectoryEntry pPsf2DirectoryEntry, string pDestinationFile) { uint blockCount = ((pPsf2DirectoryEntry.UncompressedSize + pPsf2DirectoryEntry.BlockSize) - 1) / pPsf2DirectoryEntry.BlockSize; UInt32[] blockTable = new UInt32[blockCount]; string tempCompressedFile = Path.GetTempFileName(); byte[] uncompressedBlock; byte[] compressedBlock; int bytesRead; int bytesInflated; long totalBytesInflated = 0; MemoryStream compressedBytesStream; using (FileStream pfs = File.Open(this.FilePath, FileMode.Open, FileAccess.Read)) { pfs.Position = (long)pPsf2DirectoryEntry.Offset; for (int i = 0; i < blockCount; i++) { blockTable[i] = BitConverter.ToUInt32(ParseFile.ParseSimpleOffset(pfs, (long)pPsf2DirectoryEntry.Offset + (i * 4), 4), 0); } pfs.Position = (long)(pPsf2DirectoryEntry.Offset + (blockCount * 4)); if (!IsEmptyFile(pPsf2DirectoryEntry)) { // write compressed bytes to mem stream and decompress to file foreach (UInt32 b in blockTable) { compressedBlock = new byte[b]; bytesRead = pfs.Read(compressedBlock, 0, (int)b); using (compressedBytesStream = new MemoryStream(compressedBlock, 0, bytesRead)) { using (FileStream outputFs = File.Open(pDestinationFile, FileMode.Append, FileAccess.Write)) { using (ZlibStream zs = new ZlibStream(compressedBytesStream, CompressionMode.Decompress, true)) { if ((int)b > 0x2000) { zs.BufferSize = (int)b; } else { zs.BufferSize = 0x2000; } uncompressedBlock = new byte[pPsf2DirectoryEntry.BlockSize]; using (BinaryWriter bw = new BinaryWriter(outputFs)) { while ((bytesInflated = zs.Read(uncompressedBlock, 0, uncompressedBlock.Length)) > 0) { totalBytesInflated += bytesInflated; bw.Write(uncompressedBlock, 0, bytesInflated); } } } } } } } } }