Originally Posted by
nitrogrlie
I see, I am going to have to check on something when i get home from work because I'm starting to think that what I refer to as the VFTable is different from what people here seem to mean. I call the VFTable the virtual function table that exists in each object that inherits virtual functions from a parent class and comprises the first (or more if inheriting from more than one class) DWORD(s) of that class.
For example, the pointer to the CPlayer class in WoW has a pointer to it's VFTable as its first entry. So if you call GetObjectByGUID() with your player's guid as the argument you get back a pointer where the first DWORD is a ptr to the VFTable for that class type. The 10th & 11th entry in that table point to the GetPosition() and GetOrientation() respectively. The 51st entry doesn't point to a function that is GetName() as far as my testing showed. Rather it is the 48th entry.
It seems to me that what people call the table here is with regards to some function lookup table (probably inline - aka fastcall). If that is not correct, can someone please explain because then I'm clearly confused.
You're obviously reversing things wrong. (Hint: nullsubs ARE considered virtual funcs)
Here's some of the current CGPlayer_C vtable (some funcs un-named, etc... laziness ftw)
Code:
.rdata:009E6C70 off_9E6C70 dd offset CGPlayer_C__destructor
.rdata:009E6C74 dd offset CGPlayer_C__Disable
.rdata:009E6C78 dd offset sub_65DA10
.rdata:009E6C7C dd offset CGPlayer_C_virt0C
.rdata:009E6C80 dd offset nullsub_5
.rdata:009E6C84 dd offset CGUnit_C_virt10
.rdata:009E6C88 dd offset sub_68D1C0
.rdata:009E6C8C dd offset nullsub_5
.rdata:009E6C90 dd offset sub_698530
.rdata:009E6C94 dd offset sub_65ED20
.rdata:009E6C98 dd offset CGUnit_C__GetPosition
.rdata:009E6C9C dd offset sub_65EC60
.rdata:009E6CA0 dd offset sub_65EC90
.rdata:009E6CA4 dd offset sub_65ECB0
.rdata:009E6CA8 dd offset CGObject_C__GetScale
.rdata:009E6CAC dd offset sub_65ECC0
.rdata:009E6CB0 dd offset CGObject_C_GetModel
.rdata:009E6CB4 dd offset CGUnit_C__CanGossip
.rdata:009E6CB8 dd offset CGUnit_C_virt38
.rdata:009E6CBC dd offset CGUnit_C_virt3C
.rdata:009E6CC0 dd offset sub_6916C0
.rdata:009E6CC4 dd offset sub_691770
.rdata:009E6CC8 dd offset CGUnit_C_virt40
.rdata:009E6CCC dd offset CGUnit_C_virt48
.rdata:009E6CD0 dd offset CGUnit_C_virt4C
.rdata:009E6CD4 dd offset CGUnit_C_virt50
.rdata:009E6CD8 dd offset CGUnit_C_virt54
.rdata:009E6CDC dd offset CGUnit_C_virt58
.rdata:009E6CE0 dd offset CGUnit_C_virt5C
.rdata:009E6CE4 dd offset sub_694970
.rdata:009E6CE8 dd offset CGUnit_C_virt64
.rdata:009E6CEC dd offset CGPlayer_C__PreAnimate
.rdata:009E6CF0 dd offset CGUnit_C__GetWorldMatrix
.rdata:009E6CF4 dd offset CGPlayer_C__ShouldRender
.rdata:009E6CF8 dd offset CGUnit_C_virt74
.rdata:009E6CFC dd offset CGUnit_C_virt78
.rdata:009E6D00 dd offset CGObject_C_virt18
.rdata:009E6D04 dd offset CGObject_C_virt54
.rdata:009E6D08 dd offset CGUnit_C_virt84
.rdata:009E6D0C dd offset sub_65EC10
.rdata:009E6D10 dd offset lua_CloseGuildRoster
.rdata:009E6D14 dd offset CGUnit_C__OnRightClick
.rdata:009E6D18 dd offset sub_65EC20
.rdata:009E6D1C dd offset CGUnit_C_virt98
.rdata:009E6D20 dd offset CGUnit_C_virt9C
.rdata:009E6D24 dd offset CGUnit_C_virtA0
.rdata:009E6D28 dd offset CGUnit_C_virtA4
.rdata:009E6D2C dd offset CGUnit_C_virtB0
.rdata:009E6D30 dd offset CGUnit_C_virtB4
.rdata:009E6D34 dd offset CGUnit_C_virtB8
.rdata:009E6D38 dd offset sub_65ECD0
.rdata:009E6D3C dd offset CGUnit_C__GetObjectName
.rdata:009E6D40 dd offset CGObject_C_virt54
.rdata:009E6D44 dd offset sub_6C2630
.rdata:009E6D48 dd offset CGUnit_C_virtA8
.rdata:009E6D4C dd offset sub_68E080
.rdata:009E6D50 dd offset CGUnit_C_virtCC
.rdata:009E6D54 dd offset sub_684480
.rdata:009E6D58 dd offset sub_6C2610
.rdata:009E6D5C dd offset CGUnit_C_virtE4
.rdata:009E6D60 dd offset sub_6B4E50
.rdata:009E6D64 dd offset sub_6B0FB0
.rdata:009E6D68 dd offset sub_6A2F20
.rdata:009E6D6C dd offset CGPlayer_C__GetAFKText
.rdata:009E6D70 dd offset CGPlayer_C__GetDNDText
.rdata:009E6D74 dd offset CGPlayer_C__GetGMText
.rdata:009E6D78 dd offset CGPlayer_C_virtF4
.rdata:009E6D7C dd offset CGPlayer_C_virtF8
.rdata:009E6D80 dd offset CGPlayer_C_virtFC
.rdata:009E6D84 dd offset CGPlayer_C_virt100
.rdata:009E6D88 dd offset sub_653AE0
.rdata:009E6D8C dd offset CGPlayer_C_virt108
.rdata:009E6D90 dd offset CGPlayer_C_virt10C
.rdata:009E6D94 dd offset CGPlayer_C_virt110
.rdata:009E6D98 dd offset sub_64F3C0
.rdata:009E6D9C dd offset CGPlayer_C_virt118
.rdata:009E6DA0 dd offset sub_658460
.rdata:009E6DA4 dd offset sub_65A730
.rdata:009E6DA8 dd offset CGPlayer_C_virt124
.rdata:009E6DAC dd offset sub_65ED10
.rdata:009E6DB0 dd offset sub_65ED20
Go ahead... count them... then come back and tell me you're still right.