Делаю подмены функций в памяти. Последнее время делаю так: записываю вместо инструкций переход на мою функцию, а в моей функции - точное копирование этих самых инструкций+кое-что от себя. Раньше всё работало нормально, до сегодняшнего дня. Я записал переход на мою функцию в конце другой функции, вместо инструкций: Код (Text): pop ebx mov eax, 1 ; adr_GetPacketEnd add esp, 1Ch retn В функции на которую осуществляется переход, я просто скопировал эти же инструкции (для теста): Код (Text): void Hook_Sys_GetPacket_ded(){ _asm{ pop ebx mov eax, 1 ; adr_GetPacketEnd add esp, 1Ch retn } } И... Ошибка во время работы. Дизассемблирую свою dll, и вместо моей функции вижу следующий сюрприз: Код (Text): push ebx pop ebx mov eax, 1 ; adr_GetPacketEnd add esp, 1Ch retn pop ebx retn Компилятор почему-то решил по бокам моей функции разместить инструкции push ebx и pop ebx, а т.к. в моей асм-вставке присутствует retn, происходит ошибка. Собственно, вопрос - есть ли какой-нибудь способ избежать таких "подарков" от компилятора, чтобы он в точности компилировал функцию? VC2005.
Код (Text): __declspec(naked) void Hook_Sys_GetPacket_ded(){ _asm{ pop ebx mov eax, 1 ; adr_GetPacketEnd add esp, 1Ch retn } }
Не буду создавать второй темы. Скажите, при юзании асм-вставок, студийный оптимизатор их трогает или нет? Т.е. есть шанс, что оптимизатор похерит мою асм-вставку?