--- sourceforge.net/trunk/seamlessrdp/ServerExe/HookDll/hookdll.cpp 2006/03/08 15:52:38 1064 +++ sourceforge.net/trunk/seamlessrdp/ServerExe/HookDll/hookdll.cpp 2006/03/08 16:12:49 1065 @@ -37,11 +37,11 @@ { va_list argp; char buf [ 256 ]; - + va_start( argp, format ); vsprintf( buf, format, argp ); va_end( argp ); - + WriteToChannel( "DEBUG1," ); WriteToChannel( buf ); WriteToChannel( "\n" ); @@ -52,25 +52,25 @@ extern "C" BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch ( ul_reason_for_call ) { - case DLL_PROCESS_ATTACH: { + case DLL_PROCESS_ATTACH: { // remember our instance handle hInst = hinstDLL; ++iInstanceCount; OpenVirtualChannel(); break; } - - case DLL_THREAD_ATTACH: + + case DLL_THREAD_ATTACH: break; - case DLL_THREAD_DETACH: + case DLL_THREAD_DETACH: break; - case DLL_PROCESS_DETACH: { + case DLL_PROCESS_DETACH: { --iInstanceCount; CloseVirtualChannel(); } break; } - + return TRUE; } @@ -79,7 +79,7 @@ if ( nCode < 0 ) { return CallNextHookEx( hWndProc, nCode, wParam, lParam ); } - + char windowTitle[ 150 ] = { "" }; HWND windowHandle = NULL; @@ -91,64 +91,64 @@ LONG dwStyle = GetWindowLong( details->hwnd, GWL_STYLE ); WINDOWPOS *wp = ( WINDOWPOS * ) details->lParam; RECT rect; - + switch ( details->message ) { - - case WM_WINDOWPOSCHANGED: - if ( dwStyle & WS_CHILD) - break; - - - if ( wp->flags & SWP_SHOWWINDOW ) { - // FIXME: Now, just like create! - SendDebug("SWP_SHOWWINDOW for %p!", details->hwnd); - - snprintf( result, sizeof( result ), - "CREATE1,0x%p,0x%x\n", - details->hwnd, 0 ); - result[ sizeof( result ) - 1 ] = '\0'; - WriteToChannel( result ); - - // FIXME: SETSTATE - - if ( !GetWindowRect( details->hwnd, &rect ) ) { - SendDebug( "GetWindowRect failed!\n" ); - break; - } - snprintf( result, sizeof( result ), - "POSITION1,0x%p,%d,%d,%d,%d,0x%x\n", - details->hwnd, - rect.left, rect.top, - rect.right - rect.left, - rect.bottom - rect.top, - 0 ); - result[ sizeof( result ) - 1 ] = '\0'; - WriteToChannel( result ); - - } - - - if ( wp->flags & SWP_HIDEWINDOW ) { - snprintf( result, sizeof( result ), - "DESTROY1,0x%p,0x%x\n", - details->hwnd, 0 ); - result[ sizeof( result ) - 1 ] = '\0'; - WriteToChannel( result ); - - } - - - if ( !( dwStyle & WS_VISIBLE ) ) - break; - + + case WM_WINDOWPOSCHANGED: + if ( dwStyle & WS_CHILD) + break; + + + if ( wp->flags & SWP_SHOWWINDOW ) { + // FIXME: Now, just like create! + SendDebug("SWP_SHOWWINDOW for %p!", details->hwnd); + + snprintf( result, sizeof( result ), + "CREATE1,0x%p,0x%x\n", + details->hwnd, 0 ); + result[ sizeof( result ) - 1 ] = '\0'; + WriteToChannel( result ); + + // FIXME: SETSTATE + + if ( !GetWindowRect( details->hwnd, &rect ) ) { + SendDebug( "GetWindowRect failed!\n" ); + break; + } + snprintf( result, sizeof( result ), + "POSITION1,0x%p,%d,%d,%d,%d,0x%x\n", + details->hwnd, + rect.left, rect.top, + rect.right - rect.left, + rect.bottom - rect.top, + 0 ); + result[ sizeof( result ) - 1 ] = '\0'; + WriteToChannel( result ); + + } + + + if ( wp->flags & SWP_HIDEWINDOW ) { + snprintf( result, sizeof( result ), + "DESTROY1,0x%p,0x%x\n", + details->hwnd, 0 ); + result[ sizeof( result ) - 1 ] = '\0'; + WriteToChannel( result ); + + } + + + if ( !( dwStyle & WS_VISIBLE ) ) + break; + if ( wp->flags & SWP_NOMOVE && wp->flags & SWP_NOSIZE ) break; - + if ( !GetWindowRect( details->hwnd, &rect ) ) { SendDebug( "GetWindowRect failed!\n" ); break; } - + snprintf( result, sizeof( result ), "POSITION1,0x%p,%d,%d,%d,%d,0x%x\n", details->hwnd, @@ -158,10 +158,10 @@ 0 ); result[ sizeof( result ) - 1 ] = '\0'; WriteToChannel( result ); - + break; - - + + /* Note: WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED are strange. Sometimes, for example when bringing up the Notepad About dialog, only an WM_WINDOWPOSCHANGING is @@ -170,13 +170,13 @@ some reason, when closing the Notepad About dialog, an WM_WINDOWPOSCHANGING event is sent which looks just like the event that was sent when the About dialog was opened... */ - case WM_WINDOWPOSCHANGING: - if ( dwStyle & WS_CHILD) - break; - - if ( !( dwStyle & WS_VISIBLE ) ) - break; - + case WM_WINDOWPOSCHANGING: + if ( dwStyle & WS_CHILD) + break; + + if ( !( dwStyle & WS_VISIBLE ) ) + break; + if ( !( wp->flags & SWP_NOZORDER ) ) { snprintf( result, sizeof( result ), "ZCHANGE1,0x%p,0x%p,0x%x\n", @@ -187,27 +187,27 @@ WriteToChannel( result ); } break; - - - - - case WM_DESTROY: - if ( dwStyle & WS_CHILD) - break; - snprintf( result, sizeof( result ), - "DESTROY1,0x%p,0x%x\n", - details->hwnd, 0 ); - result[ sizeof( result ) - 1 ] = '\0'; - WriteToChannel( result ); - + + + + case WM_DESTROY: + if ( dwStyle & WS_CHILD) + break; + + snprintf( result, sizeof( result ), + "DESTROY1,0x%p,0x%x\n", + details->hwnd, 0 ); + result[ sizeof( result ) - 1 ] = '\0'; + WriteToChannel( result ); + break; - - default: + + default: break; } - + return CallNextHookEx( hWndProc, nCode, wParam, lParam ); } @@ -216,23 +216,23 @@ if ( nCode < 0 ) { return CallNextHookEx( hCbtProc, nCode, wParam, lParam ); } - + char windowTitle[ 150 ] = { "" }; HWND windowHandle = NULL; char result[ 255 ] = { "" }; switch ( nCode ) { - case HCBT_MINMAX: - + case HCBT_MINMAX: + if ( ( LOWORD( lParam ) == SW_SHOWMINIMIZED ) || ( LOWORD( lParam ) == SW_MINIMIZE ) ) { MessageBox( 0, "Minimizing windows is not allowed in this version. Sorry!", "SeamlessRDP", MB_OK ); return 1; } - + GetWindowText( ( HWND ) wParam, windowTitle, 150 ); - + snprintf( result, sizeof( result ), "SETSTATE1,0x%p,%s,0x%x,0x%x\n", ( HWND ) wParam, @@ -242,14 +242,14 @@ result[ sizeof( result ) - 1 ] = '\0'; WriteToChannel( result ); break; - - - default: + + + default: break; } - - - + + + return CallNextHookEx( hCbtProc, nCode, wParam, lParam ); } @@ -259,7 +259,7 @@ if ( nCode < 0 ) { return CallNextHookEx( hShellProc, nCode, wParam, lParam ); } - + char windowTitle[ 150 ] = { "" }; HWND windowHandle = NULL; @@ -272,14 +272,14 @@ char strX[ 5 ]; char strH[ 5 ]; RECT rect; - + switch ( nCode ) { - case HSHELL_WINDOWCREATED: - + case HSHELL_WINDOWCREATED: + //get window id windowHandle = ( HWND ) wParam; itoa( ( int ) windowHandle, strWindowId, 10 ); - + //get coords GetWindowRect( windowHandle, &rect ); b = rect.bottom; @@ -290,10 +290,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=" ); @@ -316,13 +316,13 @@ strcat( result, "." ); WriteToChannel( result ); break; - - case HSHELL_WINDOWDESTROYED: - + + case HSHELL_WINDOWDESTROYED: + //get window id windowHandle = ( HWND ) wParam; itoa( ( int ) windowHandle, strWindowId, 10 ); - + //get coords GetWindowRect( windowHandle, &rect ); b = rect.bottom; @@ -333,10 +333,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=" ); @@ -359,13 +359,13 @@ strcat( result, "." ); WriteToChannel( result ); break; - - - default: + + + default: break; } - - + + return CallNextHookEx( hShellProc, nCode, wParam, lParam ); } @@ -374,13 +374,13 @@ if ( !hCbtProc ) { hCbtProc = SetWindowsHookEx( WH_CBT, ( HOOKPROC ) CbtProc, hInst, ( DWORD ) NULL ); } - + #if 0 if ( !hShellProc ) { hShellProc = SetWindowsHookEx( WH_SHELL, ( HOOKPROC ) ShellProc, hInst, ( DWORD ) NULL ); } #endif - + if ( !hWndProc ) { hWndProc = SetWindowsHookEx( WH_CALLWNDPROC, ( HOOKPROC ) CallWndProc, hInst, ( DWORD ) NULL ); } @@ -391,11 +391,11 @@ if ( hCbtProc ) { UnhookWindowsHookEx( hCbtProc ); } - + if ( hShellProc ) { UnhookWindowsHookEx( hShellProc ); } - + if ( hWndProc ) { UnhookWindowsHookEx( hWndProc ); } @@ -409,7 +409,7 @@ int OpenVirtualChannel() { m_vcHandle = WTSVirtualChannelOpen( WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME ); - + if ( m_vcHandle == NULL ) { return 0; } else { @@ -420,9 +420,9 @@ int CloseVirtualChannel() { BOOL result = WTSVirtualChannelClose( m_vcHandle ); - + m_vcHandle = NULL; - + if ( result ) { return 1; } else { @@ -443,12 +443,12 @@ { PULONG bytesRead = 0; PULONG pBytesWritten = 0; - + if ( !ChannelIsOpen() ) return 1; - + BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten ); - + if ( result ) { return 1; } else {