xref: /aoo41x/main/sal/systools/win32/uwinapi/Uwinapi.h (revision 5b501c92)
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 
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 
146cdf0e10cSrcweir #define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \
147cdf0e10cSrcweir EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
148cdf0e10cSrcweir static _declspec ( naked ) func##_Thunk() \
149cdf0e10cSrcweir { \
150cdf0e10cSrcweir 	ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \
151cdf0e10cSrcweir 	_asm	jmp	[module##_##func##_Ptr] \
152cdf0e10cSrcweir } \
153cdf0e10cSrcweir EXTERN_C _declspec( naked ) rettype calltype func params \
154cdf0e10cSrcweir { \
155cdf0e10cSrcweir 	_asm	jmp	[module##_##func##_Ptr] \
156cdf0e10cSrcweir } \
157*5b501c92SAndrew Rist EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk;
158