1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #define _UWINAPI_ 29 #include <systools/win32/uwinapi.h> 30 31 #ifndef _INC_MALLOC 32 # include <malloc.h> 33 #endif 34 35 #if defined(_MSC_VER) && (_MSC_VER >= 1400) 36 #pragma warning(disable:4740) 37 #endif 38 39 #ifndef _INC_TCHAR 40 # ifdef UNICODE 41 # define _UNICODE 42 # endif 43 # include <TCHAR.H> 44 #endif 45 46 // Globally disable "warning C4100: unreferenced formal parameter" caused by 47 // IMPLEMENT_THUNK: 48 #ifdef _MSC_VER 49 #pragma warning(disable:4100) 50 #endif 51 52 /* Version macros */ 53 54 #define MAKE_VER_WIN32( major, minor, build, isWindows ) \ 55 ((DWORD)MAKELONG( MAKEWORD( major, minor ), (build) | ( isWindows ? 0x8000 : 0 ) )) 56 57 #define MAKE_VER_WIN32_NT( major, minor, build ) \ 58 MAKE_VER_WIN32( major, minor, build, FALSE ) 59 60 #define MAKE_VER_WIN32_WINDOWS( major, minor, build ) \ 61 MAKE_VER_WIN32( major, minor, build, TRUE ) 62 63 #define VER_WIN32_WINDOWS_95 MAKE_VER_WIN32_WINDOWS( 4, 0, 0 ) 64 #define VER_WIN32_WINDOWS_98 MAKE_VER_WIN32_WINDOWS( 4, 10, 0 ) 65 #define VER_WIN32_WINDOWS_ME MAKE_VER_WIN32_WINDOWS( 4, 90, 0 ) 66 #define VER_WIN32_NT_NT4 MAKE_VER_WIN32_NT( 4, 0, 0 ) 67 #define VER_WIN32_NT_2000 MAKE_VER_WIN32_NT( 5, 0, 0 ) 68 #define VER_WIN32_NT_XP MAKE_VER_WIN32_NT( 5, 1, 0 ) 69 70 71 #ifdef __cplusplus 72 73 #define _AUTO_WSTR2STR( lpStrA, lpStrW ) \ 74 LPSTR lpStrA; \ 75 if ( lpStrW ) \ 76 { \ 77 int cNeeded = WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, NULL, 0, NULL, NULL ); \ 78 lpStrA = (LPSTR)_alloca( cNeeded * sizeof(CHAR) ); \ 79 WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, lpStrA, cNeeded, NULL, NULL ); \ 80 } \ 81 else \ 82 lpStrA = NULL; 83 84 85 #define AUTO_WSTR2STR( lpStr ) \ 86 _AUTO_WSTR2STR( lpStr##A, lpStr##W ) 87 88 #define AUTO_STR( lpStr, cchBuffer ) \ 89 LPSTR lpStr##A = lpStr##W ? (LPSTR)_alloca( (cchBuffer) * sizeof(CHAR) ) : NULL; 90 91 #endif /* __cplusplus */ 92 93 94 #define STRBUF2WSTR( lpStr, cchSrcBuffer, cchDestBuffer ) \ 95 MultiByteToWideChar( CP_ACP, 0, lpStr##A, cchSrcBuffer, lpStr##W, (int) cchDestBuffer ) 96 97 #define STR2WSTR( lpStr, cchBuffer ) \ 98 STRBUF2WSTR( lpStr, -1, cchBuffer ) 99 100 #define WSTR2STR( lpStr, cchBuffer ) \ 101 WideCharToMultiByte( CP_ACP, 0, lpStr##W, -1, lpStr##A, cchBuffer, NULL, NULL ) 102 103 EXTERN_C void WINAPI ResolveThunk_WINDOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure ); 104 EXTERN_C void WINAPI ResolveThunk_TRYLOAD( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure ); 105 EXTERN_C void WINAPI ResolveThunk_ALLWAYS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure ); 106 107 108 109 110 #ifdef __MINGW32__ 111 #define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \ 112 static void func##_Thunk(); \ 113 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ 114 EXTERN_C rettype calltype func params \ 115 { \ 116 asm(" popl %ebp"); \ 117 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 118 } \ 119 EXTERN_C rettype calltype func##_##resolve params; \ 120 static rettype calltype func##_##Failure params; \ 121 static void func##_Thunk() \ 122 { \ 123 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \ 124 asm(" movl %ebp, %esp"); \ 125 asm(" popl %ebp"); \ 126 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 127 } \ 128 static rettype calltype func##_##Failure params \ 129 { \ 130 SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \ 131 return (rettype)0; \ 132 } \ 133 EXTERN_C rettype calltype func##_##resolve params 134 #else 135 #define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \ 136 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \ 137 EXTERN_C rettype calltype func##_##resolve params; \ 138 static rettype calltype func##_##Failure params; \ 139 static _declspec ( naked ) void func##_Thunk() \ 140 { \ 141 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \ 142 _asm jmp [module##_##func##_Ptr] \ 143 } \ 144 EXTERN_C _declspec( naked ) rettype calltype func params \ 145 { \ 146 _asm jmp [module##_##func##_Ptr] \ 147 } \ 148 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ 149 static rettype calltype func##_##Failure params \ 150 { \ 151 SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \ 152 return (rettype)0; \ 153 } \ 154 EXTERN_C rettype calltype func##_##resolve params 155 #endif 156 157 158 159 #ifdef __MINGW32__ 160 #define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \ 161 static void func##_Thunk(); \ 162 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ 163 static void func##_Thunk() \ 164 { \ 165 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \ 166 asm(" movl %ebp, %esp"); \ 167 asm(" popl %ebp"); \ 168 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 169 } \ 170 EXTERN_C rettype calltype func params \ 171 { \ 172 asm(" popl %ebp"); \ 173 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 174 } 175 #else 176 #define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \ 177 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \ 178 static _declspec ( naked ) void func##_Thunk() \ 179 { \ 180 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \ 181 _asm jmp [module##_##func##_Ptr] \ 182 } \ 183 EXTERN_C _declspec( naked ) rettype calltype func params \ 184 { \ 185 _asm jmp [module##_##func##_Ptr] \ 186 } \ 187 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; 188 #endif 189 190 191 #ifdef __MINGW32__ 192 #define DEFINE_DEFAULT_THUNK( module, resolve, rettype, calltype, func, params ) \ 193 static void func##_Thunk(); \ 194 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ 195 static rettype calltype func##_##Failure params; \ 196 static _declspec ( naked ) void func##_Thunk() \ 197 { \ 198 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, NULL, (FARPROC)func##_##Failure ); \ 199 asm(" movl %ebp, %esp"); \ 200 asm(" popl %ebp"); \ 201 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 202 } \ 203 EXTERN_C _declspec( naked ) rettype calltype func params \ 204 { \ 205 asm(" popl %ebp"); \ 206 asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \ 207 } \ 208 static rettype calltype func##_##Failure params \ 209 { \ 210 SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \ 211 return (rettype)0; \ 212 } 213 #else 214 #define DEFINE_DEFAULT_THUNK( module, resolve, rettype, calltype, func, params ) \ 215 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \ 216 static rettype calltype func##_##Failure params; \ 217 static _declspec ( naked ) void func##_Thunk() \ 218 { \ 219 ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, NULL, (FARPROC)func##_##Failure ); \ 220 _asm jmp [module##_##func##_Ptr] \ 221 } \ 222 EXTERN_C _declspec( naked ) rettype calltype func params \ 223 { \ 224 _asm jmp [module##_##func##_Ptr] \ 225 } \ 226 EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ 227 static rettype calltype func##_##Failure params \ 228 { \ 229 SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \ 230 return (rettype)0; \ 231 } 232 #endif 233