Share via


Вызываем 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;

Перевод: Антон Зайцев

Оригинал: https://blogs.msdn.com/sdl/archive/2009/08/06/setting-sdl-memory-related-requirements-before-your-application-starts.aspx