/[rdesktop]/sourceforge.net/trunk/seamlessrdp/ServerExe/HookDll/hookdll.cpp
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /sourceforge.net/trunk/seamlessrdp/ServerExe/HookDll/hookdll.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1005 - (show annotations)
Tue Aug 30 11:34:05 2005 UTC (18 years, 9 months ago) by astrand
File size: 10852 byte(s)
Moved calls to WriteToChannel; now calling directly as we have our
string.

Also, make sure result from snprintf is null terminated.

1 //
2 // Copyright (C) 2004-2005 Martin Wickett
3 //
4
5 #include "hookdll.h"
6 #include <windows.h>
7 #include <winuser.h>
8 #include <stdio.h>
9 #include <stdarg.h>
10
11 #include "wtsapi32.h"
12 #include "Cchannel.h"
13
14 #define DLL_EXPORT extern "C" __declspec(dllexport)
15
16 // Shared DATA
17 #pragma data_seg ( "SHAREDDATA" )
18
19 // this is the total number of processes this dll is currently attached to
20 int iInstanceCount = 0;
21 HWND hWnd = 0;
22
23 #pragma data_seg ()
24
25 #pragma comment(linker, "/section:SHAREDDATA,rws")
26
27 #define snprintf _snprintf
28
29 bool bHooked = false;
30 bool bHooked2 = false;
31 bool bHooked3 = false;
32 HHOOK hhook = 0; //cbt
33 HHOOK hhook2 = 0; //shell
34 HHOOK hhook3 = 0; //wnd proc
35 HINSTANCE hInst = 0;
36 HANDLE m_vcHandle = 0;
37
38
39 void SendDebug( char *format, ... )
40 {
41 va_list argp;
42 char buf [ 256 ];
43
44 va_start( argp, format );
45 vsprintf( buf, format, argp );
46 va_end( argp );
47
48 WriteToChannel( "DEBUG1," );
49 WriteToChannel( buf );
50 WriteToChannel( "\n" );
51 }
52
53
54
55 BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved )
56 {
57 switch ( ul_reason_for_call ) {
58 case DLL_PROCESS_ATTACH: {
59 // remember our instance handle
60 hInst = hinstDLL;
61 ++iInstanceCount;
62 OpenVirtualChannel();
63 break;
64 }
65
66 case DLL_THREAD_ATTACH:
67 break;
68 case DLL_THREAD_DETACH:
69 break;
70 case DLL_PROCESS_DETACH: {
71 --iInstanceCount;
72 CloseVirtualChannel();
73 }
74 break;
75 }
76
77 return TRUE;
78 }
79
80 LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
81 {
82 if ( nCode < 0 ) {
83 return CallNextHookEx( hhook3, nCode, wParam, lParam );
84 }
85
86 char windowTitle[ 150 ] = { ""
87 };
88 HWND windowHandle = NULL;
89 HWND windowHandle2 = NULL;
90 char result[ 255 ] = { ""
91 };
92 CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;
93 CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam;
94 LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE );
95 WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam;
96 RECT *rect = ( RECT * ) details->lParam;
97
98 switch ( details->message ) {
99
100 case WM_SIZING:
101 case WM_MOVING:
102 if ( !( dwStyle & WS_VISIBLE ) )
103 break;
104
105 if ( !( dwStyle & WS_DLGFRAME ) )
106 break;
107
108 snprintf( result, sizeof( result ),
109 "POSITION1,0x%p,%d,%d,%d,%d,0x%x",
110 details->hwnd,
111 rect->left, rect->top,
112 rect->right - rect->left,
113 rect->bottom - rect->top,
114 0 );
115 result[ sizeof( result ) - 1 ] = '\0';
116 WriteToChannel( result );
117 break;
118
119
120 /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are
121 strange. Sometimes, for example when bringing up the
122 Notepad About dialog, only an WM_WINDOWPOSCHANGING is
123 sent. In some other cases, for exmaple when opening
124 Format->Text in Notepad, both events are sent. Also, for
125 some reason, when closing the Notepad About dialog, an
126 WM_WINDOWPOSCHANGING event is sent which looks just like
127 the event that was sent when the About dialog was opened... */
128 case WM_WINDOWPOSCHANGING:
129
130 if ( !( dwStyle & WS_VISIBLE ) )
131 break;
132
133 if ( !( dwStyle & WS_DLGFRAME ) )
134 break;
135
136 if ( !( wp->flags & SWP_NOZORDER ) ) {
137 snprintf( result, sizeof( result ),
138 "ZCHANGE1,0x%p,0x%p,0x%x\n",
139 details->hwnd,
140 wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
141 0 );
142 result[ sizeof( result ) - 1 ] = '\0';
143 WriteToChannel( result );
144 }
145 break;
146
147
148 case WM_CREATE:
149 if ( cs->style & WS_DLGFRAME ) {
150 snprintf( result, sizeof( result ),
151 "CREATE1,0x%p,0x%x\n",
152 details->hwnd, 0 );
153 result[ sizeof( result ) - 1 ] = '\0';
154 WriteToChannel( result );
155 }
156 break;
157
158
159 case WM_DESTROY:
160 if ( dwStyle & WS_DLGFRAME ) {
161 snprintf( result, sizeof( result ),
162 "DESTROY1,0x%p,0x%x\n",
163 details->hwnd, 0 );
164 result[ sizeof( result ) - 1 ] = '\0';
165 WriteToChannel( result );
166 }
167
168 break;
169
170
171 default:
172 break;
173 }
174
175 return CallNextHookEx( hhook3, nCode, wParam, lParam );
176 }
177
178 LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam )
179 {
180 if ( nCode < 0 ) {
181 return CallNextHookEx( hhook, nCode, wParam, lParam );
182 }
183
184 char windowTitle[ 150 ] = { ""
185 };
186 HWND windowHandle = NULL;
187 char result[ 255 ] = { ""
188 };
189 switch ( nCode ) {
190 case HCBT_MINMAX:
191
192 if ( ( LOWORD( lParam ) == SW_SHOWMINIMIZED )
193 || ( LOWORD( lParam ) == SW_MINIMIZE ) ) {
194 MessageBox( 0, "Minimizing windows is not allowed in this version. Sorry!", "SeamlessRDP", MB_OK );
195 return 1;
196 }
197
198 GetWindowText( ( HWND ) wParam, windowTitle, 150 );
199
200 snprintf( result, sizeof( result ),
201 "SETSTATE1,0x%p,%s,0x%x,0x%x\n",
202 ( HWND ) wParam,
203 windowTitle,
204 LOWORD( lParam ),
205 0 );
206 result[ sizeof( result ) - 1 ] = '\0';
207 WriteToChannel( result );
208 break;
209
210
211 default:
212 break;
213 }
214
215
216
217 return CallNextHookEx( hhook, nCode, wParam, lParam );
218 }
219
220
221 LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
222 {
223 if ( nCode < 0 ) {
224 return CallNextHookEx( hhook, nCode, wParam, lParam );
225 }
226
227 char windowTitle[ 150 ] = { ""
228 };
229 HWND windowHandle = NULL;
230 char result[ 255 ] = { ""
231 };
232 char strWindowId[ 25 ];
233 LONG b, t, l, r;
234 char strW[ 5 ];
235 char strY[ 5 ];
236 char strX[ 5 ];
237 char strH[ 5 ];
238 RECT rect;
239
240 switch ( nCode ) {
241 case HSHELL_WINDOWCREATED:
242
243 //get window id
244 windowHandle = ( HWND ) wParam;
245 itoa( ( int ) windowHandle, strWindowId, 10 );
246
247 //get coords
248 GetWindowRect( windowHandle, &rect );
249 b = rect.bottom;
250 t = rect.top;
251 l = rect.left;
252 r = rect.right;
253 ltoa( b - t, strH, 10 );
254 ltoa( t, strY, 10 );
255 ltoa( r - l, strW, 10 );
256 ltoa( l, strX, 10 );
257
258 //get name
259 GetWindowText( windowHandle, windowTitle, 150 );
260
261 ////setup return string
262 strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
263 strcat( result, "ID=" );
264 strcat( result, strWindowId );
265 strcat( result, ";" );
266 strcat( result, "TITLE=" );
267 strcat( result, windowTitle );
268 strcat( result, ";" );
269 strcat( result, "X=" );
270 strcat( result, strX );
271 strcat( result, ";" );
272 strcat( result, "Y=" );
273 strcat( result, strY );
274 strcat( result, ";" );
275 strcat( result, "H=" );
276 strcat( result, strH );
277 strcat( result, ";" );
278 strcat( result, "W=" );
279 strcat( result, strW );
280 strcat( result, "." );
281 WriteToChannel( result );
282 break;
283
284 case HSHELL_WINDOWDESTROYED:
285
286 //get window id
287 windowHandle = ( HWND ) wParam;
288 itoa( ( int ) windowHandle, strWindowId, 10 );
289
290 //get coords
291 GetWindowRect( windowHandle, &rect );
292 b = rect.bottom;
293 t = rect.top;
294 l = rect.left;
295 r = rect.right;
296 ltoa( b - t, strH, 10 );
297 ltoa( t, strY, 10 );
298 ltoa( r - l, strW, 10 );
299 ltoa( l, strX, 10 );
300
301 //get name
302 GetWindowText( windowHandle, windowTitle, 150 );
303
304 ////setup return string
305 strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );
306 strcat( result, "ID=" );
307 strcat( result, strWindowId );
308 strcat( result, ";" );
309 strcat( result, "TITLE=" );
310 strcat( result, windowTitle );
311 strcat( result, ";" );
312 strcat( result, "X=" );
313 strcat( result, strX );
314 strcat( result, ";" );
315 strcat( result, "Y=" );
316 strcat( result, strY );
317 strcat( result, ";" );
318 strcat( result, "H=" );
319 strcat( result, strH );
320 strcat( result, ";" );
321 strcat( result, "W=" );
322 strcat( result, strW );
323 strcat( result, "." );
324 WriteToChannel( result );
325 break;
326
327
328 default:
329 break;
330 }
331
332
333 return CallNextHookEx( hhook, nCode, wParam, lParam );
334 }
335
336 DLL_EXPORT void SetCbtHook( void )
337 {
338 if ( !bHooked ) {
339 hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
340 bHooked = true;
341 }
342
343 if ( !bHooked2 ) {
344 hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
345 bHooked2 = true;
346 }
347
348 if ( !bHooked3 ) {
349 hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
350 bHooked3 = true;
351 }
352 }
353
354 DLL_EXPORT void RemoveCbtHook( void )
355 {
356 if ( bHooked ) {
357 UnhookWindowsHookEx( hhook );
358 bHooked = false;
359 }
360
361 if ( bHooked2 ) {
362 UnhookWindowsHookEx( hhook2 );
363 bHooked2 = false;
364 }
365
366 if ( bHooked3 ) {
367 UnhookWindowsHookEx( hhook3 );
368 bHooked3 = false;
369 }
370 }
371
372 DLL_EXPORT int GetInstanceCount()
373 {
374 return iInstanceCount;
375 }
376
377 int OpenVirtualChannel()
378 {
379 m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME );
380
381 if ( m_vcHandle == NULL ) {
382 return 0;
383 } else {
384 return 1;
385 }
386 }
387
388 int CloseVirtualChannel()
389 {
390 BOOL result = WTSVirtualChannelClose( m_vcHandle );
391
392 m_vcHandle = NULL;
393
394 if ( result ) {
395 return 1;
396 } else {
397 return 0;
398 }
399 }
400
401 int ChannelIsOpen()
402 {
403 if ( m_vcHandle == NULL ) {
404 return 0;
405 } else {
406 return 1;
407 }
408 }
409
410 int WriteToChannel( PCHAR buffer )
411 {
412 PULONG bytesRead = 0;
413 PULONG pBytesWritten = 0;
414
415 if ( !ChannelIsOpen() )
416 return 1;
417
418 BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
419
420 if ( result ) {
421 return 1;
422 } else {
423 return 0;
424 }
425 }

  ViewVC Help
Powered by ViewVC 1.1.26