/[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 1007 by astrand, Tue Aug 30 12:04:08 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        WriteToChannel( "DEBUG1," );
49        WriteToChannel( buf );
50        WriteToChannel( "\n" );
51    }
52    
53    
54    
55    BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved )
56  {  {
57      switch ( ul_reason_for_call ) {      switch ( ul_reason_for_call ) {
58          case DLL_PROCESS_ATTACH: {          case DLL_PROCESS_ATTACH: {
# Line 63  LRESULT CALLBACK CallWndProc( int nCode, Line 83  LRESULT CALLBACK CallWndProc( int nCode,
83          return CallNextHookEx( hhook3, nCode, wParam, lParam );          return CallNextHookEx( hhook3, nCode, wParam, lParam );
84      }      }
85            
     PCHAR buffer = NULL;  
86      char windowTitle[ 150 ] = { ""      char windowTitle[ 150 ] = { ""
87                                };                                };
88      HWND windowHandle = NULL;      HWND windowHandle = NULL;
89        HWND windowHandle2 = NULL;
90      char result[ 255 ] = { ""      char result[ 255 ] = { ""
91                           };                           };
     char strWindowId[ 25 ];  
     char type[ 25 ];  
       
     LONG b, t, l, r;  
     char strB[ 5 ];  
     char strT[ 5 ];  
     char strL[ 5 ];  
     char strR[ 5 ];  
     RECT rect;  
       
92      CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;      CWPSTRUCT *details = ( CWPSTRUCT * ) lParam;
93        CREATESTRUCT *cs = ( CREATESTRUCT * ) details->lParam;
94        LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE );
95        WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam;
96        RECT *rect = ( RECT * ) details->lParam;
97            
98      switch ( details->message ) {      switch ( details->message ) {
99        
100          case WM_SIZING:          case WM_SIZING:
101          case WM_MOVING:          case WM_MOVING:
102            if ( !( dwStyle & WS_VISIBLE ) )
103                break;
104                
105            if ( !( dwStyle & WS_DLGFRAME ) )
106                break;
107                
108            snprintf( result, sizeof( result ),
109                      "POSITION1,0x%p,%d,%d,%d,%d,0x%x",
110                      details->hwnd,
111                      rect->left, rect->top,
112                      rect->right - rect->left,
113                      rect->bottom - rect->top,
114                      0 );
115            result[ sizeof( result ) - 1 ] = '\0';
116            WriteToChannel( result );
117            break;
118                    
         windowHandle = details->hwnd;  
         //get win name  
         GetWindowText( windowHandle, windowTitle, 150 );  
119                    
120          //get an id for it          /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are
121          itoa( ( int ) windowHandle, strWindowId, 10 );          strange. Sometimes, for example when bringing up the
122            Notepad About dialog, only an WM_WINDOWPOSCHANGING is
123            sent. In some other cases, for exmaple when opening
124            Format->Text in Notepad, both events are sent. Also, for
125            some reason, when closing the Notepad About dialog, an
126            WM_WINDOWPOSCHANGING event is sent which looks just like
127            the event that was sent when the About dialog was opened...  */
128            case WM_WINDOWPOSCHANGING:
129                    
130          //get coords          if ( !( dwStyle & WS_VISIBLE ) )
131          GetWindowRect( windowHandle, &rect );              break;
132          b = rect.bottom;              
133          t = rect.top;          if ( !( dwStyle & WS_DLGFRAME ) )
134          l = rect.left;              break;
135          r = rect.right;              
136          ltoa( b, strB, 10 );          if ( !( wp->flags & SWP_NOZORDER ) ) {
137          ltoa( t, strT, 10 );              snprintf( result, sizeof( result ),
138          ltoa( r, strR, 10 );                        "ZCHANGE1,0x%p,0x%p,0x%x\n",
139          ltoa( l, strL, 10 );                        details->hwnd,
140                          wp->flags & SWP_NOACTIVATE ? wp->hwndInsertAfter : 0,
141                          0 );
142                result[ sizeof( result ) - 1 ] = '\0';
143                WriteToChannel( result );
144            }
145            break;
146            
147            
148            case WM_CREATE:
149            if ( cs->style & WS_DLGFRAME ) {
150            
151                snprintf( result, sizeof( result ),
152                          "CREATE1,0x%p,0x%x\n",
153                          details->hwnd, 0 );
154                result[ sizeof( result ) - 1 ] = '\0';
155                WriteToChannel( result );
156                
157                snprintf( result, sizeof( result ),
158                          "SETSTATE1,0x%p,%s,0x%x,0x%x\n",
159                          details->hwnd,
160                          cs->lpszName,
161                          1,    // FIXME: Check for WS_MAXIMIZE/WS_MINIMIZE
162                          0 );
163                result[ sizeof( result ) - 1 ] = '\0';
164                WriteToChannel( result );
165                
166                snprintf( result, sizeof( result ),
167                          "POSITION1,0x%p,%d,%d,%d,%d,0x%x",
168                          details->hwnd,
169                          cs->x,
170                          cs->y,
171                          cs->cx,
172                          cs->cy,
173                          0 );
174                result[ sizeof( result ) - 1 ] = '\0';
175                WriteToChannel( result );
176                
177            }
178            break;
179                    
         ////setup return string  
         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, ";" );  
180                    
181          buffer = result;          case WM_DESTROY:
182            if ( dwStyle & WS_DLGFRAME ) {
183                snprintf( result, sizeof( result ),
184                          "DESTROY1,0x%p,0x%x\n",
185                          details->hwnd, 0 );
186                result[ sizeof( result ) - 1 ] = '\0';
187                WriteToChannel( result );
188            }
189                    
190          break;          break;
191                    
192            
193          default:          default:
194          break;          break;
195      }      }
196            
     if ( ChannelIsOpen() ) {  
         if ( buffer != NULL ) {  
             WriteToChannel( buffer );  
         }  
     }  
       
197      return CallNextHookEx( hhook3, nCode, wParam, lParam );      return CallNextHookEx( hhook3, nCode, wParam, lParam );
198  }  }
199    
# Line 144  LRESULT CALLBACK CbtProc( int nCode, WPA Line 203  LRESULT CALLBACK CbtProc( int nCode, WPA
203          return CallNextHookEx( hhook, nCode, wParam, lParam );          return CallNextHookEx( hhook, nCode, wParam, lParam );
204      }      }
205            
206        char windowTitle[ 150 ] = { ""
207                                  };
208        HWND windowHandle = NULL;
209        char result[ 255 ] = { ""
210                             };
211        switch ( nCode ) {
212            case HCBT_MINMAX:
213            
214            if ( ( LOWORD( lParam ) == SW_SHOWMINIMIZED )
215                    || ( LOWORD( lParam ) == SW_MINIMIZE ) ) {
216                MessageBox( 0, "Minimizing windows is not allowed in this version. Sorry!", "SeamlessRDP", MB_OK );
217                return 1;
218            }
219            
220            GetWindowText( ( HWND ) wParam, windowTitle, 150 );
221            
222            snprintf( result, sizeof( result ),
223                      "SETSTATE1,0x%p,%s,0x%x,0x%x\n",
224                      ( HWND ) wParam,
225                      windowTitle,
226                      LOWORD( lParam ),
227                      0 );
228            result[ sizeof( result ) - 1 ] = '\0';
229            WriteToChannel( result );
230            break;
231            
232            
233            default:
234            break;
235        }
236            
     PCHAR buffer = NULL;  
237            
238            
239        return CallNextHookEx( hhook, nCode, wParam, lParam );
240    }
241    
242    
243    LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
244    {
245        if ( nCode < 0 ) {
246            return CallNextHookEx( hhook, nCode, wParam, lParam );
247        }
248        
249      char windowTitle[ 150 ] = { ""      char windowTitle[ 150 ] = { ""
250                                };                                };
251      HWND windowHandle = NULL;      HWND windowHandle = NULL;
252      char result[ 255 ] = { ""      char result[ 255 ] = { ""
253                           };                           };
254      char strWindowId[ 25 ];      char strWindowId[ 25 ];
     char type[ 25 ];  
       
       
255      LONG b, t, l, r;      LONG b, t, l, r;
256      char strB[ 5 ];      char strW[ 5 ];
257      char strT[ 5 ];      char strY[ 5 ];
258      char strL[ 5 ];      char strX[ 5 ];
259      char strR[ 5 ];      char strH[ 5 ];
260      RECT rect;      RECT rect;
261            
     int i = 0;                  //tmp  
       
262      switch ( nCode ) {      switch ( nCode ) {
263          case HCBT_MINMAX:          case HSHELL_WINDOWCREATED:
264                    
265            //get window id
266          windowHandle = ( HWND ) wParam;          windowHandle = ( HWND ) wParam;
         //get win name  
         GetWindowText( windowHandle, windowTitle, 150 );  
           
         //get an id for it  
267          itoa( ( int ) windowHandle, strWindowId, 10 );          itoa( ( int ) windowHandle, strWindowId, 10 );
268                    
         //get operation type(min,max). if max, do not clip at all,if min use window's previous coords  
         //codes are:  
           
         // SW_HIDE= 0  SW_SHOWNORMAL=1  SW_NORMAL=1  SW_SHOWMINIMIZED=2  SW_SHOWMAXIMIZED=3  SW_MAXIMIZE=3  
         // SW_SHOWNOACTIVATE=4  SW_SHOW=5  SW_MINIMIZE=6  SW_SHOWMINNOACTIVE=7  SW_SHOWNA=8  SW_RESTORE=9  
         // SW_SHOWDEFAULT=10  SW_FORCEMINIMIZE=11  SW_MAX=11  
           
         itoa( ( int ) lParam, type, 10 );  
           
269          //get coords          //get coords
270          GetWindowRect( windowHandle, &rect );          GetWindowRect( windowHandle, &rect );
271          b = rect.bottom;          b = rect.bottom;
272          t = rect.top;          t = rect.top;
273          l = rect.left;          l = rect.left;
274          r = rect.right;          r = rect.right;
275          ltoa( b, strB, 10 );          ltoa( b - t, strH, 10 );
276          ltoa( t, strT, 10 );          ltoa( t, strY, 10 );
277          ltoa( r, strR, 10 );          ltoa( r - l, strW, 10 );
278          ltoa( l, strL, 10 );          ltoa( l, strX, 10 );
279                    
280          //get name          //get name
281          GetWindowText( windowHandle, windowTitle, 150 );          GetWindowText( windowHandle, windowTitle, 150 );
282                    
283          ////setup return string          ////setup return string
284          strcat( result, "MSG=HCBT_MINMAX;" );          strcat( result, "MSG=HSHELL_WINDOWCREATED;OP=0;" );
285          strcat( result, "ID=" );          strcat( result, "ID=" );
286          strcat( result, strWindowId );          strcat( result, strWindowId );
287          strcat( result, ";" );          strcat( result, ";" );
288          strcat( result, "TITLE=" );          strcat( result, "TITLE=" );
289          strcat( result, windowTitle );          strcat( result, windowTitle );
290          strcat( result, ";" );          strcat( result, ";" );
291          strcat( result, "POS=" );          strcat( result, "X=" );
292          strcat( result, strL );          strcat( result, strX );
         strcat( result, "~" );  
         strcat( result, strT );  
         strcat( result, "~" );  
         strcat( result, strR );  
         strcat( result, "~" );  
         strcat( result, strB );  
293          strcat( result, ";" );          strcat( result, ";" );
294          strcat( result, "TYPE=" );          strcat( result, "Y=" );
295          strcat( result, type );          strcat( result, strY );
296          strcat( result, ";" );          strcat( result, ";" );
297                    strcat( result, "H=" );
298          //-------------------------------------------------------------------------------------------------          strcat( result, strH );
299          // code to prevent minimising windows (can be removed once minimise has been implemented)          strcat( result, ";" );
300          i = ( int ) lParam;          strcat( result, "W=" );
301          //if (i==0 || i==2 || i==6 || i==7 || i==8 || i==11)          strcat( result, strW );
302          if ( i == 2 || i == 6 ) {          strcat( result, "." );
303              MessageBox( 0,          WriteToChannel( result );
                         "Minimising windows is not allowed in this version. Sorry!",  
                         "TS Window Clipper", MB_OK );  
             return 1;  
         }  
         //-----------------------------------------------------------------------------------------  
           
         //-------------------------------------------------------------------------------------------------  
         // code to prevent maximising windows (can be removed once maximise has been implemented)  
         i = ( int ) lParam;  
         //if (i==3 || i==9 || i==11)  
         if ( i == 3 || i == 11 ) {  
             MessageBox( 0,  
                         "Maximising windows is not allowed in this version. Sorry!",  
                         "TS Window Clipper", MB_OK );  
             return 1;  
         }  
         //-----------------------------------------------------------------------------------------  
           
         buffer = result;  
           
304          break;          break;
305                    
306          case HCBT_MOVESIZE:          case HSHELL_WINDOWDESTROYED:
307                    
308            //get window id
309          windowHandle = ( HWND ) wParam;          windowHandle = ( HWND ) wParam;
         //get win name  
         GetWindowText( windowHandle, windowTitle, 150 );  
           
         //get an id for it  
310          itoa( ( int ) windowHandle, strWindowId, 10 );          itoa( ( int ) windowHandle, strWindowId, 10 );
311                    
312          //get coords          //get coords
# Line 263  LRESULT CALLBACK CbtProc( int nCode, WPA Line 315  LRESULT CALLBACK CbtProc( int nCode, WPA
315          t = rect.top;          t = rect.top;
316          l = rect.left;          l = rect.left;
317          r = rect.right;          r = rect.right;
318          ltoa( b, strB, 10 );          ltoa( b - t, strH, 10 );
319          ltoa( t, strT, 10 );          ltoa( t, strY, 10 );
320          ltoa( r, strR, 10 );          ltoa( r - l, strW, 10 );
321          ltoa( l, strL, 10 );          ltoa( l, strX, 10 );
322                    
323          //get name          //get name
324          GetWindowText( windowHandle, windowTitle, 150 );          GetWindowText( windowHandle, windowTitle, 150 );
325                    
326          ////setup return string          ////setup return string
327          strcat( result, "MSG=HCBT_MOVESIZE;" );          strcat( result, "MSG=HSHELL_WINDOWDESTROYED;OP=1;" );
328          strcat( result, "ID=" );          strcat( result, "ID=" );
329          strcat( result, strWindowId );          strcat( result, strWindowId );
330          strcat( result, ";" );          strcat( result, ";" );
331          strcat( result, "TITLE=" );          strcat( result, "TITLE=" );
332          strcat( result, windowTitle );          strcat( result, windowTitle );
333          strcat( result, ";" );          strcat( result, ";" );
334          strcat( result, "POS=" );          strcat( result, "X=" );
335          strcat( result, strL );          strcat( result, strX );
336          strcat( result, "~" );          strcat( result, ";" );
337          strcat( result, strT );          strcat( result, "Y=" );
338          strcat( result, "~" );          strcat( result, strY );
339          strcat( result, strR );          strcat( result, ";" );
340          strcat( result, "~" );          strcat( result, "H=" );
341          strcat( result, strB );          strcat( result, strH );
342          strcat( result, ";" );          strcat( result, ";" );
343            strcat( result, "W=" );
344            strcat( result, strW );
345            strcat( result, "." );
346            WriteToChannel( result );
347            break;
348                    
         buffer = result;  
349                    
         break;  
         case HCBT_SETFOCUS:  
         //buffer = "HCBT_SETFOCUS";  
         //not needed yet  
         break;  
350          default:          default:
351          break;          break;
352      }      }
353            
     if ( ChannelIsOpen() ) {  
         if ( buffer != NULL ) {  
             WriteToChannel( buffer );  
         }  
     }  
354            
355      return CallNextHookEx( hhook, nCode, wParam, lParam );      return CallNextHookEx( hhook, nCode, wParam, lParam );
356  }  }
357    
358    DLL_EXPORT void SetHooks( void )
 LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )  
 {  
     if ( nCode < 0 ) {  
         return CallNextHookEx( hhook, nCode, wParam, lParam );  
     }  
       
     if ( ChannelIsOpen() ) {  
         PCHAR buffer = NULL;  
           
         char windowTitle[ 150 ] = { ""  
                                   };  
         HWND windowHandle = NULL;  
         char result[ 255 ] = { ""  
                              };  
         char strWindowId[ 25 ];  
         LONG b, t, l, r;  
         char strB[ 5 ];  
         char strT[ 5 ];  
         char strL[ 5 ];  
         char strR[ 5 ];  
         RECT rect;  
           
         switch ( nCode ) {  
             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, 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=HSHELL_WINDOWCREATED;" );  
             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 HSHELL_WINDOWDESTROYED:  
               
             //get window id  
             windowHandle = ( HWND ) wParam;  
             itoa( ( int ) windowHandle, strWindowId, 10 );  
               
             //get name  
             GetWindowText( windowHandle, windowTitle, 150 );  
               
             ////setup return string  
             strcat( result, "MSG=HSHELL_WINDOWDESTROYED;" );  
             strcat( result, "ID=" );  
             strcat( result, strWindowId );  
             strcat( result, ";" );  
             strcat( result, "TITLE=" );  
             strcat( result, windowTitle );  
             strcat( result, ";" );  
               
             buffer = result;  
               
             break;  
             default:  
             break;  
         }  
           
         if ( buffer != NULL ) {  
             WriteToChannel( buffer );  
         }  
     }  
       
     return CallNextHookEx( hhook, nCode, wParam, lParam );  
 }  
   
 DLL_EXPORT void SetCbtHook( void )  
359  {  {
360      if ( !bHooked ) {      if ( !bHooked ) {
361          hhook =          hhook = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL );  
362          bHooked = true;          bHooked = true;
363      }      }
364            
365    #if 0
366      if ( !bHooked2 ) {      if ( !bHooked2 ) {
367          hhook2 =          hhook2 = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst,  
                               ( DWORD ) NULL );  
368          bHooked2 = true;          bHooked2 = true;
369      }      }
370    #endif
371            
372      if ( !bHooked3 ) {      if ( !bHooked3 ) {
373          hhook3 =          hhook3 = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL );
             SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst,  
                               ( DWORD ) NULL );  
374          bHooked3 = true;          bHooked3 = true;
375      }      }
376  }  }
377    
378  DLL_EXPORT void RemoveCbtHook( void )  DLL_EXPORT void RemoveHooks( void )
379  {  {
380      if ( bHooked ) {      if ( bHooked ) {
381          UnhookWindowsHookEx( hhook );          UnhookWindowsHookEx( hhook );
# Line 456  DLL_EXPORT int GetInstanceCount() Line 400  DLL_EXPORT int GetInstanceCount()
400    
401  int OpenVirtualChannel()  int OpenVirtualChannel()
402  {  {
403      m_vcHandle =      m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME );
404          WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION,      
                                CHANNELNAME );  
                                 
405      if ( m_vcHandle == NULL ) {      if ( m_vcHandle == NULL ) {
406          return 0;          return 0;
407      } else {      } else {
# Line 494  int WriteToChannel( PCHAR buffer ) Line 436  int WriteToChannel( PCHAR buffer )
436      PULONG bytesRead = 0;      PULONG bytesRead = 0;
437      PULONG pBytesWritten = 0;      PULONG pBytesWritten = 0;
438            
439      BOOL result =      if ( !ChannelIsOpen() )
440          WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ),          return 1;
441                                  pBytesWritten );          
442                                        BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten );
443        
444      if ( result ) {      if ( result ) {
445          return 1;          return 1;
446      } else {      } else {

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

  ViewVC Help
Powered by ViewVC 1.1.26