summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/windows/winutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/windows/winutil.cpp')
-rw-r--r--src/osd/windows/winutil.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/osd/windows/winutil.cpp b/src/osd/windows/winutil.cpp
new file mode 100644
index 00000000000..c34e358492b
--- /dev/null
+++ b/src/osd/windows/winutil.cpp
@@ -0,0 +1,135 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+//============================================================
+//
+// winutil.c - Win32 OSD core utility functions
+//
+//============================================================
+
+// standard windows headers
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+// 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 = 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;
+}
+
+//-------------------------------------------------
+// Universal way to get module handle
+//-------------------------------------------------
+
+HMODULE WINAPI GetModuleHandleUni()
+{
+ MEMORY_BASIC_INFORMATION mbi;
+ VirtualQuery((LPCVOID)GetModuleHandleUni, &mbi, sizeof(mbi));
+ return (HMODULE)mbi.AllocationBase;
+}