/[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 1001 - (show annotations)
Tue Aug 30 09:48:07 2005 UTC (18 years, 8 months ago) by astrand
File size: 14522 byte(s)
Implemented DESTROY1.

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 if ( ChannelIsOpen() ) {
49 WriteToChannel( "DEBUG1," );
50 WriteToChannel( buf );
51 WriteToChannel( "\n" );
52 }
53 }
54
55
56
57 BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved )
58 {
59 switch ( ul_reason_for_call ) {
60 case DLL_PROCESS_ATTACH: {
61 // remember our instance handle
62 hInst = hinstDLL;
63 ++iInstanceCount;
64 OpenVirtualChannel();
65 break;
66 }
67
68 case DLL_THREAD_ATTACH:
69 break;
70 case DLL_THREAD_DETACH:
71 break;
72 case DLL_PROCESS_DETACH: {
73 --iInstanceCount;
74 CloseVirtualChannel();
75 }
76 break;
77 }
78
79 return TRUE;
80 }
81
82 LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
83 {
84 if ( nCode < 0 ) {
85 return CallNextHookEx( hhook3, nCode, wParam, lParam );
86 }
87
88 PCHAR buffer = NULL;
89 char windowTitle[ 150 ] = { ""
90 };
91 HWND windowHandle = NULL;
92 HWND windowHandle2 = NULL;
93 char result[ 255 ] = { ""
94 };
95 char strWindowId[ 25 ];
96 char type[ 25 ];
97
98 LONG b, t, l, r;
99 char strX[ 5 ];
100 char strY[ 5 ];
101 char strW[ 5 ];
102 char strH[ 5 ];
103
104 CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;
105 CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam;
106 LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE );
107 WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam;
108 RECT *rect = ( RECT * ) details->lParam;
109
110 switch ( details->message ) {
111
112 case WM_SIZING:
113 case WM_MOVING:
114 if ( !( dwStyle & WS_VISIBLE ) )
115 break;
116
117 if ( !( dwStyle & WS_DLGFRAME ) )
118 break;
119
120 snprintf( result, sizeof( result ),
121 "POSITION1,0x%x,%d,%d,%d,%d,0x%x",
122 ( int ) details->hwnd,
123 rect->left, rect->top,
124 rect->right - rect->left,
125 rect->bottom - rect->top,
126 0 );
127 result[ sizeof( result ) - 1 ] = '\0';
128 buffer = result;
129 break;
130
131
132 /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are
133 strange. Sometimes, for example when bringing up the
134 Notepad About dialog, only an WM_WINDOWPOSCHANGING is
135 sent. In some other cases, for exmaple when opening
136 Format->Text in Notepad, both events are sent. Also, for
137 some reason, when closing the Notepad About dialog, an
138 WM_WINDOWPOSCHANGING event is sent which looks just like
139 the event that was sent when the About dialog was opened... */
140 case WM_WINDOWPOSCHANGING:
141
142 if ( !( dwStyle & WS_VISIBLE ) )
143 break;
144
145 if ( !( dwStyle & WS_DLGFRAME ) )
146 break;
147
148 if ( !( wp->flags & SWP_NOZORDER ) ) {
149 snprintf( result, sizeof( result ),
150 "ZCHANGE1,0x%x,0x%x,0x%x\n",
151 details->hwnd,
152 wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
153 0 );
154 result[ sizeof( result ) - 1 ] = '\0';
155 buffer = result;
156 }
157 break;
158
159
160 case WM_CREATE:
161 if ( cs->style & WS_DLGFRAME ) {
162 snprintf( result, sizeof( result ),
163 "CREATE1,0x%x,0x%x\n",
164 details->hwnd, 0 );
165 buffer = result;
166 }
167 break;
168
169
170 case WM_DESTROY:
171 if ( dwStyle & WS_DLGFRAME ) {
172 snprintf( result, sizeof( result ),
173 "DESTROY1,0x%x,0x%x\n",
174 details->hwnd, 0 );
175 buffer = result;
176 }
177
178 break;
179
180
181 default:
182 break;
183 }
184
185 if ( ChannelIsOpen() ) {
186 if ( buffer != NULL ) {
187 WriteToChannel( buffer );
188 }
189 }
190
191 return CallNextHookEx( hhook3, nCode, wParam, lParam );
192 }
193
194 LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam )
195 {
196 if ( nCode < 0 ) {
197 return CallNextHookEx( hhook, nCode, wParam, lParam );
198 }
199
200
201 PCHAR buffer = NULL;
202
203
204 char windowTitle[ 150 ] = { ""
205 };
206 HWND windowHandle = NULL;
207 char result[ 255 ] = { ""
208 };
209 char strWindowId[ 25 ];
210 char type[ 25 ];
211
212
213 LONG b, t, l, r;
214 char strW[ 5 ];
215 char strY[ 5 ];
216 char strX[ 5 ];
217 char strH[ 5 ];
218 RECT rect;
219
220 int i = 0; //tmp
221
222 switch ( nCode ) {
223 case HCBT_MINMAX:
224
225 windowHandle = ( HWND ) wParam;
226 //get win name
227 GetWindowText( windowHandle, windowTitle, 150 );
228
229 //get an id for it
230 itoa( ( int ) windowHandle, strWindowId, 10 );
231
232 //get operation type(min,max). if max, do not clip at all,if min use window's previous coords
233 //codes are:
234
235 // SW_HIDE= 0 SW_SHOWNORMAL=1 SW_NORMAL=1 SW_SHOWMINIMIZED=2 SW_SHOWMAXIMIZED=3 SW_MAXIMIZE=3
236 // SW_SHOWNOACTIVATE=4 SW_SHOW=5 SW_MINIMIZE=6 SW_SHOWMINNOACTIVE=7 SW_SHOWNA=8 SW_RESTORE=9
237 // SW_SHOWDEFAULT=10 SW_FORCEMINIMIZE=11 SW_MAX=11
238
239 itoa( ( int ) lParam, type, 10 );
240
241 //get coords
242 GetWindowRect( windowHandle, &rect );
243 b = rect.bottom;
244 t = rect.top;
245 l = rect.left;
246 r = rect.right;
247 ltoa( b - t, strW, 10 );
248 ltoa( t, strY, 10 );
249 ltoa( r - l, strH, 10 );
250 ltoa( l, strX, 10 );
251
252 //get name
253 GetWindowText( windowHandle, windowTitle, 150 );
254
255 ////setup return string
256 strcat( result, "MSG=HCBT_MINMAX;OP=4;" );
257
258 // SW_SHOWNOACTIVATE=4 SW_SHOW=5 SW_MINIMIZE=6 SW_SHOWMINNOACTIVE=7 SW_SHOWNA=8 SW_RESTORE=9
259 // SW_SHOWDEFAULT=10 SW_FORCEMINIMIZE=11 SW_MAX=11
260 strcat( result, "ID=" );
261 strcat( result, strWindowId );
262 strcat( result, ";" );
263 strcat( result, "TITLE=" );
264 strcat( result, windowTitle );
265 strcat( result, ";" );
266 strcat( result, "X=" );
267 strcat( result, strX );
268 strcat( result, ";" );
269 strcat( result, "Y=" );
270 strcat( result, strY );
271 strcat( result, ";" );
272 strcat( result, "H=" );
273 strcat( result, strH );
274 strcat( result, ";" );
275 strcat( result, "W=" );
276 strcat( result, strW );
277 strcat( result, ";" );
278 strcat( result, "TYPE=" );
279 strcat( result, type );
280 strcat( result, "." );
281
282 //-------------------------------------------------------------------------------------------------
283 // code to prevent minimising windows (can be removed once minimise has been implemented)
284 //i = (int)lParam;
285 //if (i==0 || i==2 || i==6 || i==7 || i==8 || i==11)
286 //if ( i==2 || i==6 )
287 //{
288 // MessageBox(0,"Minimising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
289 // return 1;
290 //}
291 //-----------------------------------------------------------------------------------------
292
293 //-------------------------------------------------------------------------------------------------
294 // code to prevent maximising windows (can be removed once maximise has been implemented)
295 //i = (int)lParam;
296 //if (i==3 || i==9 || i==11)
297 //if (i==3 || i==11)
298 //{
299 // MessageBox(0,"Maximising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
300 // return 1;
301 //}
302 //-----------------------------------------------------------------------------------------
303
304 buffer = result;
305
306 break;
307
308 default:
309 break;
310 }
311
312 if ( ChannelIsOpen() ) {
313 if ( buffer != NULL ) {
314 WriteToChannel( buffer );
315 }
316 }
317
318 return CallNextHookEx( hhook, nCode, wParam, lParam );
319 }
320
321
322 LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
323 {
324 if ( nCode < 0 ) {
325 return CallNextHookEx( hhook, nCode, wParam, lParam );
326 }
327
328 if ( ChannelIsOpen() ) {
329 PCHAR buffer = NULL;
330
331 char windowTitle[ 150 ] = { ""
332 };
333 HWND windowHandle = NULL;
334 char result[ 255 ] = { ""
335 };
336 char strWindowId[ 25 ];
337 LONG b, t, l, r;
338 char strW[ 5 ];
339 char strY[ 5 ];
340 char strX[ 5 ];
341 char strH[ 5 ];
342 RECT rect;
343
344 switch ( nCode ) {
345 case HSHELL_WINDOWCREATED:
346
347 //get window id
348 windowHandle = ( HWND ) wParam;
349 itoa( ( int ) windowHandle, strWindowId, 10 );
350
351 //get coords
352 GetWindowRect( windowHandle, &rect );
353 b = rect.bottom;
354 t = rect.top;
355 l = rect.left;
356 r = rect.right;
357 ltoa( b - t, strH, 10 );
358 ltoa( t, strY, 10 );
359 ltoa( r - l, strW, 10 );
360 ltoa( l, strX, 10 );
361
362 //get name
363 GetWindowText( windowHandle, windowTitle, 150 );
364
365 ////setup return string
366 strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
367 strcat( result, "ID=" );
368 strcat( result, strWindowId );
369 strcat( result, ";" );
370 strcat( result, "TITLE=" );
371 strcat( result, windowTitle );
372 strcat( result, ";" );
373 strcat( result, "X=" );
374 strcat( result, strX );
375 strcat( result, ";" );
376 strcat( result, "Y=" );
377 strcat( result, strY );
378 strcat( result, ";" );
379 strcat( result, "H=" );
380 strcat( result, strH );
381 strcat( result, ";" );
382 strcat( result, "W=" );
383 strcat( result, strW );
384 strcat( result, "." );
385
386 buffer = result;
387
388 break;
389
390 case HSHELL_WINDOWDESTROYED:
391
392 //get window id
393 windowHandle = ( HWND ) wParam;
394 itoa( ( int ) windowHandle, strWindowId, 10 );
395
396 //get coords
397 GetWindowRect( windowHandle, &rect );
398 b = rect.bottom;
399 t = rect.top;
400 l = rect.left;
401 r = rect.right;
402 ltoa( b - t, strH, 10 );
403 ltoa( t, strY, 10 );
404 ltoa( r - l, strW, 10 );
405 ltoa( l, strX, 10 );
406
407 //get name
408 GetWindowText( windowHandle, windowTitle, 150 );
409
410 ////setup return string
411 strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );
412 strcat( result, "ID=" );
413 strcat( result, strWindowId );
414 strcat( result, ";" );
415 strcat( result, "TITLE=" );
416 strcat( result, windowTitle );
417 strcat( result, ";" );
418 strcat( result, "X=" );
419 strcat( result, strX );
420 strcat( result, ";" );
421 strcat( result, "Y=" );
422 strcat( result, strY );
423 strcat( result, ";" );
424 strcat( result, "H=" );
425 strcat( result, strH );
426 strcat( result, ";" );
427 strcat( result, "W=" );
428 strcat( result, strW );
429 strcat( result, "." );
430
431 buffer = result;
432
433 break;
434 default:
435 break;
436 }
437
438 if ( buffer != NULL ) {
439 WriteToChannel( buffer );
440 }
441 }
442
443 return CallNextHookEx( hhook, nCode, wParam, lParam );
444 }
445
446 DLL_EXPORT void SetCbtHook( void )
447 {
448 if ( !bHooked ) {
449 hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
450 bHooked = true;
451 }
452
453 if ( !bHooked2 ) {
454 hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
455 bHooked2 = true;
456 }
457
458 if ( !bHooked3 ) {
459 hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
460 bHooked3 = true;
461 }
462 }
463
464 DLL_EXPORT void RemoveCbtHook( void )
465 {
466 if ( bHooked ) {
467 UnhookWindowsHookEx( hhook );
468 bHooked = false;
469 }
470
471 if ( bHooked2 ) {
472 UnhookWindowsHookEx( hhook2 );
473 bHooked2 = false;
474 }
475
476 if ( bHooked3 ) {
477 UnhookWindowsHookEx( hhook3 );
478 bHooked3 = false;
479 }
480 }
481
482 DLL_EXPORT int GetInstanceCount()
483 {
484 return iInstanceCount;
485 }
486
487 int OpenVirtualChannel()
488 {
489 m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME );
490
491 if ( m_vcHandle == NULL ) {
492 return 0;
493 } else {
494 return 1;
495 }
496 }
497
498 int CloseVirtualChannel()
499 {
500 BOOL result = WTSVirtualChannelClose( m_vcHandle );
501
502 m_vcHandle = NULL;
503
504 if ( result ) {
505 return 1;
506 } else {
507 return 0;
508 }
509 }
510
511 int ChannelIsOpen()
512 {
513 if ( m_vcHandle == NULL ) {
514 return 0;
515 } else {
516 return 1;
517 }
518 }
519
520 int WriteToChannel( PCHAR buffer )
521 {
522 PULONG bytesRead = 0;
523 PULONG pBytesWritten = 0;
524
525 BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
526
527 if ( result ) {
528 return 1;
529 } else {
530 return 0;
531 }
532 }

  ViewVC Help
Powered by ViewVC 1.1.26