Index: loader/win32.c =================================================================== --- loader/win32.c.orig 2007-02-08 10:59:41.000000000 -0800 +++ loader/win32.c 2007-02-08 12:02:00.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) @@ -1561,6 +1573,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) { @@ -1766,6 +1788,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 @@ -1832,6 +1859,25 @@ " 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) { @@ -2452,7 +2498,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); @@ -2494,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; } @@ -4933,6 +4933,8 @@ #define FF(X,Y) \ {#X, Y, (void*)exp##X}, +#define UNDEFF(X, Y) \ + {#X, Y, -1}, struct exports exp_kernel32[]= { FF(GetVolumeInformationA,-1) @@ -4985,6 +5045,7 @@ FF(MultiByteToWideChar, 427) FF(WideCharToMultiByte, -1) FF(GetVersionExA, -1) + FF(GetVersionExW, -1) FF(CreateSemaphoreA, -1) FF(QueryPerformanceCounter, -1) FF(QueryPerformanceFrequency, -1) @@ -5090,6 +5151,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[]={ @@ -5174,6 +5242,7 @@ struct exports exp_user32[]={ FF(LoadIconA,-1) FF(LoadStringA, -1) + FF(LoadStringW, -1) FF(wsprintfA, -1) FF(GetDC, -1) FF(GetDesktopWindow, -1)