示例#1
0
static int MPQ_stat(void *opaque, const char *filename, PHYSFS_Stat *stat)
{
    char *filename2 = NULL;
    HANDLE hFile;
    char success;
    DWORD fileSize = 0;

    if (!opaque)
        return 0;

    filename2 = MPQ_getValidFilename(filename);
    if (!filename2)
        return 0;

    success = SFileOpenFileEx(((MPQHandle *)opaque)->mpqHandle, filename2, 0, &hFile);
    allocator.Free(filename2);

    if (!success)
        return 0;

    SFileGetFileInfo(hFile, SFileInfoFileSize, &fileSize, sizeof(fileSize), NULL);
    stat->filesize = fileSize;

    stat->modtime = 0;
    SFileGetFileInfo(hFile, SFileInfoFileTime, &stat->modtime, sizeof(stat->modtime), NULL);
    stat->createtime = stat->modtime;
    stat->accesstime = 0;
    stat->filetype = PHYSFS_FILETYPE_REGULAR;
    stat->readonly = 1; /* .MPQ files are always read only */

    SFileCloseFile(hFile);

    return 1;
}
示例#2
0
文件: FileIO.cpp 项目: jjf28/Chkdraft
bool FileToBuffer(MPQHANDLE &hMpq, const std::string &fileName, buffer &buf)
{
    if ( hMpq == nullptr )
        CHKD_ERR("NULL MPQ file specified for opening %s", fileName.c_str());
    else
    {
        u32 bytesRead = 0;
        HANDLE openFile = NULL;
        if ( SFileGetFileInfo(hMpq, SFILE_INFO_NUM_FILES) != 0xFFFFFFFF )
        {
            if ( SFileOpenFileEx(hMpq, fileName.c_str(), SFILE_SEARCH_CURRENT_ONLY, &openFile) )
            {
                u32 fileSize = (u32)SFileGetFileSize(openFile, NULL);
                if ( buf.setSize(fileSize) )
                {
                    buf.sizeUsed = fileSize;
                    SFileReadFile(openFile, (LPVOID)buf.data, buf.sizeUsed, (LPDWORD)(&bytesRead), NULL);
                    SFileCloseFile(openFile);

                    if ( buf.sizeUsed == bytesRead )
                        return true;
                }
                else
                    SFileCloseFile(openFile);
            }
            else
                CHKD_ERR("Failed to get %s from MPQ file", fileName.c_str());
        }
        else
            CHKD_ERR("File is already open", fileName.c_str());
    }
    return false;
}
示例#3
0
DWORD WINAPI SFileGetFileInfo_stub(MPQHANDLE hFile, DWORD dwInfoType)
{
	LoadSFMpqDll();
	if (hSFMpq) {
		*(FARPROC *)&SFileGetFileInfo = GetProcAddress(hSFMpq,"SFileGetFileInfo");
		if (SFileGetFileInfo) return SFileGetFileInfo(hFile,dwInfoType);
	}
	return (DWORD)-1;
}
示例#4
0
	bool MpkManip::cleanupFragment(const char* mpkFilename)
	{
		bool bOk = false;
		HANDLE hMpk = 0;
		char tempFilename[MAX_PATH];
		if(SFileCreateArchiveEx(mpkFilename,OPEN_EXISTING,8000,&hMpk))
		{
			uint nTotal = SFileGetFileInfo(hMpk,SFILE_INFO_NUM_FILES);
			uint nFiles = 0;
			char tempPath[MAX_PATH];
			getTempPath(MAX_PATH, tempPath);
			getTempFileName(tempPath,tempFilename);

			HANDLE hTargetMpk = 0;
			if(SFileCreateArchiveEx(tempFilename,CREATE_ALWAYS,8000,&hTargetMpk))
			{
				SFILE_FIND_DATA fileFindData;
				HANDLE hFind = SFileFindFirstFile(hMpk,"*",&fileFindData,0);
				if(hFind)
				{
					do
					{
						const char* pFilename = fileFindData.cFileName;
						char tempFilename[MAX_PATH];
						getTempFileName(tempPath,tempFilename);
						if(SFileExtractFile(hMpk,pFilename,tempFilename))
						{
							if(SFileAddFile(hTargetMpk,tempFilename,pFilename,MPK_FILE_REPLACEEXISTING | MPK_FILE_COMPRESS_PKWARE))
							{
								nFiles++;
							}
						}
					}
					while(SFileFindNextFile(hFind,&fileFindData));

					if(nTotal == nFiles)bOk = true;
				}
				SFileCloseArchive(hTargetMpk);
			}

			SFileCloseArchive(hMpk);
		}

		if(bOk && copyFile(tempFilename,mpkFilename,FALSE))
		{
			bOk = true;
		}

		return bOk;
	}
示例#5
0
BOOL CMPQFileAccessor::GetLastWriteTime(CEasyTime& Time)
{
	if(m_hFile)
	{
		FILETIME MPQFileTime;
		if(SFileGetFileInfo(m_hFile,SFILE_INFO_FILETIME,&MPQFileTime,sizeof(FILETIME)))
		{
			Time=MPQFileTime;
			return TRUE;
		}
	}
	else if(m_pRealFSFile)
	{
		return m_pRealFSFile->GetLastWriteTime(Time);
	}
	return FALSE;
}
static bool IsMatchingPatchFile(
    TMPQArchive * ha,
    const char * szFileName,
    LPBYTE pbBaseFileMd5)
{
    MPQ_PATCH_HEADER PatchHeader = {0};
    HANDLE hFile = NULL;
    DWORD dwTransferred = 0;
    DWORD dwFlags = 0;
    bool bResult = false;

    // Open the file and load the patch header
    if(SFileOpenFileEx((HANDLE)ha, szFileName, SFILE_OPEN_BASE_FILE, &hFile))
    {
        // Retrieve the flags. We need to know whether the file is a patch or not
        SFileGetFileInfo(hFile, SFileInfoFlags, &dwFlags, sizeof(DWORD), &dwTransferred);
        if(dwFlags & MPQ_FILE_PATCH_FILE)
        {
            // Load the patch header
            SFileReadFile(hFile, &PatchHeader, sizeof(MPQ_PATCH_HEADER), &dwTransferred, NULL);
            BSWAP_ARRAY32_UNSIGNED(pPatchHeader, sizeof(DWORD) * 6);

            // If the file contains an incremental patch,
            // compare the "MD5 before patching" with the base file MD5
            if(dwTransferred == sizeof(MPQ_PATCH_HEADER) && PatchHeader.dwSignature == PATCH_SIGNATURE_HEADER)
                bResult = (!memcmp(PatchHeader.md5_before_patch, pbBaseFileMd5, MD5_DIGEST_SIZE));
        }
        else
        {
            // TODO: How to match it if it's not an incremental patch?
            // Example: StarCraft II\Updates\enGB\s2-update-enGB-23258.MPQ:
            //          Mods\Core.SC2Mod\enGB.SC2Assets\StreamingBuckets.txt" 
            bResult = false;
        }

        // Close the file
        SFileCloseFile(hFile);
    }

    return bResult;
}
示例#7
0
文件: FileIO.cpp 项目: jjf28/Chkdraft
bool FindFileInMpq(MPQHANDLE mpq, const char* fileName)
{
    if ( mpq == nullptr )
        CHKD_ERR("NULL MPQ file specified for opening %s", fileName);
    else
    {
        u32 bytesRead = 0;
        HANDLE openFile = NULL;
        if ( SFileGetFileInfo(mpq, SFILE_INFO_NUM_FILES) != 0xFFFFFFFF )
        {
            if ( SFileOpenFileEx(mpq, fileName, SFILE_SEARCH_CURRENT_ONLY, &openFile) == TRUE )
            {
                SFileCloseFile(openFile);
                return true;
            }
            else
                CHKD_ERR("Failed to get %s from MPQ file", fileName);
        }
        else
            CHKD_ERR("File is already open", fileName);
    }
    return false;
}
示例#8
0
void HMQHashInit(HANDLE hMPQ)
{
  hmqHashSize=128;
  for(int size=(SFileGetFileInfo(hMPQ,SFILE_INFO_NUM_FILES)+54)<<1; hmqHashSize<size; hmqHashSize<<=1)
    ;
  hmqHashFactor=hmqHashSize-1;
  hmqHashSize<<=1;
  hmqHashString=(char**)Calloc(hmqHashSize*28);
  hmqFileType=(char*)(hmqHashString+hmqHashSize);
  hmqReadFile=(char*)(hmqFileType+hmqHashSize);

  bufferFile=(char**)(hmqReadFile+hmqHashSize);
  bufferFileName=(char**)(bufferFile+hmqHashSize);
  bufferFileSize=(int*)(bufferFileName+hmqHashSize);
  bufferNeedRemove=(bool*)(bufferFileSize+hmqHashSize);
  bufferFileCount=0;
  bufferFinishCount=0;

  SetFileType("(attributes)",1);
  SetFileType("war3map.imp",2);
  SetFileType("war3campaign.imp",2);
  SetFileType("war3map.w3c",2);
  SetFileType("war3map.w3s",2);
  SetFileType("war3map.w3r",2);
  SetFileType("war3map.wct",2);
  SetFileType("war3map.wtg",2);
  SetFileType("war3mapunits.doo",2);
  SetFileType("(listfile)",3);
  SetFileType("war3map.wts",3);
  SetFileType("war3campaign.wts",3);
  SetFileType("war3map.w3i",3);
  SetFileType("war3map.doo",3);
  SetFileType("war3map.w3u",3);
  SetFileType("war3map.w3t",3);
  SetFileType("war3map.w3b",3);
  SetFileType("war3map.w3d",3);
  SetFileType("war3map.w3a",3);
  SetFileType("war3map.w3h",3);
  SetFileType("war3map.w3q",3);
  SetFileType("war3campaign.w3u",3);
  SetFileType("war3campaign.w3t",3);
  SetFileType("war3campaign.w3b",3);
  SetFileType("war3campaign.w3d",3);
  SetFileType("war3campaign.w3a",3);
  SetFileType("war3campaign.w3h",3);
  SetFileType("war3campaign.w3q",3);
  SetFileType("war3map.j",3);
  SetFileType("scripts\\war3map.j",3);
  SetFileType("war3mapskin.txt",3);
  SetFileType("war3mapmisc.txt",3);

  if (OPT_UNIT)
  {
    SetFileType("units\\campaignunitfunc.txt",4);
    SetFileType("units\\campaignunitstrings.txt",4);
    SetFileType("units\\humanunitfunc.txt",4);
    SetFileType("units\\humanunitstrings.txt",4);
    SetFileType("units\\neutralunitfunc.txt",4);
    SetFileType("units\\neutralunitstrings.txt",4);
    SetFileType("units\\nightelfunitfunc.txt",4);
    SetFileType("units\\nightelfunitstrings.txt",4);
    SetFileType("units\\orcunitfunc.txt",4);
    SetFileType("units\\orcunitstrings.txt",4);
    SetFileType("units\\undeadunitfunc.txt",4);
    SetFileType("units\\undeadunitstrings.txt",4);
    SetFileType("units\\unitabilities.slk",4);
    SetFileType("units\\unitbalance.slk",4);
    SetFileType("units\\unitdata.slk",4);
    SetFileType("units\\unitweapons.slk",4);
    SetFileType("units\\unitui.slk",4);
  }
  if (OPT_ITEM)
  {
    SetFileType("units\\itemdata.slk",4);
    SetFileType("units\\itemfunc.txt",4);
    SetFileType("units\\itemstrings.txt",4);
  }
  if (OPT_DEST)
    SetFileType("units\\destructabledata.slk",4);
  if (OPT_DOOD)
    SetFileType("doodads\\doodads.slk",4);
  if (OPT_ABIL)
  {
    SetFileType("units\\abilitydata.slk",4);
    SetFileType("units\\abilitybuffdata.slk",4);
    SetFileType("units\\campaignabilityfunc.txt",4);
    SetFileType("units\\campaignabilitystrings.txt",4);
    SetFileType("units\\commonabilityfunc.txt",4);
    SetFileType("units\\commonabilitystrings.txt",4);
    SetFileType("units\\humanabilityfunc.txt",4);
    SetFileType("units\\humanabilitystrings.txt",4);
    SetFileType("units\\itemabilityfunc.txt",4);
    SetFileType("units\\itemabilitystrings.txt",4);
    SetFileType("units\\neutralabilityfunc.txt",4);
    SetFileType("units\\neutralabilitystrings.txt",4);
    SetFileType("units\\nightelfabilityfunc.txt",4);
    SetFileType("units\\nightelfabilitystrings.txt",4);
    SetFileType("units\\orcabilityfunc.txt",4);
    SetFileType("units\\orcabilitystrings.txt",4);
    SetFileType("units\\undeadabilityfunc.txt",4);
    SetFileType("units\\undeadabilitystrings.txt",4);
  }
  if (OPT_UPGR)
  {
    SetFileType("units\\campaignupgradefunc.txt",4);
    SetFileType("units\\campaignupgradestrings.txt",4);
    SetFileType("units\\humanupgradefunc.txt",4);
    SetFileType("units\\humanupgradestrings.txt",4);
    SetFileType("units\\neutralupgradefunc.txt",4);
    SetFileType("units\\neutralupgradestrings.txt",4);
    SetFileType("units\\nightelfupgradefunc.txt",4);
    SetFileType("units\\nightelfupgradestrings.txt",4);
    SetFileType("units\\orcupgradefunc.txt",4);
    SetFileType("units\\orcupgradestrings.txt",4);
    SetFileType("units\\undeadupgradefunc.txt",4);
    SetFileType("units\\undeadupgradestrings.txt",4);
    SetFileType("units\\upgradedata.slk",4);
  }
}