Index: loader/win32.c =================================================================== --- loader/win32.c.orig 2007-03-03 23:15:46.000000000 -0800 +++ loader/win32.c 2007-03-03 23:16:14.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")==0) + 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) { @@ -1807,6 +1829,33 @@ " Platform Id: VER_PLATFORM_WIN32_NT\n Version string: 'Service Pack 3'\n"); return 1; } + +static long WINAPI expGetVersionExW(OSVERSIONINFOW* c) +{ + char CSDVersion[128]; + 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(CSDVersion, " B"); +#else + c->dwPlatformId=VER_PLATFORM_WIN32_NT; // let's not make DLL assume that it can read CR* registers + strcpy(CSDVersion, "Service Pack 3"); +#endif + MultiByteToWideChar(65001, 0x0, CSDVersion, -1, c->szCSDVersion, 128); + dbgprintf(" Major version: %d\n Minor version: %d\n Build number: 0x%08x\n" + " Platform Id: %s\n Version string: '%s'\n", + c->dwMajorVersion, c->dwMinorVersion, c->dwBuildNumber, + (c->dwPlatformId==VER_PLATFORM_WIN32_WINDOWS ? "VER_PLATFORM_WIN32_WINDOWS" : + (c->dwPlatformId==VER_PLATFORM_WIN32_NT ? "VER_PLATFORM_WIN32_NT" : "Unknown")), + CSDVersion); + return 1; +} + static HANDLE WINAPI expCreateSemaphoreA(char* v1, long init_count, long max_count, char* name) { @@ -2449,6 +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); @@ -2491,6 +2546,12 @@ 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); } @@ -4856,6 +4917,17 @@ 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 1; +} + static double expfloor(double x) { dbgprintf("floor(%lf)\n", x); @@ -4931,6 +5003,9 @@ #define FF(X,Y) \ {#X, Y, (void*)exp##X}, +#define REMAP(X,Y,Z) \ + {#X, Y, (void*)exp##Z}, + 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,9 @@ {"LoadLibraryExA", -1, (void*)&LoadLibraryExA}, FF(SetThreadIdealProcessor,-1) FF(SetProcessAffinityMask, -1) + FF(VirtualProtect, -1) + FF(EncodePointer,-1) + FF(DecodePointer,-1) }; struct exports exp_msvcrt[]={ @@ -5172,6 +5251,7 @@ struct exports exp_user32[]={ FF(LoadIconA,-1) FF(LoadStringA, -1) + REMAP(LoadStringW, -1 LoadStringA) FF(wsprintfA, -1) FF(GetDC, -1) FF(GetDesktopWindow, -1) @@ -5216,6 +5296,7 @@ FF(RegisterClipboardFormatA, -1) FF(CharNextA, -1) FF(EnumDisplaySettingsA, -1) + FF(SetRect, -1) }; struct exports exp_advapi32[]={ FF(RegCloseKey, -1)