Exemple #1
0
/// Mount
///
/// @param archive Archive
///
bool CPaz::Mount(CArcFile* archive)
{
	if (archive->GetArcExten() != _T(".paz"))
		return false;

	// Initialize Mount Key
	InitMountKey(archive);

	// Initialize Table
	InitTable();

	// Decode Table
	DecodeTable1();
	DecodeTable2();

	// Get index size
	u32 index_size;
	archive->ReadU32(&index_size);
	Decrypt(reinterpret_cast<u8*>(&index_size), sizeof(index_size));

	// Get index
	size_t index_ptr = 0;
	std::vector<u8> index(index_size);
	archive->Read(index.data(), index.size());

	// Decode Index
	Decrypt(index.data(), index.size());
	DecodeData(index.data(), index.size());

	// Get file count
	const u32 files = *reinterpret_cast<const u32*>(&index[0]);
	index_ptr += 4;

	// Initialization table for decoding movies
	if (archive->GetArcName() == _T("mov.paz"))
	{
		index_ptr += InitMovieTable(&index[index_ptr]);
	}

	// Get file info
	for (u32 i = 0; i < files; i++)
	{
		// Get file name
		TCHAR file_name[_MAX_FNAME];
		lstrcpy(file_name, reinterpret_cast<LPCTSTR>(&index[index_ptr]));
		index_ptr += lstrlen(file_name) + 1;

		// Add .ogg extension if voice.paz (Don't know why they don't have extensions)

		if (archive->GetArcName().Left(5) == _T("voice"))
		{
			if (lstrcmp(PathFindExtension(file_name), _T("")) == 0)
			{
				lstrcat(file_name, _T(".ogg"));
			}
		}

		const u32 type = *reinterpret_cast<const u32*>(&index[index_ptr + 20]);

		// Add to list view
		SFileInfo file_info;
		file_info.name       = file_name;
		file_info.sizeOrg    = type == 1 ? *reinterpret_cast<const u32*>(&index[index_ptr + 8]) : *reinterpret_cast<const u32*>(&index[index_ptr + 12]);
		file_info.dwSizeOrg2 = *reinterpret_cast<const u32*>(&index[index_ptr + 16]);
		file_info.sizeCmp    = type == 1 ? *reinterpret_cast<const u32*>(&index[index_ptr + 16]) : file_info.sizeOrg;
		file_info.start      = *reinterpret_cast<const u32*>(&index[index_ptr + 0]);
		file_info.end        = file_info.start + file_info.sizeCmp;

		if (type == 1)
		{
			file_info.format = _T("zlib");
		}

		archive->AddFileInfo(file_info);

		index_ptr += 24;
	}

	return true;
}
Exemple #2
0
/// Mount
///
/// @param pclArc Archive
///
BOOL CPaz::Mount(CArcFile* pclArc)
{
    if (pclArc->GetArcExten() != _T(".paz"))
        return FALSE;

    // Initialize Mount Key
    InitMountKey(pclArc);

    // Initialize Table
    InitTable();

    // Decode Table
    DecodeTable1();
    DecodeTable2();

    // Get index size
    DWORD dwIndexSize;
    pclArc->Read(&dwIndexSize, 4);
    Decrypt(&dwIndexSize, 4);

    // Get index
    DWORD dwIndexPtr = 0;
    YCMemory<BYTE> clmbtIndex(dwIndexSize);
    pclArc->Read(&clmbtIndex[0], dwIndexSize);

    // Decode Index
    Decrypt(&clmbtIndex[0], dwIndexSize);
    DecodeData(&clmbtIndex[0], dwIndexSize);

    // Get file count
    DWORD dwFiles = *(DWORD*)&clmbtIndex[0];
    dwIndexPtr += 4;

    // Initialization table for decoding movies
    if (pclArc->GetArcName() == _T("mov.paz"))
    {
        dwIndexPtr += InitMovieTable(&clmbtIndex[dwIndexPtr]);
    }

    // Get file info
    for (DWORD i = 0; i < dwFiles; i++)
    {
        // Get file name
        TCHAR szFileName[_MAX_FNAME];
        lstrcpy(szFileName, (LPCTSTR)&clmbtIndex[dwIndexPtr]);
        dwIndexPtr += lstrlen(szFileName) + 1;

        // Add .ogg extension if voice.paz (Don't know why they don't have extensions)

        if (pclArc->GetArcName().Left(5) == _T("voice"))
        {
            if (lstrcmp(PathFindExtension(szFileName), _T("")) == 0)
            {
                lstrcat(szFileName, _T(".ogg"));
            }
        }

        DWORD dwType = *(DWORD*)&clmbtIndex[dwIndexPtr + 20];

        // Add to list view
        SFileInfo stFileInfo;
        stFileInfo.name = szFileName;
        stFileInfo.sizeOrg = (dwType == 1) ? *(DWORD*)&clmbtIndex[dwIndexPtr + 8] : *(DWORD*)&clmbtIndex[dwIndexPtr + 12];
        stFileInfo.dwSizeOrg2 = *(DWORD*)&clmbtIndex[dwIndexPtr + 16];
        stFileInfo.sizeCmp = (dwType == 1) ? *(DWORD*)&clmbtIndex[dwIndexPtr + 16] : stFileInfo.sizeOrg;
        stFileInfo.start = *(DWORD*)&clmbtIndex[dwIndexPtr + 0];
        stFileInfo.end = stFileInfo.start + stFileInfo.sizeCmp;

        if (dwType == 1)
        {
            stFileInfo.format = _T("zlib");
        }

        pclArc->AddFileInfo(stFileInfo);

        dwIndexPtr += 24;
    }

    return TRUE;
}