/[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 1002 - (show annotations)
Tue Aug 30 11:17:52 2005 UTC (18 years, 9 months ago) by astrand
File size: 11526 byte(s)
Fixed compiler warnings: Removed unused variables. Using %p for
converting HWND to hex.

Implemented SETSTATE1.

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 CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;
96 CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam;
97 LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE );
98 WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam;
99 RECT *rect = ( RECT * ) details->lParam;
100
101 switch ( details->message ) {
102
103 case WM_SIZING:
104 case WM_MOVING:
105 if ( !( dwStyle & WS_VISIBLE ) )
106 break;
107
108 if ( !( dwStyle & WS_DLGFRAME ) )
109 break;
110
111 snprintf( result, sizeof( result ),
112 "POSITION1,0x%p,%d,%d,%d,%d,0x%x",
113 details->hwnd,
114 rect->left, rect->top,
115 rect->right - rect->left,
116 rect->bottom - rect->top,
117 0 );
118 result[ sizeof( result ) - 1 ] = '\0';
119 buffer = result;
120 break;
121
122
123 /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are
124 strange. Sometimes, for example when bringing up the
125 Notepad About dialog, only an WM_WINDOWPOSCHANGING is
126 sent. In some other cases, for exmaple when opening
127 Format->Text in Notepad, both events are sent. Also, for
128 some reason, when closing the Notepad About dialog, an
129 WM_WINDOWPOSCHANGING event is sent which looks just like
130 the event that was sent when the About dialog was opened... */
131 case WM_WINDOWPOSCHANGING:
132
133 if ( !( dwStyle & WS_VISIBLE ) )
134 break;
135
136 if ( !( dwStyle & WS_DLGFRAME ) )
137 break;
138
139 if ( !( wp->flags & SWP_NOZORDER ) ) {
140 snprintf( result, sizeof( result ),
141 "ZCHANGE1,0x%p,0x%p,0x%x\n",
142 details->hwnd,
143 wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
144 0 );
145 result[ sizeof( result ) - 1 ] = '\0';
146 buffer = result;
147 }
148 break;
149
150
151 case WM_CREATE:
152 if ( cs->style & WS_DLGFRAME ) {
153 snprintf( result, sizeof( result ),
154 "CREATE1,0x%p,0x%x\n",
155 details->hwnd, 0 );
156 buffer = result;
157 }
158 break;
159
160
161 case WM_DESTROY:
162 if ( dwStyle & WS_DLGFRAME ) {
163 snprintf( result, sizeof( result ),
164 "DESTROY1,0x%p,0x%x\n",
165 details->hwnd, 0 );
166 buffer = result;
167 }
168
169 break;
170
171
172 default:
173 break;
174 }
175
176 if ( ChannelIsOpen() ) {
177 if ( buffer != NULL ) {
178 WriteToChannel( buffer );
179 }
180 }
181
182 return CallNextHookEx( hhook3, nCode, wParam, lParam );
183 }
184
185 LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam )
186 {
187 if ( nCode < 0 ) {
188 return CallNextHookEx( hhook, nCode, wParam, lParam );
189 }
190
191
192 PCHAR buffer = NULL;
193
194
195 char windowTitle[ 150 ] = { ""
196 };
197 HWND windowHandle = NULL;
198 char result[ 255 ] = { ""
199 };
200 switch ( nCode ) {
201 case HCBT_MINMAX:
202
203 if ( ( LOWORD( lParam ) == SW_SHOWMINIMIZED )
204 || ( LOWORD( lParam ) == SW_MINIMIZE ) ) {
205 MessageBox( 0, "Minimizing windows is not allowed in this version. Sorry!", "SeamlessRDP", MB_OK );
206 return 1;
207 }
208
209 GetWindowText( ( HWND ) wParam, windowTitle, 150 );
210
211 snprintf( result, sizeof( result ),
212 "SETSTATE1,0x%p,%s,0x%x,0x%x\n",
213 ( HWND ) wParam,
214 windowTitle,
215 LOWORD( lParam ),
216 0 );
217 buffer = result;
218 break;
219
220
221 default:
222 break;
223 }
224
225 if ( ChannelIsOpen() ) {
226 if ( buffer != NULL ) {
227 WriteToChannel( buffer );
228 }
229 }
230
231 return CallNextHookEx( hhook, nCode, wParam, lParam );
232 }
233
234
235 LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
236 {
237 if ( nCode < 0 ) {
238 return CallNextHookEx( hhook, nCode, wParam, lParam );
239 }
240
241 if ( ChannelIsOpen() ) {
242 PCHAR buffer = NULL;
243
244 char windowTitle[ 150 ] = { ""
245 };
246 HWND windowHandle = NULL;
247 char result[ 255 ] = { ""
248 };
249 char strWindowId[ 25 ];
250 LONG b, t, l, r;
251 char strW[ 5 ];
252 char strY[ 5 ];
253 char strX[ 5 ];
254 char strH[ 5 ];
255 RECT rect;
256
257 switch ( nCode ) {
258 case HSHELL_WINDOWCREATED:
259
260 //get window id
261 windowHandle = ( HWND ) wParam;
262 itoa( ( int ) windowHandle, strWindowId, 10 );
263
264 //get coords
265 GetWindowRect( windowHandle, &rect );
266 b = rect.bottom;
267 t = rect.top;
268 l = rect.left;
269 r = rect.right;
270 ltoa( b - t, strH, 10 );
271 ltoa( t, strY, 10 );
272 ltoa( r - l, strW, 10 );
273 ltoa( l, strX, 10 );
274
275 //get name
276 GetWindowText( windowHandle, windowTitle, 150 );
277
278 ////setup return string
279 strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
280 strcat( result, "ID=" );
281 strcat( result, strWindowId );
282 strcat( result, ";" );
283 strcat( result, "TITLE=" );
284 strcat( result, windowTitle );
285 strcat( result, ";" );
286 strcat( result, "X=" );
287 strcat( result, strX );
288 strcat( result, ";" );
289 strcat( result, "Y=" );
290 strcat( result, strY );
291 strcat( result, ";" );
292 strcat( result, "H=" );
293 strcat( result, strH );
294 strcat( result, ";" );
295 strcat( result, "W=" );
296 strcat( result, strW );
297 strcat( result, "." );
298
299 buffer = result;
300
301 break;
302
303 case HSHELL_WINDOWDESTROYED:
304
305 //get window id
306 windowHandle = ( HWND ) wParam;
307 itoa( ( int ) windowHandle, strWindowId, 10 );
308
309 //get coords
310 GetWindowRect( windowHandle, &rect );
311 b = rect.bottom;
312 t = rect.top;
313 l = rect.left;
314 r = rect.right;
315 ltoa( b - t, strH, 10 );
316 ltoa( t, strY, 10 );
317 ltoa( r - l, strW, 10 );
318 ltoa( l, strX, 10 );
319
320 //get name
321 GetWindowText( windowHandle, windowTitle, 150 );
322
323 ////setup return string
324 strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );
325 strcat( result, "ID=" );
326 strcat( result, strWindowId );
327 strcat( result, ";" );
328 strcat( result, "TITLE=" );
329 strcat( result, windowTitle );
330 strcat( result, ";" );
331 strcat( result, "X=" );
332 strcat( result, strX );
333 strcat( result, ";" );
334 strcat( result, "Y=" );
335 strcat( result, strY );
336 strcat( result, ";" );
337 strcat( result, "H=" );
338 strcat( result, strH );
339 strcat( result, ";" );
340 strcat( result, "W=" );
341 strcat( result, strW );
342 strcat( result, "." );
343
344 buffer = result;
345
346 break;
347 default:
348 break;
349 }
350
351 if ( buffer != NULL ) {
352 WriteToChannel( buffer );
353 }
354 }
355
356 return CallNextHookEx( hhook, nCode, wParam, lParam );
357 }
358
359 DLL_EXPORT void SetCbtHook( void )
360 {
361 if ( !bHooked ) {
362 hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
363 bHooked = true;
364 }
365
366 if ( !bHooked2 ) {
367 hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
368 bHooked2 = true;
369 }
370
371 if ( !bHooked3 ) {
372 hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
373 bHooked3 = true;
374 }
375 }
376
377 DLL_EXPORT void RemoveCbtHook( void )
378 {
379 if ( bHooked ) {
380 UnhookWindowsHookEx( hhook );
381 bHooked = false;
382 }
383
384 if ( bHooked2 ) {
385 UnhookWindowsHookEx( hhook2 );
386 bHooked2 = false;
387 }
388
389 if ( bHooked3 ) {
390 UnhookWindowsHookEx( hhook3 );
391 bHooked3 = false;
392 }
393 }
394
395 DLL_EXPORT int GetInstanceCount()
396 {
397 return iInstanceCount;
398 }
399
400 int OpenVirtualChannel()
401 {
402 m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME );
403
404 if ( m_vcHandle == NULL ) {
405 return 0;
406 } else {
407 return 1;
408 }
409 }
410
411 int CloseVirtualChannel()
412 {
413 BOOL result = WTSVirtualChannelClose( m_vcHandle );
414
415 m_vcHandle = NULL;
416
417 if ( result ) {
418 return 1;
419 } else {
420 return 0;
421 }
422 }
423
424 int ChannelIsOpen()
425 {
426 if ( m_vcHandle == NULL ) {
427 return 0;
428 } else {
429 return 1;
430 }
431 }
432
433 int WriteToChannel( PCHAR buffer )
434 {
435 PULONG bytesRead = 0;
436 PULONG pBytesWritten = 0;
437
438 BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
439
440 if ( result ) {
441 return 1;
442 } else {
443 return 0;
444 }
445 }

  ViewVC Help
Powered by ViewVC 1.1.26