FPTR symbol_manager::get_text_section_base() { osd::dynamic_module::ptr m_dbghelp_dll = osd::dynamic_module::open({ "dbghelp.dll" }); ImageRvaToSection_fn image_rva_to_section = m_dbghelp_dll->bind<ImageRvaToSection_fn>("ImageRvaToSection"); ImageNtHeader_fn image_nt_header = m_dbghelp_dll->bind<ImageNtHeader_fn>("ImageNtHeader"); // start with the image base PVOID base = reinterpret_cast<PVOID>(GetModuleHandleUni()); assert(base != nullptr); // make sure we have the functions we need if (image_nt_header && image_rva_to_section) { // get the NT header PIMAGE_NT_HEADERS headers = (*image_nt_header)(base); assert(headers != nullptr); // look ourself up (assuming we are in the .text section) PIMAGE_SECTION_HEADER section = (*image_rva_to_section)(headers, base, reinterpret_cast<FPTR>(get_text_section_base) - reinterpret_cast<FPTR>(base)); if (section != nullptr) return reinterpret_cast<FPTR>(base) + section->VirtualAddress; } // fallback to returning the image base (wrong) return reinterpret_cast<FPTR>(base); }
void debugview_info::register_window_class() { if (!s_window_class_registered) { WNDCLASS wc = { 0 }; // initialize the description of the window class wc.lpszClassName = TEXT("MAMEDebugView"); wc.hInstance = GetModuleHandleUni(); wc.lpfnWndProc = &debugview_info::static_view_proc; wc.hCursor = LoadCursor(nullptr, IDC_ARROW); wc.hIcon = LoadIcon(wc.hInstance, MAKEINTRESOURCE(2)); wc.lpszMenuName = nullptr; wc.hbrBackground = nullptr; wc.style = 0; wc.cbClsExtra = 0; wc.cbWndExtra = 0; UnregisterClass(wc.lpszClassName, wc.hInstance); // register the class; fail if we can't if (!RegisterClass(&wc)) fatalerror("Unable to register debug view class\n"); s_window_class_registered = true; } }
HWND debugview_info::create_source_combobox(HWND parent, LONG_PTR userdata) { // create a combo box HWND const result = CreateWindowEx(COMBO_BOX_STYLE_EX, TEXT("COMBOBOX"), nullptr, COMBO_BOX_STYLE, 0, 0, 100, 1000, parent, nullptr, GetModuleHandleUni(), nullptr); SetWindowLongPtr(result, GWLP_USERDATA, userdata); SendMessage(result, WM_SETFONT, (WPARAM)metrics().debug_font(), (LPARAM)FALSE); // populate the combobox debug_view_source const *const cursource = m_view->source(); int maxlength = 0; for (debug_view_source const *source = m_view->first_source(); source != nullptr; source = source->next()) { int const length = strlen(source->name()); if (length > maxlength) maxlength = length; auto t_name = tstring_from_utf8(source->name()); SendMessage(result, CB_ADDSTRING, 0, (LPARAM)t_name.c_str()); } if (cursource != nullptr) { SendMessage(result, CB_SETCURSEL, m_view->source_list().indexof(*cursource), 0); SendMessage(result, CB_SETDROPPEDWIDTH, ((maxlength + 2) * metrics().debug_font_width()) + metrics().vscroll_width(), 0); m_view->set_source(*cursource); } return result; }
debugview_info::debugview_info(debugger_windows_interface &debugger, debugwin_info &owner, HWND parent, debug_view_type type) : debugbase_info(debugger), m_owner(owner), m_view(nullptr), m_wnd(nullptr), m_hscroll(nullptr), m_vscroll(nullptr) { register_window_class(); // create the child view m_wnd = CreateWindowEx(DEBUG_VIEW_STYLE_EX, TEXT("MAMEDebugView"), nullptr, DEBUG_VIEW_STYLE, 0, 0, 100, 100, parent, nullptr, GetModuleHandleUni(), this); if (m_wnd == nullptr) goto cleanup; // create the scroll bars m_hscroll = CreateWindowEx(HSCROLL_STYLE_EX, TEXT("SCROLLBAR"), nullptr, HSCROLL_STYLE, 0, 0, 100, CW_USEDEFAULT, m_wnd, nullptr, GetModuleHandleUni(), this); m_vscroll = CreateWindowEx(VSCROLL_STYLE_EX, TEXT("SCROLLBAR"), nullptr, VSCROLL_STYLE, 0, 0, CW_USEDEFAULT, 100, m_wnd, nullptr, GetModuleHandleUni(), this); if ((m_hscroll == nullptr) || (m_vscroll == nullptr)) goto cleanup; // create the debug view m_view = machine().debug_view().alloc_view(type, &debugview_info::static_update, this); if (m_view == nullptr) goto cleanup; return; cleanup: if (m_hscroll != nullptr) DestroyWindow(m_hscroll); m_hscroll = nullptr; if (m_vscroll != nullptr) DestroyWindow(m_vscroll); m_vscroll = nullptr; if (m_wnd != nullptr) DestroyWindow(m_wnd); m_wnd = nullptr; if (m_view != nullptr) machine().debug_view().free_view(*m_view); m_view = nullptr; }
bool windows_osd_interface::output_init() { int result; // reset globals clientlist = nullptr; // create our window class result = create_window_class(); assert(result == 0); (void)result; // to silence gcc 4.6 // create a window output_hwnd = CreateWindowEx( WINDOW_STYLE_EX, OUTPUT_WINDOW_CLASS, OUTPUT_WINDOW_NAME, WINDOW_STYLE, 0, 0, 1, 1, nullptr, nullptr, GetModuleHandleUni(), nullptr); assert(output_hwnd != nullptr); // set a pointer to the running machine SetWindowLongPtr(output_hwnd, GWLP_USERDATA, (LONG_PTR)&machine()); // allocate message ids om_mame_start = RegisterWindowMessage(OM_MAME_START); assert(om_mame_start != 0); om_mame_stop = RegisterWindowMessage(OM_MAME_STOP); assert(om_mame_stop != 0); om_mame_update_state = RegisterWindowMessage(OM_MAME_UPDATE_STATE); assert(om_mame_update_state != 0); om_mame_register_client = RegisterWindowMessage(OM_MAME_REGISTER_CLIENT); assert(om_mame_register_client != 0); om_mame_unregister_client = RegisterWindowMessage(OM_MAME_UNREGISTER_CLIENT); assert(om_mame_unregister_client != 0); om_mame_get_id_string = RegisterWindowMessage(OM_MAME_GET_ID_STRING); assert(om_mame_get_id_string != 0); // broadcast a startup message PostMessage(HWND_BROADCAST, om_mame_start, (WPARAM)output_hwnd, 0); // register a notifier for output changes machine().output().set_notifier(nullptr, notifier_callback, &machine()); return true; }
BOOL win_is_gui_application(void) { static BOOL is_gui_frontend; static BOOL is_first_time = TRUE; HMODULE module; BYTE *image_ptr; IMAGE_DOS_HEADER *dos_header; IMAGE_NT_HEADERS *nt_headers; IMAGE_OPTIONAL_HEADER *opt_header; // is this the first time we've been ran? if (is_first_time) { is_first_time = FALSE; // get the current module module = GetModuleHandleUni(); if (!module) return FALSE; image_ptr = (BYTE*) module; // access the DOS header dos_header = (IMAGE_DOS_HEADER *) image_ptr; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; // access the NT headers nt_headers = (IMAGE_NT_HEADERS *) ((BYTE*)(dos_header) + (DWORD)(dos_header->e_lfanew)); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return FALSE; // access the optional header opt_header = &nt_headers->OptionalHeader; switch (opt_header->Subsystem) { case IMAGE_SUBSYSTEM_WINDOWS_GUI: is_gui_frontend = TRUE; break; case IMAGE_SUBSYSTEM_WINDOWS_CUI: is_gui_frontend = FALSE; break; } } return is_gui_frontend; }
editwin_info::editwin_info(debugger_windows_interface &debugger, bool is_main_console, LPCSTR title, WNDPROC handler) : debugwin_info(debugger, is_main_console, title, handler), m_editwnd(nullptr), m_edit_defstr(), m_original_editproc(nullptr), m_history_count(0), m_last_history(0) { if (window() == nullptr) return; // create an edit box and override its key handling m_editwnd = CreateWindowEx(EDIT_BOX_STYLE_EX, TEXT("EDIT"), nullptr, EDIT_BOX_STYLE, 0, 0, 100, 100, window(), nullptr, GetModuleHandleUni(), nullptr); m_original_editproc = (WNDPROC)(FPTR)GetWindowLongPtr(m_editwnd, GWLP_WNDPROC); SetWindowLongPtr(m_editwnd, GWLP_USERDATA, (LONG_PTR)this); SetWindowLongPtr(m_editwnd, GWLP_WNDPROC, (LONG_PTR)&editwin_info::static_edit_proc); SendMessage(m_editwnd, WM_SETFONT, (WPARAM)metrics().debug_font(), (LPARAM)FALSE); SendMessage(m_editwnd, EM_LIMITTEXT, (WPARAM)MAX_EDIT_STRING, (LPARAM)0); set_editwnd_text(""); }
static int create_window_class(void) { static UINT8 classes_created = FALSE; /* only do this once */ if (!classes_created) { WNDCLASS wc = { 0 }; // initialize the description of the window class wc.lpszClassName = OUTPUT_WINDOW_CLASS; wc.hInstance = GetModuleHandleUni(); wc.lpfnWndProc = output_window_proc; UnregisterClass(wc.lpszClassName, wc.hInstance); // register the class; fail if we can't if (!RegisterClass(&wc)) return 1; classes_created = TRUE; } return 0; }
debugwin_info::debugwin_info(debugger_windows_interface &debugger, bool is_main_console, LPCSTR title, WNDPROC handler) : debugbase_info(debugger), m_is_main_console(is_main_console), m_next(NULL), m_wnd(NULL), m_handler(handler), m_minwidth(200), m_maxwidth(0), m_minheight(200), m_maxheight(0), m_ignore_char_lparam(0) { register_window_class(); m_wnd = win_create_window_ex_utf8(DEBUG_WINDOW_STYLE_EX, "MAMEDebugWindow", title, DEBUG_WINDOW_STYLE, 0, 0, 100, 100, win_window_list->m_hwnd, create_standard_menubar(), GetModuleHandleUni(), this); if (m_wnd == NULL) return; RECT work_bounds; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_bounds, 0); m_maxwidth = work_bounds.right - work_bounds.left; m_maxheight = work_bounds.bottom - work_bounds.top; }