changeset 30801:500a36300757

Support thread handles in WaitForSingleObject. Some codecs need this for clean shutdown (as opposed to a crash); we don't really support timed wait since POSIX doesn't, but it doesn't seem necessary.
author sesse
date Fri, 05 Mar 2010 11:11:47 +0000
parents d600373a8935
children 3df1e29a3185
files loader/win32.c
diffstat 1 files changed, 29 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/loader/win32.c	Fri Mar 05 08:41:35 2010 +0000
+++ b/loader/win32.c	Fri Mar 05 11:11:47 2010 +0000
@@ -569,16 +569,28 @@
 #define	MODULE_HANDLE_winmm	((HMODULE)0x128)
 #define	MODULE_HANDLE_psapi	((HMODULE)0x129)
 
+/* fake EXE struct to make msvcrt8+ not to crash:
+   it checks all exe sections for a section named .mixcrt
+   we fake a section with that name, so the crt will avoid
+   using Encode/Decode Pointer, as we was a posix binary */
+static const struct {
+    IMAGE_DOS_HEADER doshdr;
+    IMAGE_NT_HEADERS nthdr;
+    IMAGE_SECTION_HEADER opthdr;
+} __attribute__((__packed__)) mp_exe = {
+    .doshdr.e_lfanew = sizeof(IMAGE_DOS_HEADER),
+    .nthdr.FileHeader.NumberOfSections = 1,
+    .nthdr.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_NT_HEADERS) - FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader), /* 0xe0 */
+    .opthdr.Name = ".mixcrt"
+};
+
 static HMODULE WINAPI expGetModuleHandleA(const char* name)
 {
     WINE_MODREF* wm;
     HMODULE result;
     if(!name)
-#ifdef CONFIG_QTX_CODECS
-	result=1;
-#else
-	result=0;
-#endif
+      result=(HMODULE)&mp_exe.doshdr;
+
     else
     {
 	wm=MODULE_FindModule(name);
@@ -787,6 +799,7 @@
     // FIXME FIXME FIXME - this value is sometime unititialize !!!
     int ret = WAIT_FAILED;
     mutex_list* pp=mlist;
+    th_list* tp=list;
     if(object == (void*)0xcfcf9898)
     {
 	/**
@@ -802,6 +815,17 @@
     }
     dbgprintf("WaitForSingleObject(0x%x, duration %d) =>\n",object, duration);
 
+    // See if this is a thread.
+    while (tp && (tp->thread != object))
+        tp = tp->prev;
+    if (tp) {
+        if (pthread_join(*(pthread_t*)object, NULL) == 0) {
+            return (void*)WAIT_OBJECT_0;
+        } else {
+            return (void*)WAIT_FAILED;
+        }
+    }
+
     // loop below was slightly fixed - its used just for checking if
     // this object really exists in our list
     if (!ml)