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; }
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; }
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; }
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; }
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; }
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; }
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); } }