fix(iw9): new xhash opcodes & thread calls

This commit is contained in:
xensik 2022-11-16 23:44:32 +01:00
parent bff02e6a75
commit 7357fef577
4 changed files with 26 additions and 19 deletions

View File

@ -1360,6 +1360,17 @@ void decompiler::decompile_instruction(const instruction::ptr& inst)
case opcode::OP_CastFieldObject: case opcode::OP_CastFieldObject:
case opcode::OP_CastBool: case opcode::OP_CastBool:
break; break;
case opcode::OP_unk_134: // eval something
case opcode::OP_unk_133: // eval something
case opcode::OP_unk_135: // eval something
case opcode::OP_unk_136: // OP_GetDvar
case opcode::OP_unk_137: // eval something
case opcode::OP_unk_138: // eval something
{
auto node = std::make_unique<ast::expr_string>(loc, utils::string::va("data_%s", inst->data[0].data()));
stack_.push(std::move(node));
break;
}
// case opcode::OP_ClearVariableField // case opcode::OP_ClearVariableField
// case opcode::OP_EvalNewLocalVariableRefCached0 // case opcode::OP_EvalNewLocalVariableRefCached0
default: default:

View File

@ -130,6 +130,7 @@ void disassembler::dissasemble_instruction(const instruction::ptr& inst)
case opcode::OP_EvalLocalVariableCached5: case opcode::OP_EvalLocalVariableCached5:
case opcode::OP_ScriptMethodCallPointer: case opcode::OP_ScriptMethodCallPointer:
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
case opcode::OP_waittillmatch2:
case opcode::OP_minus: case opcode::OP_minus:
case opcode::OP_greater_equal: case opcode::OP_greater_equal:
case opcode::OP_vector: case opcode::OP_vector:
@ -161,7 +162,6 @@ void disassembler::dissasemble_instruction(const instruction::ptr& inst)
case opcode::OP_voidCodepos: case opcode::OP_voidCodepos:
case opcode::OP_inequality: case opcode::OP_inequality:
case opcode::OP_bit_ex_or: case opcode::OP_bit_ex_or:
case opcode::OP_unk_139:
case opcode::OP_BoolNotAfterAnd: case opcode::OP_BoolNotAfterAnd:
case opcode::OP_IsDefined: case opcode::OP_IsDefined:
case opcode::OP_IsTrue: case opcode::OP_IsTrue:
@ -200,7 +200,6 @@ void disassembler::dissasemble_instruction(const instruction::ptr& inst)
inst->data.push_back(utils::string::quote(stack_->read_c_string(), false)); inst->data.push_back(utils::string::quote(stack_->read_c_string(), false));
break; break;
case opcode::OP_waittillmatch: case opcode::OP_waittillmatch:
inst->data.push_back(utils::string::va("%i", script_->read<std::uint8_t>()));
inst->data.push_back(utils::string::va("%i", script_->read<std::uint8_t>())); inst->data.push_back(utils::string::va("%i", script_->read<std::uint8_t>()));
break; break;
case opcode::OP_EvalSelfFieldVariableRef: case opcode::OP_EvalSelfFieldVariableRef:
@ -294,7 +293,7 @@ void disassembler::dissasemble_instruction(const instruction::ptr& inst)
case opcode::OP_SetNewLocalVariableFieldCached0_Precompiled: case opcode::OP_SetNewLocalVariableFieldCached0_Precompiled:
case opcode::OP_CreateLocalVariable_Precompiled: case opcode::OP_CreateLocalVariable_Precompiled:
case opcode::OP_SafeCreateVariableFieldCached_Precompiled: case opcode::OP_SafeCreateVariableFieldCached_Precompiled:
script_->seek(8); // TODO: skipped data inst->data.push_back(resolver::hash_name(script_->read<std::uint64_t>()));
break;*/ break;*/
case opcode::OP_NativeGetFarFunction: case opcode::OP_NativeGetFarFunction:
case opcode::OP_NativeFarFunctionCall: case opcode::OP_NativeFarFunctionCall:
@ -311,15 +310,15 @@ void disassembler::dissasemble_instruction(const instruction::ptr& inst)
case opcode::OP_FormalParams_Precompiled: case opcode::OP_FormalParams_Precompiled:
disassemble_formal_params(inst); disassemble_formal_params(inst);
break; break;
case opcode::OP_unk_134: case opcode::OP_unk_134: // eval xhash
case opcode::OP_unk_137: case opcode::OP_unk_137: // eval something
script_->seek(4); inst->data.push_back(utils::string::va("%08X", script_->read<std::uint32_t>()));
break; break;
case opcode::OP_unk_133: // eval something case opcode::OP_unk_133: // eval xhash
case opcode::OP_unk_135: case opcode::OP_unk_135: // eval xhash
case opcode::OP_unk_136: case opcode::OP_unk_136: // eval xhash OP_GetDvar?
case opcode::OP_unk_138: case opcode::OP_unk_138: // eval something
inst->data.push_back(resolver::hash_name(script_->read<std::uint64_t>())); inst->data.push_back(utils::string::va("%016llX", script_->read<std::uint64_t>()));
break; break;
default: default:
throw disasm_error(utils::string::va("unhandled opcode 0x%X at index '%04X'!", inst->opcode, inst->index)); throw disasm_error(utils::string::va("unhandled opcode 0x%X at index '%04X'!", inst->opcode, inst->index));
@ -385,14 +384,13 @@ void disassembler::disassemble_far_call(const instruction::ptr& inst, bool threa
if (file == 0) if (file == 0)
{ {
inst->data.emplace(inst->data.begin(), utils::string::va("%X", inst->index + 1 + offs));
inst->data.emplace(inst->data.begin(), ""); inst->data.emplace(inst->data.begin(), "");
inst->data.push_back(utils::string::va("%X", offs + inst->index + 1));
} }
else else
{ {
inst->data.emplace(inst->data.begin(), resolver::hash_name(file));
inst->data.emplace(inst->data.begin(), resolver::hash_name(name)); inst->data.emplace(inst->data.begin(), resolver::hash_name(name));
inst->data.emplace(inst->data.begin(), resolver::hash_name(file));
} }
} }

View File

@ -49,6 +49,7 @@ auto opcode_size(std::uint8_t id) -> std::uint32_t
case opcode::OP_EvalLocalVariableCached5: case opcode::OP_EvalLocalVariableCached5:
case opcode::OP_ScriptMethodCallPointer: case opcode::OP_ScriptMethodCallPointer:
case opcode::OP_checkclearparams: case opcode::OP_checkclearparams:
case opcode::OP_waittillmatch2:
case opcode::OP_minus: case opcode::OP_minus:
case opcode::OP_greater_equal: case opcode::OP_greater_equal:
case opcode::OP_vector: case opcode::OP_vector:
@ -80,13 +81,13 @@ auto opcode_size(std::uint8_t id) -> std::uint32_t
case opcode::OP_voidCodepos: case opcode::OP_voidCodepos:
case opcode::OP_inequality: case opcode::OP_inequality:
case opcode::OP_bit_ex_or: case opcode::OP_bit_ex_or:
case opcode::OP_unk_139:
case opcode::OP_BoolNotAfterAnd: case opcode::OP_BoolNotAfterAnd:
case opcode::OP_IsDefined: case opcode::OP_IsDefined:
case opcode::OP_IsTrue: case opcode::OP_IsTrue:
return 1; return 1;
case opcode::OP_SetLocalVariableFieldCached: case opcode::OP_SetLocalVariableFieldCached:
case opcode::OP_RemoveLocalVariables: case opcode::OP_RemoveLocalVariables:
case opcode::OP_waittillmatch:
case opcode::OP_ScriptMethodChildThreadCallPointer: case opcode::OP_ScriptMethodChildThreadCallPointer:
case opcode::OP_GetByte: case opcode::OP_GetByte:
case opcode::OP_SafeSetWaittillVariableFieldCached: case opcode::OP_SafeSetWaittillVariableFieldCached:
@ -108,7 +109,6 @@ auto opcode_size(std::uint8_t id) -> std::uint32_t
case opcode::OP_FormalParams: case opcode::OP_FormalParams:
case opcode::OP_FormalParams_Precompiled: case opcode::OP_FormalParams_Precompiled:
return 2; return 2;
case opcode::OP_waittillmatch:
case opcode::OP_JumpOnTrue: case opcode::OP_JumpOnTrue:
case opcode::OP_JumpOnFalseExpr: case opcode::OP_JumpOnFalseExpr:
case opcode::OP_jumpback: case opcode::OP_jumpback:
@ -177,9 +177,9 @@ auto opcode_size(std::uint8_t id) -> std::uint32_t
return 9; return 9;
case opcode::OP_GetVector: case opcode::OP_GetVector:
return 13; return 13;
case opcode::OP_waittillmatch2:
case opcode::OP_ClearVariableField: case opcode::OP_ClearVariableField:
case opcode::OP_EvalNewLocalVariableRefCached0: case opcode::OP_EvalNewLocalVariableRefCached0:
case opcode::OP_unk_139:
case opcode::OP_unk_140: case opcode::OP_unk_140:
case opcode::OP_unk_141: case opcode::OP_unk_141:
case opcode::OP_unk_142: case opcode::OP_unk_142:

View File

@ -251,8 +251,6 @@ auto resolver::hash_id(const std::string& name) -> std::uint64_t
{ {
byte += 32; byte += 32;
} }
printf("%c", byte);
hash = (uint64_t)0x10000000233 * ((uint64_t)byte ^ hash); hash = (uint64_t)0x10000000233 * ((uint64_t)byte ^ hash);
} }