Function at 0x409960
Capabilities:
Log keystrokes via polling

Disassembly:
push ebp
mov ebp, esp
sub esp, 0xc
push ebx
mov ebx, ecx
push esi
push edi
mov eax, dword [ebx]
cmp dword [eax + 0xd0], 1
jle 0x409c1c
lea eax, [ebx + 4]
push eax
call dword [sym.imp.USER32.dll_GetKeyboardState]
xor edx, edx
lea edi, [ebx + 0x104]
mov dword [ebp - 4], edx
nop
movzx esi, byte [edi + edx - 0x100]
movzx eax, byte [edi + edx]
xor eax, esi
test eax, 0xffffff80
je 0x409a1b
mov ecx, dword [ebx + 0x20c]
mov edi, dword [ebx + 0x208]
lea eax, [ecx + 2]
cmp eax, edi
jbe 0x4099e6
lea eax, [edi + 0x400]
push eax
push dword [ebx + 0x204]
call fcn.0047aac4
mov ecx, dword [ebx + 0x20c]
add esp, 8
add dword [ebx + 0x208], 0x400
mov edx, dword [ebp - 4]
mov dword [ebx + 0x204], eax
mov eax, dword [ebx + 0x204]
cmp esi, 0x80
jae 0x4099fa
mov byte [eax + ecx], 3
jmp 0x4099fe
mov byte [eax + ecx], 2
mov ecx, dword [ebx + 0x20c]
lea edi, [ebx + 0x104]
mov eax, dword [ebx + 0x204]
mov byte [ecx + eax + 1], dl
add dword [ebx + 0x20c], 2
inc edx
mov dword [ebp - 4], edx
cmp edx, 0x100
jl 0x409990
mov ecx, 0x40
lea esi, [ebx + 4]
rep movsd dword es:[edi], dword [esi]
call fcn.00432230
mov edi, dword [ebx]
xor ecx, ecx
nop
mov al, byte [ebx + ecx + 0x210]
cmp al, byte [edi + ecx + 0x2c]
jne 0x409a58
inc ecx
cmp ecx, 4
jl 0x409a40
jmp 0x409ae0
cmp ecx, 4
jge 0x409ae0
mov ecx, dword [ebx + 0x20c]
mov edx, dword [ebx + 0x208]
lea eax, [ecx + 5]
cmp eax, edx
jbe 0x409a9f
lea eax, [edx + 0x400]
push eax
push dword [ebx + 0x204]
call fcn.0047aac4
mov ecx, dword [ebx + 0x20c]
add esp, 8
add dword [ebx + 0x208], 0x400
mov dword [ebx + 0x204], eax
mov eax, dword [ebx + 0x204]
xor esi, esi
mov byte [ecx + eax], 4
nop dword [eax + eax]
mov edx, dword [ebx + 0x20c]
mov ecx, dword [ebx + 0x204]
add edx, esi
movzx eax, byte [edi + esi + 0x2c]
mov byte [edx + ecx + 1], al
movzx eax, byte [edi + esi + 0x2c]
mov byte [ebx + esi + 0x210], al
inc esi
cmp esi, 4
jl 0x409ab0
add dword [ebx + 0x20c], 5
lea eax, [ebp - 0xc]
push eax
call dword [sym.imp.USER32.dll_GetCursorPos]
lea eax, [ebp - 0xc]
push eax
mov eax, dword [ebx]
mov eax, dword [eax + 0x18]
push dword [eax + 0x1d0]
call dword [sym.imp.USER32.dll_ScreenToClient]
mov eax, dword [ebx + 0x214]
cmp eax, dword [ebp - 0xc]
jne 0x409b19
mov eax, dword [ebx + 0x218]
cmp eax, dword [ebp - 8]
je 0x409bce
mov ecx, dword [ebx + 0x20c]
mov edx, dword [ebx + 0x208]
lea eax, [ecx + 5]
cmp eax, edx
jbe 0x409b57
lea eax, [edx + 0x400]
push eax
push dword [ebx + 0x204]
call fcn.0047aac4
mov ecx, dword [ebx + 0x20c]
add esp, 8
add dword [ebx + 0x208], 0x400
mov dword [ebx + 0x204], eax
mov eax, dword [ebx + 0x204]
mov byte [ecx + eax], 5
mov ecx, dword [ebx + 0x20c]
mov eax, dword [ebx + 0x204]
mov edx, dword [ebp - 0xc]
sar edx, 8
mov byte [ecx + eax + 1], dl
mov edx, dword [ebx + 0x20c]
mov ecx, dword [ebx + 0x204]
movzx eax, byte [ebp - 0xc]
mov byte [edx + ecx + 2], al
mov ecx, dword [ebx + 0x20c]
mov eax, dword [ebx + 0x204]
mov edx, dword [ebp - 8]
sar edx, 8
mov byte [ecx + eax + 3], dl
mov edx, dword [ebx + 0x20c]
mov ecx, dword [ebx + 0x204]
movzx eax, byte [ebp - 8]
mov byte [edx + ecx + 4], al
mov eax, dword [ebp - 0xc]
add dword [ebx + 0x20c], 5
mov dword [ebx + 0x214], eax
mov eax, dword [ebp - 8]
mov dword [ebx + 0x218], eax
mov ecx, dword [ebx + 0x20c]
mov edx, dword [ebx + 0x208]
lea eax, [ecx + 1]
cmp eax, edx
jbe 0x409c0c
lea eax, [edx + 0x400]
push eax
push dword [ebx + 0x204]
call fcn.0047aac4
mov ecx, dword [ebx + 0x20c]
add esp, 8
add dword [ebx + 0x208], 0x400
mov dword [ebx + 0x204], eax
mov eax, dword [ebx + 0x204]
mov byte [ecx + eax], 1
inc dword [ebx + 0x20c]
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret