Как оказалось не учел соглашение о вызовах.
__cdecl: очищает стек после каждого вызова (
add esp, X)
__stdcall: очищает стек внутри функции(
retn X)
После добавления
__stdcall в функцию
crsGetString, компилятор теперь знает, что она самостоятельно очищает стек, поэтому функции
GetMapDescriptions не надо заниматься его очисткой.
typedef int (__stdcall *crsGetStringType)(void *, int, char *Destination, int Count);
На Ассемблере проще писать, чем на С++ с учетом кучи тонкостей..