diff loader/win32.c @ 3465:4dad31e655b6

avifile merge. kabi: indent changes really suxxxx
author arpi
date Tue, 11 Dec 2001 22:58:14 +0000
parents ca39dc9f879b
children 5ff731ccaa69
line wrap: on
line diff
--- a/loader/win32.c	Tue Dec 11 21:21:32 2001 +0000
+++ b/loader/win32.c	Tue Dec 11 22:58:14 2001 +0000
@@ -1,13 +1,13 @@
 /***********************************************************
 
-	Win32 emulation code. Functions that emulate
-	responses from corresponding Win32 API calls.
-         Since we are not going to be able to load
-       virtually any DLL, we can only implement this
-      much, adding needed functions with each new codec.
-
-      Basic principle of implementation: it's not good
-      for DLL to know too much about its environment.
+Win32 emulation code. Functions that emulate
+responses from corresponding Win32 API calls.
+Since we are not going to be able to load
+virtually any DLL, we can only implement this
+much, adding needed functions with each new codec.
+
+Basic principle of implementation: it's not good
+for DLL to know too much about its environment.
 
 ************************************************************/
 
@@ -53,12 +53,12 @@
 /* system has no vsscanf.  try to provide one */
 static int vsscanf( const char *str, const char *format, va_list ap)
 {
-	long p1 = va_arg(ap, long);
-	long p2 = va_arg(ap, long);
-	long p3 = va_arg(ap, long);
-	long p4 = va_arg(ap, long);
-	long p5 = va_arg(ap, long);
-	return sscanf(str, format, p1, p2, p3, p4, p5);
+    long p1 = va_arg(ap, long);
+    long p2 = va_arg(ap, long);
+    long p3 = va_arg(ap, long);
+    long p4 = va_arg(ap, long);
+    long p5 = va_arg(ap, long);
+    return sscanf(str, format, p1, p2, p3, p4, p5);
 }
 #endif
 
@@ -66,37 +66,43 @@
 
 static void do_cpuid(unsigned int ax, unsigned int *regs)
 {
-	__asm__ __volatile__(
-	"pushl %%ebx; pushl %%ecx; pushl %%edx;"
-	".byte  0x0f, 0xa2;"
-	"movl   %%eax, (%2);"
-	"movl   %%ebx, 4(%2);"
-	"movl   %%ecx, 8(%2);"
-	"movl   %%edx, 12(%2);"
-	"popl %%edx; popl %%ecx; popl %%ebx;"
-	: "=a" (ax)
-	:  "0" (ax), "S" (regs)
+    __asm__ __volatile__
+	(
+	 "pushl %%ebx; pushl %%ecx; pushl %%edx;"
+	 ".byte  0x0f, 0xa2;"
+	 "movl   %%eax, (%2);"
+	 "movl   %%ebx, 4(%2);"
+	 "movl   %%ecx, 8(%2);"
+	 "movl   %%edx, 12(%2);"
+	 "popl %%edx; popl %%ecx; popl %%ebx;"
+	 : "=a" (ax)
+	 :  "0" (ax), "S" (regs)
 	);
 }
 static unsigned int c_localcount_tsc()
 {
     int a;
-    __asm__ __volatile__("rdtsc\n\t"
-    :"=a"(a)
-    :
-    :"edx");
+    __asm__ __volatile__
+	(
+	 "rdtsc\n\t"
+	 :"=a"(a)
+	 :
+	 :"edx"
+	);
     return a;
 }
 static void c_longcount_tsc(long long* z)
 {
-    __asm__ __volatile__(
-    "pushl %%ebx\n\t"
-    "movl %%eax, %%ebx\n\t"
-    "rdtsc\n\t"
-    "movl %%eax, 0(%%ebx)\n\t"
-    "movl %%edx, 4(%%ebx)\n\t"
-    "popl %%ebx\n\t"
-    ::"a"(z));
+    __asm__ __volatile__
+	(
+	 "pushl %%ebx\n\t"
+	 "movl %%eax, %%ebx\n\t"
+	 "rdtsc\n\t"
+	 "movl %%eax, 0(%%ebx)\n\t"
+	 "movl %%edx, 4(%%ebx)\n\t"
+	 "popl %%ebx\n\t"
+	 ::"a"(z)
+	);
 }
 static unsigned int c_localcount_notsc()
 {
@@ -137,7 +143,7 @@
     }
     else
     {
-    	localcount=c_localcount_notsc;
+	localcount=c_localcount_notsc;
 	longcount=c_longcount_notsc;
     }
     return localcount();
@@ -153,7 +159,7 @@
     }
     else
     {
-    	localcount=c_localcount_notsc;
+	localcount=c_localcount_notsc;
 	longcount=c_longcount_notsc;
     }
     longcount(z);
@@ -168,19 +174,20 @@
     {
 	FILE* f;
 	va_list va;
-        va_start(va, fmt);
+	va_start(va, fmt);
 	f=fopen("./log", "a");
 	vprintf(fmt, va);
-    	if(f)
+	fflush(stdout);
+	if(f)
 	{
 	    vfprintf(f, fmt, va);
 	    fsync(fileno(f));
-    	    fclose(f);
+	    fclose(f);
 	}
 	va_end(va);
     }
 #endif
-#ifdef USE_WIN32DLL
+#ifdef MPLAYER
     #include "../mp_msg.h"
     {
 	char buf[1024];
@@ -195,10 +202,10 @@
 }
 
 
-char export_names[500][30]={
-"name1",
-//"name2",
-//"name3"
+char export_names[300][32]={
+    "name1",
+    //"name2",
+    //"name3"
 };
 //#define min(x,y) ((x)<(y)?(x):(y))
 
@@ -235,8 +242,8 @@
     }
     for(;offset<min(offset+1000, 20000000); offset++)
 	if(heap[offset]!=0xCC)
-	    {
-		printf("Free heap corruption at address %d\n", offset);
+	{
+	    printf("Free heap corruption at address %d\n", offset);
 	}
 }
 #undef MEMORY_DEBUG
@@ -248,7 +255,7 @@
     static int test=0;
     test++;
     if(test%10==0)printf("Memory: %d bytes allocated\n", heap_counter);
-//    test_heap();
+    //    test_heap();
     if(heap==NULL)
     {
 	heap=malloc(20000000);
@@ -270,7 +277,7 @@
     heap_counter+=4;
     printf("Allocated %d bytes of memory: sys %d, user %d-%d\n", size, heap_counter-8, heap_counter, heap_counter+size);
     if(to_zero)
-    	memset(heap+heap_counter, 0, size);
+	memset(heap+heap_counter, 0, size);
     else
 	memset(heap+heap_counter, 0xcc, size);  // make crash reproducable
     heap_counter+=size;
@@ -278,7 +285,7 @@
 }
 int my_release(char* memory)
 {
-//    test_heap();
+    //    test_heap();
     if(memory==NULL)
     {
 	printf("ERROR: free(0)\n");
@@ -290,7 +297,7 @@
 	return 0;
     }
     printf("Freed %d bytes of memory\n", *(int*)(memory-4));
-//    memset(memory-8, *(int*)(memory-4), 0xCC);
+    //    memset(memory-8, *(int*)(memory-4), 0xCC);
     return 0;
 }
 
@@ -299,7 +306,7 @@
 typedef struct alloc_header_t alloc_header;
 struct alloc_header_t
 {
-// let's keep allocated data 16 byte aligned
+    // let's keep allocated data 16 byte aligned
     alloc_header* prev;
     alloc_header* next;
     long deadbeef;
@@ -332,11 +339,12 @@
 void* mreq_private(int size, int to_zero, int type);
 void* mreq_private(int size, int to_zero, int type)
 {
-    alloc_header* header;
+    int nsize = size + sizeof(alloc_header);
+    alloc_header* header = malloc(nsize);
+    if (!header)
+        return 0;
     if (to_zero)
-	header=calloc(size + sizeof(alloc_header), 1);
-    else
-	header=malloc(size + sizeof(alloc_header));
+	memset(header, 0, nsize);
 #ifdef GARBAGE
     if (!last_alloc)
     {
@@ -345,7 +353,7 @@
     }
     else
     {
-        pthread_mutex_lock(&memmut);
+	pthread_mutex_lock(&memmut);
 	last_alloc->next = header;  /* set next */
     }
 
@@ -363,12 +371,6 @@
     return header + 1;
 }
 
-void* my_mreq(int size, int to_zero)
-{
-    return mreq_private(size, to_zero, AREATYPE_CLIENT);
-}
-
-
 int my_release(void* memory)
 {
     alloc_header* header = (alloc_header*) memory - 1;
@@ -405,6 +407,7 @@
 	//memset(memory, 0xcc, header->size);
     }
 
+    header->deadbeef = 0;
     prevmem = header->prev;
     nextmem = header->next;
 
@@ -422,23 +425,29 @@
 	pthread_mutex_unlock(&memmut);
     else
 	pthread_mutex_destroy(&memmut);
-    
+
     //if (alccnt < 40000) printf("MY_RELEASE: %p\t%ld    (%d)\n", header, header->size, alccnt);
 #else
     if (memory == 0)
 	return 0;
 #endif
+    //memset(header + 1, 0xcc, header->size);
     free(header);
     return 0;
 }
 #endif
 
+inline void* my_mreq(int size, int to_zero)
+{
+    return mreq_private(size, to_zero, AREATYPE_CLIENT);
+}
+
 static inline int my_size(void* memory)
 {
     return ((alloc_header*)memory)[-1].size;
 }
 
-void* my_realloc(void* memory, int size)
+static void* my_realloc(void* memory, int size)
 {
     void *ans = memory;
     int osize = my_size(memory);
@@ -453,131 +462,78 @@
     return ans;
 }
 
-extern int unk_exp1;
-char extcode[20000];// place for 200 unresolved exports
-int pos=0;
-
-int WINAPI ext_unknown()
+/*
+ *
+ *  WINE  API  - native implementation for several win32 libraries
+ *
+ */
+
+static int WINAPI ext_unknown()
 {
     printf("Unknown func called\n");
     return 0;
 }
-int WINAPI expIsBadWritePtr(void* ptr, unsigned int count)
+
+static int WINAPI expIsBadWritePtr(void* ptr, unsigned int count)
 {
-    int result;
-    if(count==0)
-	result=0;
-    else
-    if(ptr==0)
-        result=1;
-    else
-	result=0;
+    int result = (count == 0 || ptr != 0) ? 0 : 1;
     dbgprintf("IsBadWritePtr(0x%x, 0x%x) => %d\n", ptr, count, result);
     return result;
 }
-int WINAPI expIsBadReadPtr(void* ptr, unsigned int count)
+static int WINAPI expIsBadReadPtr(void* ptr, unsigned int count)
 {
-    int result;
-    if(count==0)
-	result=0;
-    else
-    if(ptr==0)
-        result=1;
-    else
-	result=0;
+    int result = (count == 0 || ptr != 0) ? 0 : 1;
     dbgprintf("IsBadReadPtr(0x%x, 0x%x) => %d\n", ptr, count, result);
     return result;
 }
-void* CDECL expmalloc(int size)
-{
-//printf("malloc");
-//    return malloc(size);
-    void* result=my_mreq(size,0);
-    dbgprintf("malloc(0x%x) => 0x%x\n", size,result);
-    if(result==0)
-	printf("WARNING: malloc() failed\n");
-    return result;
-}
-void CDECL expfree(void* mem)
-{
-//    return free(mem);
-    dbgprintf("free(0x%x)\n", mem);
-    my_release(mem);
-}
-void* CDECL expnew(int size)
-{
-//    printf("NEW:: Call from address %08x\n STACK DUMP:\n", *(-1+(int*)&size));
-//    printf("%08x %08x %08x %08x\n",
-//    size, *(1+(int*)&size),
-    //    *(2+(int*)&size),*(3+(int*)&size));
-    void* result = 0;
-    assert(size >= 0);
-
-    result=my_mreq(size,0);
-    dbgprintf("new(0x%x) => 0x%x\n", size, result);
-    if (result==0)
-	printf("WARNING: new() failed\n");
-    return result;
-
-}
-int CDECL expdelete(void* memory)
-{
-    dbgprintf("delete(0x%x)\n", memory);
-    my_release(memory);
-    return 0;
-}
-int WINAPI expDisableThreadLibraryCalls(int module)
+static int WINAPI expDisableThreadLibraryCalls(int module)
 {
     dbgprintf("DisableThreadLibraryCalls(0x%x) => 0\n", module);
     return 0;
 }
-int CDECL exp_initterm(int v1, int v2)
-{
-    dbgprintf("_initterm(0x%x, 0x%x) => 0\n", v1, v2);
-    return 0;
-}
-
-HMODULE WINAPI expGetDriverModuleHandle(DRVR* pdrv)
+
+static HMODULE WINAPI expGetDriverModuleHandle(DRVR* pdrv)
 {
     HMODULE result;
     if (pdrv==NULL)
 	result=0;
     else
-        result=pdrv->hDriverModule;
+	result=pdrv->hDriverModule;
     dbgprintf("GetDriverModuleHandle(%p) => %p\n", pdrv, result);
     return result;
 }
 
 #define	MODULE_HANDLE_kernel32	((HMODULE)0x120)
 
-HMODULE WINAPI expGetModuleHandleA(const char* name)
+static HMODULE WINAPI expGetModuleHandleA(const char* name)
 {
-	WINE_MODREF* wm;
-	HMODULE result;
-	if(!name)
-	    result=0;
+    WINE_MODREF* wm;
+    HMODULE result;
+    if(!name)
+	result=0;
+    else
+    {
+	wm=MODULE_FindModule(name);
+	if(wm==0)result=0;
 	else
-	{
-    	    wm=MODULE_FindModule(name);
-		if(wm==0)result=0;
-	    else
-    		result=(HMODULE)(wm->module);
-	}
-	if(!result)
-	{
-	    if(strcasecmp(name, "kernel32")==0)
-		result=MODULE_HANDLE_kernel32;
-	}
-         dbgprintf("GetModuleHandleA('%s') => 0x%x\n", name, result);
-	return result;
+	    result=(HMODULE)(wm->module);
+    }
+    if(!result)
+    {
+	if(strcasecmp(name, "kernel32")==0)
+	    result=MODULE_HANDLE_kernel32;
+    }
+    dbgprintf("GetModuleHandleA('%s') => 0x%x\n", name, result);
+    return result;
 }
 
 
-void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize, void* lpStartAddress,
-	void* lpParameter, long dwFlags, long* dwThreadId)
+static void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize,
+				    void* lpStartAddress, void* lpParameter,
+				    long dwFlags, long* dwThreadId)
 {
     pthread_t *pth;
-//    printf("CreateThread:");
+    //    printf("CreateThread:");
     pth=my_mreq(sizeof(pthread_t), 0);
     pthread_create(pth, NULL, (void*(*)(void*))lpStartAddress, lpParameter);
     if(dwFlags)
@@ -598,7 +554,7 @@
     }
     list->thread=pth;
     dbgprintf("CreateThread(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0x%x\n",
-	pSecAttr, dwStackSize, lpStartAddress, lpParameter, dwFlags, dwThreadId, pth);
+	      pSecAttr, dwStackSize, lpStartAddress, lpParameter, dwFlags, dwThreadId, pth);
     return pth;
 }
 
@@ -622,7 +578,7 @@
 void destroy_event(void* event)
 {
     mutex_list* pp=mlist;
-//    printf("garbage collector: destroy_event(%x)\n", event);
+    //    printf("garbage collector: destroy_event(%x)\n", event);
     while(pp)
     {
 	if(pp==(mutex_list*)event)
@@ -633,46 +589,46 @@
 		pp->prev->next=pp->next;
 	    if(mlist==(mutex_list*)event)
 		mlist=mlist->prev;
-/*
-	    pp=mlist;
-	    while(pp)
-	    {
-		printf("%x => ", pp);
-		pp=pp->prev;
-	    }
-	    printf("0\n");
-*/
+	    /*
+	     pp=mlist;
+	     while(pp)
+	     {
+	     printf("%x => ", pp);
+	     pp=pp->prev;
+	     }
+	     printf("0\n");
+	     */
 	    return;
 	}
 	pp=pp->prev;
     }
 }
 
-void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
-    char bInitialState, const char* name)
+static void* WINAPI expCreateEventA(void* pSecAttr, char bManualReset,
+				    char bInitialState, const char* name)
 {
     pthread_mutex_t *pm;
     pthread_cond_t  *pc;
-/*
-    mutex_list* pp;
-    pp=mlist;
-    while(pp)
-    {
-	printf("%x => ", pp);
-	pp=pp->prev;
-    }
-    printf("0\n");
-*/
+    /*
+     mutex_list* pp;
+     pp=mlist;
+     while(pp)
+     {
+     printf("%x => ", pp);
+     pp=pp->prev;
+     }
+     printf("0\n");
+     */
     if(mlist!=NULL)
     {
 	mutex_list* pp=mlist;
 	if(name!=NULL)
-	do
+	    do
 	{
 	    if((strcmp(pp->name, name)==0) && (pp->type==0))
 	    {
 		dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n",
-		    pSecAttr, bManualReset, bInitialState, name, name, pp->pm);
+			  pSecAttr, bManualReset, bInitialState, name, name, pp->pm);
 		return pp->pm;
 	    }
 	}while((pp=pp->prev) != NULL);
@@ -699,25 +655,25 @@
     mlist->state=bInitialState;
     mlist->reset=bManualReset;
     if(name)
-        strncpy(mlist->name, name, 127);
+	strncpy(mlist->name, name, 127);
     else
 	mlist->name[0]=0;
     if(pm==NULL)
 	dbgprintf("ERROR::: CreateEventA failure\n");
-/*
-    if(bInitialState)
-        pthread_mutex_lock(pm);
-*/
+    /*
+     if(bInitialState)
+     pthread_mutex_lock(pm);
+     */
     if(name)
-    dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n",
-        pSecAttr, bManualReset, bInitialState, name, name, mlist);
+	dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, 0x%x='%s') => 0x%x\n",
+		  pSecAttr, bManualReset, bInitialState, name, name, mlist);
     else
-    dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, NULL) => 0x%x\n",
-        pSecAttr, bManualReset, bInitialState, mlist);
+	dbgprintf("CreateEventA(0x%x, 0x%x, 0x%x, NULL) => 0x%x\n",
+		  pSecAttr, bManualReset, bInitialState, mlist);
     return mlist;
 }
 
-void* WINAPI expSetEvent(void* event)
+static void* WINAPI expSetEvent(void* event)
 {
     mutex_list *ml = (mutex_list *)event;
     dbgprintf("SetEvent(%x) => 0x1\n", event);
@@ -730,7 +686,7 @@
 
     return (void *)1;
 }
-void* WINAPI expResetEvent(void* event)
+static void* WINAPI expResetEvent(void* event)
 {
     mutex_list *ml = (mutex_list *)event;
     dbgprintf("ResetEvent(0x%x) => 0x1\n", event);
@@ -741,7 +697,7 @@
     return (void *)1;
 }
 
-void* WINAPI expWaitForSingleObject(void* object, int duration)
+static void* WINAPI expWaitForSingleObject(void* object, int duration)
 {
     mutex_list *ml = (mutex_list *)object;
     // FIXME FIXME FIXME - this value is sometime unititialize !!!
@@ -749,14 +705,14 @@
     mutex_list* pp=mlist;
     if(object == (void*)0xcfcf9898)
     {
-/**
-From GetCurrentThread() documentation:
-A pseudo handle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required. Pseudo handles are not inherited by child processes.
-
-This handle has the maximum possible access to the thread object. For systems that support security descriptors, this is the maximum access allowed by the security descriptor for the calling process. For systems that do not support security descriptors, this is THREAD_ALL_ACCESS.
-
-The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it. A thread can create a "real" handle to itself that can be used by other threads, or inherited by other processes, by specifying the pseudo handle as the source handle in a call to the DuplicateHandle function.
-**/
+	/**
+	 From GetCurrentThread() documentation:
+	 A pseudo handle is a special constant that is interpreted as the current thread handle. The calling thread can use this handle to specify itself whenever a thread handle is required. Pseudo handles are not inherited by child processes.
+
+	 This handle has the maximum possible access to the thread object. For systems that support security descriptors, this is the maximum access allowed by the security descriptor for the calling process. For systems that do not support security descriptors, this is THREAD_ALL_ACCESS.
+
+	 The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it. A thread can create a "real" handle to itself that can be used by other threads, or inherited by other processes, by specifying the pseudo handle as the source handle in a call to the DuplicateHandle function.
+	 **/
 	dbgprintf("WaitForSingleObject(thread_handle) called\n");
 	return (void*)WAIT_FAILED;
     }
@@ -765,7 +721,7 @@
     // loop below was slightly fixed - its used just for checking if
     // this object really exists in our list
     if (!ml)
-        return (void*) ret;
+	return (void*) ret;
     while (pp && (pp->pm != ml->pm))
 	pp = pp->prev;
     if (!pp) {
@@ -776,46 +732,46 @@
     pthread_mutex_lock(ml->pm);
 
     switch(ml->type) {
-      case 0: /* Event */
+    case 0: /* Event */
 	if (duration == 0) { /* Check Only */
-		if (ml->state == 1) ret = WAIT_FAILED;
-		else                   ret = WAIT_OBJECT_0;
+	    if (ml->state == 1) ret = WAIT_FAILED;
+	    else                   ret = WAIT_OBJECT_0;
 	}
 	if (duration == -1) { /* INFINITE */
-		if (ml->state == 0)
-			pthread_cond_wait(ml->pc,ml->pm);
-		if (ml->reset)
-			ml->state = 0;
-		ret = WAIT_OBJECT_0;
+	    if (ml->state == 0)
+		pthread_cond_wait(ml->pc,ml->pm);
+	    if (ml->reset)
+		ml->state = 0;
+	    ret = WAIT_OBJECT_0;
 	}
 	if (duration > 0) {  /* Timed Wait */
-		struct timespec abstime;
-		struct timeval now;
-		gettimeofday(&now, 0);
-		abstime.tv_sec = now.tv_sec + (now.tv_usec+duration)/1000000;
-		abstime.tv_nsec = ((now.tv_usec+duration)%1000000)*1000;
-		if (ml->state == 0)
-			ret=pthread_cond_timedwait(ml->pc,ml->pm,&abstime);
-		if (ret == ETIMEDOUT) ret = WAIT_TIMEOUT;
-		else                  ret = WAIT_OBJECT_0;
-		if (ml->reset)
-			ml->state = 0;
+	    struct timespec abstime;
+	    struct timeval now;
+	    gettimeofday(&now, 0);
+	    abstime.tv_sec = now.tv_sec + (now.tv_usec+duration)/1000000;
+	    abstime.tv_nsec = ((now.tv_usec+duration)%1000000)*1000;
+	    if (ml->state == 0)
+		ret=pthread_cond_timedwait(ml->pc,ml->pm,&abstime);
+	    if (ret == ETIMEDOUT) ret = WAIT_TIMEOUT;
+	    else                  ret = WAIT_OBJECT_0;
+	    if (ml->reset)
+		ml->state = 0;
 	}
-        break;
-      case 1:  /* Semaphore */
-        if (duration == 0) {
-		if(ml->semaphore==0) ret = WAIT_FAILED;
-		else {
-			ml->semaphore++;
-			ret = WAIT_OBJECT_0;
-		}
-        }
+	break;
+    case 1:  /* Semaphore */
+	if (duration == 0) {
+	    if(ml->semaphore==0) ret = WAIT_FAILED;
+	    else {
+		ml->semaphore++;
+		ret = WAIT_OBJECT_0;
+	    }
+	}
 	if (duration == -1) {
-		if (ml->semaphore==0)
-			pthread_cond_wait(ml->pc,ml->pm);
-		ml->semaphore--;
+	    if (ml->semaphore==0)
+		pthread_cond_wait(ml->pc,ml->pm);
+	    ml->semaphore--;
 	}
-        break;
+	break;
     }
     pthread_mutex_unlock(ml->pm);
 
@@ -825,7 +781,7 @@
 
 static BYTE PF[64] = {0,};
 
-WIN_BOOL WINAPI expIsProcessorFeaturePresent(DWORD v)
+static WIN_BOOL WINAPI expIsProcessorFeaturePresent(DWORD v)
 {
     WIN_BOOL result;
     if(v>63)result=0;
@@ -848,46 +804,46 @@
     dbgprintf("  Processor revision: 0x%x\n", si->wProcessorRevision);
 }
 
-void WINAPI expGetSystemInfo(SYSTEM_INFO* si)
+static void WINAPI expGetSystemInfo(SYSTEM_INFO* si)
 {
-    	/* FIXME: better values for the two entries below... */
-	static int cache = 0;
-	static SYSTEM_INFO cachedsi;
-	unsigned int regs[4];
-        dbgprintf("GetSystemInfo(%p) =>\n", si);
-
-	if (cache) {
-		memcpy(si,&cachedsi,sizeof(*si));
-		DumpSystemInfo(si);
-		return;
-	}
-	memset(PF,0,sizeof(PF));
-
-	cachedsi.u.s.wProcessorArchitecture     = PROCESSOR_ARCHITECTURE_INTEL;
-	cachedsi.dwPageSize 			= getpagesize();
-
-	/* FIXME: better values for the two entries below... */
-	cachedsi.lpMinimumApplicationAddress	= (void *)0x00000000;
-	cachedsi.lpMaximumApplicationAddress	= (void *)0x7FFFFFFF;
-	cachedsi.dwActiveProcessorMask		= 1;
-	cachedsi.dwNumberOfProcessors		= 1;
-	cachedsi.dwProcessorType		= PROCESSOR_INTEL_386;
-	cachedsi.dwAllocationGranularity	= 0x10000;
-	cachedsi.wProcessorLevel		= 5; /* pentium */
-	cachedsi.wProcessorRevision		= 0x0101;
-
-#ifdef USE_WIN32DLL
-	/* mplayer's way to detect PF's */
-	{
-	    #include "../cpudetect.h"
-	    extern CpuCaps gCpuCaps;
-
-	    if (gCpuCaps.hasMMX)
-		PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-	    if (gCpuCaps.hasSSE)
-		PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
-	    if (gCpuCaps.has3DNow)
-		PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
+    /* FIXME: better values for the two entries below... */
+    static int cache = 0;
+    static SYSTEM_INFO cachedsi;
+    unsigned int regs[4];
+    dbgprintf("GetSystemInfo(%p) =>\n", si);
+
+    if (cache) {
+	memcpy(si,&cachedsi,sizeof(*si));
+	DumpSystemInfo(si);
+	return;
+    }
+    memset(PF,0,sizeof(PF));
+
+    cachedsi.u.s.wProcessorArchitecture     = PROCESSOR_ARCHITECTURE_INTEL;
+    cachedsi.dwPageSize 			= getpagesize();
+
+    /* FIXME: better values for the two entries below... */
+    cachedsi.lpMinimumApplicationAddress	= (void *)0x00000000;
+    cachedsi.lpMaximumApplicationAddress	= (void *)0x7FFFFFFF;
+    cachedsi.dwActiveProcessorMask		= 1;
+    cachedsi.dwNumberOfProcessors		= 1;
+    cachedsi.dwProcessorType		= PROCESSOR_INTEL_386;
+    cachedsi.dwAllocationGranularity	= 0x10000;
+    cachedsi.wProcessorLevel		= 5; /* pentium */
+    cachedsi.wProcessorRevision		= 0x0101;
+
+#ifdef MPLAYER
+    /* mplayer's way to detect PF's */
+    {
+#include "../cpudetect.h"
+	extern CpuCaps gCpuCaps;
+
+	if (gCpuCaps.hasMMX)
+	    PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
+	if (gCpuCaps.hasSSE)
+	    PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
+	if (gCpuCaps.has3DNow)
+	    PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
 
 	    switch(gCpuCaps.cpuType)
 	    {
@@ -908,280 +864,277 @@
 	    }
 	    cachedsi.wProcessorRevision = gCpuCaps.cpuStepping;
     	    cachedsi.dwNumberOfProcessors = 1;	/* hardcoded */
-	}
+
+    }
 #endif
 
 /* disable cpuid based detection (mplayer's cpudetect.c does this - see above) */
-#ifndef USE_WIN32DLL
+#ifndef MPLAYER
 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__svr4__)
-	do_cpuid(1, regs);
-	switch ((regs[0] >> 8) & 0xf) {			// cpu family
-	case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-		cachedsi.wProcessorLevel= 3;
-		break;
-	case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-		cachedsi.wProcessorLevel= 4;
-		break;
-	case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-		cachedsi.wProcessorLevel= 5;
-		break;
-	case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-		cachedsi.wProcessorLevel= 5;
-		break;
-	default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-		cachedsi.wProcessorLevel= 5;
-		break;
-	}
-	cachedsi.wProcessorRevision = regs[0] & 0xf;	// stepping
-	if (regs[3] & (1 <<  8))
-	  PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
-	if (regs[3] & (1 << 23))
-          PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-	if (regs[3] & (1 << 25))
-	  PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
-	if (regs[3] & (1 << 31))
-	  PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
-        cachedsi.dwNumberOfProcessors=1;
+    do_cpuid(1, regs);
+    switch ((regs[0] >> 8) & 0xf) {			// cpu family
+    case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
+    cachedsi.wProcessorLevel= 3;
+    break;
+    case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
+    cachedsi.wProcessorLevel= 4;
+    break;
+    case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+    cachedsi.wProcessorLevel= 5;
+    break;
+    case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+    cachedsi.wProcessorLevel= 5;
+    break;
+    default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+    cachedsi.wProcessorLevel= 5;
+    break;
+    }
+    cachedsi.wProcessorRevision = regs[0] & 0xf;	// stepping
+    if (regs[3] & (1 <<  8))
+	PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+    if (regs[3] & (1 << 23))
+	PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
+    if (regs[3] & (1 << 25))
+	PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
+    if (regs[3] & (1 << 31))
+	PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
+    cachedsi.dwNumberOfProcessors=1;
 #endif
-#endif /* USE_WIN32DLL */
-
+#endif /* MPLAYER */
 
 /* MPlayer: linux detection enabled (based on proc/cpuinfo) for checking
    fdiv_bug and fpu emulation flags -- alex/MPlayer */
 #ifdef __linux__
-	{
+    {
 	char buf[20];
 	char line[200];
 	FILE *f = fopen ("/proc/cpuinfo", "r");
 
 	if (!f)
-		return;
+	    return;
 	while (fgets(line,200,f)!=NULL) {
-		char	*s,*value;
-
-		/* NOTE: the ':' is the only character we can rely on */
-		if (!(value = strchr(line,':')))
-			continue;
-		/* terminate the valuename */
-		*value++ = '\0';
-		/* skip any leading spaces */
-		while (*value==' ') value++;
-		if ((s=strchr(value,'\n')))
-			*s='\0';
-
-		/* 2.1 method */
-		if (!lstrncmpiA(line, "cpu family",strlen("cpu family"))) {
-			if (isdigit (value[0])) {
-				switch (value[0] - '0') {
-				case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-					cachedsi.wProcessorLevel= 3;
-					break;
-				case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-					cachedsi.wProcessorLevel= 4;
-					break;
-				case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				}
-			}
-			/* set the CPU type of the current processor */
-			sprintf(buf,"CPU %ld",cachedsi.dwProcessorType);
-			continue;
+	    char	*s,*value;
+
+	    /* NOTE: the ':' is the only character we can rely on */
+	    if (!(value = strchr(line,':')))
+		continue;
+	    /* terminate the valuename */
+	    *value++ = '\0';
+	    /* skip any leading spaces */
+	    while (*value==' ') value++;
+	    if ((s=strchr(value,'\n')))
+		*s='\0';
+
+	    /* 2.1 method */
+	    if (!lstrncmpiA(line, "cpu family",strlen("cpu family"))) {
+		if (isdigit (value[0])) {
+		    switch (value[0] - '0') {
+		    case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
+		    cachedsi.wProcessorLevel= 3;
+		    break;
+		    case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
+		    cachedsi.wProcessorLevel= 4;
+		    break;
+		    case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    }
 		}
-		/* old 2.0 method */
-		if (!lstrncmpiA(line, "cpu",strlen("cpu"))) {
-			if (	isdigit (value[0]) && value[1] == '8' &&
-				value[2] == '6' && value[3] == 0
-			) {
-				switch (value[0] - '0') {
-				case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
-					cachedsi.wProcessorLevel= 3;
-					break;
-				case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
-					cachedsi.wProcessorLevel= 4;
-					break;
-				case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-					cachedsi.wProcessorLevel= 5;
-					break;
-				}
-			}
-			/* set the CPU type of the current processor */
-			sprintf(buf,"CPU %ld",cachedsi.dwProcessorType);
-			continue;
-		}
-		if (!lstrncmpiA(line,"fdiv_bug",strlen("fdiv_bug"))) {
-			if (!lstrncmpiA(value,"yes",3))
-				PF[PF_FLOATING_POINT_PRECISION_ERRATA] = TRUE;
-
-			continue;
+		/* set the CPU type of the current processor */
+		sprintf(buf,"CPU %ld",cachedsi.dwProcessorType);
+		continue;
+	    }
+	    /* old 2.0 method */
+	    if (!lstrncmpiA(line, "cpu",strlen("cpu"))) {
+		if (	isdigit (value[0]) && value[1] == '8' &&
+			value[2] == '6' && value[3] == 0
+		   ) {
+		    switch (value[0] - '0') {
+		    case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
+		    cachedsi.wProcessorLevel= 3;
+		    break;
+		    case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
+		    cachedsi.wProcessorLevel= 4;
+		    break;
+		    case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		    cachedsi.wProcessorLevel= 5;
+		    break;
+		    }
 		}
-		if (!lstrncmpiA(line,"fpu",strlen("fpu"))) {
-			if (!lstrncmpiA(value,"no",2))
-				PF[PF_FLOATING_POINT_EMULATED] = TRUE;
-
-			continue;
-		}
-		if (!lstrncmpiA(line,"processor",strlen("processor"))) {
-			/* processor number counts up...*/
-			int	x;
-
-			if (sscanf(value,"%d",&x))
-				if (x+1>cachedsi.dwNumberOfProcessors)
-					cachedsi.dwNumberOfProcessors=x+1;
-
-			/* Create a new processor subkey on a multiprocessor
-			 * system
-			 */
-			sprintf(buf,"%d",x);
-		}
-		if (!lstrncmpiA(line,"stepping",strlen("stepping"))) {
-			int	x;
-
-			if (sscanf(value,"%d",&x))
-				cachedsi.wProcessorRevision = x;
-		}
-		if
+		/* set the CPU type of the current processor */
+		sprintf(buf,"CPU %ld",cachedsi.dwProcessorType);
+		continue;
+	    }
+	    if (!lstrncmpiA(line,"fdiv_bug",strlen("fdiv_bug"))) {
+		if (!lstrncmpiA(value,"yes",3))
+		    PF[PF_FLOATING_POINT_PRECISION_ERRATA] = TRUE;
+
+		continue;
+	    }
+	    if (!lstrncmpiA(line,"fpu",strlen("fpu"))) {
+		if (!lstrncmpiA(value,"no",2))
+		    PF[PF_FLOATING_POINT_EMULATED] = TRUE;
+
+		continue;
+	    }
+	    if (!lstrncmpiA(line,"processor",strlen("processor"))) {
+		/* processor number counts up...*/
+		int	x;
+
+		if (sscanf(value,"%d",&x))
+		    if (x+1>cachedsi.dwNumberOfProcessors)
+			cachedsi.dwNumberOfProcessors=x+1;
+
+		/* Create a new processor subkey on a multiprocessor
+		 * system
+		 */
+		sprintf(buf,"%d",x);
+	    }
+	    if (!lstrncmpiA(line,"stepping",strlen("stepping"))) {
+		int	x;
+
+		if (sscanf(value,"%d",&x))
+		    cachedsi.wProcessorRevision = x;
+	    }
+	    if
 		( (!lstrncmpiA(line,"flags",strlen("flags")))
-		|| (!lstrncmpiA(line,"features",strlen("features"))) )
-		{
-			if (strstr(value,"cx8"))
-				PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
-			if (strstr(value,"mmx"))
-				PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
-			if (strstr(value,"tsc"))
-				PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
-			if (strstr(value,"xmm"))
-				PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
-			if (strstr(value,"3dnow"))
-				PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
-		}
+		  || (!lstrncmpiA(line,"features",strlen("features"))) )
+	    {
+		if (strstr(value,"cx8"))
+		    PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+		if (strstr(value,"mmx"))
+		    PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
+		if (strstr(value,"tsc"))
+		    PF[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
+		if (strstr(value,"xmm"))
+		    PF[PF_XMMI_INSTRUCTIONS_AVAILABLE] = TRUE;
+		if (strstr(value,"3dnow"))
+		    PF[PF_AMD3D_INSTRUCTIONS_AVAILABLE] = TRUE;
+	    }
 	}
 	fclose (f);
-/*
- *	ad hoc fix for smp machines.
- *	some problems on WaitForSingleObject,CreateEvent,SetEvent
- *			CreateThread ...etc..
- *
- */
-        cachedsi.dwNumberOfProcessors=1;
-	}
+	/*
+	 *	ad hoc fix for smp machines.
+	 *	some problems on WaitForSingleObject,CreateEvent,SetEvent
+	 *			CreateThread ...etc..
+	 *
+	 */
+	cachedsi.dwNumberOfProcessors=1;
+    }
 #endif /* __linux__ */
-
-	cache = 1;
-	memcpy(si,&cachedsi,sizeof(*si));
-	DumpSystemInfo(si);
+    cache = 1;
+    memcpy(si,&cachedsi,sizeof(*si));
+    DumpSystemInfo(si);
 }
 
-long WINAPI expGetVersion()
+static long WINAPI expGetVersion()
 {
     dbgprintf("GetVersion() => 0xC0000004\n");
     return 0xC0000004;//Windows 95
 }
 
-HANDLE WINAPI expHeapCreate(long flags, long init_size, long max_size)
+static HANDLE WINAPI expHeapCreate(long flags, long init_size, long max_size)
 {
-//    printf("HeapCreate:");
+    //    printf("HeapCreate:");
     HANDLE result;
     if(init_size==0)
-    	result=(HANDLE)my_mreq(0x110000, 0);
+	result=(HANDLE)my_mreq(0x110000, 0);
     else
-	result=(HANDLE)my_mreq(init_size, 0);
+	result=(HANDLE)my_mreq((init_size + 0xfff) & 0x7ffff000 , 0);
     dbgprintf("HeapCreate(flags 0x%x, initial size %d, maximum size %d) => 0x%x\n", flags, init_size, max_size, result);
     return result;
 }
 
 // this is another dirty hack
-// VP31 is releasing one allocated Heap twice
+// VP31 is releasing one allocated Heap chunk twice
 // we will silently ignore this second call...
 static void* heapfreehack = 0;
 static int heapfreehackshown = 0;
-void* WINAPI expHeapAlloc(HANDLE heap, int flags, int size)
+//extern void trapbug(void);
+static void* WINAPI expHeapAlloc(HANDLE heap, int flags, int size)
 {
     void* z;
-//    printf("HeapAlloc:");
-/**
- Morgan's m3jpeg32.dll v. 2.0 encoder expects that request for
- HeapAlloc returns area larger than size argument :-/
- - do we really have to vaste that much memory - I would
- suggest to make extra check for this value - FIXME
-**/
-    //z=my_mreq(size, flags&8);
-    z=my_mreq((size + 0xfff) & 0x7ffff000, flags&8);
+    /**
+     Morgan's m3jpeg32.dll v. 2.0 encoder expects that request for
+     HeapAlloc returns area larger than size argument :-/
+
+     actually according to M$ Doc  HeapCreate size should be rounded
+     to page boundaries thus we should simulate this
+     **/
+    //if (size == 22276) trapbug();
+    z=my_mreq((size + 0xfff) & 0x7ffff000, (flags & HEAP_ZERO_MEMORY));
     if(z==0)
 	printf("HeapAlloc failure\n");
-    dbgprintf("HeapAlloc(heap 0x%x, flags 0x%x, size 0x%x) => 0x%x\n", heap, flags, size, z);
+    dbgprintf("HeapAlloc(heap 0x%x, flags 0x%x, size %d) => 0x%x\n", heap, flags, size, z);
     heapfreehack = 0; // reset
     return z;
 }
-long WINAPI expHeapDestroy(void* heap)
+static long WINAPI expHeapDestroy(void* heap)
 {
     dbgprintf("HeapDestroy(heap 0x%x) => 1\n", heap);
     my_release(heap);
     return 1;
 }
 
-long WINAPI expHeapFree(int arg1, int arg2, void* ptr)
+static long WINAPI expHeapFree(int arg1, int arg2, void* ptr)
 {
     dbgprintf("HeapFree(0x%x, 0x%x, pointer 0x%x) => 1\n", arg1, arg2, ptr);
     if (heapfreehack != ptr && ptr != (void*)0xffffffff)
 	my_release(ptr);
     else
     {
-        if (!heapfreehackshown++)
+	if (!heapfreehackshown++)
 	    printf("Info: HeapFree deallocating same memory twice! (%p)\n", ptr);
     }
     heapfreehack = ptr;
     return 1;
 }
-long WINAPI expHeapSize(int heap, int flags, void* pointer)
+static long WINAPI expHeapSize(int heap, int flags, void* pointer)
 {
     long result=my_size(pointer);
     dbgprintf("HeapSize(heap 0x%x, flags 0x%x, pointer 0x%x) => %d\n", heap, flags, pointer, result);
     return result;
 }
-void* WINAPI expHeapReAlloc(HANDLE heap,int flags,void *lpMem,int size)
+static void* WINAPI expHeapReAlloc(HANDLE heap,int flags,void *lpMem,int size)
 {
-    long orgsize;
-    void *newp;
-    orgsize = my_size(lpMem);
+    long orgsize = my_size(lpMem);
     dbgprintf("HeapReAlloc() Size %ld org %d\n",orgsize,size);
     return my_realloc(lpMem, size);
 }
-long WINAPI expGetProcessHeap(void)
+static long WINAPI expGetProcessHeap(void)
 {
     dbgprintf("GetProcessHeap() => 1\n");
     return 1;
 }
-void* WINAPI expVirtualAlloc(void* v1, long v2, long v3, long v4)
+static void* WINAPI expVirtualAlloc(void* v1, long v2, long v3, long v4)
 {
-    void* z;
-    z=VirtualAlloc(v1, v2, v3, v4);
+    void* z = VirtualAlloc(v1, v2, v3, v4);
     if(z==0)
 	printf("VirtualAlloc failure\n");
     dbgprintf("VirtualAlloc(0x%x, %d, %d, %d) => 0x%x \n",v1,v2,v3,v4, z);
     return z;
 }
-int WINAPI expVirtualFree(void* v1, int v2, int v3)
+static int WINAPI expVirtualFree(void* v1, int v2, int v3)
 {
-    int result=VirtualFree(v1,v2,v3);
+    int result = VirtualFree(v1,v2,v3);
     dbgprintf("VirtualFree(0x%x, %d, %d) => %d\n",v1,v2,v3, result);
     return result;
 }
 
 /* we're building a table of critical sections. cs_win pointer uses the DLL
-   cs_unix is the real structure, we're using cs_win only to identifying cs_unix */
+ cs_unix is the real structure, we're using cs_win only to identifying cs_unix */
 struct critsecs_list_t
 {
     CRITICAL_SECTION *cs_win;
@@ -1189,14 +1142,14 @@
 };
 
 /* 'NEWTYPE' is working with VIVO and 3ivX dll (no more segfaults) -- alex */
-//#undef CRITSECS_NEWTYPE
-#define CRITSECS_NEWTYPE 1
+#undef CRITSECS_NEWTYPE
+//#define CRITSECS_NEWTYPE 1
 
 #ifdef CRITSECS_NEWTYPE
 #define CRITSECS_LIST_MAX 20
 static struct critsecs_list_t critsecs_list[CRITSECS_LIST_MAX];
 
-int critsecs_get_pos(CRITICAL_SECTION *cs_win)
+static int critsecs_get_pos(CRITICAL_SECTION *cs_win)
 {
     int i;
 
@@ -1206,7 +1159,7 @@
     return(-1);
 }
 
-int critsecs_get_unused(void)
+static int critsecs_get_unused(void)
 {
     int i;
 
@@ -1231,52 +1184,52 @@
 #endif
 #endif
 
-void WINAPI expInitializeCriticalSection(CRITICAL_SECTION* c)
+static void WINAPI expInitializeCriticalSection(CRITICAL_SECTION* c)
 {
     dbgprintf("InitializeCriticalSection(0x%x)\n", c);
-/*    if(sizeof(pthread_mutex_t)>sizeof(CRITICAL_SECTION))
-    {
-	printf(" ERROR:::: sizeof(pthread_mutex_t) is %d, expected <=%d!\n",
-	     sizeof(pthread_mutex_t), sizeof(CRITICAL_SECTION));
-	return;
-    }*/
-/*    pthread_mutex_init((pthread_mutex_t*)c, NULL);   */
+    /*    if(sizeof(pthread_mutex_t)>sizeof(CRITICAL_SECTION))
+     {
+     printf(" ERROR:::: sizeof(pthread_mutex_t) is %d, expected <=%d!\n",
+     sizeof(pthread_mutex_t), sizeof(CRITICAL_SECTION));
+     return;
+     }*/
+    /*    pthread_mutex_init((pthread_mutex_t*)c, NULL);   */
 #ifdef CRITSECS_NEWTYPE
-{
-    struct CRITSECT *cs;
-    int i = critsecs_get_unused();
-
-    if (i < 0)
     {
-	printf("InitializeCriticalSection(%p) - no more space in list\n", c);
-	return;
+	struct CRITSECT *cs;
+	int i = critsecs_get_unused();
+
+	if (i < 0)
+	{
+	    printf("InitializeCriticalSection(%p) - no more space in list\n", c);
+	    return;
+	}
+	printf("got unused space at %d\n", i);
+	cs = expmalloc(sizeof(struct CRITSECT));
+	if (!cs)
+	{
+	    printf("InitializeCriticalSection(%p) - out of memory\n", c);
+	    return;
+	}
+	pthread_mutex_init(&cs->mutex, NULL);
+	cs->locked = 0;
+	critsecs_list[i].cs_win = c;
+	critsecs_list[i].cs_unix = cs;
+	dbgprintf("InitializeCriticalSection -> itemno=%d, cs_win=%p, cs_unix=%p\n",
+		  i, c, cs);
     }
-//    printf("got unused space at %d\n", i);
-    cs = expmalloc(sizeof(struct CRITSECT));
-    if (!cs)
+#else
     {
-	printf("InitializeCriticalSection(%p) - out of memory\n", c);
-	return;
+	struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT);
+	pthread_mutex_init(&cs->mutex, NULL);
+	cs->locked=0;
+	*(void**)c = cs;
     }
-    pthread_mutex_init(&cs->mutex, NULL);
-    cs->locked = 0;
-    critsecs_list[i].cs_win = c;
-    critsecs_list[i].cs_unix = cs;
-    dbgprintf("InitializeCriticalSection -> itemno=%d, cs_win=%p, cs_unix=%p\n",
-	i, c, cs);
-}
-#else
-{
-    struct CRITSECT* cs = mreq_private(sizeof(struct CRITSECT), 0, AREATYPE_CRITSECT);
-    pthread_mutex_init(&cs->mutex, NULL);
-    cs->locked=0;
-    *(void**)c = cs;
-}
 #endif
     return;
 }
 
-void WINAPI expEnterCriticalSection(CRITICAL_SECTION* c)
+static void WINAPI expEnterCriticalSection(CRITICAL_SECTION* c)
 {
 #ifdef CRITSECS_NEWTYPE
     struct CRITSECT* cs = critsecs_get_unix(c);
@@ -1286,7 +1239,7 @@
     dbgprintf("EnterCriticalSection(0x%x)\n",c);
     if (!cs)
     {
-        printf("entered uninitialized critisec!\n");
+	printf("entered uninitialized critisec!\n");
 	expInitializeCriticalSection(c);
 #ifdef CRITSECS_NEWTYPE
 	cs=critsecs_get_unix(c);
@@ -1303,14 +1256,14 @@
     cs->id=pthread_self();
     return;
 }
-void WINAPI expLeaveCriticalSection(CRITICAL_SECTION* c)
+static void WINAPI expLeaveCriticalSection(CRITICAL_SECTION* c)
 {
 #ifdef CRITSECS_NEWTYPE
     struct CRITSECT* cs = critsecs_get_unix(c);
 #else
     struct CRITSECT* cs=*(struct CRITSECT**)c;
 #endif
-//    struct CRITSECT* cs=(struct CRITSECT*)c;
+    //    struct CRITSECT* cs=(struct CRITSECT*)c;
     dbgprintf("LeaveCriticalSection(0x%x)\n",c);
     if (!cs)
     {
@@ -1321,41 +1274,45 @@
     pthread_mutex_unlock(&(cs->mutex));
     return;
 }
-void WINAPI expDeleteCriticalSection(CRITICAL_SECTION *c)
+static void WINAPI expDeleteCriticalSection(CRITICAL_SECTION *c)
 {
 #ifdef CRITSECS_NEWTYPE
     struct CRITSECT* cs = critsecs_get_unix(c);
 #else
     struct CRITSECT* cs=*(struct CRITSECT**)c;
 #endif
-//    struct CRITSECT* cs=(struct CRITSECT*)c;
+    //    struct CRITSECT* cs=(struct CRITSECT*)c;
     dbgprintf("DeleteCriticalSection(0x%x)\n",c);
+
+#ifndef GARBAGE
     pthread_mutex_destroy(&(cs->mutex));
-//    free(cs);
+    // released by GarbageCollector in my_relase otherwise
+#endif
+    my_release(cs);
 #ifdef CRITSECS_NEWTYPE
-{
-    int i = critsecs_get_pos(c);
-
-    if (i < 0)
     {
-        printf("DeleteCriticalSection(%p) error (critsec not found)\n", c);
-        return;
+	int i = critsecs_get_pos(c);
+
+	if (i < 0)
+	{
+	    printf("DeleteCriticalSection(%p) error (critsec not found)\n", c);
+	    return;
+	}
+
+	critsecs_list[i].cs_win = NULL;
+	expfree(critsecs_list[i].cs_unix);
+	critsecs_list[i].cs_unix = NULL;
+	dbgprintf("DeleteCriticalSection -> itemno=%d\n", i);
     }
-
-    critsecs_list[i].cs_win = NULL;
-    expfree(critsecs_list[i].cs_unix);
-    critsecs_list[i].cs_unix = NULL;
-    dbgprintf("DeleteCriticalSection -> itemno=%d\n", i);
-}
 #endif
     return;
 }
-int WINAPI expGetCurrentThreadId()
+static int WINAPI expGetCurrentThreadId()
 {
     dbgprintf("GetCurrentThreadId() => %d\n", getpid());
     return getpid();
 }
-int WINAPI expGetCurrentProcess()
+static int WINAPI expGetCurrentProcess()
 {
     dbgprintf("GetCurrentProcess() => %d\n", getpid());
     return getpid();
@@ -1369,7 +1326,7 @@
 
 //static int tls_count;
 static int tls_use_map[64];
-int WINAPI expTlsAlloc()
+static int WINAPI expTlsAlloc()
 {
     int i;
     for(i=0; i<64; i++)
@@ -1381,23 +1338,26 @@
     return -1;
 }
 
-int WINAPI expTlsSetValue(int index, void* value)
+static int WINAPI expTlsSetValue(void idx, void* value)
 {
+    int index = (int) idx;
     if((index<0) || (index>64))
 	return 0;
     *(void**)((char*)fs_seg+0x88+4*index) = value;
     return 1;
 }
 
-void* WINAPI expTlsGetValue(int index)
+static void* WINAPI expTlsGetValue(int idx)
 {
+    int index = (int) idx;
     if((index<0) || (index>64))
 	return 0;
     return *(void**)((char*)fs_seg+0x88+index);
 }
 
-int WINAPI expTlsFree(int index)
+static int WINAPI expTlsFree(int idx)
 {
+    int index = (int) idx;
     if((index<0) || (index>64))
 	return 0;
     tls_use_map[index]=0;
@@ -1412,7 +1372,7 @@
     struct tls_s* next;
 };
 
-void* WINAPI expTlsAlloc()
+static void* WINAPI expTlsAlloc()
 {
     if(g_tls==NULL)
     {
@@ -1432,8 +1392,9 @@
     return g_tls;
 }
 
-int WINAPI expTlsSetValue(tls_t* index, void* value)
+static int WINAPI expTlsSetValue(void* idx, void* value)
 {
+    tls_t* index = (tls_t*) idx;
     int result;
     if(index==0)
 	result=0;
@@ -1445,8 +1406,9 @@
     dbgprintf("TlsSetValue(index 0x%x, value 0x%x) => %d \n", index, value, result );
     return result;
 }
-void* WINAPI expTlsGetValue(tls_t* index)
+static void* WINAPI expTlsGetValue(void* idx)
 {
+    tls_t* index = (tls_t*) idx;
     void* result;
     if(index==0)
 	result=0;
@@ -1455,8 +1417,9 @@
     dbgprintf("TlsGetValue(index 0x%x) => 0x%x\n", index, result);
     return result;
 }
-int WINAPI expTlsFree(tls_t* index)
+static int WINAPI expTlsFree(void* idx)
 {
+    tls_t* index = (tls_t*) idx;
     int result;
     if(index==0)
 	result=0;
@@ -1465,7 +1428,7 @@
 	if(index->next)
 	    index->next->prev=index->prev;
 	if(index->prev)
-    	    index->prev->next=index->next;
+	    index->prev->next=index->next;
 	my_release((void*)index);
 	result=1;
     }
@@ -1474,87 +1437,81 @@
 }
 #endif
 
-void* WINAPI expLocalAlloc(int flags, int size)
+static void* WINAPI expLocalAlloc(int flags, int size)
 {
-    void* z;
-    if(flags&GMEM_ZEROINIT)
-	z=my_mreq(size, 1);
-    else
-	z=my_mreq(size, 0);
-    if(z==0)
+    void* z = my_mreq(size, (flags & GMEM_ZEROINIT));
+    if (z == 0)
 	printf("LocalAlloc() failed\n");
     dbgprintf("LocalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z);
     return z;
 }
 
-void* WINAPI expLocalReAlloc(int handle,int size, int flags)
+static void* WINAPI expLocalReAlloc(int handle,int size, int flags)
 {
-   void *newpointer;
-   int oldsize;
-
-   newpointer=NULL;
-   if (flags & LMEM_MODIFY) {
-        dbgprintf("LocalReAlloc MODIFY\n");
-       return (void *)handle;
-   }
-   oldsize = my_size((void *)handle);
-   newpointer = my_realloc((void *)handle,size);
-   dbgprintf("LocalReAlloc(%x %d(old %d), flags 0x%x) => 0x%x\n", handle,size,oldsize, flags,newpointer);
-
-  return newpointer;
+    void *newpointer;
+    int oldsize;
+
+    newpointer=NULL;
+    if (flags & LMEM_MODIFY) {
+	dbgprintf("LocalReAlloc MODIFY\n");
+	return (void *)handle;
+    }
+    oldsize = my_size((void *)handle);
+    newpointer = my_realloc((void *)handle,size);
+    dbgprintf("LocalReAlloc(%x %d(old %d), flags 0x%x) => 0x%x\n", handle,size,oldsize, flags,newpointer);
+
+    return newpointer;
 }
 
-void* WINAPI expLocalLock(void* z)
+static void* WINAPI expLocalLock(void* z)
 {
     dbgprintf("LocalLock(0x%x) => 0x%x\n", z, z);
     return z;
 }
 
-void* WINAPI expGlobalAlloc(int flags, int size)
+static void* WINAPI expGlobalAlloc(int flags, int size)
 {
     void* z;
     dbgprintf("GlobalAlloc(%d, flags 0x%X)\n", size, flags);
-    if(flags&GMEM_ZEROINIT)
-	z=my_mreq(size, 1);
-	//z=calloc(size, 1);
-    else
-	z=my_mreq(size, 0);
-	//z=malloc(size);
+
+    z=my_mreq(size, (flags & GMEM_ZEROINIT));
+    //z=calloc(size, 1);
+    //z=malloc(size);
     if(z==0)
 	printf("GlobalAlloc() failed\n");
     dbgprintf("GlobalAlloc(%d, flags 0x%x) => 0x%x\n", size, flags, z);
     return z;
 }
-void* WINAPI expGlobalLock(void* z)
+static void* WINAPI expGlobalLock(void* z)
 {
     dbgprintf("GlobalLock(0x%x) => 0x%x\n", z, z);
     return z;
 }
 // pvmjpg20 - but doesn't work anyway
-int WINAPI expGlobalSize(void* amem)
+static int WINAPI expGlobalSize(void* amem)
 {
     int size = 100000;
 #ifdef GARBAGE
     alloc_header* header = last_alloc;
     alloc_header* mem = (alloc_header*) amem - 1;
     if (amem == 0)
-        return 0;
+	return 0;
     pthread_mutex_lock(&memmut);
     while (header)
     {
-	    if (header->deadbeef != 0xdeadbeef)
-	    {
-		printf("FATAL found corrupted memory! %p  0x%lx  (%d)\n", header, header->deadbeef, alccnt);
-		break;
-	    }
-
-	    if (header == mem)
-	    {
-                size = header->size;
-		break;
-	    }
-
-	    header = header->prev;
+	if (header->deadbeef != 0xdeadbeef)
+	{
+	    printf("FATAL found corrupted memory! %p  0x%lx  (%d)\n", header, header->deadbeef, alccnt);
+	    break;
+	}
+
+	if (header == mem)
+	{
+	    size = header->size;
+	    break;
+	}
+
+	header = header->prev;
     }
     pthread_mutex_unlock(&memmut);
 #endif
@@ -1562,36 +1519,36 @@
     dbgprintf("GlobalSize(0x%x)\n", amem);
     return size;
 }
-int WINAPI expLoadStringA(long instance, long  id, void* buf, long size)
+static int WINAPI expLoadStringA(long instance, long  id, void* buf, long size)
 {
     int result=LoadStringA(instance, id, buf, size);
-//    if(buf)
+    //    if(buf)
     dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d ( %s )\n",
-	instance, id, buf, size, result, buf);
-//    else
-//    dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d\n",
-//	instance, id, buf, size, result);
+	      instance, id, buf, size, result, buf);
+    //    else
+    //    dbgprintf("LoadStringA(instance 0x%x, id 0x%x, buffer 0x%x, size %d) => %d\n",
+    //	instance, id, buf, size, result);
     return result;
 }
 
-long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2)
+static long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2)
 {
 #warning FIXME
     int i;
     int result;
     if(s2==0)
-    	result=1;
+	result=1;
     else
     {
-    if(siz1>siz2/2)siz1=siz2/2;
-    for(i=1; i<=siz1; i++)
-    {
-    	*s2=*s1;
-	if(!*s1)break;
-	s2++;
-	s1++;
-    }
-    result=i;
+	if(siz1>siz2/2)siz1=siz2/2;
+	for(i=1; i<=siz1; i++)
+	{
+	    *s2=*s1;
+	    if(!*s1)break;
+	    s2++;
+	    s1++;
+	}
+	result=i;
     }
     if(s1)
 	dbgprintf("MultiByteToWideChar(codepage %d, flags 0x%x, string 0x%x='%s',"
@@ -1609,18 +1566,19 @@
     while(*str)dbgprintf("%c", *str++);
     dbgprintf("\n");
 }
-long WINAPI expWideCharToMultiByte(long v1, long v2, short* s1, long siz1, char* s2, int siz2, char* c3, int* siz3)
+static long WINAPI expWideCharToMultiByte(long v1, long v2, short* s1, long siz1,
+					  char* s2, int siz2, char* c3, int* siz3)
 {
     int result;
     dbgprintf("WideCharToMultiByte(codepage %d, flags 0x%x, src 0x%x, src size %d, "
-	"dest 0x%x, dest size %d, defch 0x%x, used_defch 0x%x)", v1, v2, s1, siz1, s2, siz2, c3, siz3);
+	      "dest 0x%x, dest size %d, defch 0x%x, used_defch 0x%x)", v1, v2, s1, siz1, s2, siz2, c3, siz3);
     result=WideCharToMultiByte(v1, v2, s1, siz1, s2, siz2, c3, siz3);
     dbgprintf("=> %d\n", result);
     //if(s1)wch_print(s1);
     if(s2)dbgprintf("  dest: %s\n", s2);
     return result;
 }
-long WINAPI expGetVersionExA(OSVERSIONINFOA* c)
+static long WINAPI expGetVersionExA(OSVERSIONINFOA* c)
 {
     dbgprintf("GetVersionExA(0x%x) => 1\n");
     c->dwOSVersionInfoSize=sizeof(*c);
@@ -1636,34 +1594,35 @@
     strcpy(c->szCSDVersion, "Service Pack 3");
 #endif
     dbgprintf("  Major version: 4\n  Minor version: 0\n  Build number: 0x4000457\n"
-    "  Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n");
+	      "  Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n");
     return 1;
 }
-HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name)
+static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count,
+					 long max_count, char* name)
 {
     pthread_mutex_t *pm;
     pthread_cond_t  *pc;
     mutex_list* pp;
-/*
-    printf("CreateSemaphoreA(%p = %s)\n", name, (name ? name : "<null>"));
-    pp=mlist;
-    while(pp)
-    {
-	printf("%p => ", pp);
-	pp=pp->prev;
-    }
-    printf("0\n");
-*/
+    /*
+     printf("CreateSemaphoreA(%p = %s)\n", name, (name ? name : "<null>"));
+     pp=mlist;
+     while(pp)
+     {
+     printf("%p => ", pp);
+     pp=pp->prev;
+     }
+     printf("0\n");
+     */
     if(mlist!=NULL)
     {
 	mutex_list* pp=mlist;
 	if(name!=NULL)
-	do
+	    do
 	{
 	    if((strcmp(pp->name, name)==0) && (pp->type==1))
 	    {
-	        dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x",
-		    v1, init_count, max_count, name, name, mlist);
+		dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x\n",
+			  v1, init_count, max_count, name, name, mlist);
 		return (HANDLE)mlist;
 	    }
 	}while((pp=pp->prev) != NULL);
@@ -1683,7 +1642,7 @@
 	mlist->next->prev=mlist;
 	mlist->next->next=NULL;
 	mlist=mlist->next;
-//	printf("new semaphore %p\n", mlist);
+	//	printf("new semaphore %p\n", mlist);
     }
     mlist->type=1; /* Type Semaphore */
     mlist->pm=pm;
@@ -1692,26 +1651,26 @@
     mlist->reset=0;
     mlist->semaphore=init_count;
     if(name!=NULL)
-        strncpy(mlist->name, name, 64);
+	strncpy(mlist->name, name, 64);
     else
 	mlist->name[0]=0;
     if(pm==NULL)
 	dbgprintf("ERROR::: CreateSemaphoreA failure\n");
     if(name)
-	dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x",
-	v1, init_count, max_count, name, name, mlist);
+	dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0x%x='%s') => 0x%x\n",
+		  v1, init_count, max_count, name, name, mlist);
     else
-	dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x",
-	v1, init_count, max_count, mlist);
+	dbgprintf("CreateSemaphoreA(0x%x, init_count %d, max_count %d, name 0) => 0x%x\n",
+		  v1, init_count, max_count, mlist);
     return (HANDLE)mlist;
 }
 
-long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count)
+static long WINAPI expReleaseSemaphore(long hsem, long increment, long* prev_count)
 {
-// The state of a semaphore object is signaled when its count
-// is greater than zero and nonsignaled when its count is equal to zero
-// Each time a waiting thread is released because of the semaphore's signaled
-// state, the count of the semaphore is decreased by one.
+    // The state of a semaphore object is signaled when its count
+    // is greater than zero and nonsignaled when its count is equal to zero
+    // Each time a waiting thread is released because of the semaphore's signaled
+    // state, the count of the semaphore is decreased by one.
     mutex_list *ml = (mutex_list *)hsem;
 
     pthread_mutex_lock(ml->pm);
@@ -1720,70 +1679,78 @@
     ml->semaphore += increment;
     pthread_mutex_unlock(ml->pm);
     dbgprintf("ReleaseSemaphore(semaphore 0x%x, increment %d, prev_count 0x%x) => 1\n",
-	hsem, increment, prev_count);
+	      hsem, increment, prev_count);
     return 1;
 }
 
 
-long WINAPI expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey)
+static long WINAPI expRegOpenKeyExA(long key, const char* subkey, long reserved, long access, int* newkey)
 {
     long result=RegOpenKeyExA(key, subkey, reserved, access, newkey);
     dbgprintf("RegOpenKeyExA(key 0x%x, subkey %s, reserved %d, access 0x%x, pnewkey 0x%x) => %d\n",
-	key, subkey, reserved, access, newkey, result);
+	      key, subkey, reserved, access, newkey, result);
     if(newkey)dbgprintf("  New key: 0x%x\n", *newkey);
     return result;
 }
-long WINAPI expRegCloseKey(long key)
+static long WINAPI expRegCloseKey(long key)
 {
     long result=RegCloseKey(key);
     dbgprintf("RegCloseKey(0x%x) => %d\n", key, result);
     return result;
 }
-long WINAPI expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count)
+static long WINAPI expRegQueryValueExA(long key, const char* value, int* reserved, int* type, int* data, int* count)
 {
     long result=RegQueryValueExA(key, value, reserved, type, data, count);
     dbgprintf("RegQueryValueExA(key 0x%x, value %s, reserved 0x%x, data 0x%x, count 0x%x)"
-	" => 0x%x\n", key, value, reserved, data, count, result);
+	      " => 0x%x\n", key, value, reserved, data, count, result);
     if(data && count)dbgprintf("  read %d bytes: '%s'\n", *count, data);
     return result;
 }
-long WINAPI expRegCreateKeyExA(long key, const char* name, long reserved,
-							   void* classs, long options, long security,
-							   void* sec_attr, int* newkey, int* status)
+static long WINAPI expRegCreateKeyExA(long key, const char* name, long reserved,
+				      void* classs, long options, long security,
+				      void* sec_attr, int* newkey, int* status)
 {
     long result=RegCreateKeyExA(key, name, reserved, classs, options, security, sec_attr, newkey, status);
     dbgprintf("RegCreateKeyExA(key 0x%x, name 0x%x='%s', reserved=0x%x,"
-	" 0x%x, 0x%x, 0x%x, newkey=0x%x, status=0x%x) => %d\n",
-	    key, name, name, reserved, classs, options, security, sec_attr, newkey, status, result);
+	      " 0x%x, 0x%x, 0x%x, newkey=0x%x, status=0x%x) => %d\n",
+	      key, name, name, reserved, classs, options, security, sec_attr, newkey, status, result);
     if(!result && newkey) dbgprintf("  New key: 0x%x\n", *newkey);
     if(!result && status) dbgprintf("  New key status: 0x%x\n", *status);
     return result;
 }
-long WINAPI expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size)
+static long WINAPI expRegSetValueExA(long key, const char* name, long v1, long v2, void* data, long size)
 {
     long result=RegSetValueExA(key, name, v1, v2, data, size);
     dbgprintf("RegSetValueExA(key 0x%x, name '%s', 0x%x, 0x%x, data 0x%x -> 0x%x '%s', size=%d) => %d",
-	key, name, v1, v2, data, *(int*)data, data, size, result);
+	      key, name, v1, v2, data, *(int*)data, data, size, result);
     return result;
 }
 
-long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult)
+static long WINAPI expRegOpenKeyA (long hKey, LPCSTR lpSubKey, int* phkResult)
 {
     long result=RegOpenKeyExA(hKey, lpSubKey, 0, 0, phkResult);
     dbgprintf("RegOpenKeyExA(key 0x%x, subkey '%s', 0x%x) => %d\n",
-	hKey, lpSubKey, phkResult, result);
+	      hKey, lpSubKey, phkResult, result);
     if(!result && phkResult) dbgprintf("  New key: 0x%x\n", *phkResult);
     return result;
 }
 
-DWORD WINAPI expRegEnumValueA(HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count,
-			       LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count)
+static DWORD WINAPI expRegEnumValueA(HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count,
+				     LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count)
 {
     return RegEnumValueA(hkey, index, value, val_count,
 			 reserved, type, data, count);
 }
 
-long WINAPI expQueryPerformanceCounter(long long* z)
+static DWORD WINAPI expRegEnumKeyExA(HKEY hKey, DWORD dwIndex, LPSTR lpName, LPDWORD lpcbName,
+				     LPDWORD lpReserved, LPSTR lpClass, LPDWORD lpcbClass,
+				     LPFILETIME lpftLastWriteTime)
+{
+    return RegEnumKeyExA(hKey, dwIndex, lpName, lpcbName, lpReserved, lpClass,
+			 lpcbClass, lpftLastWriteTime);
+}
+
+static long WINAPI expQueryPerformanceCounter(long long* z)
 {
     longcount(z);
     dbgprintf("QueryPerformanceCounter(0x%x) => 1 ( %Ld )\n", z, *z);
@@ -1825,8 +1792,7 @@
 }
 
 
-static double
-solaris_kstat_freq()
+static double solaris_kstat_freq()
 {
 #if	defined(HAVE_LIBKSTAT) && defined(KSTAT_DATA_INT32)
     /*
@@ -1898,13 +1864,13 @@
     return tsc_freq();
 }
 
-long WINAPI expQueryPerformanceFrequency(long long* z)
+static long WINAPI expQueryPerformanceFrequency(long long* z)
 {
     *z=(long long)CPU_Freq();
     dbgprintf("QueryPerformanceFrequency(0x%x) => 1 ( %Ld )\n", z, *z);
     return 1;
 }
-long WINAPI exptimeGetTime()
+static long WINAPI exptimeGetTime()
 {
     struct timeval t;
     long result;
@@ -1913,23 +1879,23 @@
     dbgprintf("timeGetTime() => %d\n", result);
     return result;
 }
-void* WINAPI expLocalHandle(void* v)
+static void* WINAPI expLocalHandle(void* v)
 {
     dbgprintf("LocalHandle(0x%x) => 0x%x\n", v, v);
     return v;
 }
 
-void* WINAPI expGlobalHandle(void* v)
+static void* WINAPI expGlobalHandle(void* v)
 {
     dbgprintf("GlobalHandle(0x%x) => 0x%x\n", v, v);
     return v;
 }
-int WINAPI expGlobalUnlock(void* v)
+static int WINAPI expGlobalUnlock(void* v)
 {
     dbgprintf("GlobalUnlock(0x%x) => 1\n", v);
     return 1;
 }
-void* WINAPI expGlobalFree(void* v)
+static void* WINAPI expGlobalFree(void* v)
 {
     dbgprintf("GlobalFree(0x%x) => 0\n", v);
     my_release(v);
@@ -1937,7 +1903,7 @@
     return 0;
 }
 
-void* WINAPI expGlobalReAlloc(void* v, int size, int flags)
+static void* WINAPI expGlobalReAlloc(void* v, int size, int flags)
 {
     void* result=my_realloc(v, size);
     //void* result=realloc(v, size);
@@ -1945,38 +1911,41 @@
     return result;
 }
 
-int WINAPI expLocalUnlock(void* v)
+static int WINAPI expLocalUnlock(void* v)
 {
     dbgprintf("LocalUnlock(0x%x) => 1\n", v);
     return 1;
 }
-  //
-void* WINAPI expLocalFree(void* v)
+//
+static void* WINAPI expLocalFree(void* v)
 {
     dbgprintf("LocalFree(0x%x) => 0\n", v);
     my_release(v);
     return 0;
 }
-HRSRC WINAPI expFindResourceA(HMODULE module, char* name, char* type)
+static HRSRC WINAPI expFindResourceA(HMODULE module, char* name, char* type)
 {
-    HRSRC result=FindResourceA(module, name, type);
-    dbgprintf("FindResourceA(module 0x%x, name 0x%x, type 0x%x) => 0x%x\n", module, name, type, result);
+    HRSRC result;
+
+    result=FindResourceA(module, name, type);
+    dbgprintf("FindResourceA(module 0x%x, name 0x%x(%s), type 0x%x(%s)) => 0x%x\n", module, HIWORD(name) ? name : "UNICODE", HIWORD(type) ? type : "UNICODE", result);
     return result;
 }
+
 extern HRSRC WINAPI LoadResource(HMODULE, HRSRC);
-HGLOBAL WINAPI expLoadResource(HMODULE module, HRSRC res)
+static HGLOBAL WINAPI expLoadResource(HMODULE module, HRSRC res)
 {
     HGLOBAL result=LoadResource(module, res);
     dbgprintf("LoadResource(module 0x%x, resource 0x%x) => 0x%x\n", module, res, result);
     return result;
 }
-void* WINAPI expLockResource(long res)
+static void* WINAPI expLockResource(long res)
 {
     void* result=LockResource(res);
     dbgprintf("LockResource(0x%x) => 0x%x\n", res, result);
     return result;
 }
-int WINAPI expFreeResource(long res)
+static int WINAPI expFreeResource(long res)
 {
     int result=FreeResource(res);
     dbgprintf("FreeResource(0x%x) => %d\n", res, result);
@@ -1984,151 +1953,152 @@
 }
 //bool fun(HANDLE)
 //!0 on success
-int WINAPI expCloseHandle(long v1)
+static int WINAPI expCloseHandle(long v1)
 {
     dbgprintf("CloseHandle(0x%x) => 1\n", v1);
     return 1;
 }
 
-const char* WINAPI expGetCommandLineA()
+static const char* WINAPI expGetCommandLineA()
 {
     dbgprintf("GetCommandLineA() => \"c:\\aviplay.exe\"\n");
     return "c:\\aviplay.exe";
 }
 static short envs[]={'p', 'a', 't', 'h', ' ', 'c', ':', '\\', 0, 0};
-LPWSTR WINAPI expGetEnvironmentStringsW()
+static LPWSTR WINAPI expGetEnvironmentStringsW()
 {
- dbgprintf("GetEnvironmentStringsW() => 0\n", envs);
- return 0;
+    dbgprintf("GetEnvironmentStringsW() => 0\n", envs);
+    return 0;
 }
-void * WINAPI expRtlZeroMemory(void *p, size_t len)
+static void * WINAPI expRtlZeroMemory(void *p, size_t len)
 {
     void* result=memset(p,0,len);
     dbgprintf("RtlZeroMemory(0x%x, len %d) => 0x%x\n",p,len,result);
     return result;
 }
-void * WINAPI expRtlMoveMemory(void *dst, void *src, size_t len)
+static void * WINAPI expRtlMoveMemory(void *dst, void *src, size_t len)
 {
     void* result=memmove(dst,src,len);
     dbgprintf("RtlMoveMemory (dest 0x%x, src 0x%x, len %d) => 0x%x\n",dst,src,len,result);
     return result;
 }
 
-void * WINAPI expRtlFillMemory(void *p, int ch, size_t len)
+static void * WINAPI expRtlFillMemory(void *p, int ch, size_t len)
 {
     void* result=memset(p,ch,len);
     dbgprintf("RtlFillMemory(0x%x, char 0x%x, len %d) => 0x%x\n",p,ch,len,result);
     return result;
 }
-int WINAPI expFreeEnvironmentStringsW(short* strings)
+static int WINAPI expFreeEnvironmentStringsW(short* strings)
 {
     dbgprintf("FreeEnvironmentStringsW(0x%x) => 1\n", strings);
     return 1;
 }
-int WINAPI expFreeEnvironmentStringsA(char* strings)
+static int WINAPI expFreeEnvironmentStringsA(char* strings)
 {
- dbgprintf("FreeEnvironmentStringsA(0x%x) => 1\n", strings);
- return 1;
+    dbgprintf("FreeEnvironmentStringsA(0x%x) => 1\n", strings);
+    return 1;
 }
+
 static const char ch_envs[]=
-    "__MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1\r\n"
-    "PATH=C:\\;C:\\windows\\;C:\\windows\\system\r\n";
-LPCSTR WINAPI expGetEnvironmentStrings()
+"__MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1\r\n"
+"PATH=C:\\;C:\\windows\\;C:\\windows\\system\r\n";
+static LPCSTR WINAPI expGetEnvironmentStrings()
 {
     dbgprintf("GetEnvironmentStrings() => 0x%x\n", ch_envs);
     return (LPCSTR)ch_envs;
-// dbgprintf("GetEnvironmentStrings() => 0\n");
-// return 0;
+    // dbgprintf("GetEnvironmentStrings() => 0\n");
+    // return 0;
 }
 
-int WINAPI expGetStartupInfoA(STARTUPINFOA *s)
+static int WINAPI expGetStartupInfoA(STARTUPINFOA *s)
 {
     int i;
     dbgprintf("GetStartupInfoA(0x%x) => 1\n");
     memset(s, 0, sizeof(*s));
     s->cb=sizeof(*s);
-// s->lpReserved="Reserved";
-// s->lpDesktop="Desktop";
-// s->lpTitle="Title";
-// s->dwX=s->dwY=0;
-// s->dwXSize=s->dwYSize=200;
- s->dwFlags=s->wShowWindow=1;
-// s->hStdInput=s->hStdOutput=s->hStdError=0x1234;
+    // s->lpReserved="Reserved";
+    // s->lpDesktop="Desktop";
+    // s->lpTitle="Title";
+    // s->dwX=s->dwY=0;
+    // s->dwXSize=s->dwYSize=200;
+    s->dwFlags=s->wShowWindow=1;
+    // s->hStdInput=s->hStdOutput=s->hStdError=0x1234;
     dbgprintf("  cb=%d\n", s->cb);
     dbgprintf("  lpReserved='%s'\n", s->lpReserved);
     dbgprintf("  lpDesktop='%s'\n", s->lpDesktop);
     dbgprintf("  lpTitle='%s'\n", s->lpTitle);
     dbgprintf("  dwX=%d dwY=%d dwXSize=%d dwYSize=%d\n",
-	s->dwX, s->dwY, s->dwXSize, s->dwYSize);
+	      s->dwX, s->dwY, s->dwXSize, s->dwYSize);
     dbgprintf("  dwXCountChars=%d dwYCountChars=%d dwFillAttribute=%d\n",
-	s->dwXCountChars, s->dwYCountChars, s->dwFillAttribute);
+	      s->dwXCountChars, s->dwYCountChars, s->dwFillAttribute);
     dbgprintf("  dwFlags=0x%x wShowWindow=0x%x cbReserved2=0x%x\n",
-	s->dwFlags, s->wShowWindow, s->cbReserved2);
+	      s->dwFlags, s->wShowWindow, s->cbReserved2);
     dbgprintf("  lpReserved2=0x%x hStdInput=0x%x hStdOutput=0x%x hStdError=0x%x\n",
-	s->lpReserved2, s->hStdInput, s->hStdOutput, s->hStdError);
+	      s->lpReserved2, s->hStdInput, s->hStdOutput, s->hStdError);
     return 1;
 }
 
-int WINAPI expGetStdHandle(int z)
+static int WINAPI expGetStdHandle(int z)
 {
- dbgprintf("GetStdHandle(0x%x) => 0x%x\n", z+0x1234);
- return z+0x1234;
+    dbgprintf("GetStdHandle(0x%x) => 0x%x\n", z+0x1234);
+    return z+0x1234;
 }
-int WINAPI expGetFileType(int handle)
+static int WINAPI expGetFileType(int handle)
 {
- dbgprintf("GetFileType(0x%x) => 0x3 = pipe\n", handle);
- return 0x3;
+    dbgprintf("GetFileType(0x%x) => 0x3 = pipe\n", handle);
+    return 0x3;
 }
-int WINAPI expSetHandleCount(int count)
+static int WINAPI expSetHandleCount(int count)
 {
     dbgprintf("SetHandleCount(0x%x) => 1\n", count);
     return 1;
 }
-int WINAPI expGetACP()
+static int WINAPI expGetACP()
 {
     dbgprintf("GetACP() => 0\n");
     return 0;
 }
 extern WINE_MODREF *MODULE32_LookupHMODULE(HMODULE m);
-int WINAPI expGetModuleFileNameA(int module, char* s, int len)
+static int WINAPI expGetModuleFileNameA(int module, char* s, int len)
 {
     WINE_MODREF *mr;
     int result;
-//    printf("File name of module %X requested\n", module);
+    //    printf("File name of module %X requested\n", module);
     if(s==0)
 	result=0;
     else
-    if(len<35)
-    result=0;
-    else
-    {
-	result=1;
-	strcpy(s, "c:\\windows\\system\\");
-	mr=MODULE32_LookupHMODULE(module);
-	if(mr==0)//oops
-    	    strcat(s, "aviplay.dll");
+	if(len<35)
+	    result=0;
 	else
-	if(strrchr(mr->filename, '/')==NULL)
-	    strcat(s, mr->filename);
-	else
-	    strcat(s, strrchr(mr->filename, '/')+1);
-    }
+	{
+	    result=1;
+	    strcpy(s, "c:\\windows\\system\\");
+	    mr=MODULE32_LookupHMODULE(module);
+	    if(mr==0)//oops
+		strcat(s, "aviplay.dll");
+	    else
+		if(strrchr(mr->filename, '/')==NULL)
+		    strcat(s, mr->filename);
+		else
+		    strcat(s, strrchr(mr->filename, '/')+1);
+	}
     if(!s)
-    dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d\n",
-	module, s, len, result);
+	dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d\n",
+		  module, s, len, result);
     else
-    dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d ( '%s' )",
-	module, s, len, result, s);
+	dbgprintf("GetModuleFileNameA(0x%x, 0x%x, %d) => %d ( '%s' )\n",
+		  module, s, len, result, s);
     return result;
 }
 
-int WINAPI expSetUnhandledExceptionFilter(void* filter)
+static int WINAPI expSetUnhandledExceptionFilter(void* filter)
 {
     dbgprintf("SetUnhandledExceptionFilter(0x%x) => 1\n", filter);
     return 1;//unsupported and probably won't ever be supported
 }
 
-int WINAPI expLoadLibraryA(char* name)
+static int WINAPI expLoadLibraryA(char* name)
 {
     int result = 0;
     char* lastbc;
@@ -2142,8 +2112,8 @@
     lastbc = strrchr(name, '\\');
     if (lastbc)
     {
-        int i;
-        lastbc++;
+	int i;
+	lastbc++;
 	for (i = 0; 1 ;i++)
 	{
 	    name[i] = *lastbc++;
@@ -2155,6 +2125,7 @@
     if(strncmp(name, ".\\", 2)==0) name += 2;
 
     dbgprintf("Entering LoadLibraryA(%s)\n", name);
+
     // PIMJ and VIVO audio are loading  kernel32.dll
     if (strcasecmp(name, "kernel32.dll") == 0 || strcasecmp(name, "kernel32") == 0)
 //	return MODULE_HANDLE_kernel32;
@@ -2166,13 +2137,13 @@
 
     return result;
 }
-int WINAPI expFreeLibrary(int module)
+static int WINAPI expFreeLibrary(int module)
 {
     int result=FreeLibrary(module);
     dbgprintf("FreeLibrary(0x%x) => %d\n", module, result);
     return result;
 }
-void* WINAPI expGetProcAddress(HMODULE mod, char* name)
+static void* WINAPI expGetProcAddress(HMODULE mod, char* name)
 {
     void* result;
     if(mod!=MODULE_HANDLE_kernel32)
@@ -2183,8 +2154,9 @@
     return result;
 }
 
-long WINAPI expCreateFileMappingA(int hFile, void* lpAttr,
-    long flProtect, long dwMaxHigh, long dwMaxLow, const char* name)
+static long WINAPI expCreateFileMappingA(int hFile, void* lpAttr,
+					 long flProtect, long dwMaxHigh,
+					 long dwMaxLow, const char* name)
 {
     long result=CreateFileMappingA(hFile, lpAttr, flProtect, dwMaxHigh, dwMaxLow, name);
     if(!name)
@@ -2198,82 +2170,121 @@
     return result;
 }
 
-long WINAPI expOpenFileMappingA(long hFile, long hz, const char* name)
+static long WINAPI expOpenFileMappingA(long hFile, long hz, const char* name)
 {
     long result=OpenFileMappingA(hFile, hz, name);
     if(!name)
 	dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0) => %d\n",
-	    hFile, hz, result);
+		  hFile, hz, result);
     else
 	dbgprintf("OpenFileMappingA(0x%x, 0x%x, 0x%x='%s') => %d\n",
-	    hFile, hz, name, name, result);
+		  hFile, hz, name, name, result);
     return result;
 }
 
-void* WINAPI expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh, DWORD offLow, DWORD size)
+static void* WINAPI expMapViewOfFile(HANDLE file, DWORD mode, DWORD offHigh,
+				     DWORD offLow, DWORD size)
 {
     dbgprintf("MapViewOfFile(0x%x, 0x%x, 0x%x, 0x%x, size %d) => 0x%x\n",
-	file,mode,offHigh,offLow,size,(char*)file+offLow);
+	      file,mode,offHigh,offLow,size,(char*)file+offLow);
     return (char*)file+offLow;
 }
 
-void* WINAPI expUnmapViewOfFile(void* view)
+static void* WINAPI expUnmapViewOfFile(void* view)
 {
     dbgprintf("UnmapViewOfFile(0x%x) => 0\n", view);
     return 0;
 }
 
-void* WINAPI expSleep(int time)
+static void* WINAPI expSleep(int time)
+{
+#if HAVE_NANOSLEEP
+    /* solaris doesn't have thread safe usleep */
+    struct timespec tsp;
+    tsp.tv_sec  =  time / 1000000;
+    tsp.tv_nsec = (time % 1000000) * 1000;
+    nanosleep(&tsp, NULL);
+#else
+    usleep(time);
+#endif
+    dbgprintf("Sleep(%d) => 0\n", time);
+    return 0;
+}
+// why does IV32 codec want to call this? I don't know ...
+static int WINAPI expCreateCompatibleDC(int hdc)
 {
-//    extern int avm_usleep(int);
-    dbgprintf("Sleep(%d) => 0\n", time);
-//    avm_usleep(time);
-    usleep(time);
+    int dc = 0;//0x81;
+    //dbgprintf("CreateCompatibleDC(%d) => 0x81\n", hdc);
+    dbgprintf("CreateCompatibleDC(%d) => %d\n", hdc, dc);
+    return dc;
+}
+
+static int WINAPI expGetDeviceCaps(int hdc, int unk)
+{
+    dbgprintf("GetDeviceCaps(0x%x, %d) => 0\n", hdc, unk);
+    return 0;
+}
+
+static WIN_BOOL WINAPI expDeleteDC(int hdc)
+{
+    dbgprintf("DeleteDC(0x%x) => 0\n", hdc);
+    if (hdc == 0x81)
+	return 1;
     return 0;
 }
- // why does IV32 codec want to call this? I don't know ...
-void* WINAPI expCreateCompatibleDC(int hdc)
+
+static WIN_BOOL WINAPI expDeleteObject(int hdc)
 {
-        dbgprintf("CreateCompatibleDC(%d) => 0x81\n", hdc);
-        return (void*)0x81;
-}
-
-int WINAPI expGetDeviceCaps(int hdc, int unk)
-{
-        dbgprintf("GetDeviceCaps(0x%x, %d) => 0\n", hdc, unk);
-        return 0;
+    dbgprintf("DeleteObject(0x%x) => 1\n", hdc);
+    /* FIXME - implement code here */
+    return 1;
 }
 
-WIN_BOOL WINAPI expDeleteDC(int hdc)
+/* btvvc32.drv wants this one */
+static void* WINAPI expGetWindowDC(int hdc)
 {
-        dbgprintf("DeleteDC(0x%x) => 0\n", hdc);
-        return 0;
-}
-
-// btvvc32.drv wants this one
-void* WINAPI expGetWindowDC(int hdc)
-{
-        dbgprintf("GetWindowDC(%d) => 0x81\n", hdc);
-        return (void*)0x81;
-}
-
-void* WINAPI expCreateFontA(void)
-{
+    dbgprintf("GetWindowDC(%d) => 0x0\n", hdc);
     return 0;
 }
 
-int expwsprintfA(char* string, char* format, ...)
+/*
+ * Returns the number of milliseconds, modulo 2^32, since the start
+ * of the wineserver.
+ */
+static int WINAPI expGetTickCount(void)
 {
-    va_list va;
-    int result;
-    va_start(va, format);
-    result=vsprintf(string, format, va);
-    dbgprintf("wsprintfA(0x%x, '%s', ...) => %d\n", string, format, result);
-    va_end(va);
-    return result;
+    static int tcstart = 0;
+    struct timeval t;
+    int tc;
+    gettimeofday( &t, NULL );
+    tc = ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - tcstart;
+    if (tcstart == 0)
+    {
+	tcstart = 0;
+        tc = 0;
+    }
+    dbgprintf("GetTickCount() => %d\n", tc);
+    return tc;
 }
 
-int WINAPI expGetPrivateProfileIntA(const char* appname, const char* keyname, int default_value, const char* filename)
+static int WINAPI expCreateFontA(void)
+{
+    dbgprintf("CreateFontA() => 0x0\n");
+    return 1;
+}
+
+/* tried to get pvmjpg work in a different way - no success */
+static int WINAPI expDrawTextA(int hDC, char* lpString, int nCount,
+			       LPRECT lpRect, unsigned int uFormat)
+{
+    dbgprintf("expDrawTextA(%p,...) => 8\n", hDC);
+    return 8;
+}
+
+static int WINAPI expGetPrivateProfileIntA(const char* appname,
+					   const char* keyname,
+					   int default_value,
+					   const char* filename)
 {
     int size=255;
     char buffer[256];
@@ -2283,7 +2294,7 @@
     buffer[255]=0;
     if(!(appname && keyname && filename) )
     {
-        dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, default_value );
+	dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, default_value );
 	return default_value;
     }
     fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename));
@@ -2296,7 +2307,7 @@
     result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)buffer, &size);
     if((size>=0)&&(size<256))
 	buffer[size]=0;
-//    printf("GetPrivateProfileIntA(%s, %s, %s) -> %s\n", appname, keyname, filename, buffer);
+    //    printf("GetPrivateProfileIntA(%s, %s, %s) -> %s\n", appname, keyname, filename, buffer);
     free(fullname);
     if(result)
 	result=default_value;
@@ -2305,15 +2316,19 @@
     dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %d\n", appname, keyname, default_value, filename, result);
     return result;
 }
-int WINAPI expGetProfileIntA(const char* appname, const char* keyname, int default_value)
+static int WINAPI expGetProfileIntA(const char* appname,
+				    const char* keyname,
+				    int default_value)
 {
     dbgprintf("GetProfileIntA -> ");
-//    dbgprintf("GetProfileIntA(%s, %s, %d)\n", appname, keyname, default_value);
     return expGetPrivateProfileIntA(appname, keyname, default_value, "default");
 }
 
-int WINAPI expGetPrivateProfileStringA(const char* appname, const char* keyname,
-	const char* def_val, char* dest, unsigned int len, const char* filename)
+static int WINAPI expGetPrivateProfileStringA(const char* appname,
+					      const char* keyname,
+					      const char* def_val,
+					      char* dest, unsigned int len,
+					      const char* filename)
 {
     int result;
     int size;
@@ -2329,7 +2344,6 @@
     strcat(fullname, filename);
     size=len;
     result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)dest, &size);
-//    printf("GetPrivateProfileStringA(%s, %s, %s, %X, %X, %s)\n", appname, keyname, def_val, dest, len, filename );
     free(fullname);
     if(result)
     {
@@ -2339,8 +2353,10 @@
     dbgprintf(" => %d ( '%s' )\n", size, dest);
     return size;
 }
-int WINAPI expWritePrivateProfileStringA(const char* appname, const char* keyname,
-	const char* string, const char* filename)
+static int WINAPI expWritePrivateProfileStringA(const char* appname,
+						const char* keyname,
+						const char* string,
+						const char* filename)
 {
     int size=256;
     char* fullname;
@@ -2358,228 +2374,57 @@
     strcat(fullname, "\\");
     strcat(fullname, filename);
     RegSetValueExA(HKEY_LOCAL_MACHINE, fullname, 0, REG_SZ, (int*)string, strlen(string));
-//    printf("RegSetValueExA(%s,%d)\n", string, strlen(string));
-//    printf("WritePrivateProfileStringA(%s, %s, %s, %s)\n", appname, keyname, string, filename );
+    //    printf("RegSetValueExA(%s,%d)\n", string, strlen(string));
+    //    printf("WritePrivateProfileStringA(%s, %s, %s, %s)\n", appname, keyname, string, filename );
     free(fullname);
     dbgprintf(" => 0\n");
     return 0;
 }
-int expsprintf(char* str, const char* format, ...)
-{
-    va_list args;
-    int r;
-    dbgprintf("sprintf(%s, %s)\n", str, format);
-    va_start(args, format);
-    r = vsprintf(str, format, args);
-    va_end(args);
-    return r;
-}
-int expsscanf(const char* str, const char* format, ...)
-{
-    va_list args;
-    int r;
-    dbgprintf("sscanf(%s, %s)\n", str, format);
-    va_start(args, format);
-    r = vsscanf(str, format, args);
-    va_end(args);
-    return r;
-}
-void* expfopen(const char* path, const char* mode)
-{
-    printf("fopen: \"%s\"  mode:%s\n", path, mode);
-    //return fopen(path, mode);
-    return fdopen(0, mode); // everything on screen
-}
-int expfprintf(void* stream, const char* format, ...)
-{
-    va_list args;
-    int r = 0;
-#if 1
-    va_start(args, format);
-    r = vfprintf((FILE*) stream, format, args);
-    va_end(args);
-#endif
-    return r;
-}
-
-int expprintf(const char* format, ...)
-{
-    va_list args;
-    int r;
-    va_start(args, format);
-    r = vprintf(format, args);
-    va_end(args);
-    return r;
-}
-
-void* expwcscpy(WCHAR* dst, const WCHAR* src)
-{
-    WCHAR* p = dst;
-    while ((*p++ = *src++))
-	;
-    return dst;
-}
-
 
 unsigned int _GetPrivateProfileIntA(const char* appname, const char* keyname, INT default_value, const char* filename)
 {
     return expGetPrivateProfileIntA(appname, keyname, default_value, filename);
 }
 int _GetPrivateProfileStringA(const char* appname, const char* keyname,
-	const char* def_val, char* dest, unsigned int len, const char* filename)
+			      const char* def_val, char* dest, unsigned int len, const char* filename)
 {
     return expGetPrivateProfileStringA(appname, keyname, def_val, dest, len, filename);
 }
 int _WritePrivateProfileStringA(const char* appname, const char* keyname,
-	const char* string, const char* filename)
+				const char* string, const char* filename)
 {
     return expWritePrivateProfileStringA(appname, keyname, string, filename);
 }
 
 
 
-int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2)
+static int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2)
 {
     dbgprintf("DefDriverProc(0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0\n", _private, id, msg, arg1, arg2);
     return 0;
 }
 
-int WINAPI expSizeofResource(int v1, int v2)
+static int WINAPI expSizeofResource(int v1, int v2)
 {
     int result=SizeofResource(v1, v2);
     dbgprintf("SizeofResource(0x%x, 0x%x) => %d\n", v1, v2, result);
     return result;
 }
 
-int WINAPI expGetLastError()
+static int WINAPI expGetLastError()
 {
     int result=GetLastError();
     dbgprintf("GetLastError() => 0x%x\n", result);
     return result;
 }
 
-void WINAPI expSetLastError(int error)
+static void WINAPI expSetLastError(int error)
 {
     dbgprintf("SetLastError(0x%x)\n", error);
     SetLastError(error);
 }
 
-char* expstrrchr(char* string, int value)
-{
-    char* result=strrchr(string, value);
-    if(result)
-	dbgprintf("strrchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
-    else
-	dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value);
-    return result;
-}
-
-char* expstrchr(char* string, int value)
-{
-    char* result=strchr(string, value);
-    if(result)
-	dbgprintf("strchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
-    else
-	dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value);
-    return result;
-}
-int expstrlen(char* str)
-{
-    int result=strlen(str);
-    dbgprintf("strlen(0x%x='%s') => %d\n", str, str, result);
-    return result;
-}
-int expstrcpy(char* str1, const char* str2)
-{
-    int result= (int) strcpy(str1, str2);
-    dbgprintf("strcpy(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result);
-    return result;
-}
-int expstrcmp(const char* str1, const char* str2)
-{
-    int result=strcmp(str1, str2);
-    dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
-    return result;
-}
-int expstrncmp(const char* str1, const char* str2,int x)
-{
-    int result=strncmp(str1, str2,x);
-    dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
-    return result;
-}
-int expstrcat(char* str1, const char* str2)
-{
-    int result= (int) strcat(str1, str2);
-    dbgprintf("strcat(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
-    return result;
-}
-int expisalnum(int c)
-{
-    int result= (int) isalnum(c);
-    dbgprintf("isalnum(0x%x='%c' => %d\n", c, c, result);
-    return result;
-}
-int expmemmove(void* dest, void* src, int n)
-{
-    int result= (int) memmove(dest, src, n);
-    dbgprintf("memmove(0x%x, 0x%x, %d) => %d\n", dest, src, n, result);
-    return result;
-}
-int expmemcmp(void* dest, void* src, int n)
-{
-    int result=memcmp(dest, src, n);
-    dbgprintf("memcmp(0x%x, 0x%x, %d) => %d\n", dest, src, n, result);
-    return result;
-}
-void *expmemcpy(void* dest, void* src, int n)
-{
-    void *result=memcpy(dest, src, n);
-    dbgprintf("memcpy(0x%x, 0x%x, %d) => %p\n", dest, src, n, result);
-    return result;
-}
-time_t exptime(time_t* t)
-{
-    time_t result=time(t);
-    dbgprintf("time(0x%x) => %d\n", t, result);
-    return result;
-}
-
-int exprand(void)
-{
-    return rand();
-}
-
-double explog10(double x)
-{
-    return log10(x);
-}
-
-double expcos(double x)
-{
-    return cos(x);
-}
-
-double exppow(double x, double y)
-{
-    return pow(x, y);
-}
-
-void expsrand(int seed)
-{
-    srand(seed);
-}
-
-int exp_ftol(float f)
-{
-    return (int)(f+.5);
-}
-
-int exp_stricmp(const char* s1, const char* s2)
-{
-    return strcasecmp(s1, s2);
-}
-
-int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax)
+static int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax)
 {
     int result=snprintf(str, cbMax, "%.8x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x",
 			guid->f1, guid->f2, guid->f3,
@@ -2592,13 +2437,13 @@
 }
 
 
-int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle)
+static int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle)
 {
     dbgprintf("GetFileVersionInfoSizeA(0x%x='%s', 0x%X) => 0\n", name, name, lpHandle);
     return 0;
 }
 
-int WINAPI expIsBadStringPtrW(const short* string, int nchars)
+static int WINAPI expIsBadStringPtrW(const short* string, int nchars)
 {
     int result;
     if(string==0)result=1; else result=0;
@@ -2606,108 +2451,114 @@
     if(string)wch_print(string);
     return result;
 }
-int WINAPI expIsBadStringPtrA(const char* string, int nchars)
+static int WINAPI expIsBadStringPtrA(const char* string, int nchars)
 {
     return expIsBadStringPtrW((const short*)string, nchars);
 }
-extern long WINAPI InterlockedExchangeAdd( long* dest, long incr )
+static long WINAPI expInterlockedExchangeAdd( long* dest, long incr )
 {
     long ret;
-    __asm__ __volatile__( "lock; xaddl %0,(%1)"
-                          : "=r" (ret) : "r" (dest), "0" (incr) : "memory" );
+    __asm__ __volatile__
+	(
+	 "lock; xaddl %0,(%1)"
+	 : "=r" (ret)
+	 : "r" (dest), "0" (incr)
+	 : "memory"
+	);
     return ret;
 }
 
-extern long WINAPI expInterlockedIncrement( long* dest )
+static long WINAPI expInterlockedIncrement( long* dest )
 {
-    long result=InterlockedExchangeAdd( dest, 1 ) + 1;
+    long result=expInterlockedExchangeAdd( dest, 1 ) + 1;
     dbgprintf("InterlockedIncrement(0x%x => %d) => %d\n", dest, *dest, result);
     return result;
 }
-extern long WINAPI expInterlockedDecrement( long* dest )
+static long WINAPI expInterlockedDecrement( long* dest )
 {
-    long result=InterlockedExchangeAdd( dest, -1 ) - 1;
+    long result=expInterlockedExchangeAdd( dest, -1 ) - 1;
     dbgprintf("InterlockedDecrement(0x%x => %d) => %d\n", dest, *dest, result);
     return result;
 }
 
-extern void WINAPI expOutputDebugStringA( const char* string )
+static void WINAPI expOutputDebugStringA( const char* string )
 {
     dbgprintf("OutputDebugStringA(0x%x='%s')\n", string);
     fprintf(stderr, "DEBUG: %s\n", string);
 }
 
-int WINAPI expGetDC(int hwnd)
+static int WINAPI expGetDC(int hwnd)
 {
     dbgprintf("GetDC(0x%x) => 0\n", hwnd);
     return 0;
 }
 
-int WINAPI expGetDesktopWindow()
-{
-    dbgprintf("GetDesktopWindow() => 0\n");
-    return 0;
-}
-
-int WINAPI expReleaseDC(int hwnd, int hdc)
+static int WINAPI expReleaseDC(int hwnd, int hdc)
 {
     dbgprintf("ReleaseDC(0x%x, 0x%x) => 0\n", hwnd, hdc);
     return 0;
 }
-static int cursor[100];
-
-int WINAPI expLoadCursorA(int handle,LPCSTR name)
+
+static int WINAPI expGetDesktopWindow()
 {
-  dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%x\n", handle, name, (int)&cursor[0]);
-  return (int)&cursor[0];
+    dbgprintf("GetDesktopWindow() => 0\n");
+    return 0;
 }
-int WINAPI expSetCursor(void *cursor)
+
+static int cursor[100];
+
+static int WINAPI expLoadCursorA(int handle,LPCSTR name)
+{
+    dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%x\n", handle, name, (int)&cursor[0]);
+    return (int)&cursor[0];
+}
+static int WINAPI expSetCursor(void *cursor)
 {
     dbgprintf("SetCursor(0x%x) => 0x%x\n", cursor, cursor);
     return (int)cursor;
 }
-int WINAPI expGetCursorPos(void *cursor)
+static int WINAPI expGetCursorPos(void *cursor)
 {
     dbgprintf("GetCursorPos(0x%x) => 0x%x\n", cursor, cursor);
     return 1;
 }
-int WINAPI expRegisterWindowMessageA(char *message)
+static int WINAPI expRegisterWindowMessageA(char *message)
 {
     dbgprintf("RegisterWindowMessageA(%s)\n", message);
     return 1;
 }
-int WINAPI expGetProcessVersion(int pid)
+static int WINAPI expGetProcessVersion(int pid)
 {
     dbgprintf("GetProcessVersion(%d)\n", pid);
     return 1;
 }
-int WINAPI expGetCurrentThread(void)
+static int WINAPI expGetCurrentThread(void)
 {
 #warning FIXME!
     dbgprintf("GetCurrentThread() => %x\n", 0xcfcf9898);
     return 0xcfcf9898;
 }
-int WINAPI expGetOEMCP(void)
+static int WINAPI expGetOEMCP(void)
 {
     dbgprintf("GetOEMCP()\n");
     return 1;
 }
-int WINAPI expGetCPInfo(int cp,void *info)
+static int WINAPI expGetCPInfo(int cp,void *info)
 {
     dbgprintf("GetCPInfo()\n");
     return 0;
 }
-int WINAPI expGetSystemMetrics(int index)
+static int WINAPI expGetSystemMetrics(int index)
 {
     dbgprintf("GetSystemMetrics(%d)\n", index);
     return 1;
 }
-int WINAPI expGetSysColor(int index)
+static int WINAPI expGetSysColor(int index)
 {
     dbgprintf("GetSysColor(%d)\n", index);
     return 1;
 }
-int WINAPI expGetSysColorBrush(int index)
+static int WINAPI expGetSysColorBrush(int index)
 {
     dbgprintf("GetSysColorBrush(%d)\n", index);
     return 1;
@@ -2715,26 +2566,26 @@
 
 
 
-int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe)
+static int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe)
 {
     dbgprintf("GetSystemPaletteEntries(0x%x, 0x%x, 0x%x, 0x%x) => 0\n",
-	hdc, iStartIndex, nEntries, lppe);
+	      hdc, iStartIndex, nEntries, lppe);
     return 0;
 }
 
 /*
-typedef struct _TIME_ZONE_INFORMATION {
-    long Bias;
-    char StandardName[32];
-    SYSTEMTIME StandardDate;
-    long StandardBias;
-    char DaylightName[32];
-    SYSTEMTIME DaylightDate;
-    long DaylightBias;
-} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
-*/
-
-int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
+ typedef struct _TIME_ZONE_INFORMATION {
+ long Bias;
+ char StandardName[32];
+ SYSTEMTIME StandardDate;
+ long StandardBias;
+ char DaylightName[32];
+ SYSTEMTIME DaylightDate;
+ long DaylightBias;
+ } TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
+ */
+
+static int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
 {
     const short name[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'S', 't', 'a',
     'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e', 0};
@@ -2756,7 +2607,7 @@
     return TIME_ZONE_ID_STANDARD;
 }
 
-void WINAPI expGetLocalTime(SYSTEMTIME* systime)
+static void WINAPI expGetLocalTime(SYSTEMTIME* systime)
 {
     time_t local_time;
     struct tm *local_tm;
@@ -2776,13 +2627,13 @@
     systime->wSecond = local_tm->tm_sec;
     systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
     dbgprintf("  Year: %d\n  Month: %d\n  Day of week: %d\n"
-    "  Day: %d\n  Hour: %d\n  Minute: %d\n  Second:  %d\n"
-    "  Milliseconds: %d\n",
-    systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
-    systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
+	      "  Day: %d\n  Hour: %d\n  Minute: %d\n  Second:  %d\n"
+	      "  Milliseconds: %d\n",
+	      systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
+	      systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
 }
 
-int WINAPI expGetSystemTime(SYSTEMTIME* systime)
+static int WINAPI expGetSystemTime(SYSTEMTIME* systime)
 {
     time_t local_time;
     struct tm *local_tm;
@@ -2802,39 +2653,48 @@
     systime->wSecond = local_tm->tm_sec;
     systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
     dbgprintf("  Year: %d\n  Month: %d\n  Day of week: %d\n"
-    "  Day: %d\n  Hour: %d\n  Minute: %d\n  Second:  %d\n"
-    "  Milliseconds: %d\n",
-    systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
-    systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
+	      "  Day: %d\n  Hour: %d\n  Minute: %d\n  Second:  %d\n"
+	      "  Milliseconds: %d\n",
+	      systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
+	      systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
     return 0;
 }
 
-int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size)
+static int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size)
 {
     char *p;
-//    printf("%s %x %x\n", name, field, size);
+    //    printf("%s %x %x\n", name, field, size);
     if(field)field[0]=0;
-/*
-    p = getenv(name);
-    if (p) strncpy(field,p,size);
-*/
+    /*
+     p = getenv(name);
+     if (p) strncpy(field,p,size);
+     */
     if (strcmp(name,"__MSVCRT_HEAP_SELECT")==0)
-       strcpy(field,"__GLOBAL_HEAP_SELECTED,1");
+	strcpy(field,"__GLOBAL_HEAP_SELECTED,1");
     dbgprintf("GetEnvironmentVariableA(0x%x='%s', 0x%x, %d) => %d\n", name, name, field, size, strlen(field));
     return strlen(field);
 }
 
-void* WINAPI expCoTaskMemAlloc(ULONG cb)
+static void* WINAPI expCoTaskMemAlloc(ULONG cb)
 {
     return my_mreq(cb, 0);
 }
-void WINAPI expCoTaskMemFree(void* cb)
+static void WINAPI expCoTaskMemFree(void* cb)
 {
     my_release(cb);
 }
 
-void* CoTaskMemAlloc(ULONG cb){return expCoTaskMemAlloc(cb);}
-void CoTaskMemFree(void* cb){expCoTaskMemFree(cb);}
+
+
+
+void* CoTaskMemAlloc(ULONG cb)
+{
+    return expCoTaskMemAlloc(cb);
+}
+void CoTaskMemFree(void* cb)
+{
+    expCoTaskMemFree(cb);
+}
 
 struct COM_OBJECT_INFO
 {
@@ -2875,7 +2735,7 @@
 	else if (memcmp(&com_object_table[i].clsid, clsid, sizeof(GUID)) == 0
 		 && com_object_table[i].GetClassObject == gcs)
 	{
-            found++;
+	    found++;
 	}
 	i++;
     }
@@ -2884,58 +2744,57 @@
 	if (--com_object_size == 0)
 	{
 	    free(com_object_table);
-            com_object_table = 0;
+	    com_object_table = 0;
 	}
     }
     return 0;
 }
 
 
-GUID IID_IUnknown={0x00000000, 0x0000, 0x0000,
-    {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
-GUID IID_IClassFactory={0x00000001, 0x0000, 0x0000,
-    {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
-
-long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
-                    long dwClsContext, GUID* riid, void** ppv)
+GUID IID_IUnknown =
+{
+    0x00000000, 0x0000, 0x0000,
+    {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
+};
+GUID IID_IClassFactory =
+{
+    0x00000001, 0x0000, 0x0000,
+    {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
+};
+
+static long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
+				       long dwClsContext, GUID* riid, void** ppv)
 {
     int i;
     struct COM_OBJECT_INFO* ci=0;
     for(i=0; i<com_object_size; i++)
 	if(!memcmp(rclsid, &com_object_table[i].clsid, sizeof(GUID)))
 	    ci=&com_object_table[i];
-    if(!ci)return 0x80040154;
+    if(!ci)return REGDB_E_CLASSNOTREG;
     // in 'real' world we should mess with IClassFactory here
     i=ci->GetClassObject(rclsid, riid, ppv);
     return i;
 }
 
 long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
-                    long dwClsContext, GUID* riid, void** ppv)
+		      long dwClsContext, GUID* riid, void** ppv)
 {
     return expCoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
 }
 
-int WINAPI
- expIsRectEmpty(
-CONST RECT *lprc)
+static int WINAPI expIsRectEmpty(CONST RECT *lprc)
 {
-    dbgprintf("IsRectEmpty(0x%x)");
-    if((!lprc) || (lprc->right==lprc->left) || (lprc->top==lprc->bottom))
-    {
-	dbgprintf(" => TRUE\n");
-	return TRUE;
-    }
-    dbgprintf(" => FALSE\n");
-    return FALSE;
+    int r = (!lprc || (lprc->right == lprc->left) || (lprc->top == lprc->bottom));
+    dbgprintf("IsRectEmpty(%p) => %s\n", lprc, (r) ? "TRUE" : "FALSE");
+    return r;
 }
 
-int _adjust_fdiv=0; //what's this?
-
-
-
-
-unsigned int WINAPI expGetTempPathA(unsigned int len, char* path)
+static int _adjust_fdiv=0; //what's this? - used to adjust division
+
+
+
+
+static unsigned int WINAPI expGetTempPathA(unsigned int len, char* path)
 {
     dbgprintf("GetTempPathA(%d, 0x%x)", len, path);
     if(len<5)
@@ -2948,45 +2807,45 @@
     return 5;
 }
 /*
-FYI:
-typedef struct
-{
-    DWORD     dwFileAttributes;
-    FILETIME  ftCreationTime;
-    FILETIME  ftLastAccessTime;
-    FILETIME  ftLastWriteTime;
-    DWORD     nFileSizeHigh;
-    DWORD     nFileSizeLow;
-    DWORD     dwReserved0;
-    DWORD     dwReserved1;
-    CHAR      cFileName[260];
-    CHAR      cAlternateFileName[14];
-} WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
-*/
-
-HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd)
+ FYI:
+ typedef struct
+ {
+ DWORD     dwFileAttributes;
+ FILETIME  ftCreationTime;
+ FILETIME  ftLastAccessTime;
+ FILETIME  ftLastWriteTime;
+ DWORD     nFileSizeHigh;
+ DWORD     nFileSizeLow;
+ DWORD     dwReserved0;
+ DWORD     dwReserved1;
+ CHAR      cFileName[260];
+ CHAR      cAlternateFileName[14];
+ } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
+ */
+
+static HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd)
 {
     dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => 0\n", s, s, lpfd);
     strcpy(lpfd->cFileName, "msms001.vwp");
     strcpy(lpfd->cAlternateFileName, "msms001.vwp");
     return (HANDLE)0;
 }
-WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p)
+static WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA p)
 {
     dbgprintf("FindNextFileA(0x%x, 0x%x) => 0\n", h, p);
     return 0;
 }
-WIN_BOOL WINAPI expFindClose(HANDLE h)
+static WIN_BOOL WINAPI expFindClose(HANDLE h)
 {
     dbgprintf("FindClose(0x%x) => 0\n", h);
     return 0;
 }
-UINT WINAPI expSetErrorMode(UINT i)
+static UINT WINAPI expSetErrorMode(UINT i)
 {
     dbgprintf("SetErrorMode(%d) => 0\n", i);
     return 0;
 }
-UINT      WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c)
+static UINT WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c)
 {
     char windir[]="c:\\windows";
     int result;
@@ -2996,18 +2855,18 @@
     return result;
 }
 
-WIN_BOOL  WINAPI expDeleteFileA(LPCSTR s)
+static WIN_BOOL  WINAPI expDeleteFileA(LPCSTR s)
 {
     dbgprintf("DeleteFileA(0x%x='%s') => 0\n", s, s);
     return 0;
 }
-WIN_BOOL  WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf)
+static WIN_BOOL  WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf)
 {
     dbgprintf("FileTimeToLocalFileTime(0x%x, 0x%x) => 0\n", cpf, pf);
     return 0;
 }
 
-UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps)
+static UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps)
 {
     char mask[16]="/tmp/AP_XXXXXX";
     int result;
@@ -3027,11 +2886,11 @@
 // They try to open APmpeg4v1.apl with it.
 // DLL will close opened file with CloseHandle().
 //
-HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
-    LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5)
+static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
+				    LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5)
 {
     dbgprintf("CreateFileA(0x%x='%s', %d, %d, 0x%x, %d, %d, 0x%x)\n", cs1, cs1, i1,
-	     i2, p1, i3, i4, i5);
+	      i2, p1, i3, i4, i5);
     if((!cs1) || (strlen(cs1)<2))return -1;
 
     if(strncmp(cs1, "AP", 2) == 0)
@@ -3074,12 +2933,12 @@
     return atoi(cs1+2);
 }
 static char sysdir[]=".";
-LPCSTR WINAPI expGetSystemDirectoryA()
+static LPCSTR WINAPI expGetSystemDirectoryA()
 {
     dbgprintf("GetSystemDirectoryA() => 0x%x='%s'\n", sysdir, sysdir);
     return sysdir;
 }
-WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused)
+static WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused)
 {
     int result;
     dbgprintf("ReadFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, rd);
@@ -3089,7 +2948,7 @@
     return 1;
 }
 
-WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused)
+static WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused)
 {
     int result;
     dbgprintf("WriteFile(%d, 0x%x, %d -> 0x%x)\n", h, pv, size, wr);
@@ -3099,11 +2958,11 @@
     if(!result)return 0;
     return 1;
 }
-DWORD  WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence)
+static DWORD  WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence)
 {
     int wh;
     dbgprintf("SetFilePointer(%d, %d, 0x%x, %d)\n", h, val, ext, whence);
-//why would DLL want temporary file with >2Gb size?
+    //why would DLL want temporary file with >2Gb size?
     switch(whence)
     {
     case FILE_BEGIN:
@@ -3118,40 +2977,37 @@
     return lseek(h, val, wh);
 }
 
-HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName,
-                             LPARAM lParam2)
+static HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName,
+				   LPARAM lParam2)
 {
     dbgprintf("OpenDriverA(0x%x='%s', 0x%x='%s', 0x%x) => -1\n", szDriverName,  szDriverName, szSectionName, szSectionName, lParam2);
     return -1;
 }
-HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName,
-                             LPARAM lParam2)
+static HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName,
+				  LPARAM lParam2)
 {
     dbgprintf("OpenDriver(0x%x='%s', 0x%x='%s', 0x%x) => -1\n", szDriverName, szDriverName, szSectionName, szSectionName, lParam2);
     return -1;
 }
 
 
-WIN_BOOL
- WINAPI
- expGetProcessAffinityMask(
-    HANDLE hProcess,
-    LPDWORD lpProcessAffinityMask,
-    LPDWORD lpSystemAffinityMask
-    )
+static WIN_BOOL WINAPI expGetProcessAffinityMask(HANDLE hProcess,
+						 LPDWORD lpProcessAffinityMask,
+						 LPDWORD lpSystemAffinityMask)
 {
     dbgprintf("GetProcessAffinityMask(0x%x, 0x%x, 0x%x) => 1\n",
-	hProcess, lpProcessAffinityMask, lpSystemAffinityMask);
+	      hProcess, lpProcessAffinityMask, lpSystemAffinityMask);
     if(lpProcessAffinityMask)*lpProcessAffinityMask=1;
     if(lpSystemAffinityMask)*lpSystemAffinityMask=1;
     return 1;
 }
 
-int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator)
+static int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator)
 {
     static const long long max_int=0x7FFFFFFFLL;
     static const long long min_int=-0x80000000LL;
     long long tmp=(long long)nNumber*(long long)nNumerator;
+    dbgprintf("expMulDiv %d * %d / %d\n", nNumber, nNumerator, nDenominator);
     if(!nDenominator)return 1;
     tmp/=nDenominator;
     if(tmp<min_int) return 1;
@@ -3159,37 +3015,37 @@
     return (int)tmp;
 }
 
-LONG WINAPI explstrcmpiA(const char* str1, const char* str2)
+static LONG WINAPI explstrcmpiA(const char* str1, const char* str2)
 {
     LONG result=strcasecmp(str1, str2);
     dbgprintf("strcmpi(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
     return result;
 }
 
-LONG WINAPI explstrlenA(const char* str1)
+static LONG WINAPI explstrlenA(const char* str1)
 {
     LONG result=strlen(str1);
     dbgprintf("strlen(0x%x='%.50s') => %d\n", str1, str1, result);
     return result;
 }
 
-LONG WINAPI explstrcpyA(char* str1, const char* str2)
+static LONG WINAPI explstrcpyA(char* str1, const char* str2)
 {
     int result= (int) strcpy(str1, str2);
     dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %d\n", str1, str2, str2, result);
     return result;
 }
-LONG WINAPI explstrcpynA(char* str1, const char* str2,int len)
+static LONG WINAPI explstrcpynA(char* str1, const char* str2,int len)
 {
     int result;
     if (strlen(str2)>len)
-      result =  (int) strncpy(str1, str2,len);
+	result = (int) strncpy(str1, str2,len);
     else
-      result =  (int) strcpy(str1,str2);
+	result = (int) strcpy(str1,str2);
     dbgprintf("strncpy(0x%x, 0x%x='%s' len %d strlen %d) => %x\n", str1, str2, str2,len, strlen(str2),result);
     return result;
 }
-LONG WINAPI explstrcatA(char* str1, const char* str2)
+static LONG WINAPI explstrcatA(char* str1, const char* str2)
 {
     int result= (int) strcat(str1, str2);
     dbgprintf("strcat(0x%x, 0x%x='%s') => %d\n", str1, str2, str2, result);
@@ -3197,59 +3053,57 @@
 }
 
 
-LONG WINAPI expInterlockedExchange(long *dest, long l)
+static LONG WINAPI expInterlockedExchange(long *dest, long l)
 {
-	long retval;
-	retval = *dest;
-	*dest = l;
-	return retval;
+    long retval = *dest;
+    *dest = l;
+    return retval;
 }
 
-void WINAPI expInitCommonControls(void)
+static void WINAPI expInitCommonControls(void)
 {
     printf("InitCommonControls called!\n");
     return;
 }
 
 /* alex: implement this call! needed for 3ivx */
-HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner)
+static HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner)
 {
     printf("CoCreateFreeThreadedMarshaler(%p, %p) called!\n",
-	pUnkOuter, ppUnkInner);
+	   pUnkOuter, ppUnkInner);
     return ERROR_CALL_NOT_IMPLEMENTED;
 }
 
 
-int WINAPI expDuplicateHandle(
-      HANDLE hSourceProcessHandle,  // handle to source process
-      HANDLE hSourceHandle,         // handle to duplicate
-      HANDLE hTargetProcessHandle,  // handle to target process
-      HANDLE* lpTargetHandle,      // duplicate handle
- DWORD dwDesiredAccess,        // requested access
-     int bInheritHandle,          // handle inheritance option
-      DWORD dwOptions               // optional actions
-      )
+static int WINAPI expDuplicateHandle(HANDLE hSourceProcessHandle,  // handle to source process
+				     HANDLE hSourceHandle,         // handle to duplicate
+				     HANDLE hTargetProcessHandle,  // handle to target process
+				     HANDLE* lpTargetHandle,      // duplicate handle
+				     DWORD dwDesiredAccess,        // requested access
+				     int bInheritHandle,          // handle inheritance option
+				     DWORD dwOptions               // optional actions
+				    )
 {
     dbgprintf("DuplicateHandle(%p, %p, %p, %p, 0x%x, %d, %d) called\n",
-	hSourceProcessHandle, hSourceHandle, hTargetProcessHandle,
-	lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions);
+	      hSourceProcessHandle, hSourceHandle, hTargetProcessHandle,
+	      lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions);
     *lpTargetHandle = hSourceHandle;
     return 1;
 }
 
 // required by PIM1 codec (used by win98 PCTV Studio capture sw)
-HRESULT WINAPI expCoInitialize(
-	LPVOID lpReserved	/* [in] pointer to win32 malloc interface
-                                   (obsolete, should be NULL) */
-)
+static HRESULT WINAPI expCoInitialize(
+				      LPVOID lpReserved	/* [in] pointer to win32 malloc interface
+				      (obsolete, should be NULL) */
+				     )
 {
-  /*
-   * Just delegate to the newer method.
-   */
-  return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED);
+    /*
+     * Just delegate to the newer method.
+     */
+    return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED);
 }
 
-DWORD expSetThreadAffinityMask
+static DWORD WINAPI expSetThreadAffinityMask
 (
         HANDLE hThread,
         DWORD dwThreadAffinityMask
@@ -3257,6 +3111,353 @@
     return 0;
 };
 
+/*
+ * no WINAPI functions - CDECL
+ */
+static void* expmalloc(int size)
+{
+    //printf("malloc");
+    //    return malloc(size);
+    void* result=my_mreq(size,0);
+    dbgprintf("malloc(0x%x) => 0x%x\n", size,result);
+    if(result==0)
+	printf("WARNING: malloc() failed\n");
+    return result;
+}
+static void expfree(void* mem)
+{
+    //    return free(mem);
+    dbgprintf("free(%p)\n", mem);
+    my_release(mem);
+}
+static void* expnew(int size)
+{
+    //    printf("NEW:: Call from address %08x\n STACK DUMP:\n", *(-1+(int*)&size));
+    //    printf("%08x %08x %08x %08x\n",
+    //    size, *(1+(int*)&size),
+    //    *(2+(int*)&size),*(3+(int*)&size));
+    void* result;
+    assert(size >= 0);
+
+    result=my_mreq(size,0);
+    dbgprintf("new(%d) => %p\n", size, result);
+    if (result==0)
+	printf("WARNING: new() failed\n");
+    return result;
+
+}
+static int expdelete(void* memory)
+{
+    dbgprintf("delete(%p)\n", memory);
+    my_release(memory);
+    return 0;
+}
+static int exp_initterm(int v1, int v2)
+{
+    dbgprintf("_initterm(0x%x, 0x%x) => 0\n", v1, v2);
+    return 0;
+}
+
+static int expwsprintfA(char* string, char* format, ...)
+{
+    va_list va;
+    int result;
+    va_start(va, format);
+    result = vsprintf(string, format, va);
+    dbgprintf("wsprintfA(0x%x, '%s', ...) => %d\n", string, format, result);
+    va_end(va);
+    return result;
+}
+
+static int expsprintf(char* str, const char* format, ...)
+{
+    va_list args;
+    int r;
+    dbgprintf("sprintf(%s, %s)\n", str, format);
+    va_start(args, format);
+    r = vsprintf(str, format, args);
+    va_end(args);
+    return r;
+}
+static int expsscanf(const char* str, const char* format, ...)
+{
+    va_list args;
+    int r;
+    dbgprintf("sscanf(%s, %s)\n", str, format);
+    va_start(args, format);
+    r = vsscanf(str, format, args);
+    va_end(args);
+    return r;
+}
+static void* expfopen(const char* path, const char* mode)
+{
+    printf("fopen: \"%s\"  mode:%s\n", path, mode);
+    //return fopen(path, mode);
+    return fdopen(0, mode); // everything on screen
+}
+static int expfprintf(void* stream, const char* format, ...)
+{
+    va_list args;
+    int r = 0;
+    dbgprintf("fprintf(%p, %s, ...)\n", stream, format);
+#if 1
+    va_start(args, format);
+    r = vfprintf((FILE*) stream, format, args);
+    va_end(args);
+#endif
+    return r;
+}
+
+static int expprintf(const char* format, ...)
+{
+    va_list args;
+    int r;
+    dbgprintf("printf(%s, ...)\n", format);
+    va_start(args, format);
+    r = vprintf(format, args);
+    va_end(args);
+    return r;
+}
+
+static char* expgetenv(const char* varname)
+{
+    char* v = getenv(varname);
+    dbgprintf("getenv(%s) => %s\n", varname, v);
+    return v;
+}
+
+static void* expwcscpy(WCHAR* dst, const WCHAR* src)
+{
+    WCHAR* p = dst;
+    while ((*p++ = *src++))
+	;
+    return dst;
+}
+
+static char* expstrrchr(char* string, int value)
+{
+    char* result=strrchr(string, value);
+    if(result)
+	dbgprintf("strrchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
+    else
+	dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value);
+    return result;
+}
+
+static char* expstrchr(char* string, int value)
+{
+    char* result=strchr(string, value);
+    if(result)
+	dbgprintf("strchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
+    else
+	dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value);
+    return result;
+}
+static int expstrlen(char* str)
+{
+    int result=strlen(str);
+    dbgprintf("strlen(0x%x='%s') => %d\n", str, str, result);
+    return result;
+}
+static char* expstrcpy(char* str1, const char* str2)
+{
+    char* result= strcpy(str1, str2);
+    dbgprintf("strcpy(0x%x, 0x%x='%s') => %p\n", str1, str2, str2, result);
+    return result;
+}
+static int expstrcmp(const char* str1, const char* str2)
+{
+    int result=strcmp(str1, str2);
+    dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
+    return result;
+}
+static int expstrncmp(const char* str1, const char* str2,int x)
+{
+    int result=strncmp(str1, str2,x);
+    dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %d\n", str1, str1, str2, str2, result);
+    return result;
+}
+static char* expstrcat(char* str1, const char* str2)
+{
+    char* result = strcat(str1, str2);
+    dbgprintf("strcat(0x%x='%s', 0x%x='%s') => %p\n", str1, str1, str2, str2, result);
+    return result;
+}
+static char* exp_strdup(const char* str1)
+{
+    int l = strlen(str1);
+    char* result = my_mreq(l + 1,0);
+    if (result)
+	strcpy(result, str1);
+    dbgprintf("_strdup(0x%x='%s') => %p\n", str1, str1, result);
+    return result;
+}
+static int expisalnum(int c)
+{
+    int result= (int) isalnum(c);
+    dbgprintf("isalnum(0x%x='%c' => %d\n", c, c, result);
+    return result;
+}
+static void* expmemmove(void* dest, void* src, int n)
+{
+    void* result = memmove(dest, src, n);
+    dbgprintf("memmove(0x%x, 0x%x, %d) => %p\n", dest, src, n, result);
+    return result;
+}
+static int expmemcmp(void* dest, void* src, int n)
+{
+    int result = memcmp(dest, src, n);
+    dbgprintf("memcmp(0x%x, 0x%x, %d) => %d\n", dest, src, n, result);
+    return result;
+}
+static void* expmemcpy(void* dest, void* src, int n)
+{
+    void *result = memcpy(dest, src, n);
+    dbgprintf("memcpy(0x%x, 0x%x, %d) => %p\n", dest, src, n, result);
+    return result;
+}
+static time_t exptime(time_t* t)
+{
+    time_t result = time(t);
+    dbgprintf("time(0x%x) => %d\n", t, result);
+    return result;
+}
+
+static int exprand(void)
+{
+    return rand();
+}
+
+static void expsrand(int seed)
+{
+    srand(seed);
+}
+
+#if 1
+
+// prefered compilation with  -O2 -ffast-math !
+
+static double explog10(double x)
+{
+    /*printf("Log10 %f => %f    0x%Lx\n", x, log10(x), *((int64_t*)&x));*/
+    return log10(x);
+}
+
+static double expcos(double x)
+{
+    /*printf("Cos %f => %f  0x%Lx\n", x, cos(x), *((int64_t*)&x));*/
+    return cos(x);
+}
+
+/* doens't work */
+static long exp_ftol_wrong(double x)
+{
+    return (long) x;
+}
+
+#else
+
+static void explog10(void)
+{
+    __asm__ __volatile__
+	(
+	 "fldl 8(%esp)	\n\t"
+	 "fldln2	\n\t"
+	 "fxch %st(1)	\n\t"
+	 "fyl2x		\n\t"
+	);
+}
+
+static void expcos(void)
+{
+    __asm__ __volatile__
+	(
+	 "fldl 8(%esp)	\n\t"
+	 "fcos		\n\t"
+	);
+}
+
+#endif
+
+// this seem to be the only how to make this function working properly
+// ok - I've spent tremendous amount of time (many many many hours
+// of debuging fixing & testing - it's almost unimaginable - kabi
+
+// _ftol - operated on the float value which is already on the FPU stack
+static void exp_ftol(void)
+{
+    __asm__ __volatile__
+	(
+	 "sub $12, %esp		\n\t"
+	 "fstcw   -2(%ebp)	\n\t"
+	 "wait			\n\t"
+	 "mov	  -2(%ebp), %ax	\n\t"
+	 "or	 $0x0C, %ah	\n\t"
+	 "mov    %ax, -4(%ebp)	\n\t"
+	 "fldcw   -4(%ebp)	\n\t"
+	 "fistpl -12(%ebp)	\n\t"
+	 "fldcw   -2(%ebp)	\n\t"
+	 "mov	 -12(%ebp), %eax \n\t"
+	);
+}
+
+static double exppow(double x, double y)
+{
+    /*printf("Pow %f  %f    0x%Lx  0x%Lx  => %f\n", x, y, *((int64_t*)&x), *((int64_t*)&y), pow(x, y));*/
+    return pow(x, y);
+}
+
+
+
+static int exp_stricmp(const char* s1, const char* s2)
+{
+    return strcasecmp(s1, s2);
+}
+
+/* from declaration taken from Wine sources - this fountion seems to be
+ * undocumented in any M$ doc */
+static int exp_setjmp3(void* jmpbuf, int x)
+{
+    //dbgprintf("!!!!UNIMPLEMENTED: setjmp3(%p, %d) => 0\n", jmpbuf, x);
+    //return 0;
+    __asm__ __volatile__
+	(
+	 //"mov 4(%%esp), %%edx	\n\t"
+	 "mov (%%esp), %%eax   \n\t"
+	 "mov %%eax, (%%edx)	\n\t" // store ebp
+
+	 //"mov %%ebp, (%%edx)	\n\t"
+	 "mov %%ebx, 4(%%edx)	\n\t"
+	 "mov %%edi, 8(%%edx)	\n\t"
+	 "mov %%esi, 12(%%edx)	\n\t"
+	 "mov %%esp, 16(%%edx)	\n\t"
+
+	 "mov 4(%%esp), %%eax	\n\t"
+	 "mov %%eax, 20(%%edx)	\n\t"
+
+	 "movl $0x56433230, 32(%%edx)	\n\t" // VC20 ??
+	 "movl $0, 36(%%edx)	\n\t"
+	 : // output
+	 : "d"(jmpbuf) // input
+	);
+#if 1
+    __asm__ __volatile__
+	(
+	 "mov %%fs:0, %%eax	\n\t" // unsure
+	 "mov %%eax, 24(%%edx)	\n\t"
+	 "cmp $0xffffffff, %%eax \n\t"
+	 "jnz l1                \n\t"
+	 "mov %%eax, 28(%%edx)	\n\t"
+	 "l1:                   \n\t"
+	 :
+	 :
+	);
+#endif
+
+	return 0;
+}
+
+
 
 struct exports
 {
@@ -3272,251 +3473,311 @@
 };
 
 #define FF(X,Y) \
-{#X, Y, (void*)exp##X},
-
-struct exports exp_kernel32[]={
-FF(IsBadWritePtr, 357)
-FF(IsBadReadPtr, 354)
-FF(IsBadStringPtrW, -1)
-FF(IsBadStringPtrA, -1)
-FF(DisableThreadLibraryCalls, -1)
-FF(CreateThread, -1)
-FF(CreateEventA, -1)
-FF(SetEvent, -1)
-FF(ResetEvent, -1)
-FF(WaitForSingleObject, -1)
-FF(GetSystemInfo, -1)
-FF(GetVersion, 332)
-FF(HeapCreate, 461)
-FF(HeapAlloc, -1)
-FF(HeapDestroy, -1)
-FF(HeapFree, -1)
-FF(HeapSize, -1)
-FF(HeapReAlloc,-1)
-FF(GetProcessHeap, -1)
-FF(VirtualAlloc, -1)
-FF(VirtualFree, -1)
-FF(InitializeCriticalSection, -1)
-FF(EnterCriticalSection, -1)
-FF(LeaveCriticalSection, -1)
-FF(DeleteCriticalSection, -1)
-FF(TlsAlloc, -1)
-FF(TlsFree, -1)
-FF(TlsGetValue, -1)
-FF(TlsSetValue, -1)
-FF(GetCurrentThreadId, -1)
-FF(GetCurrentProcess, -1)
-FF(LocalAlloc, -1)
-FF(LocalReAlloc,-1)
-FF(LocalLock, -1)
-FF(GlobalAlloc, -1)
-FF(GlobalReAlloc, -1)
-FF(GlobalLock, -1)
-FF(GlobalSize, -1)
-FF(MultiByteToWideChar, 427)
-FF(WideCharToMultiByte, -1)
-FF(GetVersionExA, -1)
-FF(CreateSemaphoreA, -1)
-FF(QueryPerformanceCounter, -1)
-FF(QueryPerformanceFrequency, -1)
-FF(LocalHandle, -1)
-FF(LocalUnlock, -1)
-FF(LocalFree, -1)
-FF(GlobalHandle, -1)
-FF(GlobalUnlock, -1)
-FF(GlobalFree, -1)
-FF(LoadResource, -1)
-FF(ReleaseSemaphore, -1)
-FF(FindResourceA, -1)
-FF(LockResource, -1)
-FF(FreeResource, -1)
-FF(SizeofResource, -1)
-FF(CloseHandle, -1)
-FF(GetCommandLineA, -1)
-FF(GetEnvironmentStringsW, -1)
-FF(FreeEnvironmentStringsW, -1)
-FF(FreeEnvironmentStringsA, -1)
-FF(GetEnvironmentStrings, -1)
-FF(GetStartupInfoA, -1)
-FF(GetStdHandle, -1)
-FF(GetFileType, -1)
-FF(SetHandleCount, -1)
-FF(GetACP, -1)
-FF(GetModuleFileNameA, -1)
-FF(SetUnhandledExceptionFilter, -1)
-FF(LoadLibraryA, -1)
-FF(GetProcAddress, -1)
-FF(FreeLibrary, -1)
-FF(CreateFileMappingA, -1)
-FF(OpenFileMappingA, -1)
-FF(MapViewOfFile, -1)
-FF(UnmapViewOfFile, -1)
-FF(Sleep, -1)
-FF(GetModuleHandleA, -1)
-FF(GetProfileIntA, -1)
-FF(GetPrivateProfileIntA, -1)
-FF(GetPrivateProfileStringA, -1)
-FF(WritePrivateProfileStringA, -1)
-FF(GetLastError, -1)
-FF(SetLastError, -1)
-FF(InterlockedIncrement, -1)
-FF(InterlockedDecrement, -1)
-FF(GetTimeZoneInformation, -1)
-FF(OutputDebugStringA, -1)
-FF(GetLocalTime, -1)
-FF(GetSystemTime, -1)
-FF(GetEnvironmentVariableA, -1)
-FF(RtlZeroMemory,-1)
-FF(RtlMoveMemory,-1)
-FF(RtlFillMemory,-1)
-FF(GetTempPathA,-1)
-FF(FindFirstFileA,-1)
-FF(FindNextFileA,-1)
-FF(FindClose,-1)
-FF(FileTimeToLocalFileTime,-1)
-FF(DeleteFileA,-1)
-FF(ReadFile,-1)
-FF(WriteFile,-1)
-FF(SetFilePointer,-1)
-FF(GetTempFileNameA,-1)
-FF(CreateFileA,-1)
-FF(GetSystemDirectoryA,-1)
-FF(GetWindowsDirectoryA,-1)
-FF(SetErrorMode, -1)
-FF(IsProcessorFeaturePresent, -1)
-FF(GetProcessAffinityMask, -1)
-FF(InterlockedExchange, -1)
-FF(MulDiv, -1)
-FF(lstrcmpiA, -1)
-FF(lstrlenA, -1)
-FF(lstrcpyA, -1)
-FF(lstrcatA, -1)
-FF(lstrcpynA,-1)
-FF(GetProcessVersion,-1)
-FF(GetCurrentThread,-1)
-FF(GetOEMCP,-1)
-FF(GetCPInfo,-1)
-FF(DuplicateHandle,-1)
-FF(SetThreadAffinityMask,-1)
+    {#X, Y, (void*)exp##X},
+
+struct exports exp_kernel32[]=
+{
+    FF(IsBadWritePtr, 357)
+    FF(IsBadReadPtr, 354)
+    FF(IsBadStringPtrW, -1)
+    FF(IsBadStringPtrA, -1)
+    FF(DisableThreadLibraryCalls, -1)
+    FF(CreateThread, -1)
+    FF(CreateEventA, -1)
+    FF(SetEvent, -1)
+    FF(ResetEvent, -1)
+    FF(WaitForSingleObject, -1)
+    FF(GetSystemInfo, -1)
+    FF(GetVersion, 332)
+    FF(HeapCreate, 461)
+    FF(HeapAlloc, -1)
+    FF(HeapDestroy, -1)
+    FF(HeapFree, -1)
+    FF(HeapSize, -1)
+    FF(HeapReAlloc,-1)
+    FF(GetProcessHeap, -1)
+    FF(VirtualAlloc, -1)
+    FF(VirtualFree, -1)
+    FF(InitializeCriticalSection, -1)
+    FF(EnterCriticalSection, -1)
+    FF(LeaveCriticalSection, -1)
+    FF(DeleteCriticalSection, -1)
+    FF(TlsAlloc, -1)
+    FF(TlsFree, -1)
+    FF(TlsGetValue, -1)
+    FF(TlsSetValue, -1)
+    FF(GetCurrentThreadId, -1)
+    FF(GetCurrentProcess, -1)
+    FF(LocalAlloc, -1)
+    FF(LocalReAlloc,-1)
+    FF(LocalLock, -1)
+    FF(GlobalAlloc, -1)
+    FF(GlobalReAlloc, -1)
+    FF(GlobalLock, -1)
+    FF(GlobalSize, -1)
+    FF(MultiByteToWideChar, 427)
+    FF(WideCharToMultiByte, -1)
+    FF(GetVersionExA, -1)
+    FF(CreateSemaphoreA, -1)
+    FF(QueryPerformanceCounter, -1)
+    FF(QueryPerformanceFrequency, -1)
+    FF(LocalHandle, -1)
+    FF(LocalUnlock, -1)
+    FF(LocalFree, -1)
+    FF(GlobalHandle, -1)
+    FF(GlobalUnlock, -1)
+    FF(GlobalFree, -1)
+    FF(LoadResource, -1)
+    FF(ReleaseSemaphore, -1)
+    FF(FindResourceA, -1)
+    FF(LockResource, -1)
+    FF(FreeResource, -1)
+    FF(SizeofResource, -1)
+    FF(CloseHandle, -1)
+    FF(GetCommandLineA, -1)
+    FF(GetEnvironmentStringsW, -1)
+    FF(FreeEnvironmentStringsW, -1)
+    FF(FreeEnvironmentStringsA, -1)
+    FF(GetEnvironmentStrings, -1)
+    FF(GetStartupInfoA, -1)
+    FF(GetStdHandle, -1)
+    FF(GetFileType, -1)
+    FF(SetHandleCount, -1)
+    FF(GetACP, -1)
+    FF(GetModuleFileNameA, -1)
+    FF(SetUnhandledExceptionFilter, -1)
+    FF(LoadLibraryA, -1)
+    FF(GetProcAddress, -1)
+    FF(FreeLibrary, -1)
+    FF(CreateFileMappingA, -1)
+    FF(OpenFileMappingA, -1)
+    FF(MapViewOfFile, -1)
+    FF(UnmapViewOfFile, -1)
+    FF(Sleep, -1)
+    FF(GetModuleHandleA, -1)
+    FF(GetProfileIntA, -1)
+    FF(GetPrivateProfileIntA, -1)
+    FF(GetPrivateProfileStringA, -1)
+    FF(WritePrivateProfileStringA, -1)
+    FF(GetLastError, -1)
+    FF(SetLastError, -1)
+    FF(InterlockedIncrement, -1)
+    FF(InterlockedDecrement, -1)
+    FF(GetTimeZoneInformation, -1)
+    FF(OutputDebugStringA, -1)
+    FF(GetLocalTime, -1)
+    FF(GetSystemTime, -1)
+    FF(GetEnvironmentVariableA, -1)
+    FF(RtlZeroMemory,-1)
+    FF(RtlMoveMemory,-1)
+    FF(RtlFillMemory,-1)
+    FF(GetTempPathA,-1)
+    FF(FindFirstFileA,-1)
+    FF(FindNextFileA,-1)
+    FF(FindClose,-1)
+    FF(FileTimeToLocalFileTime,-1)
+    FF(DeleteFileA,-1)
+    FF(ReadFile,-1)
+    FF(WriteFile,-1)
+    FF(SetFilePointer,-1)
+    FF(GetTempFileNameA,-1)
+    FF(CreateFileA,-1)
+    FF(GetSystemDirectoryA,-1)
+    FF(GetWindowsDirectoryA,-1)
+    FF(SetErrorMode, -1)
+    FF(IsProcessorFeaturePresent, -1)
+    FF(GetProcessAffinityMask, -1)
+    FF(InterlockedExchange, -1)
+    FF(MulDiv, -1)
+    FF(lstrcmpiA, -1)
+    FF(lstrlenA, -1)
+    FF(lstrcpyA, -1)
+    FF(lstrcatA, -1)
+    FF(lstrcpynA,-1)
+    FF(GetProcessVersion,-1)
+    FF(GetCurrentThread,-1)
+    FF(GetOEMCP,-1)
+    FF(GetCPInfo,-1)
+    FF(DuplicateHandle,-1)
+    FF(GetTickCount, -1)
+    FF(SetThreadAffinityMask,-1)
 };
 
 struct exports exp_msvcrt[]={
-FF(malloc, -1)
-FF(_initterm, -1)
-FF(free, -1)
-{"??3@YAXPAX@Z", -1, expdelete},
-{"??2@YAPAXI@Z", -1, expnew},
-{"_adjust_fdiv", -1, (void*)&_adjust_fdiv},
-FF(strrchr, -1)
-FF(strchr, -1)
-FF(strlen, -1)
-FF(strcpy, -1)
-FF(strcmp, -1)
-FF(strncmp, -1)
-FF(strcat, -1)
-FF(_stricmp,-1)
-FF(isalnum, -1)
-FF(memmove, -1)
-FF(memcmp, -1)
-FF(time, -1)
-FF(_ftol,-1)
-FF(rand, -1)
-FF(log10, -1)
-FF(pow, -1)
-FF(cos, -1)
-FF(srand, -1)
-FF(sprintf,-1)
-FF(sscanf,-1)
-FF(fopen,-1)
-FF(fprintf,-1)
-FF(printf,-1)
+    FF(malloc, -1)
+    FF(_initterm, -1)
+    FF(free, -1)
+    {"??3@YAXPAX@Z", -1, expdelete},
+    {"??2@YAPAXI@Z", -1, expnew},
+    {"_adjust_fdiv", -1, (void*)&_adjust_fdiv},
+    FF(strrchr, -1)
+    FF(strchr, -1)
+    FF(strlen, -1)
+    FF(strcpy, -1)
+    FF(wcscpy, -1)
+    FF(strcmp, -1)
+    FF(strncmp, -1)
+    FF(strcat, -1)
+    FF(_stricmp,-1)
+    FF(_strdup,-1)
+    FF(_setjmp3,-1)
+    FF(isalnum, -1)
+    FF(memmove, -1)
+    FF(memcmp, -1)
+    FF(time, -1)
+    FF(rand, -1)
+    FF(srand, -1)
+    FF(log10, -1)
+    FF(pow, -1)
+    FF(cos, -1)
+    FF(_ftol,-1)
+    FF(sprintf,-1)
+    FF(sscanf,-1)
+    FF(fopen,-1)
+    FF(fprintf,-1)
+    FF(printf,-1)
+    FF(getenv,-1)
 };
 struct exports exp_winmm[]={
-FF(GetDriverModuleHandle, -1)
-FF(timeGetTime, -1)
-FF(DefDriverProc, -1)
-FF(OpenDriverA, -1)
-FF(OpenDriver, -1)
+    FF(GetDriverModuleHandle, -1)
+    FF(timeGetTime, -1)
+    FF(DefDriverProc, -1)
+    FF(OpenDriverA, -1)
+    FF(OpenDriver, -1)
 };
 struct exports exp_user32[]={
-FF(LoadStringA, -1)
-FF(wsprintfA, -1)
-FF(GetDC, -1)
-FF(GetDesktopWindow, -1)
-FF(ReleaseDC, -1)
-FF(IsRectEmpty, -1)
-FF(LoadCursorA,-1)
-FF(SetCursor,-1)
-FF(GetCursorPos,-1)
-FF(GetCursorPos,-1)
-FF(RegisterWindowMessageA,-1)
-FF(GetSystemMetrics,-1)
-FF(GetSysColor,-1)
-FF(GetSysColorBrush,-1)
-FF(GetWindowDC, -1)
+    FF(LoadStringA, -1)
+    FF(wsprintfA, -1)
+    FF(GetDC, -1)
+    FF(GetDesktopWindow, -1)
+    FF(ReleaseDC, -1)
+    FF(IsRectEmpty, -1)
+    FF(LoadCursorA,-1)
+    FF(SetCursor,-1)
+    FF(GetCursorPos,-1)
+    FF(GetCursorPos,-1)
+    FF(RegisterWindowMessageA,-1)
+    FF(GetSystemMetrics,-1)
+    FF(GetSysColor,-1)
+    FF(GetSysColorBrush,-1)
+    FF(GetWindowDC, -1)
+    FF(DrawTextA, -1)
 };
 struct exports exp_advapi32[]={
-FF(RegOpenKeyA, -1)
-FF(RegOpenKeyExA, -1)
-FF(RegCreateKeyExA, -1)
-FF(RegQueryValueExA, -1)
-FF(RegSetValueExA, -1)
-FF(RegCloseKey, -1)
-FF(RegEnumValueA, -1)
+    FF(RegCloseKey, -1)
+    FF(RegCreateKeyExA, -1)
+    FF(RegEnumKeyExA, -1)
+    FF(RegEnumValueA, -1)
+    FF(RegOpenKeyA, -1)
+    FF(RegOpenKeyExA, -1)
+    FF(RegQueryValueExA, -1)
+    FF(RegSetValueExA, -1)
 };
 struct exports exp_gdi32[]={
-FF(CreateCompatibleDC, -1)
-FF(GetDeviceCaps, -1)
-FF(DeleteDC, -1)
-FF(GetSystemPaletteEntries, -1)
-FF(CreateFontA, -1)
+    FF(CreateCompatibleDC, -1)
+    FF(CreateFontA, -1)
+    FF(DeleteDC, -1)
+    FF(DeleteObject, -1)
+    FF(GetDeviceCaps, -1)
+    FF(GetSystemPaletteEntries, -1)
 };
 struct exports exp_version[]={
-FF(GetFileVersionInfoSizeA, -1)
+    FF(GetFileVersionInfoSizeA, -1)
 };
 struct exports exp_ole32[]={
-FF(CoTaskMemAlloc, -1)
-FF(CoTaskMemFree, -1)
-FF(CoCreateInstance, -1)
-FF(StringFromGUID2, -1)
-FF(CoCreateFreeThreadedMarshaler,-1)
-FF(CoInitialize, -1)
+    FF(CoCreateFreeThreadedMarshaler,-1)
+    FF(CoCreateInstance, -1)
+    FF(CoInitialize, -1)
+    FF(CoTaskMemAlloc, -1)
+    FF(CoTaskMemFree, -1)
+    FF(StringFromGUID2, -1)
 };
+// do we really need crtdll ???
+// msvcrt is the correct place probably...
 struct exports exp_crtdll[]={
-FF(memcpy, -1)
-FF(wcscpy, -1)
+    FF(memcpy, -1)
+    FF(wcscpy, -1)
 };
 struct exports exp_comctl32[]={
-FF(StringFromGUID2, -1)
-FF(InitCommonControls, 17)
+    FF(StringFromGUID2, -1)
+    FF(InitCommonControls, 17)
 };
+
+struct exports exp_msdmo[]={
+    FF(memcpy, -1) // just test
+};
+
 #define LL(X) \
-{#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X},
+    {#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X},
 
 struct libs libraries[]={
-LL(kernel32)
-LL(msvcrt)
-LL(winmm)
-LL(user32)
-LL(advapi32)
-LL(gdi32)
-LL(version)
-LL(ole32)
-LL(crtdll)
-LL(comctl32)
+    LL(kernel32)
+    LL(msvcrt)
+    LL(winmm)
+    LL(user32)
+    LL(advapi32)
+    LL(gdi32)
+    LL(version)
+    LL(ole32)
+    LL(crtdll)
+    LL(comctl32)
+    LL(msdmo)
 };
 
+static char* called_unk = "Called unk_%s\n";
+static void ext_stubs(void)
+{
+    // expects:
+    //  ax  position index
+    //  cx  address of printf function
+    __asm__ __volatile__
+	(
+         "push %edx             \n\t"
+	 "movl $0, %eax		\n\t"
+	 "movl $0, %edx		\n\t"
+	 "shl $5,%eax		\n\t"			// ax * 32
+	 "addl $export_names,%eax \n\t"
+	 "pushl %eax		\n\t"
+	 "pushl called_unk	\n\t"
+	 "call *%edx		\n\t"                   // printf (via dx)
+	 "addl $8,%esp		\n\t"
+	 "xorl %eax,%eax	\n\t"
+         "pop %edx             \n\t"
+	);
+}
+
+//static void add_stub(int pos)
+
+extern int unk_exp1;
+static char extcode[20000];// place for 200 unresolved exports
+static int pos=0;
+
+static void* add_stub()
+{
+    char* answ = (char*)extcode+pos*0x30;
+#if 0
+    memcpy(answ, &unk_exp1, 0x64);
+    *(int*)(answ+9)=pos;
+    *(int*)(answ+47)-=((int)answ-(int)&unk_exp1);
+#endif
+    memcpy(answ, ext_stubs, 0x2f); // 0x2c is current size
+    //answ[0] = 0xb8; // movl $0, eax  (0xb8 0x00000000)
+    *((int*) (answ + 5)) = pos;
+    //answ[5] = 0xb9; // movl $0, edx  (0xb9 0x00000000)
+    *((int*) (answ + 10)) = (int) printf;
+    pos++;
+    return (void*)answ;
+}
 
 void* LookupExternal(const char* library, int ordinal)
 {
-    char* answ;
     int i,j;
     if(library==0)
     {
 	printf("ERROR: library=0\n");
 	return (void*)ext_unknown;
     }
-//    printf("%x %x\n", &unk_exp1, &unk_exp2);
+    //    printf("%x %x\n", &unk_exp1, &unk_exp2);
 
     for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++)
     {
@@ -3532,20 +3793,15 @@
     }
     printf("External func %s:%d\n", library, ordinal);
     if(pos>150)return 0;
-    answ=(char*)extcode+pos*0x64;
-    memcpy(answ, &unk_exp1, 0x64);
-    *(int*)(answ+9)=pos;
-    *(int*)(answ+47)-=((int)answ-(int)&unk_exp1);
     sprintf(export_names[pos], "%s:%d", library, ordinal);
-    pos++;
-    return (void*)answ;
+    return add_stub(pos);
 }
 
 void* LookupExternalByName(const char* library, const char* name)
 {
     char* answ;
     int i,j;
-//   return (void*)ext_unknown;
+    //   return (void*)ext_unknown;
     if(library==0)
     {
 	printf("ERROR: library=0\n");
@@ -3565,24 +3821,13 @@
 	{
 	    if(strcmp(name, libraries[i].exps[j].name))
 		continue;
-//	    printf("Hit: 0x%08X\n", libraries[i].exps[j].func);
+	    //	    printf("Hit: 0x%08X\n", libraries[i].exps[j].func);
 	    return libraries[i].exps[j].func;
 	}
     }
-//    printf("%s %s\n", library, name);
-    if(pos>150)return 0;
+    if(pos>150)return 0;// to many symbols
     strcpy(export_names[pos], name);
-    answ=(char*)extcode+pos*0x64;
-    memcpy(answ, &unk_exp1, 0x64);
-    *(int*)(answ+9)=pos;
-    *(int*)(answ+47)-=((int)answ-(int)&unk_exp1);
-    pos++;
-    return (void*)answ;
-//    memcpy(extcode, &unk_exp1, 0x64);
-//    *(int*)(extcode+52)-=((int)extcode-(int)&unk_exp1);
-//    return (void*)extcode;
-//    printf("Unknown func %s:%s\n", library, name);
-//    return (void*)ext_unknown;
+    return add_stub(pos);
 }
 
 void my_garbagecollection(void)
@@ -3595,7 +3840,7 @@
     {
 	alloc_header* mem = last_alloc + 1;
 	unfree += my_size(mem);
-        unfreecnt++;
+	unfreecnt++;
 	my_release(mem);
     }
     printf("Total Unfree %d bytes cnt %d [%p,%d]\n",unfree, unfreecnt, last_alloc, alccnt);