ServiceArgumentParser(DWORD argc, const LPSTR* argv) { if (argc > 1) { for (DWORD i = 0; i < argc; i++) { args_.push_back(argv[i]); } owns_argv_ptrs_ = false; } else { int wargc = 0; LPWSTR* wargv = ::CommandLineToArgvW(::GetCommandLineW(), &wargc); if (wargv != nullptr) { for (int i = 0; i < wargc; i++) { LPSTR arg = toMBString(wargv[i]); // On error, bail out and clean up the vector if (arg == nullptr) { cleanArgs(); ::LocalFree(wargv); break; } args_.push_back(arg); } owns_argv_ptrs_ = true; ::LocalFree(wargv); } } }
static bool recordAndWriteEntries(NexasPackage* package, bool isBfeFormat) { package->indexes = newByteArray(package->header->entryCount * sizeof(IndexEntry)); IndexEntry* indexes = (IndexEntry*)baData(package->indexes); u32 i = 0; u32 offset = 12; if (isBfeFormat) { /// This PAC Variant puts index first, but now we do not know /// the index, so we reserve the space. u32 len = baLength(package->indexes); for (u32 i = 0; i < len; ++i) { if (fputc('\0', package->file) == EOF) { writeLog(LOG_QUIET, L"ERROR: Unable to reserve space for the index!"); return false; } } offset += len; } struct _wfinddata_t foundFile; intptr_t handle = _wfindfirst(L"*", &foundFile); int status = 0; while (status == 0) { if ((foundFile.attrib & _A_SUBDIR) == 0) { char* fname = toMBString(foundFile.name, L"japanese"); if (strlen(fname) >= 64) { writeLog(LOG_QUIET, L"ERROR: Entry %u: %s, The file name is too long!", i, foundFile.name); free(fname); return false; } strncpy(indexes[i].name, fname, 64); free(fname); indexes[i].encodedLen = foundFile.size; indexes[i].decodedLen = foundFile.size; indexes[i].offset = offset; writeLog(LOG_VERBOSE, L"Entry %u: %s, Offset: %u, OLen: %u", i, foundFile.name, indexes[i].offset, indexes[i].decodedLen); FILE* infile = _wfopen(foundFile.name, L"rb"); byte* decodedData = malloc(indexes[i].decodedLen); if (fread(decodedData, 1, indexes[i].decodedLen, infile) != indexes[i].decodedLen) { writeLog(LOG_QUIET, L"ERROR: Entry %u: %s, Unable to read the file!", i, foundFile.name); free(decodedData); fclose(infile); return false; } fclose(infile); byte* encodedData = NULL; ByteArray* encodedArray = NULL; if (isBfeFormat) { encodedArray = lzssEncode(decodedData, indexes[i].decodedLen); encodedData = baData(encodedArray); indexes[i].encodedLen = baLength(encodedArray); } else if (shouldZip(foundFile.name)) { encodedData = malloc(indexes[i].decodedLen); unsigned long len = indexes[i].encodedLen; if (compress(encodedData, &len, decodedData, indexes[i].decodedLen) != Z_OK) { free(encodedData); free(decodedData); return false; } indexes[i].encodedLen = len; writeLog(LOG_VERBOSE, L"Entry %u is compressed: ELen: %u", i, len); } else { encodedData = decodedData; } offset += indexes[i].encodedLen; writeLog(LOG_VERBOSE, L"Entry %u: ELen: %u", i, indexes[i].encodedLen); if (fwrite(encodedData, 1, indexes[i].encodedLen, package->file) != indexes[i].encodedLen) { writeLog(LOG_QUIET, L"ERROR: Entry %u: %s, Unable to write to the package!", i, foundFile.name); if (encodedArray != NULL) { deleteByteArray(encodedArray); } else if (encodedData != decodedData) { free(encodedData); } free(decodedData); return false; } if (encodedArray != NULL) { deleteByteArray(encodedArray); } else if (encodedData != decodedData) { free(encodedData); } free(decodedData); writeLog(LOG_NORMAL, L"Packed: Entry %u: %s.", i, foundFile.name); ++i; } status = _wfindnext(handle, &foundFile); } _findclose(handle); return true; }