Here is one by at ColdCristal @ UCForum.
Code:
DWORD GetFuncLen(DWORD Addr)
{
DWORD Highest = 0;
DWORD Offset = 0;
hde32s disasm;
while (true)
{
DWORD Target = Offset;
hde32_disasm((void*)(Addr+Offset), &disasm);
if ((disasm.opcode>=0x70 && disasm.opcode<=0x7F) || disasm.opcode==0xEB)
{
Target += disasm.len+(char)disasm.imm.imm8;
} else if ((disasm.opcode==0x0F && disasm.opcode2>=0x80 && disasm.opcode2<=0x8F) || disasm.opcode==0xE9) {
Target += disasm.len+(int)disasm.imm.imm32;
} else if (disasm.opcode==0xC3 || disasm.opcode==0xC2) {
if (Offset>Highest)
{
Offset += disasm.len;
break;
}
}
if (Target>Highest)
Highest = Target;
Offset += disasm.len;
}
return Offset;
}
Bookmarks