fix(iw9): new xhash opcodes & thread calls
This commit is contained in:
parent
bff02e6a75
commit
7357fef577
@ -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:
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user