Example #1
0
  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);
      }
    }
  }
Example #2
0
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;
}