/[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 1003 - (show annotations)
Tue Aug 30 11:22:46 2005 UTC (18 years, 10 months ago) by astrand
File size: 11217 byte(s)
Got rid of unnecessary buffer variables.

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

  ViewVC Help
Powered by ViewVC 1.1.26