/* * PROJECT: ReactOS 'General' Shim library * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Test shim used to verify the inner working of the shim engine * COPYRIGHT: Copyright 2019 Mark Jansen (mark.jansen@reactos.org) */ #define WIN32_NO_STATUS #include #include #include #include #define SHIM_NS ShimTest #include typedef BOOL (WINAPI *tGetComputerNameA)(LPSTR lpBuffer, LPDWORD lpnSize); BOOL WINAPI SHIM_OBJ_NAME(GetComputerNameA)(LPSTR lpBuffer, LPDWORD lpnSize) { CHAR Buffer[100] = {0}; DWORD dwSize = sizeof(Buffer) - 1; size_t cchLen; if (CALL_SHIM(0, tGetComputerNameA)(Buffer, &dwSize)) { SHIM_INFO("Original function returned: '%s'\n", Buffer); } else { SHIM_INFO("Original function failed\n"); Buffer[0] = '\0'; } if (!lpnSize) { SHIM_WARN("No lpnSize\n"); return FALSE; } StringCchCopyA(lpBuffer, *lpnSize, "ShimTest:"); StringCchCatA(lpBuffer, *lpnSize, Buffer); StringCchLengthA(lpBuffer, *lpnSize, &cchLen); *lpnSize = (DWORD)cchLen; return TRUE; } typedef INT (WINAPI *tSHStringFromGUIDA)(REFGUID guid, LPSTR lpszDest, INT cchMax); int WINAPI SHIM_OBJ_NAME(SHStringFromGUIDA)(REFGUID guid, LPSTR lpszDest, INT cchMax) { CHAR Buffer[100] = {0}; if (CALL_SHIM(1, tSHStringFromGUIDA)(guid, Buffer, sizeof(Buffer)-1)) { SHIM_INFO("Original function returned: '%s'\n", Buffer); } else { SHIM_INFO("Original function failed\n"); Buffer[0] = '\0'; } StringCchCopyA(lpszDest, cchMax, "ShimTest:"); StringCchCatA(lpszDest, cchMax, Buffer); return 0; } BOOL WINAPI SHIM_OBJ_NAME(Notify)(DWORD fdwReason, PVOID ptr) { if (fdwReason == SHIM_REASON_INIT) { SHIM_MSG("SHIM_REASON_INIT\n"); } return TRUE; } #define SHIM_NOTIFY_FN SHIM_OBJ_NAME(Notify) #define SHIM_NUM_HOOKS 2 #define SHIM_SETUP_HOOKS \ SHIM_HOOK(0, "KERNEL32.DLL", "GetComputerNameA", SHIM_OBJ_NAME(GetComputerNameA)) \ SHIM_HOOK(1, "SHLWAPI.DLL", (PCSTR)23, SHIM_OBJ_NAME(SHStringFromGUIDA)) #include