Еще раз спасибо за помощь. Попробовал вот такой код. Сама функция отрабатывает без ошибок (по крайней мере, когда вектор пустой xD). Но вот после выхода, я так понимаю, где-то ломается asm код.Это не столько клео, сколько ассемблерная вставка.
Причем сам листинг скорее всего автогенерируемый, потому что странная логика в нескольких моментах, да и в целом можно
было уже все написать на ассемблере чтоб не перекидывать значения между CLEO и хуком.
Было:
Код:8B 46 14 mov eax, [esi+14h] 8B CE mov ecx, esi 50 push eax E8 A2 5D 03 00 call CVehicle::DoVehicleLights(CMatrix &,uint)
Стало:
ASP.net:B8 [patch_point] mov eax, [patch_point] FF E0 jmp eax
C:// // указатель на текущее авто для которого рисовать неон // или нулевой если неон не нужен // в CLEO это была 0@ // static void* active_vehicle; // // временная переменная со стека потока CLEO, которая зачем-то вместо стека используется // хранит в себе указатель на авто, который игра обрабатывает и используется для вычисления флага draw on buildings // в CLEO это была 2@ // static void* tmp; // 2@ // // цвета (0 - 128) // в CLEO это была 6@ static unsigned int color_blue; // 6@ // в CLEO это была 5@ static unsigned int color_green; // 5@ // в CLEO это была 4@ static unsigned int color_red; // 4@ // // переменная, которая используется для хранения размера модели // в CLEO это была 8@ static float dimension_corner_b_x; // // временная переменная со стека потока CLEO, которая зачем-то вместо стека используется // в CLEO это была 7@ static float tmp_dimension; // // переменная, которая используется для хранения размера модели // в CLEO это была 9@ static float dimension_corner_b_y; extern __declspec(naked) void patch_point(/* CVehicle* vehicle<esi> */) { __asm { /* 00: A1 00 00 00 00 */ mov eax, dword ptr active_vehicle /* 05: 3B F0 */ cmp esi, eax /* 07: 75 47 */ jnz short store_shadow /* 09: 89 F0 */ mov eax, esi /* 0B: A3 00 00 00 00 */ mov dword ptr tmp, eax /* 10: 0F 94 C0 */ setz al /* 13: 50 */ push eax /* 14: 6A 00 */ push 0 /* 16: 68 00 00 80 3F */ push 3F800000h /* 1B: 6A 00 */ push 0 /* 1D: 68 00 00 00 40 */ push 40000000h /* 22: A1 00 00 00 00 */ mov eax, dword ptr color_blue /* 27: 50 */ push eax /* 28: A1 00 00 00 00 */ mov eax, dword ptr color_green /* 2D: 50 */ push eax /* 2E: A1 00 00 00 00 */ mov eax, dword ptr color_red /* 33: 50 */ push eax /* 34: 68 FF 00 00 00 */ push 0FFh /* 39: 8B 46 14 */ mov eax, [esi+14h] /* 3C: D9 40 04 */ fld dword ptr [eax+4] /* 3F: B8 00 00 00 00 */ mov eax, dword ptr dimension_corner_b_x /* 44: D8 08 */ fmul dword ptr [eax] /* 46: B8 00 00 00 00 */ mov eax, dword ptr tmp_dimension /* 4B: D9 18 */ fstp dword ptr [eax] /* 4D: 8B 00 */ mov eax, [eax] /* 4F: 50 */ push eax /* 50: */ store_shadow: /* 50: A1 00 00 00 00 */ mov eax, dword ptr active_vehicle /* 55: 3B F0 */ cmp esi, eax /* 57: 75 65 */ jnz short call_default /* 59: 8B 46 14 */ mov eax, [esi+14h] /* 5C: D9 40 00 */ fld dword ptr [eax+0] /* 5F: B8 00 00 00 00 */ mov eax, dimension_corner_b_x /* 64: D8 08 */ fmul dword ptr [eax] /* 66: B8 00 00 00 00 */ mov eax, tmp_dimension /* 6B: D9 18 */ fstp dword ptr [eax] /* 6D: 8B 00 */ mov eax, [eax] /* 6F: 50 */ push eax /* 70: 8B 46 14 */ mov eax, [esi+14h] /* 73: D9 40 14 */ fld dword ptr [eax+14h] /* 76: B8 00 00 00 00 */ mov eax, dimension_corner_b_y /* 7B: D8 08 */ fmul dword ptr [eax] /* 7D: B8 00 00 00 00 */ mov eax, tmp_dimension /* 82: D9 18 */ fstp dword ptr [eax] /* 84: 8B 00 */ mov eax, [eax] /* 86: 50 */ push eax /* 87: 8B 46 14 */ mov eax, [esi+14h] /* 8A: D9 40 10 */ fld dword ptr [eax+10h] /* 8D: B8 00 00 00 00 */ mov eax, dimension_corner_b_y /* 92: D8 08 */ fmul dword ptr [eax] /* 94: B8 00 00 00 00 */ mov eax, tmp_dimension /* 99: D9 18 */ fstp dword ptr [eax] /* 9B: 8B 00 */ mov eax, [eax] /* 9D: 50 */ push eax /* 9E: 8B 46 14 */ mov eax, [esi+14h] /* A1: 83 C0 30 */ add eax, 30h /* A4: 50 */ push eax /* A5: A1 F4 03 C4 00 */ mov eax, ds:0C403F4h /* AA: 50 */ push eax /* AB: 6A 02 */ push 2 /* AD: B8 90 73 70 00 */ mov eax, 707390h /* B2: FF D0 */ call eax /* B4: 83 C4 40 */ add esp, 40h /* B7: A1 00 00 00 00 */ mov eax, dword ptr tmp /* BC: 89 C6 */ mov esi, eax /* BE: */ call_default: /* BE: 8B 46 14 */ mov eax, [esi+14h] /* C1: 89 F1 */ mov ecx, esi /* C3: 50 */ push eax /* C4: B8 60 1A 6E 00 */ mov eax, 6E1A60h /* C9: FF D0 */ call eax /* CB: B8 BE BC 6A 00 */ mov eax, 6ABCBEh /* D0: FF E0 */ jmp eax } }
C++:static void alternate_patch_point(/* CVehicle* vehicle<esi> */) { if (vehicle == active_vehicle) { // m_pMatrix: CAutomobile -> CVehicle -> CPhysical -> CEntity -> CPlaceable -> CMatrixLink CShadows::StoreShadowToBeRendered( 2, // type (void*)0xC403F4, // texture (gpShadowExplosionTex) &vehicle->m_pMatrix->pos, // pos vehicle->m_pMatrix->up.x * dimension_corner_b_y, // x1 vehicle->m_pMatrix->up.y * dimension_corner_b_y, // y1 vehicle->m_pMatrix->right.x * dimension_corner_b_x, // x2 vehicle->m_pMatrix->right.y * dimension_corner_b_x, // y2 255, // intensity color_red, // r color_green, // g color_blue, // b 2.0f, // distance 0, // draw on water 1.0f, // scale 0x0, // shadow data 1 // draw on buildings ); } CVehicle::DoVehicleLights(vehicle, vehicle->m_pMatrix); // прыжок на 0x6ABCBE }
P.S. мог где-то проебаться, названия из plugin sdk, и безусловно это прототип и нужно нормальный код с константами, векторами, и отсутствием магических чисел
C++:
Plugin::Plugin()
{
memwrapper::write_memory<std::uint8_t>(0x6ABCB3, 0xB8);
memwrapper::write_memory<std::uintptr_t>(0x6ABCB4, reinterpret_cast<std::uintptr_t>(&LightHooked));
memwrapper::write_memory<std::uint16_t>(0x6ABCB8, 0xE0FF);
}
void Plugin::LightHooked(CVehicle* vehicle) {
std::cout << "vehicle " << vehicle << std::endl;
for (auto parseVehicle : PLUGIN.vehicles)
{
if (parseVehicle->handle == vehicle)
{
int dimension_corner_b_y = 1;
int dimension_corner_b_x = 1;
// m_pMatrix: CAutomobile -> CVehicle -> CPhysical -> CEntity -> CPlaceable -> CMatrixLink
CShadows::StoreShadowToBeRendered(
2, // type
(RwTexture*)0xC403F4, // texture (gpShadowExplosionTex)
&vehicle->m_matrix->pos, // pos
vehicle->m_matrix->up.x * dimension_corner_b_y, // x1
vehicle->m_matrix->up.y * dimension_corner_b_y, // y1
vehicle->m_matrix->right.x * dimension_corner_b_x, // x2
vehicle->m_matrix->right.y * dimension_corner_b_x, // y2
255, // intensity
parseVehicle->rgb.r, // r
parseVehicle->rgb.g, // g
parseVehicle->rgb.b, // b
2.0f, // distance
0, // draw on water
1.0f, // scale
0x0, // shadow data
1 // draw on buildings
);
vehicle->DoVehicleLights(*vehicle->m_matrix, 1);
// прыжок на 0x6ABCBE
}
}
std::cout << "AFTER PROCESSING " << vehicle << std::endl;
__asm {
// Эпилог
mov esp, ebp
pop ebp
// Возврат в функцию
mov ecx, 0x6ABCBE
jmp ecx
}
}