2013-07-08 4 views
0

поэтому я просматриваю какой-то исходный код, и эта одна вещь меня тошнит. Я немного новичок в C++, поэтому мне трудно понять, для чего это нужно. Я действительно не знаю, для чего нужен следующий typedef, и как он используется в коде ниже.C++ typedef с параметрами и fastcall

typedef void (__fastcall *TSecType_long___SetData_t)(DWORD dwAddress, DWORD dwEDX, DWORD dwValue); 

Это некоторые значения, используемые для метода, который использует этот typedef.

const TSecType_long___SetData_t TSecType_long___SetData = reinterpret_cast<TSecType_long___SetData_t>(0x00518430); // 56 8B ? 8B ? ? ? ? ? 41 [3rd Result] 

const DWORD *const pdwUserLocal = reinterpret_cast<const DWORD *const>(0x016A1234); // 8B ? ? ? ? ? 85 C9 74 ? 83 B8 ? ? ? ? 00 74 ? 8B ? ? ? ? ? 85 C0 7E ? 8B 
const DWORD dwTeleportToggleOffset = 0x00008A94; // 8D ? ? ? ? ? 8B ? 8B ? E8 ? ? ? ? 85 ? 0F 85 ? ? ? ? 39 ? ? ? ? ? 
const DWORD dwTeleportYOffset = 0x00008AAC; // 8D ? ? ? ? ? ? 8B ? E8 ? ? ? ? 6A ? 8B ? E8 ? ? ? ? 6A 00 68 ? ? ? ? 
const DWORD dwTeleportXOffset = dwTeleportYOffset + 0x0C; 

И для самого метода:

bool Teleport(_In_ int nX, _In_ int nY) 
{ 
__try 
{ 
    { 

     DWORD dwUserLocal = *pdwUserLocal; 
     TSecType_long___SetData(dwUserLocal + dwTeleportToggleOffset, NULL, 0); 
     TSecType_long___SetData(dwUserLocal + dwTeleportXOffset, NULL, nX); 
     TSecType_long___SetData(dwUserLocal + dwTeleportYOffset, NULL, nY); 
     TSecType_long___SetData(dwUserLocal + dwTeleportToggleOffset, NULL, 1); 
    } 
} 
__except (EXCEPTION_EXECUTE_HANDLER) 
{ 
    return false; 
} 
return true; 
} 
+3

Что именно ваш вопрос? – chris

+0

Что это за код? Возможно, это произошло из некоторого компилятора C++? (не знал, что они есть, но я не могу представить себе такой код написания человеком). Если это так, то это не очень хорошая работа. –

+1

@j_kubik, Это взломать игру (или, по крайней мере, похожую на одну). Не совсем уверен в том, для чего предназначены все длинные типы/имена, которые используют зарезервированные идентификаторы. – chris

ответ

1

Работа в предположении, что вы знаете, что такое typedef это (он принимает тип данных и дает ему другое имя), все, что это - это функция typedef. Другими словами, TSecType_long___SetData_t - это функция, которая принимает аргументы 3 DWORD и возвращает void.

В вашем случае у кого-то есть априорное знание, что адрес 0x00518430 содержит функцию, которая может быть вызвана с учетом API TSecType_long___SetData_t. Чтобы сделать этот адрес вызываемым, адрес переинтерпретируется как тип данных функции и присваивается переменной TSecType_long___SetData.

0

Точно так же, как @chris сказал, что TSecType_long___SetData_t - это просто указатель на указатель на функцию, имеющий параметры. И следующая строка:

const TSecType_long___SetData_t TSecType_long___SetData = einterpret_cast<TSecType_long___SetData_t>(0x00518430); 

определяет переменную этого типа и присваивает ему значение, которое в данном случае, кажется, жёстко прописанные ячейку памяти (который я не знаю, где это происходит от). Все остальные вхождения - это просто вызовы функций.
Небольшой поиск по функциям должен показывать вам все, что вам нужно знать о них.