[SHIMENG] Find shims case-insensitive
[reactos.git] / dll / appcompat / shims / shimlib / shimlib.h
1 /*
2 * PROJECT: ReactOS Shim helper library
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: ReactOS Shim Engine common functions / structures
5 * COPYRIGHT: Copyright 2016-2019 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8 #pragma once
9
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15
16 typedef struct tagHOOKAPI
17 {
18 PCSTR LibraryName;
19 PCSTR FunctionName;
20 PVOID ReplacementFunction;
21 PVOID OriginalFunction;
22 PVOID Reserved[2];
23 } HOOKAPI, *PHOOKAPI;
24
25
26 PVOID ShimLib_ShimMalloc(SIZE_T dwSize);
27 VOID ShimLib_ShimFree(PVOID pData);
28 PCSTR ShimLib_StringDuplicateA(PCSTR szString);
29 PCSTR ShimLib_StringNDuplicateA(PCSTR szString, SIZE_T stringLength);
30 BOOL ShimLib_StrAEqualsWNC(PCSTR szString, PCWSTR wszString);
31 HINSTANCE ShimLib_Instance(VOID);
32
33 /* Forward events to generic handlers */
34 VOID ShimLib_Init(HINSTANCE hInstance);
35 VOID ShimLib_Deinit(VOID);
36 PHOOKAPI WINAPI ShimLib_GetHookAPIs(LPCSTR szCommandLine,LPCWSTR wszShimName,PDWORD pdwHookCount);
37 BOOL WINAPI ShimLib_NotifyShims(DWORD fdwReason, PVOID ptr);
38
39
40 /* Shims should respond to SHIM_REASON_XXXX in the Notify routines.
41 SHIM_NOTIFY_ codes are sent by apphelp, and translated to SHIM_REASON_ by the shimlib routines.
42 The only exception being SHIM_NOTIFY_ATTACH, that is also set for one-time init.
43 */
44
45 #define SHIM_REASON_INIT 100
46 #define SHIM_REASON_DEINIT 101
47 #define SHIM_REASON_DLL_LOAD 102 /* Arg: PLDR_DATA_TABLE_ENTRY */
48 #define SHIM_REASON_DLL_UNLOAD 103 /* Arg: PLDR_DATA_TABLE_ENTRY */
49
50 #define SHIM_NOTIFY_ATTACH 1
51 #define SHIM_NOTIFY_DETACH 2
52 #define SHIM_NOTIFY_DLL_LOAD 3 /* Arg: PLDR_DATA_TABLE_ENTRY */
53 #define SHIM_NOTIFY_DLL_UNLOAD 4 /* Arg: PLDR_DATA_TABLE_ENTRY */
54
55
56
57 typedef enum _SEI_LOG_LEVEL {
58 SEI_MSG = 1,
59 SEI_FAIL = 2,
60 SEI_WARN = 3,
61 SEI_INFO = 4,
62 } SEI_LOG_LEVEL;
63
64 BOOL WINAPIV SeiDbgPrint(SEI_LOG_LEVEL Level, PCSTR Function, PCSTR Format, ...);
65 extern ULONG g_ShimEngDebugLevel;
66
67 #if defined(IN_APPHELP)
68 /* Apphelp shimeng logging uses the function name */
69 #define SHIMENG_MSG(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_MSG, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
70 #define SHIMENG_FAIL(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_FAIL, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
71 #define SHIMENG_WARN(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_WARN, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
72 #define SHIMENG_INFO(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_INFO, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
73 #else
74 /* Shims use the shim name */
75 #define SHIM_MSG(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_MSG, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
76 #define SHIM_FAIL(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_FAIL, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
77 #define SHIM_WARN(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_WARN, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
78 #define SHIM_INFO(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_INFO, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
79 #endif
80
81 typedef PHOOKAPI (WINAPI* _PVGetHookAPIs)(DWORD, PCSTR, PDWORD);
82 typedef BOOL (WINAPI* _PVNotify)(DWORD, PVOID);
83
84 typedef struct tagSHIMREG
85 {
86 _PVGetHookAPIs GetHookAPIs;
87 _PVNotify Notify;
88 PCSTR ShimName;
89 } SHIMREG, *PSHIMREG;
90
91
92 #if defined(_MSC_VER)
93 #define _SHMALLOC(x) __declspec(allocate(x))
94 #elif defined(__GNUC__)
95 #define _SHMALLOC(x) __attribute__ ((section (x) ))
96 #else
97 #error Your compiler is not supported.
98 #endif
99
100 #ifdef __cplusplus
101 } // extern "C"
102 #endif
103