// Copyright 2018 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // main.cpp: DLL entry point. #if defined(_WIN32) # include "resource.h" # include # ifdef DEBUGGER_WAIT_DIALOG static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rect; switch(uMsg) { case WM_INITDIALOG: GetWindowRect(GetDesktopWindow(), &rect); SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE); SetTimer(hwnd, 1, 100, NULL); return TRUE; case WM_COMMAND: if(LOWORD(wParam) == IDCANCEL) { EndDialog(hwnd, 0); } break; case WM_TIMER: if(IsDebuggerPresent()) { EndDialog(hwnd, 0); } } return FALSE; } static void WaitForDebugger(HINSTANCE instance) { if(!IsDebuggerPresent()) { HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG); DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE *)LoadResource(instance, dialog); DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc); } } # endif extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: # ifdef DEBUGGER_WAIT_DIALOG { char disable_debugger_wait_dialog[] = "0"; GetEnvironmentVariable("SWIFTSHADER_DISABLE_DEBUGGER_WAIT_DIALOG", disable_debugger_wait_dialog, sizeof(disable_debugger_wait_dialog)); if(disable_debugger_wait_dialog[0] != '1') { WaitForDebugger(instance); } } # endif break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: default: break; } return TRUE; } #endif