Index: loader/win32.c =================================================================== --- loader/win32.c.orig 2007-02-15 11:41:42.000000000 -0800 +++ loader/win32.c 2007-02-15 11:44:20.000000000 -0800 @@ -579,6 +579,9 @@ #define MODULE_HANDLE_msvcrt ((HMODULE)0x126) #define MODULE_HANDLE_ole32 ((HMODULE)0x127) #define MODULE_HANDLE_winmm ((HMODULE)0x128) +#define MODULE_HANDLE_version ((HMODULE)0x129) +#define MODULE_HANDLE_gdi32 ((HMODULE)0x130) +#define MODULE_HANDLE_oleaut32 ((HMODULE)0x131) static HMODULE WINAPI expGetModuleHandleA(const char* name) { @@ -605,11 +608,20 @@ if(name && strcasecmp(name, "user32")==0) result=MODULE_HANDLE_user32; #endif + if(name && strcasecmp(name, "oleaut32")==0 || !strcasecmp(name, "oleaut32.dll")) + result=MODULE_HANDLE_oleaut32; } dbgprintf("GetModuleHandleA('%s') => 0x%x\n", name, result); return result; } +static int WINAPI expVirtualProtect(void *ptr, int size, int prot, int *oldprot) +{ + dbgprintf("VirtualProtect(%x, %d, %d, %x)\n", ptr, size, prot, oldprot); + *oldprot = prot; + return 1; +} + static void* WINAPI expCreateThread(void* pSecAttr, long dwStackSize, void* lpStartAddress, void* lpParameter, long dwFlags, long* dwThreadId) @@ -1536,6 +1548,16 @@ return -1; } +static void * WINAPI expEncodePointer(void *value) +{ + return (void *)((long)value ^ getpid()); +} + +static void * WINAPI expDecodePointer(void *value) +{ + return (void *)((long)value ^ getpid()); +} + //static int WINAPI expTlsSetValue(DWORD index, void* value) static int WINAPI expTlsSetValue(int index, void* value) { @@ -1741,6 +1763,11 @@ return result; } +static int WINAPI expLoadStringW(long instance, long id, void* buf, long size) +{ + return expLoadStringA(instance, id, buf, size); +} + static long WINAPI expMultiByteToWideChar(long v1, long v2, char* s1, long siz1, short* s2, int siz2) { #warning FIXME @@ -1807,6 +1834,27 @@ " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); return 1; } + +static long WINAPI expGetVersionExW(OSVERSIONINFOW* c) +{ + dbgprintf("GetVersionExW(0x%x) => 1\n"); + c->dwOSVersionInfoSize=sizeof(*c); + c->dwMajorVersion=5; + c->dwMinorVersion=0; + c->dwBuildNumber=0x5000457; +#if 1 + // leave it here for testing win9x-only codecs + c->dwPlatformId=VER_PLATFORM_WIN32_WINDOWS; + strcpy(c->szCSDVersion, " B"); +#else + c->dwPlatformId=VER_PLATFORM_WIN32_NT; // let's not make DLL assume that it can read CR* registers + strcpy(c->szCSDVersion, "Service Pack 3"); +#endif + dbgprintf(" Major version: 5\n Minor version: 0\n Build number: 0x5000457\n" + " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); + return 1; +} + static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name) { @@ -2449,6 +2497,12 @@ return MODULE_HANDLE_ole32; if (strcasecmp(name, "winmm.dll") == 0 || strcasecmp(name, "winmm") == 0) return MODULE_HANDLE_winmm; + if (strcasecmp(name, "version.dll") == 0 || strcasecmp(name, "version") == 0) + return MODULE_HANDLE_version; + if (strcasecmp(name, "gdi32.dll") == 0 || strcasecmp(name, "gdi32") == 0) + return MODULE_HANDLE_gdi32; + if (strcasecmp(name, "oleaut32.dll") == 0 || strcasecmp(name, "oleaut32") == 0) + return MODULE_HANDLE_oleaut32; result=LoadLibraryA(name); dbgprintf("Returned LoadLibraryA(0x%x='%s'), def_path=%s => 0x%x\n", name, name, def_path, result); @@ -2491,10 +2545,19 @@ result=LookupExternalByName("ole32.dll", name); break; case MODULE_HANDLE_winmm: result=LookupExternalByName("winmm.dll", name); break; + case MODULE_HANDLE_version: + result=LookupExternalByName("version.dll", name); break; + case MODULE_HANDLE_gdi32: + result=LookupExternalByName("gdi32.dll", name); break; + case MODULE_HANDLE_oleaut32: + result=LookupExternalByName("oleaut32.dll", name); break; default: result=GetProcAddress(mod, name); } - dbgprintf("GetProcAddress(0x%x, '%s') => 0x%x\n", mod, name, result); + if((unsigned int)name > 0xffff) + dbgprintf("GetProcAddress(0x%x, '%s') => 0x%x\n", mod, name, result); + else + dbgprintf("GetProcAddress(0x%x, '%d') => 0x%x\n", mod, (int)name, result); return result; } @@ -4856,6 +4919,16 @@ return name; } +static WIN_BOOL WINAPI expSetRect(LPRECT rect, int left, int top, + int right, int bottom) { + rect->left = left; + rect->top = top; + rect->right = right; + rect->bottom = bottom; + dbgprintf("SetRect(0x%x (%d,%d)-(%d,%d) => 0\n", rect, left, top, right, bottom); + return 0; +} + static double expfloor(double x) { dbgprintf("floor(%lf)\n", x); @@ -4931,6 +5004,8 @@ #define FF(X,Y) \ {#X, Y, (void*)exp##X}, +#define UNDEFF(X, Y) \ + {#X, Y, -1}, struct exports exp_kernel32[]= { FF(GetVolumeInformationA,-1) @@ -4983,6 +5058,7 @@ FF(MultiByteToWideChar, 427) FF(WideCharToMultiByte, -1) FF(GetVersionExA, -1) + FF(GetVersionExW, -1) FF(CreateSemaphoreA, -1) FF(QueryPerformanceCounter, -1) FF(QueryPerformanceFrequency, -1) @@ -5088,6 +5164,13 @@ {"LoadLibraryExA", -1, (void*)&LoadLibraryExA}, FF(SetThreadIdealProcessor,-1) FF(SetProcessAffinityMask, -1) + FF(VirtualProtect, -1) + FF(EncodePointer,-1) + FF(DecodePointer,-1) + UNDEFF(FlsAlloc, -1) + UNDEFF(FlsGetValue, -1) + UNDEFF(FlsSetValue, -1) + UNDEFF(FlsFree, -1) }; struct exports exp_msvcrt[]={ @@ -5172,6 +5255,7 @@ struct exports exp_user32[]={ FF(LoadIconA,-1) FF(LoadStringA, -1) + FF(LoadStringW, -1) FF(wsprintfA, -1) FF(GetDC, -1) FF(GetDesktopWindow, -1) @@ -5216,6 +5300,7 @@ FF(RegisterClipboardFormatA, -1) FF(CharNextA, -1) FF(EnumDisplaySettingsA, -1) + FF(SetRect, -1) }; struct exports exp_advapi32[]={ FF(RegCloseKey, -1) @@ -5485,10 +5570,9 @@ printf("ERROR: library=0\n"); return (void*)ext_unknown; } - if(name==0) + if((unsigned int)name<=0xffff) { - printf("ERROR: name=0\n"); - return (void*)ext_unknown; + return LookupExternal(library, (int)name); } dbgprintf("External func %s:%s\n", library, name); for(i=0; i