| 70 | // Creates a new MPQ archive. |
| 71 | |
| 72 | bool WINAPI SFileCreateArchive(const TCHAR * szMpqName, DWORD dwCreateFlags, DWORD dwMaxFileCount, HANDLE * phMpq) |
| 73 | { |
| 74 | SFILE_CREATE_MPQ CreateInfo; |
| 75 | |
| 76 | // Fill the create structure |
| 77 | memset(&CreateInfo, 0, sizeof(SFILE_CREATE_MPQ)); |
| 78 | CreateInfo.cbSize = sizeof(SFILE_CREATE_MPQ); |
| 79 | CreateInfo.dwMpqVersion = (dwCreateFlags & MPQ_CREATE_ARCHIVE_VMASK) >> FLAGS_TO_FORMAT_SHIFT; |
| 80 | CreateInfo.dwStreamFlags = STREAM_PROVIDER_FLAT | BASE_PROVIDER_FILE; |
| 81 | CreateInfo.dwFileFlags1 = (dwCreateFlags & MPQ_CREATE_LISTFILE) ? MPQ_FILE_DEFAULT_INTERNAL : 0; |
| 82 | CreateInfo.dwFileFlags2 = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? MPQ_FILE_DEFAULT_INTERNAL : 0; |
| 83 | CreateInfo.dwFileFlags3 = (dwCreateFlags & MPQ_CREATE_SIGNATURE) ? MPQ_FILE_DEFAULT_INTERNAL : 0; |
| 84 | CreateInfo.dwAttrFlags = (dwCreateFlags & MPQ_CREATE_ATTRIBUTES) ? (MPQ_ATTRIBUTE_CRC32 | MPQ_ATTRIBUTE_FILETIME | MPQ_ATTRIBUTE_MD5) : 0; |
| 85 | CreateInfo.dwSectorSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_3) ? 0x4000 : 0x1000; |
| 86 | CreateInfo.dwRawChunkSize = (CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_4) ? 0x4000 : 0; |
| 87 | CreateInfo.dwMaxFileCount = dwMaxFileCount; |
| 88 | |
| 89 | // Set the proper attribute parts |
| 90 | if((CreateInfo.dwMpqVersion >= MPQ_FORMAT_VERSION_3) && (dwCreateFlags & MPQ_CREATE_ATTRIBUTES)) |
| 91 | CreateInfo.dwAttrFlags |= MPQ_ATTRIBUTE_PATCH_BIT; |
| 92 | |
| 93 | // Backward compatibility: SFileCreateArchive always used to add (listfile) |
| 94 | // We would break loads of applications if we change that |
| 95 | CreateInfo.dwFileFlags1 = MPQ_FILE_DEFAULT_INTERNAL; |
| 96 | |
| 97 | // Let the main function create the archive |
| 98 | return SFileCreateArchive2(szMpqName, &CreateInfo, phMpq); |
| 99 | } |
| 100 | |
| 101 | bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCreateInfo, HANDLE * phMpq) |
| 102 | { |