Skip to content

Instantly share code, notes, and snippets.

@cairthenn
Created February 8, 2022 16:18
Show Gist options
  • Save cairthenn/21227b53b624c4e5b7f251b77507f57a to your computer and use it in GitHub Desktop.
Save cairthenn/21227b53b624c4e5b7f251b77507f57a to your computer and use it in GitHub Desktop.
FFXIV action usage assembly commenting
# To better understand how actions are handled in XIV, I decided to step-by-step comment thru the assembly
# Was this useful? Well. To each their own.
# Where the function keeps some stuff for a lot of the time:
r12 : location, Vector3* if called with resolvable target, otherwise bool*
rbp : target
eax : action id
r15 : action type
rdi : action manager pointer
# save register stack location
rsi : rsp + 0x80
r13 : rsp + 0x88
r14 : rsp + 0x98
# known stack
rsp + 0xA0 : param
rsp + 0xA8 : origin
rsp + 0xB0 : unk_param
rsp + 0xB8 : location
ffxiv_dx11.exe+7EA6A0 - 4C 8B A4 24 B8000000 - mov r12,[rsp+000000B8] # Moves location arg to r12
ffxiv_dx11.exe+7EA6A8 - 49 8B E9 - mov rbp,r9 # target to rbp
ffxiv_dx11.exe+7EA6AB - 41 8B C0 - mov eax,r8d # action id to eax
ffxiv_dx11.exe+7EA6AE - 44 8B FA - mov r15d,edx # action type to r15
ffxiv_dx11.exe+7EA6B1 - 48 8B F9 - mov rdi,rcx # action manager pointer to rdi
ffxiv_dx11.exe+7EA6B4 - 4D 85 E4 - test r12,r12 #
ffxiv_dx11.exe+7EA6B7 - 74 05 - je ffxiv_dx11.exe+7EA6BE # Label A
ffxiv_dx11.exe+7EA6B9 - 41 C6 04 24 00 - mov byte ptr [r12],00 # Zero it out
A: ffxiv_dx11.exe+7EA6BE - 83 BC 24 A8000000 01 - cmp dword ptr [rsp+000000A8],01 # Check if the action is origin 1 (queue)
ffxiv_dx11.exe+7EA6C6 - 8B D8 - mov ebx,eax # Move action ID to ebx
ffxiv_dx11.exe+7EA6C8 - 74 14 - je ffxiv_dx11.exe+7EA6DE # Label B if origin is queue
ffxiv_dx11.exe+7EA6CA - 80 79 68 00 - cmp byte ptr [rcx+68],00 # Check action manager + 0x68 == 0. This is essentially a bool that says something is queued
ffxiv_dx11.exe+7EA6CE - 74 0E - je ffxiv_dx11.exe+7EA6DE # Label B if nothing in queue
ffxiv_dx11.exe+7EA6D0 - 32 C0 - xor al,al # Return value = false (0)
ffxiv_dx11.exe+7EA6D2 - 48 83 C4 50 - add rsp,50 # Restore stack
ffxiv_dx11.exe+7EA6D6 - 41 5F - pop r15
ffxiv_dx11.exe+7EA6D8 - 41 5C - pop r12
ffxiv_dx11.exe+7EA6DA - 5F - pop rdi
ffxiv_dx11.exe+7EA6DB - 5D - pop rbp
ffxiv_dx11.exe+7EA6DC - 5B - pop rbx
ffxiv_dx11.exe+7EA6DD - C3 - ret # Origin was not queue and there was something in the queue, return early
B: ffxiv_dx11.exe+7EA6DE - 48 89 B4 24 80000000 - mov [rsp+00000080],rsi # RSI first use, preserve value on stack
ffxiv_dx11.exe+7EA6E6 - 48 8B 35 03566901 - mov rsi,[ffxiv_dx11.exe+1E7FCF0] # Gets player game object into RSI
ffxiv_dx11.exe+7EA6ED - 48 89 B4 24 B8000000 - mov [rsp+000000B8],rsi
ffxiv_dx11.exe+7EA6F5 - 48 85 F6 - test rsi,rsi # Check if it's a null pointer
ffxiv_dx11.exe+7EA6F8 - 75 07 - jne ffxiv_dx11.exe+7EA701 # Label C if location is not null
ffxiv_dx11.exe+7EA6FA - 32 C0 - xor al,al # return value = 0 (false)
ffxiv_dx11.exe+7EA6FC - E9 B0050000 - jmp ffxiv_dx11.exe+7EACB1 # This jumps to an early return which restores RSI
C: ffxiv_dx11.exe+7EA701 - 4C 89 AC 24 88000000 - mov [rsp+00000088],r13 # r13 first use, preserve value on stack
ffxiv_dx11.exe+7EA709 - 8B D0 - mov edx,eax # action ID to edx
ffxiv_dx11.exe+7EA70B - 41 8B CF - mov ecx,r15d # action type to ecx
ffxiv_dx11.exe+7EA70E - 4C 89 B4 24 98000000 - mov [rsp+00000098],r14 # preserve r14 on the stack
ffxiv_dx11.exe+7EA716 - E8 2556FFFF - call ffxiv_dx11.exe+7DFD40 # uint UnknownFunction(action type, action id); returns new action ID, helps with mounting and such
ffxiv_dx11.exe+7EA71B - 44 8B F0 - mov r14d,eax # Return value to r14
ffxiv_dx11.exe+7EA71E - 41 83 FF 01 - cmp r15d,01 # Check if action type is 1
ffxiv_dx11.exe+7EA722 - 75 0F - jne ffxiv_dx11.exe+7EA733 # Label D if action type isn't 1
ffxiv_dx11.exe+7EA724 - 8B D0 - mov edx,eax # action ID to edx
ffxiv_dx11.exe+7EA726 - 48 8B CF - mov rcx,rdi # action manager this ptr to rcx
ffxiv_dx11.exe+7EA729 - E8 62EDFFFF - call ffxiv_dx11.exe+7E9490 # uint ActionManager.GetUpgradedActionID(action id);
ffxiv_dx11.exe+7EA72E - 44 8B F0 - mov r14d,eax # return value to r14
ffxiv_dx11.exe+7EA731 - 8B D8 - mov ebx,eax # upgraded action ID to ebx
D: ffxiv_dx11.exe+7EA733 - 41 8B CE - mov ecx,r14d # Either comes from directly above or before the jump
ffxiv_dx11.exe+7EA736 - E8 D503EAFF - call ffxiv_dx11.exe+68AB10 # Get's the action resource *******************************************
ffxiv_dx11.exe+7EA73B - 4C 8B E8 - mov r13,rax # puts resource pointer in r13
ffxiv_dx11.exe+7EA73E - 48 85 C0 - test rax,rax # checks if the resource was null
ffxiv_dx11.exe+7EA741 - 0F84 1B020000 - je ffxiv_dx11.exe+7EA962 # Jumps to an early return with a ret value of false
ffxiv_dx11.exe+7EA747 - 41 83 FE 04 - cmp r14d,04 # Check if upgraded action ID is 4 (mounting)
ffxiv_dx11.exe+7EA74B - 75 42 - jne ffxiv_dx11.exe+7EA78F # Label F if not mounting
# Mount specific code
ffxiv_dx11.exe+7EA74D - 48 8B CE - mov rcx,rsi # Player game object -> rcx
ffxiv_dx11.exe+7EA750 - E8 7B33F0FF - call ffxiv_dx11.exe+6EDAD0 # returns player game object + 0xC38, which is your current mount
ffxiv_dx11.exe+7EA755 - 66 85 C0 - test ax,ax # Check if return if 0
ffxiv_dx11.exe+7EA758 - 74 4E - je ffxiv_dx11.exe+7EA7A8 # Label G if return is 0 (not mounted)
# Dismount stuff
ffxiv_dx11.exe+7EA75A - 48 8B CE - mov rcx,rsi
ffxiv_dx11.exe+7EA75D - E8 6E33F0FF - call ffxiv_dx11.exe+6EDAD0 # Gets the mount again
ffxiv_dx11.exe+7EA762 - 0FB7 C8 - movzx ecx,ax # Moves mount ID to ECX
ffxiv_dx11.exe+7EA765 - E8 3626EAFF - call ffxiv_dx11.exe+68CDA0 # IntPtr GetMountResource(mount id);
ffxiv_dx11.exe+7EA76A - 48 85 C0 - test rax,rax #
ffxiv_dx11.exe+7EA76D - 0F84 EF010000 - je ffxiv_dx11.exe+7EA962 # If it's null, early return 0 (false)
ffxiv_dx11.exe+7EA773 - 66 83 78 38 00 - cmp word ptr [rax+38],00 # Check resource + 0x38
ffxiv_dx11.exe+7EA778 - 7C 2E - jl ffxiv_dx11.exe+7EA7A8 # If the value is less than 0, go to label G
E: ffxiv_dx11.exe+7EA77A - 33 D2 - xor edx,edx # Set edx = 0
ffxiv_dx11.exe+7EA77C - 48 8D 0D 7DE06B01 - lea rcx,[ffxiv_dx11.exe+1EA8800] # Get static function
ffxiv_dx11.exe+7EA783 - E8 88FFFCFF - call ffxiv_dx11.exe+7BA710 # Function to try to dismount (?????????????)
ffxiv_dx11.exe+7EA788 - B0 01 - mov al,01 # Set return value to TRUE
ffxiv_dx11.exe+7EA78A - E9 12050000 - jmp ffxiv_dx11.exe+7EACA1 # jump to function cleanup
F: ffxiv_dx11.exe+7EA78F - 41 81 FE 5D4E0000 - cmp r14d,00004E5D # Checks if you are ACCESSORIZING
ffxiv_dx11.exe+7EA796 - 75 10 - jne ffxiv_dx11.exe+7EA7A8 # Label G if not accessorizing
ffxiv_dx11.exe+7EA798 - 48 8D 8E F80D0000 - lea rcx,[rsi+00000DF8]
ffxiv_dx11.exe+7EA79F - E8 DCCF9400 - call ffxiv_dx11.exe+1137780
ffxiv_dx11.exe+7EA7A4 - 84 C0 - test al,al # if return is true, jump back up
ffxiv_dx11.exe+7EA7A6 - 75 D2 - jne ffxiv_dx11.exe+7EA77A # back up to label E
G: ffxiv_dx11.exe+7EA7A8 - C6 44 24 28 01 - mov byte ptr [rsp+28],01 # Modifies lowest byte of local pointer (rsp+28)
ffxiv_dx11.exe+7EA7AD - 4C 8B CD - mov r9,rbp # Moves target ID to r9
ffxiv_dx11.exe+7EA7B0 - 44 8B C3 - mov r8d,ebx # Moves action ID to r8
ffxiv_dx11.exe+7EA7B3 - C6 44 24 20 01 - mov byte ptr [rsp+20],01 # Modifies lowest byte of local pointer (rsp+20)
ffxiv_dx11.exe+7EA7B8 - 41 8B D7 - mov edx,r15d # moves action type to EDX
ffxiv_dx11.exe+7EA7BB - 48 8B CF - mov rcx,rdi # moves action manager pointer to rcx
ffxiv_dx11.exe+7EA7BE - E8 FDC7FFFF - call ffxiv_dx11.exe+7E6FC0 # ActionManager.UnknownFunction(ActionType, action id, target id)
# This function is some sort of status checker
# 0 = OK
# 0x23C (572) = Cannot use yet
# 0x243 (579) = Cannot execute at this time
# 0x244 (580) = Casting
# 0x246 (582) = Not yet ready
# 0x247 (583) = No item
# 0x536 = Companion related
ffxiv_dx11.exe+7EA7C3 - 83 BC 24 A8000000 02 - cmp dword ptr [rsp+000000A8],02 # Check if the origin is 2 (text/macro)
ffxiv_dx11.exe+7EA7CB - 8B F0 - mov esi,eax # Move return result into ESI
ffxiv_dx11.exe+7EA7CD - 0F84 B6000000 - je ffxiv_dx11.exe+7EA889 # Label K if macro/text source
# Action queueing here
ffxiv_dx11.exe+7EA7D3 - 80 7F 68 00 - cmp byte ptr [rdi+68],00 # Check if an action is in the queue
ffxiv_dx11.exe+7EA7D7 - 0F85 AC000000 - jne ffxiv_dx11.exe+7EA889 # Label K if queue is full
ffxiv_dx11.exe+7EA7DD - 41 83 FE 05 - cmp r14d,05 #
ffxiv_dx11.exe+7EA7E1 - 0F84 A2000000 - je ffxiv_dx11.exe+7EA889 # Label K if action id 5 (dont queue teleport)
ffxiv_dx11.exe+7EA7E7 - 05 BCFDFFFF - add eax,FFFFFDBC # Subtract 580
ffxiv_dx11.exe+7EA7EC - A9 FDFFFFFF - test eax,FFFFFFFD # Checks if anything but bit 2 is set (0x244 and 0x246 will pass)
ffxiv_dx11.exe+7EA7F1 - 74 11 - je ffxiv_dx11.exe+7EA804 # Label H
ffxiv_dx11.exe+7EA7F3 - F3 0F10 4F 08 - movss xmm1,[rdi+08] # Checks action manager + 0x08, which indicates the remaining animation time
ffxiv_dx11.exe+7EA7F8 - 0F57 C0 - xorps xmm0,xmm0
ffxiv_dx11.exe+7EA7FB - 0F2F C8 - comiss xmm1,xmm0
ffxiv_dx11.exe+7EA7FE - 0F86 85000000 - jbe ffxiv_dx11.exe+7EA889 # If the remaining animation time is 0, skip queueing (Label K)
# More research into action resource to figure out what's at offset 0x20 and 0x3A
H: ffxiv_dx11.exe+7EA804 - 41 0FB6 4D 20 - movzx ecx,byte ptr [r13+20] # Moves action resource + 0x20 (ACTION CATEGORY) into ecx
ffxiv_dx11.exe+7EA809 - 8D 41 FE - lea eax,[rcx-02] # Subtract 2 and put it in rax
ffxiv_dx11.exe+7EA80C - 3C 01 - cmp al,01
ffxiv_dx11.exe+7EA80E - 76 30 - jna ffxiv_dx11.exe+7EA840 # Label J if action category is 3 or less (spell and weaponskill)
ffxiv_dx11.exe+7EA810 - 80 F9 04 - cmp cl,04
# This is how sprint, items, etc skip the queue:
ffxiv_dx11.exe+7EA813 - 75 07 - jne ffxiv_dx11.exe+7EA81C # Label I if category is not 4
ffxiv_dx11.exe+7EA815 - 41 F6 45 3A 01 - test byte ptr [r13+3A],01 # Some sort of target flags
ffxiv_dx11.exe+7EA81A - 74 24 - je ffxiv_dx11.exe+7EA840 # Label J if not ground target
I: ffxiv_dx11.exe+7EA81C - 41 81 FE F50D0000 - cmp r14d,00000DF5
ffxiv_dx11.exe+7EA823 - 74 1B - je ffxiv_dx11.exe+7EA840 # Label J if Ley Lines
ffxiv_dx11.exe+7EA825 - 41 81 FE FB1C0000 - cmp r14d,00001CFB
ffxiv_dx11.exe+7EA82C - 74 12 - je ffxiv_dx11.exe+7EA840 # Label J if Between the Lines
ffxiv_dx11.exe+7EA82E - 41 81 FE 535F0000 - cmp r14d,00005F53
ffxiv_dx11.exe+7EA835 - 74 09 - je ffxiv_dx11.exe+7EA840 # Label J if Regresss
ffxiv_dx11.exe+7EA837 - 41 81 FE AB6C0000 - cmp r14d,00006CAB
ffxiv_dx11.exe+7EA83E - 75 49 - jne ffxiv_dx11.exe+7EA889 # Label K if not Regress (PVP)
J: ffxiv_dx11.exe+7EA840 - 44 8B C3 - mov r8d,ebx # action id to r8
ffxiv_dx11.exe+7EA843 - 41 8B D7 - mov edx,r15d # action type to rdx
ffxiv_dx11.exe+7EA846 - 48 8B CF - mov rcx,rdi # Action manager to rcx
ffxiv_dx11.exe+7EA849 - E8 C20D0000 - call ffxiv_dx11.exe+7EB610 # bool ActionManager.CanQueue(ActionType, ActionId)
ffxiv_dx11.exe+7EA84E - 84 C0 - test al,al
ffxiv_dx11.exe+7EA850 - 74 37 - je ffxiv_dx11.exe+7EA889
ffxiv_dx11.exe+7EA852 - 8B 84 24 90000000 - mov eax,[rsp+00000090]
ffxiv_dx11.exe+7EA859 - 89 47 70 - mov [rdi+70],eax # ActionManager + 0x70 = Action ID
ffxiv_dx11.exe+7EA85C - 8B 84 24 A8000000 - mov eax,[rsp+000000A8]
ffxiv_dx11.exe+7EA863 - 89 87 80000000 - mov [rdi+00000080],eax # ActionManager + 0x80 = Origin (should always be 0, nothing else can get here ATM)
ffxiv_dx11.exe+7EA869 - 8B 84 24 B0000000 - mov eax,[rsp+000000B0]
ffxiv_dx11.exe+7EA870 - 89 87 84000000 - mov [rdi+00000084],eax # ActionManager + 0x84 = action param
ffxiv_dx11.exe+7EA876 - B0 01 - mov al,01 # Set return to 1 (true)
ffxiv_dx11.exe+7EA878 - C6 47 68 01 - mov byte ptr [rdi+68],01 # ActionManager + 0x68 = 1 (this is a bool that indicates something is queued)
ffxiv_dx11.exe+7EA87C - 44 89 7F 6C - mov [rdi+6C],r15d # ActionManager + 0x6C = Action Type
ffxiv_dx11.exe+7EA880 - 48 89 6F 78 - mov [rdi+78],rbp # ActionManager + 0x78 = target id
ffxiv_dx11.exe+7EA884 - E9 18040000 - jmp ffxiv_dx11.exe+7EACA1 # jump to return
K: ffxiv_dx11.exe+7EA889 - 85 F6 - test esi,esi # This is the return from the status check earlier
ffxiv_dx11.exe+7EA88B - 74 65 - je ffxiv_dx11.exe+7EA8F2 # Label M if status was 0 (ok)
# If the code gets here, the spell won't cast, there is some cleanup before jumping to the return code
ffxiv_dx11.exe+7EA88D - 81 FE 46020000 - cmp esi,00000246 # This happens if something is on recast usually
ffxiv_dx11.exe+7EA893 - 75 1D - jne ffxiv_dx11.exe+7EA8B2 # L if status is not "recast"
ffxiv_dx11.exe+7EA895 - 48 8B 0D ACEB6601 - mov rcx,[ffxiv_dx11.exe+1E59448] # Gets some game object
ffxiv_dx11.exe+7EA89C - 8D 56 25 - lea edx,[rsi+25]
ffxiv_dx11.exe+7EA89F - 48 83 C1 10 - add rcx,10
ffxiv_dx11.exe+7EA8A3 - E8 C8EE87FF - call ffxiv_dx11.exe+69770 # UnknownGameObject.UnknownFunction(action status + 0x25)
ffxiv_dx11.exe+7EA8A8 - 83 78 20 00 - cmp dword ptr [rax+20],00
ffxiv_dx11.exe+7EA8AC - 0F84 B0000000 - je ffxiv_dx11.exe+7EA962 # Label N if 0
L: ffxiv_dx11.exe+7EA8B2 - F3 0F10 05 5ADCF100 - movss xmm0,[ffxiv_dx11.exe+1708514] # const 100.0 to xmm0
ffxiv_dx11.exe+7EA8BA - 33 C0 - xor eax,eax # eax to 0
ffxiv_dx11.exe+7EA8BC - 48 8B 94 24 B8000000 - mov rdx,[rsp+000000B8] # location to rdx
ffxiv_dx11.exe+7EA8C4 - 45 8B CF - mov r9d,r15d # action type to r9
ffxiv_dx11.exe+7EA8C7 - F3 0F11 44 24 48 - movss [rsp+48],xmm0 # 100.0 to rsp+48
ffxiv_dx11.exe+7EA8CD - 45 33 C0 - xor r8d,r8d # r8 to 0
ffxiv_dx11.exe+7EA8D0 - 89 44 24 40 - mov [rsp+40],eax # rsp+40 to 0
ffxiv_dx11.exe+7EA8D4 - 8B CE - mov ecx,esi # status to rcx
ffxiv_dx11.exe+7EA8D6 - 89 44 24 38 - mov [rsp+38],eax # rsp+38 to 0
ffxiv_dx11.exe+7EA8DA - 89 44 24 30 - mov [rsp+30],eax # rsp+30 to 0
ffxiv_dx11.exe+7EA8DE - 89 44 24 28 - mov [rsp+28],eax # rsp+28 to 0
ffxiv_dx11.exe+7EA8E2 - 89 5C 24 20 - mov [rsp+20],ebx # rsp+20 to
ffxiv_dx11.exe+7EA8E6 - E8 F535FDFF - call ffxiv_dx11.exe+7BDEE0 # Error toast call
ffxiv_dx11.exe+7EA8EB - 32 C0 - xor al,al # set return to 0 (false)
ffxiv_dx11.exe+7EA8ED - E9 AF030000 - jmp ffxiv_dx11.exe+7EACA1 # jump to return
# If you got here this means that the queue was empty and it's possible to use the action
M: ffxiv_dx11.exe+7EA8F2 - 41 F6 45 3A 01 - test byte ptr [r13+3A],01 # Check action resource + 0x3A
ffxiv_dx11.exe+7EA8F7 - 74 70 - je ffxiv_dx11.exe+7EA969 # Label O if 1
ffxiv_dx11.exe+7EA8F9 - 41 81 FE F50D0000 - cmp r14d,00000DF5
ffxiv_dx11.exe+7EA900 - 74 67 - je ffxiv_dx11.exe+7EA969 # Label O if Ley Lines
ffxiv_dx11.exe+7EA902 - 41 81 FE FB1C0000 - cmp r14d,00001CFB
ffxiv_dx11.exe+7EA909 - 74 5E - je ffxiv_dx11.exe+7EA969 # Label O if Between the Lines
ffxiv_dx11.exe+7EA90B - 41 81 FE 535F0000 - cmp r14d,00005F53
ffxiv_dx11.exe+7EA912 - 74 55 - je ffxiv_dx11.exe+7EA969 # Label O if Regress
ffxiv_dx11.exe+7EA914 - 41 81 FE AB6C0000 - cmp r14d,00006CAB
ffxiv_dx11.exe+7EA91B - 74 4C - je ffxiv_dx11.exe+7EA969 # Label O if Regress (PVP)
ffxiv_dx11.exe+7EA91D - 4D 85 E4 - test r12,r12 # Check if location is null
ffxiv_dx11.exe+7EA920 - 74 05 - je ffxiv_dx11.exe+7EA927
ffxiv_dx11.exe+7EA922 - 41 C6 04 24 01 - mov byte ptr [r12],01 # If not, make it true
ffxiv_dx11.exe+7EA927 - 33 C0 - xor eax,eax # eax to 0
ffxiv_dx11.exe+7EA929 - 44 8B CB - mov r9d,ebx # action id to r9
ffxiv_dx11.exe+7EA92C - 45 8B C7 - mov r8d,r15d # action type to r8
ffxiv_dx11.exe+7EA92F - 89 44 24 20 - mov [rsp+20],eax # rsp+0x20 to 0
ffxiv_dx11.exe+7EA933 - 41 8B D6 - mov edx,r14d # action id to rdx
ffxiv_dx11.exe+7EA936 - 48 8B CF - mov rcx,rdi # actionmanager to rcx
# This function will create the orange ground circle, or immediately place the action if it was specified with a target, eg <t>
ffxiv_dx11.exe+7EA939 - E8 B22B0000 - call ffxiv_dx11.exe+7ED4F0 # ActionManager.CreateGroundTarget(uint circle_id, uint action_id, ActionType);
ffxiv_dx11.exe+7EA93E - 41 80 7D 20 08 - cmp byte ptr [r13+20],08
ffxiv_dx11.exe+7EA943 - 75 1D - jne ffxiv_dx11.exe+7EA962 # Label N if resource+0x20 is not 8
# Gets the same unknown game object from earlier, note that the below code paths all lead to N which returns early with false
ffxiv_dx11.exe+7EA945 - 48 8B 0D FCEA6601 - mov rcx,[ffxiv_dx11.exe+1E59448]
ffxiv_dx11.exe+7EA94C - E8 AF828AFF - call ffxiv_dx11.exe+92C00
ffxiv_dx11.exe+7EA951 - 48 85 C0 - test rax,rax
ffxiv_dx11.exe+7EA954 - 74 0C - je ffxiv_dx11.exe+7EA962 # Conditional jump to Label N
ffxiv_dx11.exe+7EA956 - 48 8B 10 - mov rdx,[rax]
ffxiv_dx11.exe+7EA959 - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EA95C - FF 92 48030000 - call qword ptr [rdx+00000348]
N: ffxiv_dx11.exe+7EA962 - 32 C0 - xor al,al # return value false
ffxiv_dx11.exe+7EA964 - E9 38030000 - jmp ffxiv_dx11.exe+7EACA1 # label END
O: ffxiv_dx11.exe+7EA969 - E8 62409700 - call ffxiv_dx11.exe+115E9D0
ffxiv_dx11.exe+7EA96E - 41 8D 47 FF - lea eax,[r15-01]
ffxiv_dx11.exe+7EA972 - 40 B6 01 - mov sil,01 { 1 }
ffxiv_dx11.exe+7EA975 - 83 F8 13 - cmp eax,13 { 19 }
ffxiv_dx11.exe+7EA978 - 0F87 0D030000 - ja ffxiv_dx11.exe+7EAC8B
ffxiv_dx11.exe+7EA97E - 48 8D 15 7B5681FF - lea rdx,[ffxiv_dx11.exe] { (9460301) }
ffxiv_dx11.exe+7EA985 - 48 98 - cdqe
ffxiv_dx11.exe+7EA987 - 8B 8C 82 A0AD7E00 - mov ecx,[rdx+rax*4+007EADA0]
ffxiv_dx11.exe+7EA98E - 48 03 CA - add rcx,rdx
ffxiv_dx11.exe+7EA991 - FF E1 - jmp rcx
ffxiv_dx11.exe+7EA993 - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EA995 - 48 8D 0D A4676B01 - lea rcx,[ffxiv_dx11.exe+1EA1140] { (0) }
ffxiv_dx11.exe+7EA99C - E8 2FF1EEFF - call ffxiv_dx11.exe+6D9AD0
ffxiv_dx11.exe+7EA9A1 - 84 C0 - test al,al
ffxiv_dx11.exe+7EA9A3 - 0F85 B4030000 - jne ffxiv_dx11.exe+7EAD5D
ffxiv_dx11.exe+7EA9A9 - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EA9AB - 48 8D 0D 8E676B01 - lea rcx,[ffxiv_dx11.exe+1EA1140] { (0) }
ffxiv_dx11.exe+7EA9B2 - E8 39DFEEFF - call ffxiv_dx11.exe+6D88F0
ffxiv_dx11.exe+7EA9B7 - 84 C0 - test al,al
ffxiv_dx11.exe+7EA9B9 - 0F85 EF000000 - jne ffxiv_dx11.exe+7EAAAE
ffxiv_dx11.exe+7EA9BF - 41 81 FE 22040000 - cmp r14d,00000422 { 1058 }
ffxiv_dx11.exe+7EA9C6 - 75 6D - jne ffxiv_dx11.exe+7EAA35
ffxiv_dx11.exe+7EA9C8 - 48 8B 0D 79EA6601 - mov rcx,[ffxiv_dx11.exe+1E59448] { (20BC0B368E0) }
ffxiv_dx11.exe+7EA9CF - E8 2C828AFF - call ffxiv_dx11.exe+92C00
ffxiv_dx11.exe+7EA9D4 - 48 85 C0 - test rax,rax
ffxiv_dx11.exe+7EA9D7 - 74 89 - je ffxiv_dx11.exe+7EA962
ffxiv_dx11.exe+7EA9D9 - 48 8B 10 - mov rdx,[rax]
ffxiv_dx11.exe+7EA9DC - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EA9DF - FF 92 10010000 - call qword ptr [rdx+00000110]
ffxiv_dx11.exe+7EA9E5 - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EA9E8 - BA 8C000000 - mov edx,0000008C { 140 }
ffxiv_dx11.exe+7EA9ED - E8 7EAEA1FF - call ffxiv_dx11.exe+205870
ffxiv_dx11.exe+7EA9F2 - 48 8B F8 - mov rdi,rax
ffxiv_dx11.exe+7EA9F5 - 48 85 C0 - test rax,rax
ffxiv_dx11.exe+7EA9F8 - 0F84 64FFFFFF - je ffxiv_dx11.exe+7EA962
ffxiv_dx11.exe+7EA9FE - 33 C0 - xor eax,eax
ffxiv_dx11.exe+7EAA00 - 48 8D 0D 59676B01 - lea rcx,[ffxiv_dx11.exe+1EA1160] { (1) }
ffxiv_dx11.exe+7EAA07 - 66 89 44 24 30 - mov [rsp+30],ax
ffxiv_dx11.exe+7EAA0C - 45 33 C9 - xor r9d,r9d
ffxiv_dx11.exe+7EAA0F - C6 44 24 28 01 - mov byte ptr [rsp+28],01 { 1 }
ffxiv_dx11.exe+7EAA14 - 45 33 C0 - xor r8d,r8d
ffxiv_dx11.exe+7EAA17 - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EAA19 - C6 44 24 20 01 - mov byte ptr [rsp+20],01 { 1 }
ffxiv_dx11.exe+7EAA1E - E8 6DC9ECFF - call ffxiv_dx11.exe+6B7390
ffxiv_dx11.exe+7EAA23 - 48 8B D0 - mov rdx,rax
ffxiv_dx11.exe+7EAA26 - 48 8B CF - mov rcx,rdi
ffxiv_dx11.exe+7EAA29 - E8 D2951400 - call ffxiv_dx11.exe+934000
ffxiv_dx11.exe+7EAA2E - B0 01 - mov al,01 { 1 }
ffxiv_dx11.exe+7EAA30 - E9 6C020000 - jmp ffxiv_dx11.exe+7EACA1
ffxiv_dx11.exe+7EAA35 - 41 83 FF 02 - cmp r15d,02 { 2 }
ffxiv_dx11.exe+7EAA39 - 75 7A - jne ffxiv_dx11.exe+7EAAB5
ffxiv_dx11.exe+7EAA3B - 81 FB D3210000 - cmp ebx,000021D3 { 8659 }
ffxiv_dx11.exe+7EAA41 - 75 72 - jne ffxiv_dx11.exe+7EAAB5
ffxiv_dx11.exe+7EAA43 - 48 8B 0D FEE96601 - mov rcx,[ffxiv_dx11.exe+1E59448] { (20BC0B368E0) }
ffxiv_dx11.exe+7EAA4A - E8 B1818AFF - call ffxiv_dx11.exe+92C00
ffxiv_dx11.exe+7EAA4F - 48 85 C0 - test rax,rax
ffxiv_dx11.exe+7EAA52 - 0F84 0AFFFFFF - je ffxiv_dx11.exe+7EA962
ffxiv_dx11.exe+7EAA58 - 48 8B 10 - mov rdx,[rax]
ffxiv_dx11.exe+7EAA5B - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EAA5E - FF 92 10010000 - call qword ptr [rdx+00000110]
ffxiv_dx11.exe+7EAA64 - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EAA67 - BA 8A000000 - mov edx,0000008A { 138 }
ffxiv_dx11.exe+7EAA6C - E8 FFADA1FF - call ffxiv_dx11.exe+205870
ffxiv_dx11.exe+7EAA71 - 48 8B D8 - mov rbx,rax
ffxiv_dx11.exe+7EAA74 - 48 85 C0 - test rax,rax
ffxiv_dx11.exe+7EAA77 - 0F84 E5FEFFFF - je ffxiv_dx11.exe+7EA962
ffxiv_dx11.exe+7EAA7D - 33 C0 - xor eax,eax
ffxiv_dx11.exe+7EAA7F - 48 8D 0D DA666B01 - lea rcx,[ffxiv_dx11.exe+1EA1160] { (1) }
ffxiv_dx11.exe+7EAA86 - 66 89 44 24 30 - mov [rsp+30],ax
ffxiv_dx11.exe+7EAA8B - 45 33 C9 - xor r9d,r9d
ffxiv_dx11.exe+7EAA8E - 88 44 24 28 - mov [rsp+28],al
ffxiv_dx11.exe+7EAA92 - 45 33 C0 - xor r8d,r8d
ffxiv_dx11.exe+7EAA95 - BA D3210000 - mov edx,000021D3 { 8659 }
ffxiv_dx11.exe+7EAA9A - 88 44 24 20 - mov [rsp+20],al
ffxiv_dx11.exe+7EAA9E - E8 EDC8ECFF - call ffxiv_dx11.exe+6B7390
ffxiv_dx11.exe+7EAAA3 - 48 8B D0 - mov rdx,rax
ffxiv_dx11.exe+7EAAA6 - 48 8B CB - mov rcx,rbx
ffxiv_dx11.exe+7EAAA9 - E8 12641400 - call ffxiv_dx11.exe+930EC0
ffxiv_dx11.exe+7EAAAE - B0 01 - mov al,01 { 1 }
ffxiv_dx11.exe+7EAAB0 - E9 EC010000 - jmp ffxiv_dx11.exe+7EACA1
ffxiv_dx11.exe+7EAAB5 - 41 0FB6 45 35 - movzx eax,byte ptr [r13+35]
ffxiv_dx11.exe+7EAABA - 3C 12 - cmp al,12 { 18 }
ffxiv_dx11.exe+7EAABC - 75 22 - jne ffxiv_dx11.exe+7EAAE0
ffxiv_dx11.exe+7EAABE - 41 80 7D 21 06 - cmp byte ptr [r13+21],06 { 6 }
ffxiv_dx11.exe+7EAAC3 - 0F85 94020000 - jne ffxiv_dx11.exe+7EAD5D
ffxiv_dx11.exe+7EAAC9 - E8 72D02600 - call ffxiv_dx11.exe+A57B40
ffxiv_dx11.exe+7EAACE - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EAAD1 - 4C 8B C5 - mov r8,rbp
ffxiv_dx11.exe+7EAAD4 - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EAAD6 - E8 65222700 - call ffxiv_dx11.exe+A5CD40
ffxiv_dx11.exe+7EAADB - E9 A5020000 - jmp ffxiv_dx11.exe+7EAD85
ffxiv_dx11.exe+7EAAE0 - 2C 10 - sub al,10 { 16 }
ffxiv_dx11.exe+7EAAE2 - 3C 01 - cmp al,01 { 1 }
ffxiv_dx11.exe+7EAAE4 - 0F86 5B010000 - jbe ffxiv_dx11.exe+7EAC45
ffxiv_dx11.exe+7EAAEA - 41 83 FF 01 - cmp r15d,01 { 1 }
ffxiv_dx11.exe+7EAAEE - 0F85 69020000 - jne ffxiv_dx11.exe+7EAD5D
ffxiv_dx11.exe+7EAAF4 - 81 FB C6640000 - cmp ebx,000064C6 { 25798 }
ffxiv_dx11.exe+7EAAFA - 0F84 31010000 - je ffxiv_dx11.exe+7EAC31
ffxiv_dx11.exe+7EAB00 - 8D 83 339BFFFF - lea eax,[rbx-000064CD]
ffxiv_dx11.exe+7EAB06 - 83 F8 02 - cmp eax,02 { 2 }
ffxiv_dx11.exe+7EAB09 - 0F86 22010000 - jbe ffxiv_dx11.exe+7EAC31
ffxiv_dx11.exe+7EAB0F - 81 FB F50D0000 - cmp ebx,00000DF5 { 3573 }
ffxiv_dx11.exe+7EAB15 - 75 36 - jne ffxiv_dx11.exe+7EAB4D
ffxiv_dx11.exe+7EAB17 - 4C 8B B4 24 B8000000 - mov r14,[rsp+000000B8]
ffxiv_dx11.exe+7EAB1F - 49 8B CE - mov rcx,r14
ffxiv_dx11.exe+7EAB22 - E8 D94CEFFF - call ffxiv_dx11.exe+6DF800
ffxiv_dx11.exe+7EAB27 - 8B 8C 24 A0000000 - mov ecx,[rsp+000000A0]
ffxiv_dx11.exe+7EAB2E - 4C 8B CD - mov r9,rbp
ffxiv_dx11.exe+7EAB31 - 89 4C 24 28 - mov [rsp+28],ecx
ffxiv_dx11.exe+7EAB35 - 41 8B D7 - mov edx,r15d
ffxiv_dx11.exe+7EAB38 - 48 8B CF - mov rcx,rdi
ffxiv_dx11.exe+7EAB3B - 48 89 44 24 20 - mov [rsp+20],rax
ffxiv_dx11.exe+7EAB40 - 44 8B C3 - mov r8d,ebx
ffxiv_dx11.exe+7EAB43 - E8 1867FFFF - call ffxiv_dx11.exe+7E1260 # Use action
ffxiv_dx11.exe+7EAB48 - E9 40020000 - jmp ffxiv_dx11.exe+7EAD8D
ffxiv_dx11.exe+7EAB4D - 81 FB FB1C0000 - cmp ebx,00001CFB { 7419 }
ffxiv_dx11.exe+7EAB53 - 75 47 - jne ffxiv_dx11.exe+7EAB9C
ffxiv_dx11.exe+7EAB55 - 48 8B 0D 2CBF6801 - mov rcx,[ffxiv_dx11.exe+1E76A88] { (144) }
ffxiv_dx11.exe+7EAB5C - 48 85 C9 - test rcx,rcx
ffxiv_dx11.exe+7EAB5F - 74 33 - je ffxiv_dx11.exe+7EAB94
ffxiv_dx11.exe+7EAB61 - 48 8B 05 78BF6801 - mov rax,[ffxiv_dx11.exe+1E76AE0] { (37) }
ffxiv_dx11.exe+7EAB68 - 3C 07 - cmp al,07 { 7 }
ffxiv_dx11.exe+7EAB6A - 74 04 - je ffxiv_dx11.exe+7EAB70
ffxiv_dx11.exe+7EAB6C - 3C 19 - cmp al,19 { 25 }
ffxiv_dx11.exe+7EAB6E - 75 24 - jne ffxiv_dx11.exe+7EAB94
ffxiv_dx11.exe+7EAB70 - 8B 84 24 A0000000 - mov eax,[rsp+000000A0]
ffxiv_dx11.exe+7EAB77 - 48 83 C1 10 - add rcx,10 { 16 }
ffxiv_dx11.exe+7EAB7B - 89 44 24 28 - mov [rsp+28],eax
ffxiv_dx11.exe+7EAB7F - BA 01000000 - mov edx,00000001 { 1 }
ffxiv_dx11.exe+7EAB84 - 48 89 4C 24 20 - mov [rsp+20],rcx
ffxiv_dx11.exe+7EAB89 - 41 B8 FB1C0000 - mov r8d,00001CFB { 7419 }
ffxiv_dx11.exe+7EAB8F - E9 E6010000 - jmp ffxiv_dx11.exe+7EAD7A
ffxiv_dx11.exe+7EAB94 - 40 32 F6 - xor sil,sil
ffxiv_dx11.exe+7EAB97 - E9 01010000 - jmp ffxiv_dx11.exe+7EAC9D
ffxiv_dx11.exe+7EAB9C - 8D 83 AFA0FFFF - lea eax,[rbx-00005F51]
ffxiv_dx11.exe+7EABA2 - 83 F8 01 - cmp eax,01 { 1 }
ffxiv_dx11.exe+7EABA5 - 76 52 - jna ffxiv_dx11.exe+7EABF9
ffxiv_dx11.exe+7EABA7 - 8D 83 5793FFFF - lea eax,[rbx-00006CA9]
ffxiv_dx11.exe+7EABAD - 83 F8 01 - cmp eax,01 { 1 }
ffxiv_dx11.exe+7EABB0 - 76 47 - jna ffxiv_dx11.exe+7EABF9
ffxiv_dx11.exe+7EABB2 - 81 FB 535F0000 - cmp ebx,00005F53 { 24403 }
ffxiv_dx11.exe+7EABB8 - 74 0C - je ffxiv_dx11.exe+7EABC6
ffxiv_dx11.exe+7EABBA - 81 FB AB6C0000 - cmp ebx,00006CAB { 27819 }
ffxiv_dx11.exe+7EABC0 - 0F85 97010000 - jne ffxiv_dx11.exe+7EAD5D
ffxiv_dx11.exe+7EABC6 - 48 8B 0D BBBE6801 - mov rcx,[ffxiv_dx11.exe+1E76A88] { (144) }
ffxiv_dx11.exe+7EABCD - 48 85 C9 - test rcx,rcx
ffxiv_dx11.exe+7EABD0 - 74 C2 - je ffxiv_dx11.exe+7EAB94
ffxiv_dx11.exe+7EABD2 - 80 3D 07BF6801 27 - cmp byte ptr [ffxiv_dx11.exe+1E76AE0],27 { (37),39 }
ffxiv_dx11.exe+7EABD9 - 75 B9 - jne ffxiv_dx11.exe+7EAB94
ffxiv_dx11.exe+7EABDB - 8B 84 24 A0000000 - mov eax,[rsp+000000A0]
ffxiv_dx11.exe+7EABE2 - 48 83 C1 10 - add rcx,10 { 16 }
ffxiv_dx11.exe+7EABE6 - 89 44 24 28 - mov [rsp+28],eax
ffxiv_dx11.exe+7EABEA - BA 01000000 - mov edx,00000001 { 1 }
ffxiv_dx11.exe+7EABEF - 48 89 4C 24 20 - mov [rsp+20],rcx
ffxiv_dx11.exe+7EABF4 - E9 7E010000 - jmp ffxiv_dx11.exe+7EAD77
ffxiv_dx11.exe+7EABF9 - 4C 8B B4 24 B8000000 - mov r14,[rsp+000000B8]
ffxiv_dx11.exe+7EAC01 - 49 8B CE - mov rcx,r14
ffxiv_dx11.exe+7EAC04 - E8 F74BEFFF - call ffxiv_dx11.exe+6DF800
ffxiv_dx11.exe+7EAC09 - 8B 8C 24 A0000000 - mov ecx,[rsp+000000A0]
ffxiv_dx11.exe+7EAC10 - 4C 8B CD - mov r9,rbp
ffxiv_dx11.exe+7EAC13 - 89 4C 24 28 - mov [rsp+28],ecx
ffxiv_dx11.exe+7EAC17 - 44 8B C3 - mov r8d,ebx
ffxiv_dx11.exe+7EAC1A - 48 8B CF - mov rcx,rdi
ffxiv_dx11.exe+7EAC1D - 48 89 44 24 20 - mov [rsp+20],rax
ffxiv_dx11.exe+7EAC22 - BA 01000000 - mov edx,00000001 { 1 }
ffxiv_dx11.exe+7EAC27 - E8 3466FFFF - call ffxiv_dx11.exe+7E1260 # Use Action
ffxiv_dx11.exe+7EAC2C - E9 5C010000 - jmp ffxiv_dx11.exe+7EAD8D
ffxiv_dx11.exe+7EAC31 - 8B CB - mov ecx,ebx
ffxiv_dx11.exe+7EAC33 - E8 98FEF6FF - call ffxiv_dx11.exe+75AAD0
ffxiv_dx11.exe+7EAC38 - 0FB6 C0 - movzx eax,al
ffxiv_dx11.exe+7EAC3B - BA 01000000 - mov edx,00000001 { 1 }
ffxiv_dx11.exe+7EAC40 - E9 22010000 - jmp ffxiv_dx11.exe+7EAD67
ffxiv_dx11.exe+7EAC45 - 41 80 7D 21 06 - cmp byte ptr [r13+21],06 { 6 }
ffxiv_dx11.exe+7EAC4A - 0F85 0D010000 - jne ffxiv_dx11.exe+7EAD5D
ffxiv_dx11.exe+7EAC50 - E8 EBCE2600 - call ffxiv_dx11.exe+A57B40
ffxiv_dx11.exe+7EAC55 - 48 8B C8 - mov rcx,rax
ffxiv_dx11.exe+7EAC58 - 4C 8B C5 - mov r8,rbp
ffxiv_dx11.exe+7EAC5B - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EAC5D - E8 AEF92600 - call ffxiv_dx11.exe+A5A610
ffxiv_dx11.exe+7EAC62 - E9 1E010000 - jmp ffxiv_dx11.exe+7EAD85 # jumps to LBL3 or LBL2 based on function success
ffxiv_dx11.exe+7EAC67 - 44 8B 8C 24 A8000000 - mov r9d,[rsp+000000A8]
ffxiv_dx11.exe+7EAC6F - 4C 8B C5 - mov r8,rbp
ffxiv_dx11.exe+7EAC72 - 8B D3 - mov edx,ebx
ffxiv_dx11.exe+7EAC74 - 4C 89 64 24 20 - mov [rsp+20],r12
ffxiv_dx11.exe+7EAC79 - 48 8B CF - mov rcx,rdi
ffxiv_dx11.exe+7EAC7C - E8 FF73FFFF - call ffxiv_dx11.exe+7E2080
ffxiv_dx11.exe+7EAC81 - 83 FB 0A - cmp ebx,0A # ebx is 10
ffxiv_dx11.exe+7EAC84 - 0F95 C0 - setne al
ffxiv_dx11.exe+7EAC87 - 84 C0 - test al,al
ffxiv_dx11.exe+7EAC89 - 74 12 - je ffxiv_dx11.exe+7EAC9D # LBL2 if
LBL1: ffxiv_dx11.exe+7EAC8B - 4C 8B B4 24 B8000000 - mov r14,[rsp+000000B8] # location to r14
LBL3: ffxiv_dx11.exe+7EAC93 - B2 01 - mov dl,01 # 1 to rdx
ffxiv_dx11.exe+7EAC95 - 49 8B CE - mov rcx,r14 # location to rcx
ffxiv_dx11.exe+7EAC98 - E8 B3FAF0FF - call ffxiv_dx11.exe+6FA750
LBL2: ffxiv_dx11.exe+7EAC9D - 40 0FB6 C6 - movzx eax,sil # use esi for return value, 1 if "success"
END: ffxiv_dx11.exe+7EACA1 - 4C 8B AC 24 88000000 - mov r13,[rsp+00000088] # restore r13
ffxiv_dx11.exe+7EACA9 - 4C 8B B4 24 98000000 - mov r14,[rsp+00000098] # restore r14
ffxiv_dx11.exe+7EACB1 - 48 8B B4 24 80000000 - mov rsi,[rsp+00000080] # restore rsi
ffxiv_dx11.exe+7EACB9 - 48 83 C4 50 - add rsp,50 # restore stack
ffxiv_dx11.exe+7EACBD - 41 5F - pop r15
ffxiv_dx11.exe+7EACBF - 41 5C - pop r12
ffxiv_dx11.exe+7EACC1 - 5F - pop rdi
ffxiv_dx11.exe+7EACC2 - 5D - pop rbp
ffxiv_dx11.exe+7EACC3 - 5B - pop rbx
ffxiv_dx11.exe+7EACC4 - C3 - ret # the end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment