Вызываем API, требуемые SDL, перед запуском приложения.
С вами Майкл Ховард.
Сразу предупреждаю, что данный пост имеет мало общего со схемой SDL и выложен исключительно к вашему сведению.
Приблизительно раз в месяц я получаю подобный вопрос: "Как я могу вызвать множество прикладных программных интерфейсов(API), требуемых SDL, перед запуском моего кода?".
Поэтому вместо того, чтобы постоянно отвечать одно и то же, я решил опубликовать статью на эту тему. Вопрос можно приблизительно переформулировать следующим образом: "Могу ли я вызвать некоторый код для настройки перед тем, так запустится main() ?".
Я отвечу: "Конечно, да!". Но зачем нам это необходимо? Возможно, что вы хотите вызвать SetProcessDEPPolicy API , потому что не имеете доступа к компилятору с флагом /NXCOMPAT. Или вызвать HeapSetInformation до запуска main() , потому что в теле программы используются сомнительные входные данные. Или, возможно, вы желаете создать библиотеку для ваших разработчиков, чтобы они ее подсоединяли и не требовать от них добавлять вызовы прикладных программных интерфейсов в их код. Но, наверняка, самой важной причиной будет то, что вы захотели обновить много EXE-приложений, но желаете менять сам код. Все, что вам нужно - это подключить OBJ-файл!
Visual C++ позволяет вам определить ваши собственные секции кода, которые будут вызваны службой запуска начального кода (C startup runtime code) до функции main(). Следующий фрагмент кода можно скомпилировать в файл .OBJ и далее подключить к вашему С или С++ проекту. Этот код вызовет SetProcessDEPPolicy API и выставит защиту NX-битом для вашего приложения. Хотя там вы можете добавить любой прикладной программный интерфейс.
1:
2: static int __cdecl SDLSetup(void) {
3: HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
4: HMODULE hmodKernel32 = GetModuleHandleW(L"KERNEL32.DLL");
5: BOOL (WINAPI *pfnSetProcessDEPPolicy)(DWORD);
6: *(FARPROC *) &pfnSetProcessDEPPolicy
7: = GetProcAddress(hmodKernel32, "SetProcessDEPPolicy");
8: if (pfnSetProcessDEPPolicy != 0)
9: (*pfnSetProcessDEPPolicy)
10: (PROCESS_DEP_ENABLE | PROCESS_DEP_DISABLE_ATL_THUNK_EMULATION);
11: return(0);
12: }
13: static __declspec(allocate(".CRT$XIAA")) int (__cdecl *pfnSDLSetup)(void)
14:
15: = &SDLSetup;
Перевод: Антон Зайцев