diff --git a/DynamicHooks/conventions/x86MsCdecl.cpp b/DynamicHooks/conventions/x86MsCdecl.cpp index bf8c834..85ff3e4 100644 --- a/DynamicHooks/conventions/x86MsCdecl.cpp +++ b/DynamicHooks/conventions/x86MsCdecl.cpp @@ -129,6 +129,9 @@ int x86MsCdecl::GetArgRegisterSize() void* x86MsCdecl::GetArgumentPtr(int iIndex, CRegisters* pRegisters) { + if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) + return NULL; + // Check if this argument was passed in a register. if (m_vecArgTypes[iIndex].custom_register != None) { diff --git a/DynamicHooks/conventions/x86MsStdcall.cpp b/DynamicHooks/conventions/x86MsStdcall.cpp index d0d9777..827db59 100644 --- a/DynamicHooks/conventions/x86MsStdcall.cpp +++ b/DynamicHooks/conventions/x86MsStdcall.cpp @@ -137,6 +137,9 @@ int x86MsStdcall::GetArgRegisterSize() void* x86MsStdcall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) { + if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) + return NULL; + // Check if this argument was passed in a register. if (m_vecArgTypes[iIndex].custom_register != None) { diff --git a/DynamicHooks/conventions/x86MsThiscall.cpp b/DynamicHooks/conventions/x86MsThiscall.cpp index 275715a..8bce46f 100644 --- a/DynamicHooks/conventions/x86MsThiscall.cpp +++ b/DynamicHooks/conventions/x86MsThiscall.cpp @@ -150,11 +150,17 @@ void* x86MsThiscall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) // TODO: Allow custom this register. return pRegisters->m_ecx->m_pAddress; } + + // The this pointer isn't explicitly defined as an argument. + iIndex--; + + if (iIndex < 0 || iIndex >= m_vecArgTypes.length()) + return NULL; // Check if this argument was passed in a register. - if (m_vecArgTypes[iIndex-1].custom_register != None) + if (m_vecArgTypes[iIndex].custom_register != None) { - CRegister *pRegister = pRegisters->GetRegister(m_vecArgTypes[iIndex-1].custom_register); + CRegister *pRegister = pRegisters->GetRegister(m_vecArgTypes[iIndex].custom_register); if (!pRegister) return NULL; @@ -162,7 +168,7 @@ void* x86MsThiscall::GetArgumentPtr(int iIndex, CRegisters* pRegisters) } int iOffset = 4; - for(int i=0; i < iIndex-1; i++) + for(int i=0; i < iIndex; i++) { if (m_vecArgTypes[i].custom_register == None) iOffset += m_vecArgTypes[i].size;