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 104