// Класс-заглушка class UObject { } ; // Структура кадра стека UnrealScript struct FFrame { int * ftable ; // Указатель на таблицу функций void * Node ; // Указатель на узел UObject * Object ; // Указатель на объект BYTE * Code ; // Указатель на код BYTE * Locals ; // Указатель на локальные переменные INT LineNum ; // Номер строки } ; // Тип для нативных функций typedef void ( __stdcall * Native ) ( FFrame & , void * const ) ; // Тип для функции регистрации нативных функций в UnrealScript typedef BYTE ( __cdecl * GRegisterNative_fnType ) ( INT iNative , const Native & Func ) ; //Функция которая должна вернуть строку в UnrealScript static void __stdcall GetMyString ( struct FFrame & Stack , void * Result ) { const wchar_t * source = L "Hello, world!" ; size_t len = wcslen ( source ) + 1 ; // Выделяем память + проверка на ошибку wchar_t * buffer = ( wchar_t * ) malloc ( len * sizeof ( wchar_t ) ) ; if ( buffer == NULL ) { * ( ( wchar_t * * ) Result ) = NULL ; return ; } // Используем wcscpy_s errno_t err = wcscpy_s ( buffer , len , source ) ; // len - размер буфера if ( err != 0 ) { free ( buffer ) ; // Обязательно освободить память в случае ошибки * ( ( wchar_t * * ) Result ) = NULL ; return ; } * ( ( wchar_t * * ) Result ) = buffer ; } // Подключение Core.dll void hookCore ( ) { HMODULE hCore = GetModuleHandleA ( "Core.dll" ) ; // Получение дескриптора Core.dll // Проверка на успешное получение дескриптора if ( hCore ) { GRegisterNative_fnType GRegisterNative_fn = ( GRegisterNative_fnType ) GetProcAddress ( hCore , "?GRegisterNative@@YAEHABQ8UObject@@AEXAAUFFrame@@QAX@Z@Z" ) ; // Проверка на успешное получение адреса функции if ( GRegisterNative_fn ) { // Регистрация нативных функций в UnrealScript GRegisterNative_fn ( 1255 , & GetMyString ) ; } } } // Точка входа DLL extern "C" __declspec ( dllexport ) BOOL APIENTRY DllMain ( HMODULE hModule , DWORD ul_reason_for_call , LPVOID lpReserved ) { if ( ul_reason_for_call == DLL_PROCESS_ATTACH ) { // Отключение отслеживания вызовов функций библиотеки DisableThreadLibraryCalls ( hModule ) ; hookCore ( ) ; } return TRUE ; }
native ( 1255 ) final function string GetMyString ( ) ; AddSystemMessageString ( "DLL_TEXT=" @ GetMyString ( ) ) ; //string Вывод системных сообщений в чат