/[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 1002 by astrand, Tue Aug 30 11:17:52 2005 UTC revision 1011 by astrand, Wed Aug 31 15:36:59 2005 UTC
# Line 26  HWND hWnd = 0; Line 26  HWND hWnd = 0;
26    
27  #define snprintf _snprintf  #define snprintf _snprintf
28    
29  bool bHooked = false;  HHOOK hCbtProc = 0;
30  bool bHooked2 = false;  HHOOK hShellProc = 0;
31  bool bHooked3 = false;  HHOOK hWndProc = 0;
 HHOOK hhook = 0; //cbt  
 HHOOK hhook2 = 0; //shell  
 HHOOK hhook3 = 0; //wnd proc  
32  HINSTANCE hInst = 0;  HINSTANCE hInst = 0;
33  HANDLE m_vcHandle = 0;  HANDLE m_vcHandle = 0;
34    
# Line 45  void SendDebug( char *format, ... ) Line 42  void SendDebug( char *format, ... )
42      vsprintf( buf, format, argp );      vsprintf( buf, format, argp );
43      va_end( argp );      va_end( argp );
44            
45      if ( ChannelIsOpen() ) {      WriteToChannel( "DEBUG1," );
46          WriteToChannel( "DEBUG1," );      WriteToChannel( buf );
47          WriteToChannel( buf );      WriteToChannel( "\n" );
         WriteToChannel( "\n" );  
     }  
48  }  }
49    
50    
# Line 82  BOOL APIENTRY DllMain( HINSTANCE hinstDL Line 77  BOOL APIENTRY DllMain( HINSTANCE hinstDL
77  LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )  LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
78  {  {
79      if ( nCode < 0 ) {      if ( nCode < 0 ) {
80          return CallNextHookEx( hhook3, nCode, wParam, lParam );          return CallNextHookEx( hWndProc, nCode, wParam, lParam );
81      }      }
82            
     PCHAR buffer = NULL;  
83      char windowTitle[ 150 ] = { ""      char windowTitle[ 150 ] = { ""
84                                };                                };
85      HWND windowHandle = NULL;      HWND windowHandle = NULL;
# Line 109  LRESULT CALLBACK CallWndProc( int nCode, Line 103  LRESULT CALLBACK CallWndProc( int nCode,
103              break;              break;
104                            
105          snprintf( result, sizeof( result ),          snprintf( result, sizeof( result ),
106                    "POSITION1,0x%p,%d,%d,%d,%d,0x%x",                    "POSITION1,0x%p,%d,%d,%d,%d,0x%x\n",
107                    details->hwnd,                    details->hwnd,
108                    rect->left, rect->top,                    rect->left, rect->top,
109                    rect->right - rect->left,                    rect->right - rect->left,
110                    rect->bottom - rect->top,                    rect->bottom - rect->top,
111                    0 );                    0 );
112          result[ sizeof( result ) - 1 ] = '\0';          result[ sizeof( result ) - 1 ] = '\0';
113          buffer = result;          WriteToChannel( result );
114          break;          break;
115                    
116                    
# Line 143  LRESULT CALLBACK CallWndProc( int nCode, Line 137  LRESULT CALLBACK CallWndProc( int nCode,
137                        wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,                        wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
138                        0 );                        0 );
139              result[ sizeof( result ) - 1 ] = '\0';              result[ sizeof( result ) - 1 ] = '\0';
140              buffer = result;              WriteToChannel( result );
141          }          }
142          break;          break;
143                    
144                    
145          case WM_CREATE:          case WM_CREATE:
146          if ( cs->style & WS_DLGFRAME ) {          if ( cs->style & WS_DLGFRAME ) {
147            
148              snprintf( result, sizeof( result ),              snprintf( result, sizeof( result ),
149                        "CREATE1,0x%p,0x%x\n",                        "CREATE1,0x%p,0x%x\n",
150                        details->hwnd, 0 );                        details->hwnd, 0 );
151              buffer = result;              result[ sizeof( result ) - 1 ] = '\0';
152                WriteToChannel( result );
153                
154                snprintf( result, sizeof( result ),
155                          "SETSTATE1,0x%p,%s,0x%x,0x%x\n",
156                          details->hwnd,
157                          cs->lpszName,
158                          1,       // FIXME: Check for WS_MAXIMIZE/WS_MINIMIZE
159                          0 );
160                result[ sizeof( result ) - 1 ] = '\0';
161                WriteToChannel( result );
162                
163                snprintf( result, sizeof( result ),
164                          "POSITION1,0x%p,%d,%d,%d,%d,0x%x\n",
165                          details->hwnd,
166                          cs->x,
167                          cs->y,
168                          cs->cx,
169                          cs->cy,
170                          0 );
171                result[ sizeof( result ) - 1 ] = '\0';
172                WriteToChannel( result );
173                
174          }          }
175          break;          break;
176                    
# Line 163  LRESULT CALLBACK CallWndProc( int nCode, Line 180  LRESULT CALLBACK CallWndProc( int nCode,
180              snprintf( result, sizeof( result ),              snprintf( result, sizeof( result ),
181                        "DESTROY1,0x%p,0x%x\n",                        "DESTROY1,0x%p,0x%x\n",
182                        details->hwnd, 0 );                        details->hwnd, 0 );
183              buffer = result;              result[ sizeof( result ) - 1 ] = '\0';
184                WriteToChannel( result );
185          }          }
186                    
187          break;          break;
# Line 173  LRESULT CALLBACK CallWndProc( int nCode, Line 191  LRESULT CALLBACK CallWndProc( int nCode,
191          break;          break;
192      }      }
193            
194      if ( ChannelIsOpen() ) {      return CallNextHookEx( hWndProc, nCode, wParam, lParam );
         if ( buffer != NULL ) {  
             WriteToChannel( buffer );  
         }  
     }  
       
     return CallNextHookEx( hhook3, nCode, wParam, lParam );  
195  }  }
196    
197  LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam )  LRESULT CALLBACK CbtProc( int nCode, WPARAM wParam, LPARAM lParam )
198  {  {
199      if ( nCode < 0 ) {      if ( nCode < 0 ) {
200          return CallNextHookEx( hhook, nCode, wParam, lParam );          return CallNextHookEx( hCbtProc, nCode, wParam, lParam );
201      }      }
202            
       
     PCHAR buffer = NULL;  
       
       
203      char windowTitle[ 150 ] = { ""      char windowTitle[ 150 ] = { ""
204                                };                                };
205      HWND windowHandle = NULL;      HWND windowHandle = NULL;
# Line 214  LRESULT CALLBACK CbtProc( int nCode, WPA Line 222  LRESULT CALLBACK CbtProc( int nCode, WPA
222                    windowTitle,                    windowTitle,
223                    LOWORD( lParam ),                    LOWORD( lParam ),
224                    0 );                    0 );
225          buffer = result;          result[ sizeof( result ) - 1 ] = '\0';
226            WriteToChannel( result );
227          break;          break;
228                    
229                    
# Line 222  LRESULT CALLBACK CbtProc( int nCode, WPA Line 231  LRESULT CALLBACK CbtProc( int nCode, WPA
231          break;          break;
232      }      }
233            
     if ( ChannelIsOpen() ) {  
         if ( buffer != NULL ) {  
             WriteToChannel( buffer );  
         }  
     }  
234            
235      return CallNextHookEx( hhook, nCode, wParam, lParam );      
236        return CallNextHookEx( hCbtProc, nCode, wParam, lParam );
237  }  }
238    
239    
240  LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )  LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
241  {  {
242      if ( nCode < 0 ) {      if ( nCode < 0 ) {
243          return CallNextHookEx( hhook, nCode, wParam, lParam );          return CallNextHookEx( hShellProc, nCode, wParam, lParam );
244      }      }
245            
246      if ( ChannelIsOpen() ) {      char windowTitle[ 150 ] = { ""
247          PCHAR buffer = NULL;                                };
248        HWND windowHandle = NULL;
249        char result[ 255 ] = { ""
250                             };
251        char strWindowId[ 25 ];
252        LONG b, t, l, r;
253        char strW[ 5 ];
254        char strY[ 5 ];
255        char strX[ 5 ];
256        char strH[ 5 ];
257        RECT rect;
258        
259        switch ( nCode ) {
260            case HSHELL_WINDOWCREATED:
261                    
262          char windowTitle[ 150 ] = { ""          //get window id
263                                    };          windowHandle = ( HWND ) wParam;
264          HWND windowHandle = NULL;          itoa( ( int ) windowHandle, strWindowId, 10 );
265          char result[ 255 ] = { ""          
266                               };          //get coords
267          char strWindowId[ 25 ];          GetWindowRect( windowHandle, &rect );
268          LONG b, t, l, r;          b = rect.bottom;
269          char strW[ 5 ];          t = rect.top;
270          char strY[ 5 ];          l = rect.left;
271          char strX[ 5 ];          r = rect.right;
272          char strH[ 5 ];          ltoa( b - t, strH, 10 );
273          RECT rect;          ltoa( t, strY, 10 );
274            ltoa( r - l, strW, 10 );
275            ltoa( l, strX, 10 );
276            
277            //get name
278            GetWindowText( windowHandle, windowTitle, 150 );
279            
280            ////setup return string
281            strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
282            strcat( result, "ID=" );
283            strcat( result, strWindowId );
284            strcat( result, ";" );
285            strcat( result, "TITLE=" );
286            strcat( result, windowTitle );
287            strcat( result, ";" );
288            strcat( result, "X=" );
289            strcat( result, strX );
290            strcat( result, ";" );
291            strcat( result, "Y=" );
292            strcat( result, strY );
293            strcat( result, ";" );
294            strcat( result, "H=" );
295            strcat( result, strH );
296            strcat( result, ";" );
297            strcat( result, "W=" );
298            strcat( result, strW );
299            strcat( result, "." );
300            WriteToChannel( result );
301            break;
302                    
303          switch ( nCode ) {          case HSHELL_WINDOWDESTROYED:
             case HSHELL_WINDOWCREATED:  
               
             //get window id  
             windowHandle = ( HWND ) wParam;  
             itoa( ( int ) windowHandle, strWindowId, 10 );  
               
             //get coords  
             GetWindowRect( windowHandle, &rect );  
             b = rect.bottom;  
             t = rect.top;  
             l = rect.left;  
             r = rect.right;  
             ltoa( b - t, strH, 10 );  
             ltoa( t, strY, 10 );  
             ltoa( r - l, strW, 10 );  
             ltoa( l, strX, 10 );  
               
             //get name  
             GetWindowText( windowHandle, windowTitle, 150 );  
               
             ////setup return string  
             strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );  
             strcat( result, "ID=" );  
             strcat( result, strWindowId );  
             strcat( result, ";" );  
             strcat( result, "TITLE=" );  
             strcat( result, windowTitle );  
             strcat( result, ";" );  
             strcat( result, "X=" );  
             strcat( result, strX );  
             strcat( result, ";" );  
             strcat( result, "Y=" );  
             strcat( result, strY );  
             strcat( result, ";" );  
             strcat( result, "H=" );  
             strcat( result, strH );  
             strcat( result, ";" );  
             strcat( result, "W=" );  
             strcat( result, strW );  
             strcat( result, "." );  
               
             buffer = result;  
               
             break;  
               
             case HSHELL_WINDOWDESTROYED:  
               
             //get window id  
             windowHandle = ( HWND ) wParam;  
             itoa( ( int ) windowHandle, strWindowId, 10 );  
               
             //get coords  
             GetWindowRect( windowHandle, &rect );  
             b = rect.bottom;  
             t = rect.top;  
             l = rect.left;  
             r = rect.right;  
             ltoa( b - t, strH, 10 );  
             ltoa( t, strY, 10 );  
             ltoa( r - l, strW, 10 );  
             ltoa( l, strX, 10 );  
               
             //get name  
             GetWindowText( windowHandle, windowTitle, 150 );  
               
             ////setup return string  
             strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );  
             strcat( result, "ID=" );  
             strcat( result, strWindowId );  
             strcat( result, ";" );  
             strcat( result, "TITLE=" );  
             strcat( result, windowTitle );  
             strcat( result, ";" );  
             strcat( result, "X=" );  
             strcat( result, strX );  
             strcat( result, ";" );  
             strcat( result, "Y=" );  
             strcat( result, strY );  
             strcat( result, ";" );  
             strcat( result, "H=" );  
             strcat( result, strH );  
             strcat( result, ";" );  
             strcat( result, "W=" );  
             strcat( result, strW );  
             strcat( result, "." );  
               
             buffer = result;  
               
             break;  
             default:  
             break;  
         }  
304                    
305          if ( buffer != NULL ) {          //get window id
306              WriteToChannel( buffer );          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            WriteToChannel( result );
344            break;
345            
346            
347            default:
348            break;
349      }      }
350            
351      return CallNextHookEx( hhook, nCode, wParam, lParam );      
352        return CallNextHookEx( hShellProc, nCode, wParam, lParam );
353  }  }
354    
355  DLL_EXPORT void SetCbtHook( void )  DLL_EXPORT void SetHooks( void )
356  {  {
357      if ( !bHooked ) {      if ( !hCbtProc ) {
358          hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );          hCbtProc = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
         bHooked = true;  
359      }      }
360            
361      if ( !bHooked2 ) {  #if 0
362          hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );      if ( !hShellProc ) {
363          bHooked2 = true;          hShellProc = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
364      }      }
365    #endif
366            
367      if ( !bHooked3 ) {      if ( !hWndProc ) {
368          hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );          hWndProc = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
         bHooked3 = true;  
369      }      }
370  }  }
371    
372  DLL_EXPORT void RemoveCbtHook( void )  DLL_EXPORT void RemoveHooks( void )
373  {  {
374      if ( bHooked ) {      if ( hCbtProc ) {
375          UnhookWindowsHookEx( hhook );          UnhookWindowsHookEx( hCbtProc );
         bHooked = false;  
376      }      }
377            
378      if ( bHooked2 ) {      if ( hShellProc ) {
379          UnhookWindowsHookEx( hhook2 );          UnhookWindowsHookEx( hShellProc );
         bHooked2 = false;  
380      }      }
381            
382      if ( bHooked3 ) {      if ( hWndProc ) {
383          UnhookWindowsHookEx( hhook3 );          UnhookWindowsHookEx( hWndProc );
         bHooked3 = false;  
384      }      }
385  }  }
386    
# Line 435  int WriteToChannel( PCHAR buffer ) Line 427  int WriteToChannel( PCHAR buffer )
427      PULONG bytesRead = 0;      PULONG bytesRead = 0;
428      PULONG pBytesWritten = 0;      PULONG pBytesWritten = 0;
429            
430        if ( !ChannelIsOpen() )
431            return 1;
432            
433      BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );      BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
434            
435      if ( result ) {      if ( result ) {

Legend:
Removed from v.1002  
changed lines
  Added in v.1011

  ViewVC Help
Powered by ViewVC 1.1.26