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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 993 by astrand, Sun Aug 28 12:58:39 2005 UTC revision 999 by astrand, Tue Aug 30 09:18:53 2005 UTC
# Line 5  Line 5 
5  #include "hookdll.h"  #include "hookdll.h"
6  #include <windows.h>  #include <windows.h>
7  #include <winuser.h>  #include <winuser.h>
8    #include <stdio.h>
9    #include <stdarg.h>
10    
11  #include "wtsapi32.h"  #include "wtsapi32.h"
12  #include "Cchannel.h"  #include "Cchannel.h"
# Line 22  HWND hWnd = 0; Line 24  HWND hWnd = 0;
24    
25  #pragma comment(linker, "/section:SHAREDDATA,rws")  #pragma comment(linker, "/section:SHAREDDATA,rws")
26    
27    #define snprintf _snprintf
28    
29  bool bHooked = false;  bool bHooked = false;
30  bool bHooked2 = false;  bool bHooked2 = false;
31  bool bHooked3 = false;  bool bHooked3 = false;
32  HHOOK hhook = 0;                //cbt  HHOOK hhook = 0; //cbt
33  HHOOK hhook2 = 0;               //shell  HHOOK hhook2 = 0; //shell
34  HHOOK hhook3 = 0;               //wnd proc  HHOOK hhook3 = 0; //wnd proc
35  HINSTANCE hInst = 0;  HINSTANCE hInst = 0;
36  HANDLE m_vcHandle = 0;  HANDLE m_vcHandle = 0;
37    
38  BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call,  
39                         LPVOID lpReserved )  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 ) {      switch ( ul_reason_for_call ) {
60          case DLL_PROCESS_ATTACH: {          case DLL_PROCESS_ATTACH: {
# Line 67  LRESULT CALLBACK CallWndProc( int nCode, Line 89  LRESULT CALLBACK CallWndProc( int nCode,
89      char windowTitle[ 150 ] = { ""      char windowTitle[ 150 ] = { ""
90                                };                                };
91      HWND windowHandle = NULL;      HWND windowHandle = NULL;
92        HWND windowHandle2 = NULL;
93      char result[ 255 ] = { ""      char result[ 255 ] = { ""
94                           };                           };
95      char strWindowId[ 25 ];      char strWindowId[ 25 ];
96      char type[ 25 ];      char type[ 25 ];
97            
98      LONG b, t, l, r;      LONG b, t, l, r;
99      char strB[ 5 ];      char strX[ 5 ];
100      char strT[ 5 ];      char strY[ 5 ];
101      char strL[ 5 ];      char strW[ 5 ];
102      char strR[ 5 ];      char strH[ 5 ];
     RECT rect;  
103            
104      CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;      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 ) {      switch ( details->message ) {
111        
112          case WM_SIZING:          case WM_SIZING:
113          case WM_MOVING:          case WM_MOVING:
114            snprintf( result, sizeof( result ),
115                      "POSITION1,0x%x,%d,%d,%d,%d,0x%x",
116                      ( int ) details->hwnd,
117                      rect->left, rect->top,
118                      rect->right - rect->left,
119                      rect->bottom - rect->top,
120                      0 );
121            result[ sizeof( result ) - 1 ] = '\0';
122            buffer = result;
123                    
124          windowHandle = details->hwnd;          break;
         //get win name  
         GetWindowText( windowHandle, windowTitle, 150 );  
125                    
126          //get an id for it          /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are
127          itoa( ( int ) windowHandle, strWindowId, 10 );          strange. Sometimes, for example when bringing up the
128            Notepad About dialog, only an WM_WINDOWPOSCHANGING is
129            sent. In some other cases, for exmaple when opening
130            Format->Text in Notepad, both events are sent. Also, for
131            some reason, when closing the Notepad About dialog, an
132            WM_WINDOWPOSCHANGING event is sent which looks just like
133            the event that was sent when the About dialog was opened...  */
134            case WM_WINDOWPOSCHANGING:
135                    
136          //get coords          if ( !( dwStyle & WS_VISIBLE ) )
137          GetWindowRect( windowHandle, &rect );              break;
138          b = rect.bottom;              
139          t = rect.top;          if ( !( dwStyle & WS_DLGFRAME ) )
140          l = rect.left;              break;
141          r = rect.right;              
142          ltoa( b, strB, 10 );          if ( !( wp->flags & SWP_NOZORDER ) ) {
143          ltoa( t, strT, 10 );              snprintf( result, sizeof( result ),
144          ltoa( r, strR, 10 );                        "ZCHANGE1,0x%x,0x%x,0x%x\n",
145          ltoa( l, strL, 10 );                        details->hwnd,
146                          wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
147                          0 );
148                result[ sizeof( result ) - 1 ] = '\0';
149            }
150            buffer = result;
151                    
152          ////setup return string          break;
         strcat( result, "MSG=CALLWNDPROC_WM_MOVING;" );  
         strcat( result, "ID=" );  
         strcat( result, strWindowId );  
         strcat( result, ";" );  
         strcat( result, "TITLE=" );  
         strcat( result, windowTitle );  
         strcat( result, ";" );  
         strcat( result, "POS=" );  
         strcat( result, strL );  
         strcat( result, "~" );  
         strcat( result, strT );  
         strcat( result, "~" );  
         strcat( result, strR );  
         strcat( result, "~" );  
         strcat( result, strB );  
         strcat( result, ";" );  
153                    
154          buffer = result;          
155            case WM_CREATE:
156            if ( cs->style & WS_DLGFRAME ) {
157                sprintf( result, "DEBUG:WM_CREATE:%dx%d at %d,%d, title=%s, menu=%p, window=%p, WS_BORDER=%d, WS_DLGFRAME=%d, WS_POPUP=%d",
158                         cs->cx, cs->cy, cs->x, cs->y, cs->lpszName, cs->hMenu, details->hwnd,
159                         cs->style & WS_BORDER, cs->style & WS_DLGFRAME,
160                         cs->style & WS_POPUP );
161                buffer = result;
162            }
163            
164            break;
165            
166            
167            case WM_DESTROY:
168            if ( dwStyle & WS_DLGFRAME ) {
169                sprintf( result, "WM_DESTROY:%p", details->hwnd );
170                buffer = result;
171            }
172                    
173          break;          break;
174                    
# Line 158  LRESULT CALLBACK CbtProc( int nCode, WPA Line 205  LRESULT CALLBACK CbtProc( int nCode, WPA
205            
206            
207      LONG b, t, l, r;      LONG b, t, l, r;
208      char strB[ 5 ];      char strW[ 5 ];
209      char strT[ 5 ];      char strY[ 5 ];
210      char strL[ 5 ];      char strX[ 5 ];
211      char strR[ 5 ];      char strH[ 5 ];
212      RECT rect;      RECT rect;
213            
214      int i = 0;                  //tmp      int i = 0; //tmp
215            
216      switch ( nCode ) {      switch ( nCode ) {
217          case HCBT_MINMAX:          case HCBT_MINMAX:
# Line 191  LRESULT CALLBACK CbtProc( int nCode, WPA Line 238  LRESULT CALLBACK CbtProc( int nCode, WPA
238          t = rect.top;          t = rect.top;
239          l = rect.left;          l = rect.left;
240          r = rect.right;          r = rect.right;
241          ltoa( b, strB, 10 );          ltoa( b - t, strW, 10 );
242          ltoa( t, strT, 10 );          ltoa( t, strY, 10 );
243          ltoa( r, strR, 10 );          ltoa( r - l, strH, 10 );
244          ltoa( l, strL, 10 );          ltoa( l, strX, 10 );
245                    
246          //get name          //get name
247          GetWindowText( windowHandle, windowTitle, 150 );          GetWindowText( windowHandle, windowTitle, 150 );
248                    
249          ////setup return string          ////setup return string
250          strcat( result, "MSG=HCBT_MINMAX;" );          strcat( result, "MSG=HCBT_MINMAX;OP=4;" );
251            
252            // SW_SHOWNOACTIVATE=4  SW_SHOW=5  SW_MINIMIZE=6  SW_SHOWMINNOACTIVE=7  SW_SHOWNA=8  SW_RESTORE=9
253            // SW_SHOWDEFAULT=10  SW_FORCEMINIMIZE=11  SW_MAX=11
254          strcat( result, "ID=" );          strcat( result, "ID=" );
255          strcat( result, strWindowId );          strcat( result, strWindowId );
256          strcat( result, ";" );          strcat( result, ";" );
257          strcat( result, "TITLE=" );          strcat( result, "TITLE=" );
258          strcat( result, windowTitle );          strcat( result, windowTitle );
259          strcat( result, ";" );          strcat( result, ";" );
260          strcat( result, "POS=" );          strcat( result, "X=" );
261          strcat( result, strL );          strcat( result, strX );
262          strcat( result, "~" );          strcat( result, ";" );
263          strcat( result, strT );          strcat( result, "Y=" );
264          strcat( result, "~" );          strcat( result, strY );
265          strcat( result, strR );          strcat( result, ";" );
266          strcat( result, "~" );          strcat( result, "H=" );
267          strcat( result, strB );          strcat( result, strH );
268            strcat( result, ";" );
269            strcat( result, "W=" );
270            strcat( result, strW );
271          strcat( result, ";" );          strcat( result, ";" );
272          strcat( result, "TYPE=" );          strcat( result, "TYPE=" );
273          strcat( result, type );          strcat( result, type );
274          strcat( result, ";" );          strcat( result, "." );
275                    
276          //-------------------------------------------------------------------------------------------------          //-------------------------------------------------------------------------------------------------
277          // code to prevent minimising windows (can be removed once minimise has been implemented)          // code to prevent minimising windows (can be removed once minimise has been implemented)
278          i = ( int ) lParam;          //i = (int)lParam;
279          //if (i==0 || i==2 || i==6 || i==7 || i==8 || i==11)          //if (i==0 || i==2 || i==6 || i==7 || i==8 || i==11)
280          if ( i == 2 || i == 6 ) {          //if ( i==2 || i==6 )
281              MessageBox( 0,          //{
282                          "Minimising windows is not allowed in this version. Sorry!",          // MessageBox(0,"Minimising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
283                          "TS Window Clipper", MB_OK );          // return 1;
284              return 1;          //}
         }  
285          //-----------------------------------------------------------------------------------------          //-----------------------------------------------------------------------------------------
286                    
287          //-------------------------------------------------------------------------------------------------          //-------------------------------------------------------------------------------------------------
288          // code to prevent maximising windows (can be removed once maximise has been implemented)          // code to prevent maximising windows (can be removed once maximise has been implemented)
289          i = ( int ) lParam;          //i = (int)lParam;
290          //if (i==3 || i==9 || i==11)          //if (i==3 || i==9 || i==11)
291          if ( i == 3 || i == 11 ) {          //if (i==3 || i==11)
292              MessageBox( 0,          //{
293                          "Maximising windows is not allowed in this version. Sorry!",          // MessageBox(0,"Maximising windows is not allowed in this version. Sorry!","TS Window Clipper", MB_OK);
294                          "TS Window Clipper", MB_OK );          // return 1;
295              return 1;          //}
         }  
296          //-----------------------------------------------------------------------------------------          //-----------------------------------------------------------------------------------------
297                    
298          buffer = result;          buffer = result;
299                    
300          break;          break;
301                    
         case HCBT_MOVESIZE:  
           
         windowHandle = ( HWND ) wParam;  
         //get win name  
         GetWindowText( windowHandle, windowTitle, 150 );  
           
         //get an id for it  
         itoa( ( int ) windowHandle, strWindowId, 10 );  
           
         //get coords  
         GetWindowRect( windowHandle, &rect );  
         b = rect.bottom;  
         t = rect.top;  
         l = rect.left;  
         r = rect.right;  
         ltoa( b, strB, 10 );  
         ltoa( t, strT, 10 );  
         ltoa( r, strR, 10 );  
         ltoa( l, strL, 10 );  
           
         //get name  
         GetWindowText( windowHandle, windowTitle, 150 );  
           
         ////setup return string  
         strcat( result, "MSG=HCBT_MOVESIZE;" );  
         strcat( result, "ID=" );  
         strcat( result, strWindowId );  
         strcat( result, ";" );  
         strcat( result, "TITLE=" );  
         strcat( result, windowTitle );  
         strcat( result, ";" );  
         strcat( result, "POS=" );  
         strcat( result, strL );  
         strcat( result, "~" );  
         strcat( result, strT );  
         strcat( result, "~" );  
         strcat( result, strR );  
         strcat( result, "~" );  
         strcat( result, strB );  
         strcat( result, ";" );  
           
         buffer = result;  
           
         break;  
         case HCBT_SETFOCUS:  
         //buffer = "HCBT_SETFOCUS";  
         //not needed yet  
         break;  
302          default:          default:
303          break;          break;
304      }      }
# Line 326  LRESULT CALLBACK ShellProc( int nCode, W Line 329  LRESULT CALLBACK ShellProc( int nCode, W
329                               };                               };
330          char strWindowId[ 25 ];          char strWindowId[ 25 ];
331          LONG b, t, l, r;          LONG b, t, l, r;
332          char strB[ 5 ];          char strW[ 5 ];
333          char strT[ 5 ];          char strY[ 5 ];
334          char strL[ 5 ];          char strX[ 5 ];
335          char strR[ 5 ];          char strH[ 5 ];
336          RECT rect;          RECT rect;
337                    
338          switch ( nCode ) {          switch ( nCode ) {
# Line 345  LRESULT CALLBACK ShellProc( int nCode, W Line 348  LRESULT CALLBACK ShellProc( int nCode, W
348              t = rect.top;              t = rect.top;
349              l = rect.left;              l = rect.left;
350              r = rect.right;              r = rect.right;
351              ltoa( b, strB, 10 );              ltoa( b - t, strH, 10 );
352              ltoa( t, strT, 10 );              ltoa( t, strY, 10 );
353              ltoa( r, strR, 10 );              ltoa( r - l, strW, 10 );
354              ltoa( l, strL, 10 );              ltoa( l, strX, 10 );
355                            
356              //get name              //get name
357              GetWindowText( windowHandle, windowTitle, 150 );              GetWindowText( windowHandle, windowTitle, 150 );
358                            
359              ////setup return string              ////setup return string
360              strcat( result, "MSG=HSHELL_WINDOWCREATED;" );              strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
361              strcat( result, "ID=" );              strcat( result, "ID=" );
362              strcat( result, strWindowId );              strcat( result, strWindowId );
363              strcat( result, ";" );              strcat( result, ";" );
364              strcat( result, "TITLE=" );              strcat( result, "TITLE=" );
365              strcat( result, windowTitle );              strcat( result, windowTitle );
366              strcat( result, ";" );              strcat( result, ";" );
367              strcat( result, "POS=" );              strcat( result, "X=" );
368              strcat( result, strL );              strcat( result, strX );
369              strcat( result, "~" );              strcat( result, ";" );
370              strcat( result, strT );              strcat( result, "Y=" );
371              strcat( result, "~" );              strcat( result, strY );
             strcat( result, strR );  
             strcat( result, "~" );  
             strcat( result, strB );  
372              strcat( result, ";" );              strcat( result, ";" );
373                strcat( result, "H=" );
374                strcat( result, strH );
375                strcat( result, ";" );
376                strcat( result, "W=" );
377                strcat( result, strW );
378                strcat( result, "." );
379                            
380              buffer = result;              buffer = result;
381                            
# Line 381  LRESULT CALLBACK ShellProc( int nCode, W Line 387  LRESULT CALLBACK ShellProc( int nCode, W
387              windowHandle = ( HWND ) wParam;              windowHandle = ( HWND ) wParam;
388              itoa( ( int ) windowHandle, strWindowId, 10 );              itoa( ( int ) windowHandle, strWindowId, 10 );
389                            
390                //get coords
391                GetWindowRect( windowHandle, &rect );
392                b = rect.bottom;
393                t = rect.top;
394                l = rect.left;
395                r = rect.right;
396                ltoa( b - t, strH, 10 );
397                ltoa( t, strY, 10 );
398                ltoa( r - l, strW, 10 );
399                ltoa( l, strX, 10 );
400                
401              //get name              //get name
402              GetWindowText( windowHandle, windowTitle, 150 );              GetWindowText( windowHandle, windowTitle, 150 );
403                            
404              ////setup return string              ////setup return string
405              strcat( result, "MSG=HSHELL_WINDOWDESTROYED;" );              strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );
406              strcat( result, "ID=" );              strcat( result, "ID=" );
407              strcat( result, strWindowId );              strcat( result, strWindowId );
408              strcat( result, ";" );              strcat( result, ";" );
409              strcat( result, "TITLE=" );              strcat( result, "TITLE=" );
410              strcat( result, windowTitle );              strcat( result, windowTitle );
411              strcat( result, ";" );              strcat( result, ";" );
412                strcat( result, "X=" );
413                strcat( result, strX );
414                strcat( result, ";" );
415                strcat( result, "Y=" );
416                strcat( result, strY );
417                strcat( result, ";" );
418                strcat( result, "H=" );
419                strcat( result, strH );
420                strcat( result, ";" );
421                strcat( result, "W=" );
422                strcat( result, strW );
423                strcat( result, "." );
424                            
425              buffer = result;              buffer = result;
426                            
# Line 411  LRESULT CALLBACK ShellProc( int nCode, W Line 440  LRESULT CALLBACK ShellProc( int nCode, W
440  DLL_EXPORT void SetCbtHook( void )  DLL_EXPORT void SetCbtHook( void )
441  {  {
442      if ( !bHooked ) {      if ( !bHooked ) {
443          hhook =          hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );  
444          bHooked = true;          bHooked = true;
445      }      }
446            
447      if ( !bHooked2 ) {      if ( !bHooked2 ) {
448          hhook2 =          hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst,  
                               ( DWORD ) NULL );  
449          bHooked2 = true;          bHooked2 = true;
450      }      }
451            
452      if ( !bHooked3 ) {      if ( !bHooked3 ) {
453          hhook3 =          hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst,  
                               ( DWORD ) NULL );  
454          bHooked3 = true;          bHooked3 = true;
455      }      }
456  }  }
# Line 456  DLL_EXPORT int GetInstanceCount() Line 480  DLL_EXPORT int GetInstanceCount()
480    
481  int OpenVirtualChannel()  int OpenVirtualChannel()
482  {  {
483      m_vcHandle =      m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME );
484          WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION,      
                                CHANNELNAME );  
                                 
485      if ( m_vcHandle == NULL ) {      if ( m_vcHandle == NULL ) {
486          return 0;          return 0;
487      } else {      } else {
# Line 494  int WriteToChannel( PCHAR buffer ) Line 516  int WriteToChannel( PCHAR buffer )
516      PULONG bytesRead = 0;      PULONG bytesRead = 0;
517      PULONG pBytesWritten = 0;      PULONG pBytesWritten = 0;
518            
519      BOOL result =      BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
520          WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ),      
                                 pBytesWritten );  
                                   
521      if ( result ) {      if ( result ) {
522          return 1;          return 1;
523      } else {      } else {

Legend:
Removed from v.993  
changed lines
  Added in v.999

  ViewVC Help
Powered by ViewVC 1.1.26