Exemple #1
0
void do_assumptions (struct app_options *opt)
{
	/* Adaption handling */
	/* '-D 1 -A' --> '-D 1', '-S -A' --> '-S' */
	if ((opt->disc_str && opt->disc_str[0] != '5') || opt->run_scanmem)
		opt->do_adapt = false;

	if (opt->do_adapt) {
		/* '-A' --> '-A -D 5' */
		if (!opt->disc_str)
			opt->disc_str = (char *) "5";
		/* '-P libmemhack*' -> '' */
		if (opt->preload_lib && strncmp(opt->preload_lib, LHACK_PRE,
		    sizeof(LHACK_PRE) - 1) == 0)
			opt->preload_lib = NULL;
	}

	/* Preloading/Starting handling */
	if (!opt->preload_lib) {
		/* '-D <str>' --> '-D <str> -P libmemdisc32/64.so' */
		if (opt->disc_str) {
			use_libmemdisc(opt);
		/* '-S' --> '-S -P libmemhack32/64.so',
		 * '--glc' --> '--glc -P libmemhack32/64.so' */
		} else if (opt->run_scanmem || opt->pre_cmd) {
			use_libmemhack(opt);
		}
	/* '-P libmemhack32/64.so -D <str>' -->
	   '-D <str> -P libmemdisc32/64.so' */
	} else if (opt->disc_str && strncmp(opt->preload_lib, LHACK_PRE,
	    sizeof(LHACK_PRE) - 1) == 0) {
		use_libmemdisc(opt);
	}
}
Exemple #2
0
i32 take_over_config (struct app_options *opt, list<CfgEntry> *cfg,
		       vector<string> *lines)
{
	list<CfgEntry>::iterator cfg_it;
	DynMemEntry *tmp = NULL;
	u32 lnr;
	i32 ret = 0;

	list_for_each (cfg, cfg_it) {
		if (!cfg_it->dynmem || cfg_it->dynmem == tmp)
			continue;
		tmp = cfg_it->dynmem;
		tmp->mem_size = tmp->adp_size;
		tmp->code_addr = tmp->adp_addr;
		if (tmp->adp_soffs)
			tmp->stack_offs = tmp->adp_soffs;
		lnr = tmp->cfg_line;
		lines->at(lnr) = "dynmemstart " + tmp->name + " "
			+ to_string(tmp->mem_size) + " 0x"
			+ to_xstring(tmp->code_addr) + " 0x"
			+ to_xstring(tmp->stack_offs);
	}
	// Adaption isn't required anymore
	lnr = opt->adp_req_line;
	if (lnr > 0)
		lines->at(lnr) = "adapt_required 0";

	// Write back config
	cout << "Writing back config.." << endl;
	ret = write_config_vect(opt->cfg_path, lines);
	if (ret)
		return ret;

	// Run game with libmemhack
	opt->do_adapt = false;
	opt->disc_str = NULL;
	use_libmemhack(opt);

	return ret;
}
Exemple #3
0
/*
 * parses the command-line options
 */
void parse_options (i32 argc, char **argv, struct app_options *opt)
{
	i32 ch = -1, prev_ch = -1, opt_idx = 0;

	if (argc < 2)
		usage();

	init_options(opt);

	while (true) {
		prev_ch = ch;
		ch = getopt_long (argc, argv, short_options,
				  long_options, &opt_idx);
		if (ch < 0)
			break;

		switch (ch) {
		case 'h':
			usage();
			break;
		case 'V':
			printf(PACKAGE_STRING " (%s %s)\n\nPlease report "
				"bugs to " PACKAGE_BUGREPORT "!\n",
				__DATE__, __TIME__);
			exit(0);
		case 'A':
			opt->do_adapt = true;
			break;
		case 'D':
			if (optind == argc || !optarg)
				opt->disc_str = (char *) "2";
			else
				opt->disc_str = optarg;
			break;
		case 'P':
			if (optind == argc || !optarg)
				use_libmemhack(opt);
			else
				opt->preload_lib = optarg;
			break;
		case 'S':
			opt->run_scanmem = true;
			break;
		case PreCmd:
			opt->pre_cmd = optarg;
			break;
		case Glc:
			if (optind == argc || !optarg)
				opt->pre_cmd = "";
			else
				opt->pre_cmd = optarg;
			opt->use_glc = true;
			break;
		TESTING_OPT_PARSING
		default:  /* unknown option */
			if (optind != argc) {
				/* optional argument handling */
				switch (prev_ch) {
				case 'D':
					opt->disc_str = argv[optind - 1];
					break;
				case 'P':
					opt->preload_lib = argv[optind - 1];
					break;
				case Glc:
					opt->pre_cmd = argv[optind - 1];
					break;
				default:
					usage();
					break;
				}
			} else {
				opt->cfg_path = argv[optind - 1];
			}
			break;
		}
	}
	if (!opt->cfg_path)
	       usage();

	do_assumptions(opt);
}