/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 930 - (hide annotations)
Thu Jun 30 14:14:56 2005 UTC (18 years, 11 months ago) by astrand
File size: 10893 byte(s)
Should have UNIX LF linebreaks, when running CVS from UNIX.

1 astrand 930 //*********************************************************************************
2     //
3     //Title: Terminal Services Window Clipper
4     //
5     //Author: Martin Wickett
6     //
7     //Date: 2004
8     //
9     //*********************************************************************************
10    
11     #include "hookdll.h"
12     #include <windows.h>
13     #include <winuser.h>
14    
15     #include "wtsapi32.h"
16     #include "Cchannel.h"
17    
18     #define DLL_EXPORT extern "C" __declspec(dllexport)
19    
20     // Shared DATA
21     #pragma data_seg ( "SHAREDDATA" )
22    
23     // this is the total number of processes this dll is currently attached to
24     int iInstanceCount = 0;
25     HWND hWnd = 0;
26    
27     #pragma data_seg ()
28    
29     #pragma comment(linker, "/section:SHAREDDATA,rws")
30    
31     bool bHooked = false;
32     bool bHooked2 = false;
33     bool bHooked3 = false;
34     HHOOK hhook = 0;//cbt
35     HHOOK hhook2 = 0;//shell
36     HHOOK hhook3 = 0;//wnd proc
37     HINSTANCE hInst = 0;
38     HANDLE m_vcHandle = 0;
39    
40     BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved )
41     {
42     switch (ul_reason_for_call)
43     {
44     case DLL_PROCESS_ATTACH:
45     {
46     // remember our instance handle
47     hInst = hinstDLL;
48     ++iInstanceCount;
49     OpenVirtualChannel();
50     break;
51     }
52    
53     case DLL_THREAD_ATTACH:
54     break;
55     case DLL_THREAD_DETACH:
56     break;
57     case DLL_PROCESS_DETACH:
58     {
59     --iInstanceCount;
60     CloseVirtualChannel();
61     }
62     break;
63     }
64    
65     return TRUE;
66     }
67    
68     LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam )
69     {
70     if (nCode<0)
71     {
72     return CallNextHookEx(hhook3, nCode, wParam, lParam);
73     }
74    
75     PCHAR buffer = NULL;
76     char windowTitle[150] = {""};
77     HWND windowHandle = NULL;
78     char result[255] = {""};
79     char strWindowId[25];
80     char type[25];
81    
82     LONG b,t,l,r;
83     char strB[5];
84     char strT[5];
85     char strL[5];
86     char strR[5];
87     RECT rect;
88    
89     CWPSTRUCT* details = (CWPSTRUCT*) lParam;
90    
91     switch( details->message )
92     {
93     case WM_SIZING:
94     case WM_MOVING:
95    
96     windowHandle = details->hwnd;
97     //get win name
98     GetWindowText(windowHandle,windowTitle,150);
99    
100     //get an id for it
101     itoa((int)windowHandle, strWindowId, 10);
102    
103     //get coords
104     GetWindowRect(windowHandle,&rect);
105     b = rect.bottom;
106     t = rect.top;
107     l = rect.left;
108     r = rect.right;
109     ltoa(b,strB,10);
110     ltoa(t,strT,10);
111     ltoa(r,strR,10);
112     ltoa(l,strL,10);
113    
114     ////setup return string
115     strcat(result, "MSG=CALLWNDPROC_WM_MOVING;");
116     strcat( result, "ID=" );
117     strcat( result, strWindowId );
118     strcat( result, ";" );
119     strcat( result, "TITLE=" );
120     strcat( result, windowTitle);
121     strcat( result, ";" );
122     strcat( result, "POS=" );
123     strcat( result, strL);
124     strcat( result, "~");
125     strcat( result, strT);
126     strcat( result, "~");
127     strcat( result, strR);
128     strcat( result, "~");
129     strcat( result, strB);
130     strcat( result, ";" );
131    
132     buffer = result;
133    
134     break;
135    
136     default:
137     break;
138     }
139    
140     if (ChannelIsOpen())
141     {
142     if ( buffer != NULL)
143     {
144     WriteToChannel(buffer);
145     }
146     }
147    
148     return CallNextHookEx(hhook3, nCode, wParam, lParam);
149     }
150    
151     LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam )
152     {
153     if (nCode<0)
154     {
155     return CallNextHookEx(hhook, nCode, wParam, lParam);
156     }
157    
158    
159     PCHAR buffer = NULL;
160    
161    
162     char windowTitle[150] = {""};
163     HWND windowHandle = NULL;
164     char result[255] = {""};
165     char strWindowId[25];
166     char type[25];
167    
168    
169     LONG b,t,l,r;
170     char strB[5];
171     char strT[5];
172     char strL[5];
173     char strR[5];
174     RECT rect;
175    
176     int i = 0;//tmp
177    
178     switch( nCode )
179     {
180     case HCBT_MINMAX:
181    
182     windowHandle = (HWND)wParam;
183     //get win name
184     GetWindowText(windowHandle,windowTitle,150);
185    
186     //get an id for it
187     itoa((int)windowHandle, strWindowId, 10);
188    
189     //get operation type(min,max). if max, do not clip at all,if min use window's previous coords
190     //codes are:
191    
192     // SW_HIDE= 0 SW_SHOWNORMAL=1 SW_NORMAL=1 SW_SHOWMINIMIZED=2 SW_SHOWMAXIMIZED=3 SW_MAXIMIZE=3
193     // SW_SHOWNOACTIVATE=4 SW_SHOW=5 SW_MINIMIZE=6 SW_SHOWMINNOACTIVE=7 SW_SHOWNA=8 SW_RESTORE=9
194     // SW_SHOWDEFAULT=10 SW_FORCEMINIMIZE=11 SW_MAX=11
195    
196     itoa((int)lParam, type, 10);
197    
198     //get coords
199     GetWindowRect(windowHandle,&rect);
200     b = rect.bottom;
201     t = rect.top;
202     l = rect.left;
203     r = rect.right;
204     ltoa(b,strB,10);
205     ltoa(t,strT,10);
206     ltoa(r,strR,10);
207     ltoa(l,strL,10);
208    
209     //get name
210     GetWindowText(windowHandle,windowTitle,150);
211    
212     ////setup return string
213     strcat(result, "MSG=HCBT_MINMAX;");
214     strcat( result, "ID=" );
215     strcat( result, strWindowId );
216     strcat( result, ";" );
217     strcat( result, "TITLE=" );
218     strcat( result, windowTitle);
219     strcat( result, ";" );
220     strcat( result, "POS=" );
221     strcat( result, strL);
222     strcat( result, "~");
223     strcat( result, strT);
224     strcat( result, "~");
225     strcat( result, strR);
226     strcat( result, "~");
227     strcat( result, strB);
228     strcat( result, ";" );
229     strcat( result, "TYPE=" );
230     strcat( result, type );
231     strcat( result, ";" );
232    
233     //-------------------------------------------------------------------------------------------------
234     // code to prevent minimising windows (can be removed once minimise has been implemented)
235     i = (int)lParam;
236     //if (i==0 || i==2 || i==6 || i==7 || i==8 || i==11)
237     if ( i==2 || i==6 )
238     {
239     MessageBox(0,"Minimising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
240     return 1;
241     }
242     //-----------------------------------------------------------------------------------------
243    
244     //-------------------------------------------------------------------------------------------------
245     // code to prevent maximising windows (can be removed once maximise has been implemented)
246     i = (int)lParam;
247     //if (i==3 || i==9 || i==11)
248     if (i==3 || i==11)
249     {
250     MessageBox(0,"Maximising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
251     return 1;
252     }
253     //-----------------------------------------------------------------------------------------
254    
255     buffer = result;
256    
257     break;
258    
259     case HCBT_MOVESIZE:
260    
261     windowHandle = (HWND)wParam;
262     //get win name
263     GetWindowText(windowHandle,windowTitle,150);
264    
265     //get an id for it
266     itoa((int)windowHandle, strWindowId, 10);
267    
268     //get coords
269     GetWindowRect(windowHandle,&rect);
270     b = rect.bottom;
271     t = rect.top;
272     l = rect.left;
273     r = rect.right;
274     ltoa(b,strB,10);
275     ltoa(t,strT,10);
276     ltoa(r,strR,10);
277     ltoa(l,strL,10);
278    
279     //get name
280     GetWindowText(windowHandle,windowTitle,150);
281    
282     ////setup return string
283     strcat(result, "MSG=HCBT_MOVESIZE;");
284     strcat( result, "ID=" );
285     strcat( result, strWindowId );
286     strcat( result, ";" );
287     strcat( result, "TITLE=" );
288     strcat( result, windowTitle);
289     strcat( result, ";" );
290     strcat( result, "POS=" );
291     strcat( result, strL);
292     strcat( result, "~");
293     strcat( result, strT);
294     strcat( result, "~");
295     strcat( result, strR);
296     strcat( result, "~");
297     strcat( result, strB);
298     strcat( result, ";" );
299    
300     buffer = result;
301    
302     break;
303     case HCBT_SETFOCUS:
304     //buffer = "HCBT_SETFOCUS";
305     //not needed yet
306     break;
307     default:
308     break;
309     }
310    
311     if (ChannelIsOpen())
312     {
313     if ( buffer != NULL)
314     {
315     WriteToChannel(buffer);
316     }
317     }
318    
319     return CallNextHookEx(hhook, nCode, wParam, lParam);
320     }
321    
322    
323     LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam )
324     {
325     if (nCode<0)
326     {
327     return CallNextHookEx(hhook, nCode, wParam, lParam);
328     }
329    
330     if (ChannelIsOpen())
331     {
332     PCHAR buffer = NULL;
333    
334     char windowTitle[150] = {""};
335     HWND windowHandle = NULL;
336     char result[255] = {""};
337     char strWindowId[25];
338     LONG b,t,l,r;
339     char strB[5];
340     char strT[5];
341     char strL[5];
342     char strR[5];
343     RECT rect;
344    
345     switch( nCode )
346     {
347     case HSHELL_WINDOWCREATED:
348    
349     //get window id
350     windowHandle = (HWND) wParam;
351     itoa((int)windowHandle, strWindowId, 10);
352    
353     //get coords
354     GetWindowRect(windowHandle,&rect);
355     b = rect.bottom;
356     t = rect.top;
357     l = rect.left;
358     r = rect.right;
359     ltoa(b,strB,10);
360     ltoa(t,strT,10);
361     ltoa(r,strR,10);
362     ltoa(l,strL,10);
363    
364     //get name
365     GetWindowText(windowHandle,windowTitle,150);
366    
367     ////setup return string
368     strcat(result, "MSG=HSHELL_WINDOWCREATED;");
369     strcat( result, "ID=" );
370     strcat( result, strWindowId );
371     strcat( result, ";" );
372     strcat( result, "TITLE=" );
373     strcat( result, windowTitle);
374     strcat( result, ";" );
375     strcat( result, "POS=" );
376     strcat( result, strL);
377     strcat( result, "~");
378     strcat( result, strT);
379     strcat( result, "~");
380     strcat( result, strR);
381     strcat( result, "~");
382     strcat( result, strB);
383     strcat( result, ";" );
384    
385     buffer = result;
386    
387     break;
388    
389     case HSHELL_WINDOWDESTROYED:
390    
391     //get window id
392     windowHandle = (HWND) wParam;
393     itoa((int)windowHandle, strWindowId, 10);
394    
395     //get name
396     GetWindowText(windowHandle,windowTitle,150);
397    
398     ////setup return string
399     strcat(result, "MSG=HSHELL_WINDOWDESTROYED;");
400     strcat( result, "ID=" );
401     strcat( result, strWindowId );
402     strcat( result, ";" );
403     strcat( result, "TITLE=" );
404     strcat( result, windowTitle);
405     strcat( result, ";" );
406    
407     buffer = result;
408    
409     break;
410     default:
411     break;
412     }
413    
414     if ( buffer != NULL)
415     {
416     WriteToChannel(buffer);
417     }
418     }
419    
420     return CallNextHookEx(hhook, nCode, wParam, lParam);
421     }
422    
423     DLL_EXPORT void SetCbtHook(void)
424     {
425     if (!bHooked)
426     {
427     hhook = SetWindowsHookEx(WH_CBT, (HOOKPROC)CbtProc, hInst, (DWORD)NULL);
428     bHooked = true;
429     }
430    
431     if (!bHooked2)
432     {
433     hhook2 = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, hInst, (DWORD)NULL);
434     bHooked2 = true;
435     }
436    
437     if (!bHooked3)
438     {
439     hhook3 = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, hInst, (DWORD)NULL);
440     bHooked3 = true;
441     }
442     }
443    
444     DLL_EXPORT void RemoveCbtHook(void)
445     {
446     if(bHooked)
447     {
448     UnhookWindowsHookEx(hhook);
449     bHooked = false;
450     }
451    
452     if(bHooked2)
453     {
454     UnhookWindowsHookEx(hhook2);
455     bHooked2 = false;
456     }
457    
458     if(bHooked3)
459     {
460     UnhookWindowsHookEx(hhook3);
461     bHooked3 = false;
462     }
463     }
464    
465     DLL_EXPORT int GetInstanceCount()
466     {
467     return iInstanceCount;
468     }
469    
470     int OpenVirtualChannel()
471     {
472     m_vcHandle = WTSVirtualChannelOpen(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,CHANNELNAME);
473    
474     if (m_vcHandle==NULL)
475     {
476     return 0;
477     }
478     else
479     {
480     return 1;
481     }
482     }
483    
484     int CloseVirtualChannel()
485     {
486     BOOL result = WTSVirtualChannelClose(m_vcHandle);
487    
488     m_vcHandle = NULL;
489    
490     if (result)
491     {
492     return 1;
493     }
494     else
495     {
496     return 0;
497     }
498     }
499    
500     int ChannelIsOpen()
501     {
502     if (m_vcHandle==NULL)
503     {
504     return 0;
505     }
506     else
507     {
508     return 1;
509     }
510     }
511    
512     int WriteToChannel(PCHAR buffer)
513     {
514     PULONG bytesRead = 0;
515     PULONG pBytesWritten = 0;
516    
517     BOOL result = WTSVirtualChannelWrite(m_vcHandle,buffer,(ULONG) strlen(buffer),pBytesWritten);
518    
519     if (result)
520     {
521     return 1;
522     }
523     else
524     {
525     return 0;
526     }
527     }

  ViewVC Help
Powered by ViewVC 1.1.26