xref: /reactos/dll/appcompat/shims/genral/shimtest.c (revision e1338178)
1 /*
2  * PROJECT:     ReactOS 'General' Shim library
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Test shim used to verify the inner working of the shim engine
5  * COPYRIGHT:   Copyright 2019 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #define WIN32_NO_STATUS
9 #include <windef.h>
10 #include <winbase.h>
11 #include <shimlib.h>
12 #include <strsafe.h>
13 
14 
15 #define SHIM_NS         ShimTest
16 #include <setup_shim.inl>
17 
18 
19 typedef BOOL (WINAPI *tGetComputerNameA)(LPSTR lpBuffer, LPDWORD lpnSize);
20 
21 BOOL WINAPI SHIM_OBJ_NAME(GetComputerNameA)(LPSTR lpBuffer, LPDWORD lpnSize)
22 {
23     CHAR Buffer[100] = {0};
24     DWORD dwSize = sizeof(Buffer) - 1;
25     size_t cchLen;
26 
27     if (CALL_SHIM(0, tGetComputerNameA)(Buffer, &dwSize))
28     {
29         SHIM_INFO("Original function returned: '%s'\n", Buffer);
30     }
31     else
32     {
33         SHIM_INFO("Original function failed\n");
34         Buffer[0] = '\0';
35     }
36 
37     if (!lpnSize)
38     {
39         SHIM_WARN("No lpnSize\n");
40         return FALSE;
41     }
42 
43     StringCchCopyA(lpBuffer, *lpnSize, "ShimTest:");
44     StringCchCatA(lpBuffer, *lpnSize, Buffer);
45     StringCchLengthA(lpBuffer, *lpnSize, &cchLen);
46     *lpnSize = (DWORD)cchLen;
47     return TRUE;
48 }
49 
50 typedef INT (WINAPI *tSHStringFromGUIDA)(REFGUID guid, LPSTR lpszDest, INT cchMax);
51 int WINAPI SHIM_OBJ_NAME(SHStringFromGUIDA)(REFGUID guid, LPSTR lpszDest, INT cchMax)
52 {
53     CHAR Buffer[100] = {0};
54 
55     if (CALL_SHIM(1, tSHStringFromGUIDA)(guid, Buffer, sizeof(Buffer)-1))
56     {
57         SHIM_INFO("Original function returned: '%s'\n", Buffer);
58     }
59     else
60     {
61         SHIM_INFO("Original function failed\n");
62         Buffer[0] = '\0';
63     }
64 
65     StringCchCopyA(lpszDest, cchMax, "ShimTest:");
66     StringCchCatA(lpszDest, cchMax, Buffer);
67     return 0;
68 }
69 
70 
71 BOOL WINAPI SHIM_OBJ_NAME(Notify)(DWORD fdwReason, PVOID ptr)
72 {
73     if (fdwReason == SHIM_REASON_INIT)
74     {
75         SHIM_MSG("SHIM_REASON_INIT\n");
76     }
77     return TRUE;
78 }
79 
80 #define SHIM_NOTIFY_FN SHIM_OBJ_NAME(Notify)
81 #define SHIM_NUM_HOOKS  2
82 #define SHIM_SETUP_HOOKS \
83     SHIM_HOOK(0, "KERNEL32.DLL", "GetComputerNameA", SHIM_OBJ_NAME(GetComputerNameA)) \
84     SHIM_HOOK(1, "SHLWAPI.DLL", (PCSTR)23, SHIM_OBJ_NAME(SHStringFromGUIDA))
85 
86 
87 #include <implement_shim.inl>
88 
89