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