//============================================================ // // winutil.c - Win32 OSD core utility functions // //============================================================ // // Copyright Aaron Giles // All rights reserved. // // Redistribution and use in source and binary forms, with or // without modification, are permitted provided that the // following conditions are met: // // * Redistributions of source code must retain the above // copyright notice, this list of conditions and the // following disclaimer. // * Redistributions in binary form must reproduce the // above copyright notice, this list of conditions and // the following disclaimer in the documentation and/or // other materials provided with the distribution. // * Neither the name 'MAME' nor the names of its // contributors may be used to endorse or promote // products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // //============================================================ // standard windows headers #define WIN32_LEAN_AND_MEAN #include // MAMEOS headers #include "winutil.h" #include "strconv.h" //============================================================ // win_error_to_file_error //============================================================ file_error win_error_to_file_error(DWORD error) { file_error filerr; // convert a Windows error to a file_error switch (error) { case ERROR_SUCCESS: filerr = FILERR_NONE; break; case ERROR_OUTOFMEMORY: filerr = FILERR_OUT_OF_MEMORY; break; case ERROR_FILE_NOT_FOUND: case ERROR_FILENAME_EXCED_RANGE: case ERROR_PATH_NOT_FOUND: filerr = FILERR_NOT_FOUND; break; case ERROR_ACCESS_DENIED: filerr = FILERR_ACCESS_DENIED; break; case ERROR_SHARING_VIOLATION: filerr = FILERR_ALREADY_OPEN; break; default: filerr = FILERR_FAILURE; break; } return filerr; } //============================================================ // win_attributes_to_entry_type //============================================================ osd_dir_entry_type win_attributes_to_entry_type(DWORD attributes) { if (attributes == 0xFFFFFFFF) return ENTTYPE_NONE; else if (attributes & FILE_ATTRIBUTE_DIRECTORY) return ENTTYPE_DIR; else return ENTTYPE_FILE; } //============================================================ // win_is_gui_application //============================================================ 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 = GetModuleHandle(NULL); 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; }