Ну, немного осмотра ассемблера выдает
0044EE35 mov esi,esp
0044EE37 push 3039h
0044EE3C mov ecx,dword ptr [ebp-18h]
0044EE3F add ecx,70h
0044EE42 mov eax,dword ptr [ebp-18h]
0044EE45 mov edx,dword ptr [eax+70h]
0044EE48 mov eax,dword ptr [edx+0Ch]
0044EE4B call eax
0044EE4D cmp esi,esp
0044EE4F call @ILT+6745(__RTC_CheckEsp) (42BA5Eh)
На это нужно обратить внимание на две строки. Первое примечание в 0x44ee35 хранит текущее значение esp в esi.
Затем, после завершения вызова функции, он делает cmp между esp и esi. Теперь они оба должны быть одинаковыми. Если нет, то кто-то либо размотал стек дважды, либо не размотал его.
Функция _RTC_CheckEsp выглядит следующим образом:
_RTC_CheckEsp:
00475A60 jne esperror (475A63h)
00475A62 ret
esperror:
00475A63 push ebp
00475A64 mov ebp,esp
00475A66 sub esp,0
00475A69 push eax
00475A6A push edx
00475A6B push ebx
00475A6C push esi
00475A6D push edi
00475A6E mov eax,dword ptr [ebp+4]
00475A71 push 0
00475A73 push eax
00475A74 call _RTC_Failure (42C34Bh)
00475A79 add esp,8
00475A7C pop edi
00475A7D pop esi
00475A7E pop ebx
00475A7F pop edx
00475A80 pop eax
00475A81 mov esp,ebp
00475A83 pop ebp
00475A84 ret
Как видите, первое, что он проверяет, было ли результат предыдущего сравнения "не равным", то есть esi! = Esp. Если это так, то он переходит к коду ошибки. Если они одинаковы, то функция просто возвращает.