gahhh this looks awful

This commit is contained in:
rtldg 2025-03-13 05:28:32 +00:00
parent 623632d9b8
commit 13b3a8ec7d

View File

@ -1078,62 +1078,63 @@ namespace SourceHook
} }
} }
if (stackSpace == 0) return 0; if (stackSpace != 0)
{
stackSpace = AlignSize(stackSpace, 16); stackSpace = AlignSize(stackSpace, 16);
m_HookFunc.sub(rsp, stackSpace); m_HookFunc.sub(rsp, stackSpace);
// Actually push registers to stack... // Actually push registers to stack...
reg_index = orig_reg_index; reg_index = orig_reg_index;
floatreg_index = 0; floatreg_index = 0;
std::int32_t stack_offset = 0; std::int32_t stack_offset = 0;
for (int i = 0; i < m_Proto.GetNumOfParams(); i++) { for (int i = 0; i < m_Proto.GetNumOfParams(); i++) {
const auto& info = m_Proto.GetParam(i); const auto& info = m_Proto.GetParam(i);
if (info.type == PassInfo::PassType_Basic) { if (info.type == PassInfo::PassType_Basic) {
if (++reg_index >= num_reg) {
m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset));
m_HookFunc.mov(rax, rax());
m_HookFunc.mov(rsp(stack_offset), rax);
stack_offset += 8;
}
} else if (info.type == PassInfo::PassType_Float) {
if (++floatreg_index >= num_floatreg) {
m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset));
m_HookFunc.mov(rax, rax());
m_HookFunc.mov(rsp(stack_offset), rax);
stack_offset += 8;
}
} else if (info.type == PassInfo::PassType_Object) {
if (info.flags & PassInfo::PassFlag_ByRef) {
if (++reg_index >= num_reg) { if (++reg_index >= num_reg) {
m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset)); m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset));
m_HookFunc.mov(rax, rax()); m_HookFunc.mov(rax, rax());
m_HookFunc.mov(rsp(stack_offset), rax); m_HookFunc.mov(rsp(stack_offset), rax);
stack_offset += 8; stack_offset += 8;
} }
} else { } else if (info.type == PassInfo::PassType_Float) {
if (info.pAssignOperator || info.pCopyCtor) { if (++floatreg_index >= num_floatreg) {
// 1st parameter (this) m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset));
m_HookFunc.lea(rdi, rbp(OffsetToCallerStack + stack_offset)); m_HookFunc.mov(rax, rax());
// 2nd parameter (copy) m_HookFunc.mov(rsp(stack_offset), rax);
m_HookFunc.lea(rsi, rsp(stack_offset)); stack_offset += 8;
// Move address and call }
m_HookFunc.mov(rax, reinterpret_cast<std::uint64_t>( } else if (info.type == PassInfo::PassType_Object) {
info.pAssignOperator ? info.pAssignOperator : info.pCopyCtor)); if (info.flags & PassInfo::PassFlag_ByRef) {
m_HookFunc.call(rax); if (++reg_index >= num_reg) {
} else { m_HookFunc.lea(rax, rbp(OffsetToCallerStack + stack_offset));
// from m_HookFunc.mov(rax, rax());
m_HookFunc.lea(rsi, rbp(OffsetToCallerStack + stack_offset)); m_HookFunc.mov(rsp(stack_offset), rax);
// to stack_offset += 8;
m_HookFunc.lea(rdi, rsp(stack_offset)); }
// size } else {
m_HookFunc.mov(rcx, info.size); if (info.pAssignOperator || info.pCopyCtor) {
// do the copy // 1st parameter (this)
m_HookFunc.rep_movs_bytes(); m_HookFunc.lea(rdi, rbp(OffsetToCallerStack + stack_offset));
// 2nd parameter (copy)
m_HookFunc.lea(rsi, rsp(stack_offset));
// Move address and call
m_HookFunc.mov(rax, reinterpret_cast<std::uint64_t>(
info.pAssignOperator ? info.pAssignOperator : info.pCopyCtor));
m_HookFunc.call(rax);
} else {
// from
m_HookFunc.lea(rsi, rbp(OffsetToCallerStack + stack_offset));
// to
m_HookFunc.lea(rdi, rsp(stack_offset));
// size
m_HookFunc.mov(rcx, info.size);
// do the copy
m_HookFunc.rep_movs_bytes();
}
stack_offset += info.size;
} }
stack_offset += info.size;
} }
} }
} }