IDA Pro сгенерировала неработоспособный листинг для парной функции strcpy/strcat
Никаким ухищрениями у нас не получится перетасовать код так, чтобы метка loc_402D11
оказалась в границах видимости, но… ведь как то же это было запрограммировано?! Обратившись к исходным текстам библиотеки LIBC.LIB (они поставляются вместе с компилятором) мы обнаружим волшебный ключик. Чтобы метка была видна отовсюду, после нее должен стоят не один знак ":", а целых два — "::".
Самая трудная задача осталась позади и теперь нам предстоит разобраться с уже встречавшимися ошибками типа "missing operator in expression". На этот раз транслятору не понравились конструкции "push large dword ptr fs:0" и "pop large dword ptr fs:0". Убираем все лишнее, превращая их в "push fs:0" и "pop fs:0" и движемся дальше, где нас ждет ошибка "immediate operand not allowed" (непосредственный операнд недозволен), затаившаяся в 3640 строке: "cmp Locale,0". Естественно, транслятор решил трактовать Locale как смещение, а не как содержимое ячейки, поэтому без явной расстановки квадратных скобок здесь не обойтись: "cmp dword ptr ds:[Locale],0".
Теперь на линии фронта остается лишь большой конгломерат ошибок типа "symbol redefinition" (символ переопределен), против которых не пропрешь, ведь он действительно переопределен, вот например, взять тот же cchMultiByte:
___crtLCMapStringA proc near ; CODE XREF: _setSBUpLow+BEp
; _setSBUpLow+E6p
Locale = dword ptr 8
lpMultiByteStr = dword ptr 10h
cchMultiByte = dword ptr 14h
…
___crtLCMapStringA endp
…
cchMultiByte dd 1 ; DATA XREF: _wctomb+31r