xref: /trunk/main/sal/systools/win32/uwinapi/Uwinapi.h (revision 5d328669834268fa077da8fd0d9b44cc5ce2793b)
1cdf0e10cSrcweir #pragma once
2*5b501c92SAndrew Rist // *************************************************************
3*5b501c92SAndrew Rist //
4*5b501c92SAndrew Rist //  Licensed to the Apache Software Foundation (ASF) under one
5*5b501c92SAndrew Rist //  or more contributor license agreements.  See the NOTICE file
6*5b501c92SAndrew Rist //  distributed with this work for additional information
7*5b501c92SAndrew Rist //  regarding copyright ownership.  The ASF licenses this file
8*5b501c92SAndrew Rist //  to you under the Apache License, Version 2.0 (the
9*5b501c92SAndrew Rist //  "License"); you may not use this file except in compliance
10*5b501c92SAndrew Rist //  with the License.  You may obtain a copy of the License at
11*5b501c92SAndrew Rist //
12*5b501c92SAndrew Rist //    http://www.apache.org/licenses/LICENSE-2.0
13*5b501c92SAndrew Rist //
14*5b501c92SAndrew Rist //  Unless required by applicable law or agreed to in writing,
15*5b501c92SAndrew Rist //  software distributed under the License is distributed on an
16*5b501c92SAndrew Rist //  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17*5b501c92SAndrew Rist //  KIND, either express or implied.  See the License for the
18*5b501c92SAndrew Rist //  specific language governing permissions and limitations
19*5b501c92SAndrew Rist //  under the License.
20*5b501c92SAndrew Rist //
21*5b501c92SAndrew Rist // *************************************************************
22cdf0e10cSrcweir 
23cdf0e10cSrcweir #ifdef _UWINAPI_
24cdf0e10cSrcweir #define _KERNEL32_
25cdf0e10cSrcweir #define _USER32_
26cdf0e10cSrcweir #define _SHELL32_
27cdf0e10cSrcweir #endif
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <windows.h>
30cdf0e10cSrcweir #include <malloc.h>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #ifndef _UWINAPI_
33cdf0e10cSrcweir EXTERN_C WINBASEAPI DWORD UWINAPI_dwFakedVersion;
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir EXTERN_C WINBASEAPI DWORD SetVersion( DWORD dwVersion );
37cdf0e10cSrcweir 
38cdf0e10cSrcweir /* Version macros */
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #define MAKE_VER_WIN32( major, minor, build, isWindows ) \
41cdf0e10cSrcweir ((DWORD)MAKELONG( MAKEWORD( major, minor ), (build) | ( isWindows ? 0x8000 : 0 ) ))
42cdf0e10cSrcweir 
43cdf0e10cSrcweir #define MAKE_VER_WIN32_NT( major, minor, build ) \
44cdf0e10cSrcweir     MAKE_VER_WIN32( major, minor, build, FALSE )
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #define MAKE_VER_WIN32_WINDOWS( major, minor, build ) \
47cdf0e10cSrcweir     MAKE_VER_WIN32( major, minor, build, TRUE )
48cdf0e10cSrcweir 
49cdf0e10cSrcweir #define VER_WIN32_WINDOWS_95    MAKE_VER_WIN32_WINDOWS( 4, 0, 0 )
50cdf0e10cSrcweir #define VER_WIN32_WINDOWS_98    MAKE_VER_WIN32_WINDOWS( 4, 10, 0 )
51cdf0e10cSrcweir #define VER_WIN32_WINDOWS_ME    MAKE_VER_WIN32_WINDOWS( 4, 90, 0 )
52cdf0e10cSrcweir #define VER_WIN32_NT_NT4        MAKE_VER_WIN32_NT( 4, 0, 0 )
53cdf0e10cSrcweir #define VER_WIN32_NT_2000       MAKE_VER_WIN32_NT( 5, 0, 0 )
54cdf0e10cSrcweir #define VER_WIN32_NT_XP         MAKE_VER_WIN32_NT( 5, 1, 0 )
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 
57cdf0e10cSrcweir EXTERN_C WINBASEAPI LPSTR WINAPI lstrchrA( LPCSTR lpString, CHAR c );
58cdf0e10cSrcweir EXTERN_C WINBASEAPI LPWSTR WINAPI lstrchrW( LPCWSTR lpString, WCHAR c );
59cdf0e10cSrcweir EXTERN_C WINBASEAPI LPSTR WINAPI lstrrchrA( LPCSTR lpString, CHAR c );
60cdf0e10cSrcweir EXTERN_C WINBASEAPI LPWSTR WINAPI lstrrchrW( LPCWSTR lpString, WCHAR c );
61cdf0e10cSrcweir 
62cdf0e10cSrcweir #ifdef UNICODE
63cdf0e10cSrcweir #define lstrrchr    lstrrchrW
64cdf0e10cSrcweir #define lstrchr     lstrchrW
65cdf0e10cSrcweir #else
66cdf0e10cSrcweir #define lstrrchr    lstrrchrA
67cdf0e10cSrcweir #define lstrchr     lstrchrA
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir 
70cdf0e10cSrcweir // macro that calculates the count of elements of a static array
71cdf0e10cSrcweir 
72cdf0e10cSrcweir #define bufsizeof(buf)  (sizeof(buf) / sizeof((buf)[0]))
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir #define IsValidHandle(Handle)   ((DWORD)(Handle) + 1 > 1)
76cdf0e10cSrcweir 
77cdf0e10cSrcweir #ifdef __cplusplus
78cdf0e10cSrcweir 
79cdf0e10cSrcweir #define _AUTO_WSTR2STR( lpStrA, lpStrW ) \
80cdf0e10cSrcweir LPSTR   lpStrA; \
81cdf0e10cSrcweir if ( lpStrW ) \
82cdf0e10cSrcweir { \
83cdf0e10cSrcweir     int cNeeded = WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, NULL, 0, NULL, NULL ); \
84cdf0e10cSrcweir     lpStrA = (LPSTR)_alloca( cNeeded * sizeof(CHAR) ); \
85cdf0e10cSrcweir     WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, lpStrA, cNeeded, NULL, NULL ); \
86cdf0e10cSrcweir } \
87cdf0e10cSrcweir else \
88cdf0e10cSrcweir     lpStrA = NULL;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 
91cdf0e10cSrcweir #define AUTO_WSTR2STR( lpStr ) \
92cdf0e10cSrcweir     _AUTO_WSTR2STR( lpStr##A, lpStr##W )
93cdf0e10cSrcweir 
94cdf0e10cSrcweir #define AUTO_STR( lpStr, cchBuffer ) \
95cdf0e10cSrcweir LPSTR   lpStr##A = lpStr##W ? (LPSTR)_alloca( (cchBuffer) * sizeof(CHAR) ) : NULL;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir #endif  // __cplusplus
98cdf0e10cSrcweir 
99cdf0e10cSrcweir #define STRBUF2WSTR( lpStr, cchSrcBuffer, cchDestBuffer ) \
100cdf0e10cSrcweir     MultiByteToWideChar( CP_ACP, 0, lpStr##A, cchSrcBuffer, lpStr##W, cchDestBuffer )
101cdf0e10cSrcweir 
102cdf0e10cSrcweir #define STR2WSTR( lpStr, cchBuffer ) \
103cdf0e10cSrcweir     STRBUF2WSTR( lpStr, -1, cchBuffer )
104cdf0e10cSrcweir 
105cdf0e10cSrcweir #define WSTR2STR( lpStr, cchBuffer ) \
106cdf0e10cSrcweir     WideCharToMultiByte( CP_ACP, 0, lpStr##W, -1, lpStr##A, cchBuffer, NULL, NULL )
107cdf0e10cSrcweir 
108cdf0e10cSrcweir EXTERN_C void WINAPI ResolveThunk_WINDOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
109cdf0e10cSrcweir EXTERN_C void WINAPI ResolveThunk_TRYLOAD( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
110cdf0e10cSrcweir EXTERN_C void WINAPI ResolveThunk_ALLWAYS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 
115cdf0e10cSrcweir #define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \
116cdf0e10cSrcweir EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
117cdf0e10cSrcweir EXTERN_C rettype calltype func##_##resolve params; \
118cdf0e10cSrcweir static rettype calltype func##_##Failure params; \
119cdf0e10cSrcweir static _declspec ( naked ) func##_Thunk() \
120cdf0e10cSrcweir { \
121cdf0e10cSrcweir     ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \
122cdf0e10cSrcweir     _asm    jmp [module##_##func##_Ptr] \
123cdf0e10cSrcweir } \
124cdf0e10cSrcweir EXTERN_C _declspec( naked ) rettype calltype func params \
125cdf0e10cSrcweir { \
126cdf0e10cSrcweir     _asm    jmp [module##_##func##_Ptr] \
127cdf0e10cSrcweir } \
128cdf0e10cSrcweir EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
129cdf0e10cSrcweir static rettype calltype func##_##Failure params \
130cdf0e10cSrcweir { \
131cdf0e10cSrcweir     SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
132cdf0e10cSrcweir     return (rettype)0; \
133cdf0e10cSrcweir } \
134cdf0e10cSrcweir EXTERN_C rettype calltype func##_##resolve params
135cdf0e10cSrcweir 
136cdf0e10cSrcweir #define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \
137cdf0e10cSrcweir EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
138cdf0e10cSrcweir static _declspec ( naked ) func##_Thunk() \
139cdf0e10cSrcweir { \
140cdf0e10cSrcweir     ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \
141cdf0e10cSrcweir     _asm    jmp [module##_##func##_Ptr] \
142cdf0e10cSrcweir } \
143cdf0e10cSrcweir EXTERN_C _declspec( naked ) rettype calltype func params \
144cdf0e10cSrcweir { \
145cdf0e10cSrcweir     _asm    jmp [module##_##func##_Ptr] \
146cdf0e10cSrcweir } \
147cdf0e10cSrcweir EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk;
148