2 * PROJECT: ReactOS Shim helper library
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: ReactOS Shim Engine common functions / structures
5 * COPYRIGHT: Copyright 2016-2018 Mark Jansen (mark.jansen@reactos.org)
10 typedef struct tagHOOKAPI
14 PVOID ReplacementFunction
;
15 PVOID OriginalFunction
;
20 PVOID
ShimLib_ShimMalloc(SIZE_T dwSize
);
21 VOID
ShimLib_ShimFree(PVOID pData
);
22 PCSTR
ShimLib_StringDuplicateA(PCSTR szString
);
23 PCSTR
ShimLib_StringNDuplicateA(PCSTR szString
, SIZE_T stringLength
);
24 BOOL
ShimLib_StrAEqualsW(PCSTR szString
, PCWSTR wszString
);
27 /* Forward events to generic handlers */
28 VOID
ShimLib_Init(HINSTANCE hInstance
);
29 VOID
ShimLib_Deinit(VOID
);
30 PHOOKAPI WINAPI
ShimLib_GetHookAPIs(LPCSTR szCommandLine
,LPCWSTR wszShimName
,PDWORD pdwHookCount
);
31 BOOL WINAPI
ShimLib_NotifyShims(DWORD fdwReason
, PVOID ptr
);
34 /* Shims should respond to SHIM_REASON_XXXX in the Notify routines.
35 SHIM_NOTIFY_ codes are sent by apphelp, and translated to SHIM_REASON_ by the shimlib routines.
36 The only exception being SHIM_NOTIFY_ATTACH, that is also set for one-time init.
39 #define SHIM_REASON_INIT 100
40 #define SHIM_REASON_DEINIT 101
41 #define SHIM_REASON_DLL_LOAD 102 /* Arg: PLDR_DATA_TABLE_ENTRY */
42 #define SHIM_REASON_DLL_UNLOAD 103 /* Arg: PLDR_DATA_TABLE_ENTRY */
44 #define SHIM_NOTIFY_ATTACH 1
45 #define SHIM_NOTIFY_DETACH 2
46 #define SHIM_NOTIFY_DLL_LOAD 3 /* Arg: PLDR_DATA_TABLE_ENTRY */
47 #define SHIM_NOTIFY_DLL_UNLOAD 4 /* Arg: PLDR_DATA_TABLE_ENTRY */
51 typedef enum _SEI_LOG_LEVEL
{
58 BOOL WINAPIV
SeiDbgPrint(SEI_LOG_LEVEL Level
, PCSTR Function
, PCSTR Format
, ...);
59 extern ULONG g_ShimEngDebugLevel
;
61 #if defined(IN_APPHELP)
62 /* Apphelp shimeng logging uses the function name */
63 #define SHIMENG_MSG(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_MSG, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
64 #define SHIMENG_FAIL(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_FAIL, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
65 #define SHIMENG_WARN(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_WARN, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
66 #define SHIMENG_INFO(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_INFO, __FUNCTION__, fmt, ##__VA_ARGS__ ); } while (0)
68 /* Shims use the shim name */
69 #define SHIM_MSG(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_MSG, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
70 #define SHIM_FAIL(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_FAIL, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
71 #define SHIM_WARN(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_WARN, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
72 #define SHIM_INFO(fmt, ...) do { if (g_ShimEngDebugLevel) SeiDbgPrint(SEI_INFO, SHIM_OBJ_NAME(g_szModuleName), fmt, ##__VA_ARGS__ ); } while (0)
75 typedef PHOOKAPI (WINAPI
* _PVGetHookAPIs
)(DWORD
, PCSTR
, PDWORD
);
76 typedef BOOL (WINAPI
* _PVNotify
)(DWORD
, PVOID
);
78 typedef struct tagSHIMREG
80 _PVGetHookAPIs GetHookAPIs
;
87 #define _SHMALLOC(x) __declspec(allocate(x))
88 #elif defined(__GNUC__)
89 #define _SHMALLOC(x) __attribute__ ((section (x) ))
91 #error Your compiler is not supported.