]> git.cworth.org Git - apitrace/blob - inject/inject.h
Get DWM traces working.
[apitrace] / inject / inject.h
1 /**************************************************************************
2  *
3  * Copyright 2011-2012 Jose Fonseca
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 /*
28  * Code for the DLL that will be injected in the target process.
29  *
30  * The injected DLL will manipulate the import tables to hook the
31  * modules/functions of interest.
32  *
33  * See also:
34  * - http://www.codeproject.com/KB/system/api_spying_hack.aspx
35  * - http://www.codeproject.com/KB/threads/APIHooking.aspx
36  * - http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
37  */
38
39
40 #include <windows.h>
41
42
43 static inline const char *
44 getSeparator(const char *szFilename) {
45     const char *p, *q;
46     p = NULL;
47     q = szFilename;
48     char c;
49     do  {
50         c = *q++;
51         if (c == '\\' || c == '/' || c == ':') {
52             p = q;
53         }
54     } while (c);
55     return p;
56 }
57
58
59 static inline const char *
60 getBaseName(const char *szFilename) {
61     const char *pSeparator = getSeparator(szFilename);
62     if (!pSeparator) {
63         return szFilename;
64     }
65     return pSeparator;
66 }
67
68
69 static inline void
70 getDirName(char *szFilename) {
71     char *pSeparator = const_cast<char *>(getSeparator(szFilename));
72     if (pSeparator) {
73         *pSeparator = '\0';
74     }
75 }
76
77
78 static inline void
79 getModuleName(char *szModuleName, size_t n, const char *szFilename) {
80     char *p = szModuleName;
81     const char *q = getBaseName(szFilename);
82     char c;
83     while (--n) {
84         c = *q++;
85         if (c == '.' || c == '\0') {
86             break;
87         }
88         *p++ = c;
89     };
90     *p++ = '\0';
91 }
92
93
94 #define SHARED_MEM_SIZE 4096
95
96 static LPVOID pSharedMem = NULL;
97 static HANDLE hFileMapping = NULL;
98
99
100 static LPSTR
101 OpenSharedMemory(void) {
102     if (pSharedMem) {
103         return (LPSTR)pSharedMem;
104     }
105
106     hFileMapping = CreateFileMapping(
107         INVALID_HANDLE_VALUE,   // system paging file
108         NULL,                   // lpAttributes
109         PAGE_READWRITE,         // read/write access
110         0,                      // dwMaximumSizeHigh
111         SHARED_MEM_SIZE,              // dwMaximumSizeLow
112         TEXT("injectfilemap")); // name of map object
113     if (hFileMapping == NULL) {
114         fprintf(stderr, "Failed to create file mapping\n");
115         return NULL;
116     }
117
118     BOOL bAlreadyExists = (GetLastError() == ERROR_ALREADY_EXISTS);
119
120     pSharedMem = MapViewOfFile(
121         hFileMapping,
122         FILE_MAP_WRITE, // read/write access
123         0,              // dwFileOffsetHigh
124         0,              // dwFileOffsetLow
125         0);             // dwNumberOfBytesToMap (entire file)
126     if (pSharedMem == NULL) {
127         fprintf(stderr, "Failed to map view \n");
128         return NULL;
129     }
130
131     if (!bAlreadyExists) {
132         memset(pSharedMem, 0, SHARED_MEM_SIZE);
133     }
134
135     return (LPSTR)pSharedMem;
136 }
137
138
139 static inline VOID
140 CloseSharedMem(void) {
141     if (!pSharedMem) {
142         return;
143     }
144
145     UnmapViewOfFile(pSharedMem);
146     pSharedMem = NULL;
147
148     CloseHandle(hFileMapping);
149     hFileMapping = NULL;
150 }
151
152
153 static inline VOID
154 SetSharedMem(LPCSTR lpszSrc) {
155     LPSTR lpszDst = OpenSharedMemory();
156     if (!lpszDst) {
157         return;
158     }
159
160     size_t n = 1;
161     while (*lpszSrc && n < SHARED_MEM_SIZE) {
162         *lpszDst++ = *lpszSrc++;
163         n++;
164     }
165     *lpszDst = '\0';
166 }
167
168
169 static inline VOID
170 GetSharedMem(LPSTR lpszDst, size_t n) {
171     LPCSTR lpszSrc = OpenSharedMemory();
172     if (!lpszSrc) {
173         return;
174     }
175
176     while (*lpszSrc && --n) {
177         *lpszDst++ = *lpszSrc++;
178     }
179     *lpszDst = '\0';
180 }
181