You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
(4) |
Sep
(3) |
Oct
(9) |
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(41) |
Feb
(1) |
Mar
(24) |
Apr
(5) |
May
|
Jun
(6) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
(20) |
May
(1) |
Jun
|
Jul
|
Aug
(2) |
Sep
(5) |
Oct
(1) |
Nov
(2) |
Dec
(5) |
2012 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(5) |
Jul
(4) |
Aug
|
Sep
(2) |
Oct
(3) |
Nov
(14) |
Dec
(2) |
2013 |
Jan
(6) |
Feb
(3) |
Mar
(10) |
Apr
(4) |
May
|
Jun
(12) |
Jul
(2) |
Aug
(10) |
Sep
(14) |
Oct
|
Nov
(21) |
Dec
(9) |
2014 |
Jan
|
Feb
(11) |
Mar
(3) |
Apr
(3) |
May
(14) |
Jun
(8) |
Jul
(5) |
Aug
(4) |
Sep
(10) |
Oct
(2) |
Nov
(4) |
Dec
|
2015 |
Jan
|
Feb
(4) |
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <as...@us...> - 2010-03-30 14:02:00
|
Revision: 1581 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1581&view=rev Author: astrand Date: 2010-03-30 14:01:54 +0000 (Tue, 30 Mar 2010) Log Message: ----------- Move back open count check; it was incorrectly moved in r1522. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/vchannel.c Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-11 09:13:58 UTC (rev 1580) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-30 14:01:54 UTC (rev 1581) @@ -128,6 +128,10 @@ EXTERN int vchannel_open() { + g_opencount++; + if (g_opencount > 1) + return 0; + g_vchannel = WTSVirtualChannelOpen(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, CHANNELNAME); @@ -145,10 +149,6 @@ return -1; } - g_opencount++; - if (g_opencount > 1) - return 0; - return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-11 09:14:05
|
Revision: 1580 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1580&view=rev Author: astrand Date: 2010-03-11 09:13:58 +0000 (Thu, 11 Mar 2010) Log Message: ----------- Added test case for 32 bit apps on 64 bit system Modified Paths: -------------- rdesktop/trunk/doc/seamlessrdp-channel.txt Modified: rdesktop/trunk/doc/seamlessrdp-channel.txt =================================================================== --- rdesktop/trunk/doc/seamlessrdp-channel.txt 2010-03-10 12:56:27 UTC (rev 1579) +++ rdesktop/trunk/doc/seamlessrdp-channel.txt 2010-03-11 09:13:58 UTC (rev 1580) @@ -435,3 +435,10 @@ overlaps. From Task Manager, execute notepadbehindwordpad.exe. This test is expected to fail when rdesktop emits the warning about broken WM at startup. + + +26 If running on a 64 bit Windows version, try a 32 bit application: + Run Task Manager seamlessly (...\seamlessrdpshell.exe + taskmgr). From Task Manager's File menu, select 'New Task (Run)' + and run %windir%\syswow64\notepad.exe. Try various window + operations. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-10 12:56:36
|
Revision: 1579 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1579&view=rev Author: astrand Date: 2010-03-10 12:56:27 +0000 (Wed, 10 Mar 2010) Log Message: ----------- Support for mixing 32- and 64-bit applications. This requires a few changes: * We must provide both a 32 and 64 bit of the DLL, and Windows requires that the DLL files have different names. seamlessrdpshell.exe has been modified to load the correct DLL depending on its "bitness". * To hook 32 bit apps om a 64 bit system, a separate 32 bit process must be used. seamlessrdpshell.exe has been modified to start and stop such a process. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/Makefile.am seamlessrdp/trunk/ServerExe/configure.ac seamlessrdp/trunk/ServerExe/main.c Added Paths: ----------- seamlessrdp/trunk/ServerExe/seamlessrdphook.c Modified: seamlessrdp/trunk/ServerExe/Makefile.am =================================================================== --- seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-08 08:51:37 UTC (rev 1578) +++ seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-10 12:56:27 UTC (rev 1579) @@ -1,8 +1,5 @@ bin_PROGRAMS = seamlessrdpshell -lib_LTLIBRARIES = \ - seamlessrdp.la - noinst_LTLIBRARIES = libvchannel.la libvchannel_la_SOURCES = vchannel.c libvchannel_la_LIBADD = -lwtsapi32 @@ -11,6 +8,31 @@ seamlessrdpshell_LDADD = libvchannel.la -lwtsapi32 seamlessrdpshell_LDFLAGS = -mwindows -seamlessrdp_la_SOURCES = hookdll.c -seamlessrdp_la_LDFLAGS = -avoid-version -module -no-undefined -seamlessrdp_la_LIBADD = libvchannel.la -lgdi32 +if OS_IS_WIN32 +bin_PROGRAMS += seamlessrdphook32 +seamlessrdphook32_SOURCES = seamlessrdphook.c +seamlessrdphook32_LDADD = +seamlessrdphook32_LDFLAGS = -mwindows +endif + +# seamlessrdphook64 is not used in practice, but built for completeness +if OS_IS_WIN64 +bin_PROGRAMS += seamlessrdphook64 +seamlessrdphook64_SOURCES = seamlessrdphook.c +seamlessrdphook64_LDADD = +seamlessrdphook64_LDFLAGS = -mwindows +endif + +if OS_IS_WIN32 +lib_LTLIBRARIES = seamlessrdp32.la +seamlessrdp32_la_SOURCES = hookdll.c +seamlessrdp32_la_LDFLAGS = -avoid-version -module -no-undefined +seamlessrdp32_la_LIBADD = libvchannel.la -lgdi32 +endif + +if OS_IS_WIN64 +lib_LTLIBRARIES = seamlessrdp64.la +seamlessrdp64_la_SOURCES = hookdll.c +seamlessrdp64_la_LDFLAGS = -avoid-version -module -no-undefined +seamlessrdp64_la_LIBADD = libvchannel.la -lgdi32 +endif Modified: seamlessrdp/trunk/ServerExe/configure.ac =================================================================== --- seamlessrdp/trunk/ServerExe/configure.ac 2010-03-08 08:51:37 UTC (rev 1578) +++ seamlessrdp/trunk/ServerExe/configure.ac 2010-03-10 12:56:27 UTC (rev 1579) @@ -11,6 +11,19 @@ fi AC_PROG_LIBTOOL +os_is_win32=0 +os_is_win64=0 +case "$host" in + i?86-*-mingw*) + os_is_win32=1 + ;; + x86_64-*-mingw*) + os_is_win64=1 + ;; +esac +AM_CONDITIONAL(OS_IS_WIN32, test "x$os_is_win32" = "x1") +AM_CONDITIONAL(OS_IS_WIN64, test "x$os_is_win64" = "x1") + AC_LIBTOOL_WIN32_DLL AC_OUTPUT(Makefile) Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-08 08:51:37 UTC (rev 1578) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-10 12:56:27 UTC (rev 1579) @@ -33,6 +33,7 @@ #include "resource.h" #define APP_NAME "SeamlessRDP Shell" +#define HELPER_TIMEOUT 2000 /* Global data */ static DWORD g_session_id; @@ -349,7 +350,8 @@ return desk == NULL; } -static BOOL +// Returns process handle on success, or NULL on failure +static HANDLE launch_app(LPSTR cmdline) { BOOL result; @@ -362,19 +364,95 @@ result = CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &startup_info, &proc_info); // Release handles - CloseHandle(proc_info.hProcess); CloseHandle(proc_info.hThread); - return result; + if (result) + { + return proc_info.hProcess; + } + else + { + return NULL; + } } +static HANDLE +launch_helper() +{ + HANDLE app = NULL; + SYSTEM_INFO si; + GetSystemInfo(&si); + + /* If we are running on a x64 system, hook 32 bit apps as well + by launching a 32 bit helper process. */ + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + { + char cmd[] = "seamlessrdphook32.exe"; + app = launch_app(cmd); + if (!app) + { + char msg[256]; + _snprintf(msg, sizeof(msg), + "Unable to launch the requested application:\n%s", cmd); + message(msg); + } + + /* Wait until helper is started, so that it gets included in + the process enum */ + DWORD ret; + ret = WaitForInputIdle(app, HELPER_TIMEOUT); + switch (ret) + { + case 0: + break; + case WAIT_TIMEOUT: + case WAIT_FAILED: + message("Hooking helper failed to start within time limit"); + break; + } + } + return app; +} + + +// Ask process to quit, otherwise kill it +static void +kill_15_9(HANDLE proc, const char *wndname, DWORD timeout) +{ + HWND procwnd; + DWORD ret; + procwnd = FindWindowEx(HWND_MESSAGE, NULL, "Message", wndname); + if (procwnd) + { + PostMessage(procwnd, WM_CLOSE, 0, 0); + } + ret = WaitForSingleObject(proc, timeout); + switch (ret) + { + case WAIT_ABANDONED: + case WAIT_OBJECT_0: + break; + case WAIT_TIMEOUT: + // Still running, kill hard + if (!TerminateProcess(proc, 1)) + { + message("Unable to terminate process"); + } + break; + case WAIT_FAILED: + message("Unable to wait for process"); + break; + } +} + + int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev_instance, LPSTR cmdline, int cmdshow) { int success = 0; + HANDLE helper = NULL; + HMODULE hookdll = NULL; - HMODULE hookdll; - set_hooks_proc_t set_hooks_fn; remove_hooks_proc_t remove_hooks_fn; get_instance_count_proc_t instance_count_fn; @@ -393,7 +471,22 @@ return -1; } - hookdll = LoadLibrary("seamlessrdp.dll"); + SYSTEM_INFO si; + GetSystemInfo(&si); + switch (si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_INTEL: + hookdll = LoadLibrary("seamlessrdp32.dll"); + break; + case PROCESSOR_ARCHITECTURE_AMD64: + hookdll = LoadLibrary("seamlessrdp64.dll"); + break; + default: + message("Unsupported processor architecture."); + break; + + } + if (!hookdll) { message("Could not load hook DLL. Unable to continue."); @@ -422,6 +515,8 @@ goto close_hookdll; } + helper = launch_helper(); + ProcessIdToSessionId(GetCurrentProcessId(), &g_session_id); build_startup_procs(); @@ -506,6 +601,11 @@ remove_hooks_fn(); free_startup_procs(); + if (helper) + { + // Terminate seamlessrdphook32.exe + kill_15_9(helper, "SeamlessRDPHook", HELPER_TIMEOUT); + } close_hookdll: FreeLibrary(hookdll); Added: seamlessrdp/trunk/ServerExe/seamlessrdphook.c =================================================================== --- seamlessrdp/trunk/ServerExe/seamlessrdphook.c (rev 0) +++ seamlessrdp/trunk/ServerExe/seamlessrdphook.c 2010-03-10 12:56:27 UTC (rev 1579) @@ -0,0 +1,106 @@ +/* -*- c-basic-offset: 8 -*- + + Copyright 2010 Peter Åstrand <as...@ce...> for Cendio AB + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#define WINVER 0x0501 + +#include <windows.h> + +#include "resource.h" + +/* Global data */ +typedef void (*set_hooks_proc_t) (); +typedef int (*get_instance_count_proc_t) (); + +static void +message(const char *text) +{ + MessageBox(GetDesktopWindow(), text, "SeamlessRDP hooking", MB_OK); +} + + +int WINAPI +WinMain(HINSTANCE instance, HINSTANCE prev_instance, LPSTR cmdline, int cmdshow) +{ + HMODULE hookdll = NULL; + set_hooks_proc_t set_hooks_fn; + get_instance_count_proc_t instance_count_fn; + + SYSTEM_INFO si; + GetSystemInfo(&si); + switch (si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_INTEL: + hookdll = LoadLibrary("seamlessrdp32.dll"); + break; + case PROCESSOR_ARCHITECTURE_AMD64: + hookdll = LoadLibrary("seamlessrdp64.dll"); + break; + default: + message("Unsupported processor architecture."); + break; + + } + + if (!hookdll) + { + message("Could not load hook DLL. Unable to continue."); + return 1; + } + + set_hooks_fn = (set_hooks_proc_t) GetProcAddress(hookdll, "SetHooks"); + instance_count_fn = (get_instance_count_proc_t) GetProcAddress(hookdll, "GetInstanceCount"); + + if (!set_hooks_fn || !instance_count_fn) + { + message("Hook DLL doesn't contain the correct functions. Unable to continue."); + goto close_hookdll; + } + + set_hooks_fn(); + + + /* Wait until seamlessrdpshell wants us to terminate. It + cannot use PostThreadMessage, because if we are showing a + dialog, such messages are lost. Instead, we need to create + a "Message-Only Window". */ + CreateWindow("Message", "SeamlessRDPHook", 0, 0, 0, 0, 0, + HWND_MESSAGE, NULL, instance, NULL); + + MSG msg; + while (1) + { + BOOL ret; + ret = GetMessage(&msg, NULL, 0, 0); + if (ret == -1) + { + message("GetMessage failed"); + break; + } + else if (ret == 0) + { + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + close_hookdll: + FreeLibrary(hookdll); + + return 0; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-08 08:51:43
|
Revision: 1578 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1578&view=rev Author: astrand Date: 2010-03-08 08:51:37 +0000 (Mon, 08 Mar 2010) Log Message: ----------- Do not use shared DLL data any longer. Instead, we are using shared memory (file mapping). The main motivation for this change is to allow mixing 32 and 64 bit Seamless applications. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-04 15:09:53 UTC (rev 1577) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-08 08:51:37 UTC (rev 1578) @@ -32,47 +32,47 @@ #define EXTERN __declspec(dllexport) -#ifdef __GNUC__ -#define SHARED __attribute__((section ("SHAREDDATA"), shared)) -#else -#define SHARED -#endif +#define FOCUS_MSG_NAME "WM_SEAMLESS_FOCUS" +static UINT g_wm_seamless_focus; -// Shared DATA -#pragma data_seg ( "SHAREDDATA" ) +static HHOOK g_cbt_hook = NULL; +static HHOOK g_wndproc_hook = NULL; +static HHOOK g_wndprocret_hook = NULL; -// this is the total number of processes this dll is currently attached to -int g_instance_count SHARED = 0; +static HINSTANCE g_instance = NULL; -// blocks for locally generated events -HWND g_block_move_hwnd SHARED = NULL; -unsigned int g_block_move_serial SHARED = 0; -RECT g_block_move SHARED = { 0, 0, 0, 0 }; +/* + The data shared between 32 and 64 bit processes contains HWNDs. On + win64, HWND is 64 bit but only 32 bits are used. Thus, our + structure only contains 32 bit, using this data type. The structure + alignment is the same on win32 and win64 (the default being 8 byte + boundaries). + */ +typedef ULONG32 HWND32; -unsigned int g_blocked_zchange_serial SHARED = 0; -HWND g_blocked_zchange[2] SHARED = { NULL, NULL }; +typedef struct _shared_variables +{ + int instance_count; -unsigned int g_blocked_focus_serial SHARED = 0; -HWND g_blocked_focus SHARED = NULL; + // blocks for locally generated events + HWND32 block_move_hwnd; + unsigned int block_move_serial; + RECT block_move; -unsigned int g_blocked_state_serial SHARED = 0; -HWND g_blocked_state_hwnd SHARED = NULL; -int g_blocked_state SHARED = -1; + unsigned int blocked_zchange_serial; + HWND32 blocked_zchange[2]; -#pragma data_seg () + unsigned int blocked_focus_serial; + HWND32 blocked_focus; -#pragma comment(linker, "/section:SHAREDDATA,rws") + unsigned int blocked_state_serial; + HWND32 blocked_state_hwnd; + int blocked_state; -#define FOCUS_MSG_NAME "WM_SEAMLESS_FOCUS" -static UINT g_wm_seamless_focus; +} shared_variables; -static HHOOK g_cbt_hook = NULL; -static HHOOK g_wndproc_hook = NULL; -static HHOOK g_wndprocret_hook = NULL; - -static HINSTANCE g_instance = NULL; - static HANDLE g_mutex = NULL; +static shared_variables *g_shdata = NULL; static BOOL is_toplevel(HWND hwnd) @@ -138,9 +138,9 @@ unsigned int serial; WaitForSingleObject(g_mutex, INFINITE); - blocked_hwnd = g_block_move_hwnd; - serial = g_block_move_serial; - memcpy(&blocked, &g_block_move, sizeof(RECT)); + blocked_hwnd = long_to_hwnd(g_shdata->block_move_hwnd); + serial = g_shdata->block_move_serial; + memcpy(&blocked, &g_shdata->block_move, sizeof(RECT)); ReleaseMutex(g_mutex); vchannel_block(); @@ -171,9 +171,9 @@ unsigned int serial; WaitForSingleObject(g_mutex, INFINITE); - serial = g_blocked_zchange_serial; - block_hwnd = g_blocked_zchange[0]; - block_behind = g_blocked_zchange[1]; + serial = g_shdata->blocked_zchange_serial; + block_hwnd = long_to_hwnd(g_shdata->blocked_zchange[0]); + block_behind = long_to_hwnd(g_shdata->blocked_zchange[1]); ReleaseMutex(g_mutex); vchannel_block(); @@ -607,7 +607,7 @@ if ((GetForegroundWindow() != hwnd) && !is_menu(hwnd)) SetForegroundWindow(hwnd); - vchannel_write("ACK", "%u", g_blocked_focus_serial); + vchannel_write("ACK", "%u", g_shdata->blocked_focus_serial); } end: @@ -630,9 +630,9 @@ LONG style; WaitForSingleObject(g_mutex, INFINITE); - blocked_hwnd = g_blocked_state_hwnd; - serial = g_blocked_state_serial; - blocked = g_blocked_state; + blocked_hwnd = long_to_hwnd(g_shdata->blocked_state_hwnd); + serial = g_shdata->blocked_state_serial; + blocked = g_shdata->blocked_state; ReleaseMutex(g_mutex); hwnd = (HWND) wparam; @@ -707,12 +707,12 @@ RECT rect; WaitForSingleObject(g_mutex, INFINITE); - g_block_move_hwnd = hwnd; - g_block_move_serial = serial; - g_block_move.left = x; - g_block_move.top = y; - g_block_move.right = x + width; - g_block_move.bottom = y + height; + g_shdata->block_move_hwnd = hwnd_to_long(hwnd); + g_shdata->block_move_serial = serial; + g_shdata->block_move.left = x; + g_shdata->block_move.top = y; + g_shdata->block_move.right = x + width; + g_shdata->block_move.bottom = y + height; ReleaseMutex(g_mutex); SetWindowPos(hwnd, NULL, x, y, width, height, SWP_NOACTIVATE | SWP_NOZORDER); @@ -726,8 +726,8 @@ update_position(hwnd); WaitForSingleObject(g_mutex, INFINITE); - g_block_move_hwnd = NULL; - memset(&g_block_move, 0, sizeof(RECT)); + g_shdata->block_move_hwnd = 0; + memset(&g_shdata->block_move, 0, sizeof(RECT)); ReleaseMutex(g_mutex); } @@ -735,9 +735,9 @@ SafeZChange(unsigned int serial, HWND hwnd, HWND behind) { WaitForSingleObject(g_mutex, INFINITE); - g_blocked_zchange_serial = serial; - g_blocked_zchange[0] = hwnd; - g_blocked_zchange[1] = behind; + g_shdata->blocked_zchange_serial = serial; + g_shdata->blocked_zchange[0] = hwnd_to_long(hwnd); + g_shdata->blocked_zchange[1] = hwnd_to_long(behind); ReleaseMutex(g_mutex); if (behind == NULL) @@ -746,8 +746,8 @@ SetWindowPos(hwnd, behind, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); WaitForSingleObject(g_mutex, INFINITE); - g_blocked_zchange[0] = NULL; - g_blocked_zchange[1] = NULL; + g_shdata->blocked_zchange[0] = 0; + g_shdata->blocked_zchange[1] = 0; ReleaseMutex(g_mutex); } @@ -755,14 +755,14 @@ SafeFocus(unsigned int serial, HWND hwnd) { WaitForSingleObject(g_mutex, INFINITE); - g_blocked_focus_serial = serial; - g_blocked_focus = hwnd; + g_shdata->blocked_focus_serial = serial; + g_shdata->blocked_focus = hwnd_to_long(hwnd); ReleaseMutex(g_mutex); SendMessage(hwnd, g_wm_seamless_focus, 0, 0); WaitForSingleObject(g_mutex, INFINITE); - g_blocked_focus = NULL; + g_shdata->blocked_focus = 0; ReleaseMutex(g_mutex); } @@ -791,9 +791,9 @@ } WaitForSingleObject(g_mutex, INFINITE); - g_blocked_state_hwnd = hwnd; - g_blocked_state_serial = serial; - g_blocked_state = state; + g_shdata->blocked_state_hwnd = hwnd_to_long(hwnd); + g_shdata->blocked_state_serial = serial; + g_shdata->blocked_state = state; ReleaseMutex(g_mutex); vchannel_unblock(); @@ -808,20 +808,21 @@ debug("Invalid state %d sent.", state); WaitForSingleObject(g_mutex, INFINITE); - g_blocked_state_hwnd = NULL; - g_blocked_state = -1; + g_shdata->blocked_state_hwnd = 0; + g_shdata->blocked_state = -1; ReleaseMutex(g_mutex); } EXTERN int GetInstanceCount() { - return g_instance_count; + return g_shdata->instance_count; } BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved) { + HANDLE filemapping = NULL; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: @@ -829,17 +830,43 @@ g_instance = hinstDLL; g_mutex = CreateMutex(NULL, FALSE, "Local\\SeamlessDLL"); - if (!g_mutex) - return FALSE; - if (vchannel_open()) + filemapping = CreateFileMapping(INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE, + 0, + sizeof(shared_variables), + "Local\\SeamlessRDPData"); + + if (filemapping) { - CloseHandle(g_mutex); + /* From MSDN: The initial contents of + the pages in a file mapping object + backed by the paging file are 0 + (zero)." */ + g_shdata = MapViewOfFile(filemapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); + } + + if (!g_mutex || !filemapping || !g_shdata || vchannel_open()) + { + /* Clean up in reverse order */ + if (g_shdata) + { + UnmapViewOfFile(g_shdata); + } + if (filemapping) + { + CloseHandle(filemapping); + } + if (g_mutex) + { + CloseHandle(g_mutex); + } return FALSE; } WaitForSingleObject(g_mutex, INFINITE); - ++g_instance_count; + ++g_shdata->instance_count; ReleaseMutex(g_mutex); g_wm_seamless_focus = RegisterWindowMessage(FOCUS_MSG_NAME); @@ -856,11 +883,13 @@ vchannel_write("DESTROYGRP", "0x%08lx, 0x%08lx", GetCurrentProcessId(), 0); WaitForSingleObject(g_mutex, INFINITE); - --g_instance_count; + --g_shdata->instance_count; ReleaseMutex(g_mutex); vchannel_close(); + UnmapViewOfFile(g_shdata); + CloseHandle(filemapping); CloseHandle(g_mutex); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-04 15:09:59
|
Revision: 1577 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1577&view=rev Author: astrand Date: 2010-03-04 15:09:53 +0000 (Thu, 04 Mar 2010) Log Message: ----------- Moved launching of application into separate function. Moved MSG variable to where it belongs. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/main.c Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-04 12:11:08 UTC (rev 1576) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-04 15:09:53 UTC (rev 1577) @@ -349,6 +349,25 @@ return desk == NULL; } +static BOOL +launch_app(LPSTR cmdline) +{ + BOOL result; + PROCESS_INFORMATION proc_info; + STARTUPINFO startup_info; + + memset(&startup_info, 0, sizeof(STARTUPINFO)); + startup_info.cb = sizeof(STARTUPINFO); + + result = CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, + NULL, NULL, &startup_info, &proc_info); + // Release handles + CloseHandle(proc_info.hProcess); + CloseHandle(proc_info.hThread); + + return result; +} + int WINAPI WinMain(HINSTANCE instance, HINSTANCE prev_instance, LPSTR cmdline, int cmdshow) { @@ -424,21 +443,7 @@ /* We don't want windows denying requests to activate windows. */ SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); - BOOL result; - PROCESS_INFORMATION proc_info; - STARTUPINFO startup_info; - MSG msg; - - memset(&startup_info, 0, sizeof(STARTUPINFO)); - startup_info.cb = sizeof(STARTUPINFO); - - result = CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, - NULL, NULL, &startup_info, &proc_info); - // Release handles - CloseHandle(proc_info.hProcess); - CloseHandle(proc_info.hThread); - - if (!result) + if (!launch_app(cmdline)) { // CreateProcess failed. char msg[256]; @@ -452,6 +457,7 @@ while (check_counter-- || !should_terminate()) { BOOL connected; + MSG msg; connected = is_connected(); if (connected && !g_connected) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-04 12:11:19
|
Revision: 1576 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1576&view=rev Author: astrand Date: 2010-03-04 12:11:08 +0000 (Thu, 04 Mar 2010) Log Message: ----------- Removed unused variable g_instance. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/main.c Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-04 12:03:43 UTC (rev 1575) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-04 12:11:08 UTC (rev 1576) @@ -35,8 +35,6 @@ #define APP_NAME "SeamlessRDP Shell" /* Global data */ -static HINSTANCE g_instance; - static DWORD g_session_id; static DWORD *g_startup_procs; static int g_startup_num_procs; @@ -364,8 +362,6 @@ int check_counter; - g_instance = instance; - if (strlen(cmdline) == 0) { message("No command line specified."); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-04 12:03:49
|
Revision: 1575 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1575&view=rev Author: astrand Date: 2010-03-04 12:03:43 +0000 (Thu, 04 Mar 2010) Log Message: ----------- Update my copyright. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c seamlessrdp/trunk/ServerExe/main.c seamlessrdp/trunk/ServerExe/vchannel.c seamlessrdp/trunk/ServerExe/vchannel.h Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-03 13:03:07 UTC (rev 1574) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-04 12:03:43 UTC (rev 1575) @@ -4,7 +4,7 @@ Based on code copyright (C) 2004-2005 Martin Wickett - Copyright 2005-2008 Peter Åstrand <as...@ce...> for Cendio AB + Copyright 2005-2010 Peter Åstrand <as...@ce...> for Cendio AB Copyright 2006-2008 Pierre Ossman <os...@ce...> for Cendio AB This program is free software: you can redistribute it and/or modify Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-03 13:03:07 UTC (rev 1574) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-04 12:03:43 UTC (rev 1575) @@ -4,7 +4,7 @@ Based on code copyright (C) 2004-2005 Martin Wickett - Copyright (C) Peter Åstrand <as...@ce...> 2005-2006 + Copyright 2005-2010 Peter Åstrand <as...@ce...> for Cendio AB Copyright (C) Pierre Ossman <os...@ce...> 2006 This program is free software: you can redistribute it and/or modify Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-03 13:03:07 UTC (rev 1574) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-04 12:03:43 UTC (rev 1575) @@ -3,6 +3,7 @@ Seamless windows - Virtual channel handling Copyright (C) Pierre Ossman <os...@ce...> 2006 + Copyright 2010 Peter Åstrand <as...@ce...> for Cendio AB This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by Modified: seamlessrdp/trunk/ServerExe/vchannel.h =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.h 2010-03-03 13:03:07 UTC (rev 1574) +++ seamlessrdp/trunk/ServerExe/vchannel.h 2010-03-04 12:03:43 UTC (rev 1575) @@ -3,6 +3,7 @@ Seamless windows - Virtual channel handling Copyright (C) Pierre Ossman <os...@ce...> 2006 + Copyright 2010 Peter Åstrand <as...@ce...> for Cendio AB This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-03 13:03:15
|
Revision: 1574 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1574&view=rev Author: astrand Date: 2010-03-03 13:03:07 +0000 (Wed, 03 Mar 2010) Log Message: ----------- Use -Wall if GCC Modified Paths: -------------- seamlessrdp/trunk/ServerExe/configure.ac Modified: seamlessrdp/trunk/ServerExe/configure.ac =================================================================== --- seamlessrdp/trunk/ServerExe/configure.ac 2010-03-03 12:39:26 UTC (rev 1573) +++ seamlessrdp/trunk/ServerExe/configure.ac 2010-03-03 13:03:07 UTC (rev 1574) @@ -6,6 +6,9 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) AC_PROG_CC +if test "$GCC" = yes; then + CFLAGS="$CFLAGS -Wall" +fi AC_PROG_LIBTOOL AC_LIBTOOL_WIN32_DLL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-03 12:39:32
|
Revision: 1573 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1573&view=rev Author: astrand Date: 2010-03-03 12:39:26 +0000 (Wed, 03 Mar 2010) Log Message: ----------- debug calls shouldn't append newline. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-03 10:05:13 UTC (rev 1572) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-03 12:39:26 UTC (rev 1573) @@ -147,7 +147,7 @@ if (!GetWindowRect(hwnd, &rect)) { - debug("GetWindowRect failed!\n"); + debug("GetWindowRect failed!"); goto end; } @@ -720,7 +720,7 @@ vchannel_write("ACK", "%u", serial); if (!GetWindowRect(hwnd, &rect)) - debug("GetWindowRect failed!\n"); + debug("GetWindowRect failed!"); else if ((rect.left != x) || (rect.top != y) || (rect.right != x + width) || (rect.bottom != y + height)) update_position(hwnd); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-03 10:05:19
|
Revision: 1572 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1572&view=rev Author: astrand Date: 2010-03-03 10:05:13 +0000 (Wed, 03 Mar 2010) Log Message: ----------- INT_MAX is in limits.h Modified Paths: -------------- seamlessrdp/trunk/ServerExe/vchannel.c Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-03 08:35:05 UTC (rev 1571) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-03 10:05:13 UTC (rev 1572) @@ -22,6 +22,7 @@ #include <stdio.h> #include <stdarg.h> #include <errno.h> +#include <limits.h> #include <windows.h> #include <wtsapi32.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-03 08:35:11
|
Revision: 1571 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1571&view=rev Author: astrand Date: 2010-03-03 08:35:05 +0000 (Wed, 03 Mar 2010) Log Message: ----------- Don't make a DLL out of vchannel any longer. Instead, link it statically into seamlessrdp.dll and seamlessrdpshell.exe. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/Makefile.am Modified: seamlessrdp/trunk/ServerExe/Makefile.am =================================================================== --- seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-02 16:24:50 UTC (rev 1570) +++ seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-03 08:35:05 UTC (rev 1571) @@ -1,17 +1,16 @@ bin_PROGRAMS = seamlessrdpshell lib_LTLIBRARIES = \ - vchannel.la \ seamlessrdp.la +noinst_LTLIBRARIES = libvchannel.la +libvchannel_la_SOURCES = vchannel.c +libvchannel_la_LIBADD = -lwtsapi32 + seamlessrdpshell_SOURCES = main.c -seamlessrdpshell_LDADD = vchannel.la +seamlessrdpshell_LDADD = libvchannel.la -lwtsapi32 seamlessrdpshell_LDFLAGS = -mwindows -vchannel_la_SOURCES = vchannel.c vchannel.h -vchannel_la_LDFLAGS = -avoid-version -module -no-undefined -lwtsapi32 - seamlessrdp_la_SOURCES = hookdll.c -seamlessrdp_la_LIBADD = vchannel.la -seamlessrdp_la_LDFLAGS = -avoid-version -module -no-undefined -lgdi32 - +seamlessrdp_la_LDFLAGS = -avoid-version -module -no-undefined +seamlessrdp_la_LIBADD = libvchannel.la -lgdi32 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 16:24:56
|
Revision: 1570 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1570&view=rev Author: astrand Date: 2010-03-02 16:24:50 +0000 (Tue, 02 Mar 2010) Log Message: ----------- Eliminate the usage of shared DLL data. Besides being ugly, this mechanism does not work when mixing 32 and 64 bit applications. We are instead using a named semaphore as a counter. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/vchannel.c Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-02 10:28:51 UTC (rev 1569) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-02 16:24:50 UTC (rev 1570) @@ -34,23 +34,9 @@ #define INVALID_CHARS "," #define REPLACEMENT_CHAR '_' -#ifdef __GNUC__ -#define SHARED __attribute__((section ("SHAREDDATA"), shared)) -#else -#define SHARED -#endif - -// Shared DATA -#pragma data_seg ( "SHAREDDATA" ) - -unsigned int g_vchannel_serial SHARED = 0; - -#pragma data_seg () - -#pragma comment(linker, "/section:SHAREDDATA,rws") - static HANDLE g_mutex = NULL; static HANDLE g_vchannel = NULL; +static HANDLE g_vchannel_serial = NULL; static unsigned int g_opencount = 0; EXTERN void @@ -147,7 +133,10 @@ return -1; g_mutex = CreateMutex(NULL, FALSE, "Local\\SeamlessChannel"); - if (!g_mutex) + + g_vchannel_serial = CreateSemaphore(NULL, 0, INT_MAX, "Local\\SeamlessRDPSerial"); + + if (!g_mutex || !g_vchannel_serial) { WTSVirtualChannelClose(g_vchannel); g_vchannel = NULL; @@ -265,13 +254,27 @@ char buf[VCHANNEL_MAX_LINE]; int size; ULONG bytes_written; + LONG prev_serial; assert(vchannel_is_open()); WaitForSingleObject(g_mutex, INFINITE); - size = _snprintf(buf, sizeof(buf), "%s,%u,", command, g_vchannel_serial); + /* Increase serial */ + if (!ReleaseSemaphore(g_vchannel_serial, 1, &prev_serial)) + { + if (GetLastError() == ERROR_TOO_MANY_POSTS) + { + /* Reset serial to zero */ + while (WaitForSingleObject(g_vchannel_serial, 0) == WAIT_OBJECT_0); + if (!ReleaseSemaphore(g_vchannel_serial, 1, &prev_serial)) + { + return -1; + } + } + } + size = _snprintf(buf, sizeof(buf), "%s,%u,", command, prev_serial); assert(size < sizeof(buf)); va_start(argp, format); @@ -283,8 +286,6 @@ result = WTSVirtualChannelWrite(g_vchannel, buf, (ULONG) strlen(buf), &bytes_written); result = WTSVirtualChannelWrite(g_vchannel, "\n", (ULONG) 1, &bytes_written); - g_vchannel_serial++; - ReleaseMutex(g_mutex); if (!result) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 10:28:57
|
Revision: 1569 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1569&view=rev Author: astrand Date: 2010-03-02 10:28:51 +0000 (Tue, 02 Mar 2010) Log Message: ----------- Slightly newer INSTALL file Modified Paths: -------------- seamlessrdp/trunk/ServerExe/INSTALL Modified: seamlessrdp/trunk/ServerExe/INSTALL =================================================================== --- seamlessrdp/trunk/ServerExe/INSTALL 2010-03-02 09:47:54 UTC (rev 1568) +++ seamlessrdp/trunk/ServerExe/INSTALL 2010-03-02 10:28:51 UTC (rev 1569) @@ -2,7 +2,7 @@ ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008 Free Software Foundation, Inc. +2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. @@ -159,7 +159,7 @@ CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: - ./configure CC="cc -Ae" + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. @@ -174,6 +174,16 @@ ./configure CC="cc -nodtk" + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + Specifying the System Type ========================== @@ -189,7 +199,8 @@ where SYSTEM can have one of these forms: - OS KERNEL-OS + OS + KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 09:48:00
|
Revision: 1568 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1568&view=rev Author: astrand Date: 2010-03-02 09:47:54 +0000 (Tue, 02 Mar 2010) Log Message: ----------- Eliminate build errors and warnings on win64. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c seamlessrdp/trunk/ServerExe/main.c seamlessrdp/trunk/ServerExe/vchannel.c seamlessrdp/trunk/ServerExe/vchannel.h Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-02 09:46:44 UTC (rev 1567) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-02 09:47:54 UTC (rev 1568) @@ -232,7 +232,7 @@ if (icon) return icon; - icon = (HICON) GetClassLong(hwnd, large ? GCL_HICON : GCL_HICONSM); + icon = (HICON) GetClassLongPtr(hwnd, large ? GCLP_HICON : GCLP_HICONSM); if (icon) return icon; @@ -423,8 +423,8 @@ flags |= SEAMLESS_CREATE_TOPMOST; vchannel_write("CREATE", "0x%08lx,0x%08lx,0x%08lx,0x%08x", - (long) hwnd, (long) pid, - (long) get_parent(hwnd), flags); + hwnd_to_long(hwnd), (long) pid, + hwnd_to_long(get_parent(hwnd)), flags); GetWindowTextW(hwnd, title, sizeof(title) / sizeof(*title)); Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-02 09:46:44 UTC (rev 1567) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-02 09:47:54 UTC (rev 1568) @@ -113,7 +113,7 @@ return TRUE; if (styles & WS_POPUP) - parent = (HWND) GetWindowLong(hwnd, GWL_HWNDPARENT); + parent = (HWND) GetWindowLongPtr(hwnd, GWLP_HWNDPARENT); else parent = NULL; @@ -123,8 +123,8 @@ if (styles & DS_MODALFRAME) flags |= SEAMLESS_CREATE_MODAL; - vchannel_write("CREATE", "0x%08lx,0x%08lx,0x%08lx,0x%08x", (long) hwnd, (long) pid, - (long) parent, flags); + vchannel_write("CREATE", "0x%08lx,0x%08lx,0x%08lx,0x%08x", + hwnd_to_long(hwnd), (long) pid, hwnd_to_long(parent), flags); if (!GetWindowRect(hwnd, &rect)) { @@ -222,20 +222,20 @@ if (strcmp(tok1, "SYNC") == 0) do_sync(); else if (strcmp(tok1, "STATE") == 0) - do_state(strtoul(tok2, NULL, 0), (HWND) strtoul(tok3, NULL, 0), + do_state(strtoul(tok2, NULL, 0), long_to_hwnd(strtoul(tok3, NULL, 0)), strtol(tok4, NULL, 0)); else if (strcmp(tok1, "POSITION") == 0) - do_position(strtoul(tok2, NULL, 0), (HWND) strtoul(tok3, NULL, 0), + do_position(strtoul(tok2, NULL, 0), long_to_hwnd(strtoul(tok3, NULL, 0)), strtol(tok4, NULL, 0), strtol(tok5, NULL, 0), strtol(tok6, NULL, 0), strtol(tok7, NULL, 0)); else if (strcmp(tok1, "ZCHANGE") == 0) - do_zchange(strtoul(tok2, NULL, 0), (HWND) strtoul(tok3, NULL, 0), - (HWND) strtoul(tok4, NULL, 0)); + do_zchange(strtoul(tok2, NULL, 0), long_to_hwnd(strtoul(tok3, NULL, 0)), + long_to_hwnd(strtoul(tok4, NULL, 0))); else if (strcmp(tok1, "FOCUS") == 0) - do_focus(strtoul(tok2, NULL, 0), (HWND) strtoul(tok3, NULL, 0)); + do_focus(strtoul(tok2, NULL, 0), long_to_hwnd(strtoul(tok3, NULL, 0))); else if (strcmp(tok1, "DESTROY") == 0) - do_destroy((HWND) strtoul(tok3, NULL, 0)); + do_destroy(long_to_hwnd(strtoul(tok3, NULL, 0))); } } Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-02 09:46:44 UTC (rev 1567) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-03-02 09:47:54 UTC (rev 1568) @@ -68,6 +68,27 @@ vchannel_write("DEBUG", buf); } +/* + From http://msdn.microsoft.com/en-us/library/aa384203(VS.85).aspx: + "64-bit versions of Windows use 32-bit handles for interoperability." + */ +long +hwnd_to_long(HWND hwnd) +{ + DWORD_PTR val; + val = (DWORD_PTR) hwnd; + return val; +} + +HWND +long_to_hwnd(long l) +{ + DWORD_PTR val; + val = l; + return (HWND) val; +} + + #define CONVERT_BUFFER_SIZE 1024 static char convert_buffer[CONVERT_BUFFER_SIZE]; Modified: seamlessrdp/trunk/ServerExe/vchannel.h =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.h 2010-03-02 09:46:44 UTC (rev 1567) +++ seamlessrdp/trunk/ServerExe/vchannel.h 2010-03-02 09:47:54 UTC (rev 1568) @@ -33,6 +33,9 @@ EXTERN void debug(char *format, ...); +EXTERN long hwnd_to_long(HWND hwnd); +EXTERN HWND long_to_hwnd(long val); + EXTERN const char *unicode_to_utf8(const unsigned short *string); EXTERN int vchannel_open(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 09:46:50
|
Revision: 1567 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1567&view=rev Author: astrand Date: 2010-03-02 09:46:44 +0000 (Tue, 02 Mar 2010) Log Message: ----------- seamlessrdpshell.exe should not be a console application. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/Makefile.am Modified: seamlessrdp/trunk/ServerExe/Makefile.am =================================================================== --- seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-02 07:53:43 UTC (rev 1566) +++ seamlessrdp/trunk/ServerExe/Makefile.am 2010-03-02 09:46:44 UTC (rev 1567) @@ -6,6 +6,7 @@ seamlessrdpshell_SOURCES = main.c seamlessrdpshell_LDADD = vchannel.la +seamlessrdpshell_LDFLAGS = -mwindows vchannel_la_SOURCES = vchannel.c vchannel.h vchannel_la_LDFLAGS = -avoid-version -module -no-undefined -lwtsapi32 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 07:53:50
|
Revision: 1566 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1566&view=rev Author: astrand Date: 2010-03-02 07:53:43 +0000 (Tue, 02 Mar 2010) Log Message: ----------- Indented Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c seamlessrdp/trunk/ServerExe/main.c Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-02 07:51:59 UTC (rev 1565) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-03-02 07:53:43 UTC (rev 1566) @@ -832,7 +832,8 @@ if (!g_mutex) return FALSE; - if (vchannel_open()) { + if (vchannel_open()) + { CloseHandle(g_mutex); return FALSE; } Modified: seamlessrdp/trunk/ServerExe/main.c =================================================================== --- seamlessrdp/trunk/ServerExe/main.c 2010-03-02 07:51:59 UTC (rev 1565) +++ seamlessrdp/trunk/ServerExe/main.c 2010-03-02 07:53:43 UTC (rev 1566) @@ -442,7 +442,8 @@ CloseHandle(proc_info.hProcess); CloseHandle(proc_info.hThread); - if (!result) { + if (!result) + { // CreateProcess failed. char msg[256]; _snprintf(msg, sizeof(msg), @@ -462,8 +463,7 @@ int flags; /* These get reset on each reconnect */ SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, TRUE, NULL, 0); - SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, - 0); + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0); flags = SEAMLESS_HELLO_RECONNECT; @@ -500,19 +500,19 @@ success = 1; -unhook: + unhook: remove_hooks_fn(); free_startup_procs(); -close_hookdll: + close_hookdll: FreeLibrary(hookdll); -close_vchannel: + close_vchannel: vchannel_close(); if (success) - return 1; + return 1; else return -1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-03-02 07:52:09
|
Revision: 1565 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1565&view=rev Author: astrand Date: 2010-03-02 07:51:59 +0000 (Tue, 02 Mar 2010) Log Message: ----------- Adapted; HookDll is no longer Modified Paths: -------------- seamlessrdp/trunk/indent-all Modified: seamlessrdp/trunk/indent-all =================================================================== --- seamlessrdp/trunk/indent-all 2010-02-18 14:54:50 UTC (rev 1564) +++ seamlessrdp/trunk/indent-all 2010-03-02 07:51:59 UTC (rev 1565) @@ -1,2 +1,2 @@ #!/bin/sh -indent -bli0 -i8 -cli8 -npcs -l100 ServerExe/*.h ServerExe/*.c ServerExe/HookDll/*.c +indent -bli0 -i8 -cli8 -npcs -l100 ServerExe/*.h ServerExe/*.c This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-02-18 14:54:56
|
Revision: 1564 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1564&view=rev Author: astrand Date: 2010-02-18 14:54:50 +0000 (Thu, 18 Feb 2010) Log Message: ----------- Rename DLL_EXPORT to EXTERN to avoid clash with libtool. Avoids warnings. Modified Paths: -------------- seamlessrdp/trunk/ServerExe/hookdll.c seamlessrdp/trunk/ServerExe/vchannel.c seamlessrdp/trunk/ServerExe/vchannel.h Modified: seamlessrdp/trunk/ServerExe/hookdll.c =================================================================== --- seamlessrdp/trunk/ServerExe/hookdll.c 2010-01-27 07:41:14 UTC (rev 1563) +++ seamlessrdp/trunk/ServerExe/hookdll.c 2010-02-18 14:54:50 UTC (rev 1564) @@ -30,7 +30,7 @@ #include "vchannel.h" -#define DLL_EXPORT __declspec(dllexport) +#define EXTERN __declspec(dllexport) #ifdef __GNUC__ #define SHARED __attribute__((section ("SHAREDDATA"), shared)) @@ -674,7 +674,7 @@ return CallNextHookEx(g_cbt_hook, code, wparam, lparam); } -DLL_EXPORT void +EXTERN void SetHooks(void) { if (!g_cbt_hook) @@ -688,7 +688,7 @@ SetWindowsHookEx(WH_CALLWNDPROCRET, wndprocret_hook_proc, g_instance, 0); } -DLL_EXPORT void +EXTERN void RemoveHooks(void) { if (g_cbt_hook) @@ -701,7 +701,7 @@ UnhookWindowsHookEx(g_wndprocret_hook); } -DLL_EXPORT void +EXTERN void SafeMoveWindow(unsigned int serial, HWND hwnd, int x, int y, int width, int height) { RECT rect; @@ -731,7 +731,7 @@ ReleaseMutex(g_mutex); } -DLL_EXPORT void +EXTERN void SafeZChange(unsigned int serial, HWND hwnd, HWND behind) { WaitForSingleObject(g_mutex, INFINITE); @@ -751,7 +751,7 @@ ReleaseMutex(g_mutex); } -DLL_EXPORT void +EXTERN void SafeFocus(unsigned int serial, HWND hwnd) { WaitForSingleObject(g_mutex, INFINITE); @@ -766,7 +766,7 @@ ReleaseMutex(g_mutex); } -DLL_EXPORT void +EXTERN void SafeSetState(unsigned int serial, HWND hwnd, int state) { LONG style; @@ -813,7 +813,7 @@ ReleaseMutex(g_mutex); } -DLL_EXPORT int +EXTERN int GetInstanceCount() { return g_instance_count; Modified: seamlessrdp/trunk/ServerExe/vchannel.c =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.c 2010-01-27 07:41:14 UTC (rev 1563) +++ seamlessrdp/trunk/ServerExe/vchannel.c 2010-02-18 14:54:50 UTC (rev 1564) @@ -53,7 +53,7 @@ static HANDLE g_vchannel = NULL; static unsigned int g_opencount = 0; -DLL_EXPORT void +EXTERN void debug(char *format, ...) { va_list argp; @@ -71,7 +71,7 @@ #define CONVERT_BUFFER_SIZE 1024 static char convert_buffer[CONVERT_BUFFER_SIZE]; -DLL_EXPORT const char * +EXTERN const char * unicode_to_utf8(const unsigned short *string) { unsigned char *buf; @@ -116,7 +116,7 @@ return convert_buffer; } -DLL_EXPORT int +EXTERN int vchannel_open() { g_vchannel = WTSVirtualChannelOpen(WTS_CURRENT_SERVER_HANDLE, @@ -140,7 +140,7 @@ return 0; } -DLL_EXPORT void +EXTERN void vchannel_close() { g_opencount--; @@ -157,7 +157,7 @@ g_vchannel = NULL; } -DLL_EXPORT int +EXTERN int vchannel_is_open() { if (g_vchannel == NULL) @@ -166,7 +166,7 @@ return 1; } -DLL_EXPORT int +EXTERN int vchannel_read(char *line, size_t length) { static BOOL overflow_mode = FALSE; @@ -236,7 +236,7 @@ return 0; } -DLL_EXPORT int +EXTERN int vchannel_write(const char *command, const char *format, ...) { BOOL result; @@ -272,19 +272,19 @@ return bytes_written; } -DLL_EXPORT void +EXTERN void vchannel_block() { WaitForSingleObject(g_mutex, INFINITE); } -DLL_EXPORT void +EXTERN void vchannel_unblock() { ReleaseMutex(g_mutex); } -DLL_EXPORT const char * +EXTERN const char * vchannel_strfilter(char *string) { char *c; @@ -298,7 +298,7 @@ return string; } -DLL_EXPORT const char * +EXTERN const char * vchannel_strfilter_unicode(const unsigned short *string) { return vchannel_strfilter((char *) unicode_to_utf8(string)); Modified: seamlessrdp/trunk/ServerExe/vchannel.h =================================================================== --- seamlessrdp/trunk/ServerExe/vchannel.h 2010-01-27 07:41:14 UTC (rev 1563) +++ seamlessrdp/trunk/ServerExe/vchannel.h 2010-02-18 14:54:50 UTC (rev 1564) @@ -21,7 +21,7 @@ #ifndef __VCHANNEL_H__ #define __VCHANNEL_H__ -#define DLL_EXPORT __declspec(dllexport) +#define EXTERN __declspec(dllexport) #define VCHANNEL_MAX_LINE 1024 @@ -31,23 +31,23 @@ #define SEAMLESS_HELLO_RECONNECT 0x0001 #define SEAMLESS_HELLO_HIDDEN 0x0002 -DLL_EXPORT void debug(char *format, ...); +EXTERN void debug(char *format, ...); -DLL_EXPORT const char *unicode_to_utf8(const unsigned short *string); +EXTERN const char *unicode_to_utf8(const unsigned short *string); -DLL_EXPORT int vchannel_open(); -DLL_EXPORT void vchannel_close(); +EXTERN int vchannel_open(); +EXTERN void vchannel_close(); -DLL_EXPORT int vchannel_is_open(); +EXTERN int vchannel_is_open(); /* read may only be used by a single process. write is completely safe */ -DLL_EXPORT int vchannel_read(char *line, size_t length); -DLL_EXPORT int vchannel_write(const char *command, const char *format, ...); +EXTERN int vchannel_read(char *line, size_t length); +EXTERN int vchannel_write(const char *command, const char *format, ...); -DLL_EXPORT void vchannel_block(); -DLL_EXPORT void vchannel_unblock(); +EXTERN void vchannel_block(); +EXTERN void vchannel_unblock(); -DLL_EXPORT const char *vchannel_strfilter(char *string); -DLL_EXPORT const char *vchannel_strfilter_unicode(const unsigned short *string); +EXTERN const char *vchannel_strfilter(char *string); +EXTERN const char *vchannel_strfilter_unicode(const unsigned short *string); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-27 07:41:20
|
Revision: 1563 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1563&view=rev Author: astrand Date: 2010-01-27 07:41:14 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Only call scard_reset_state() if building with scard support. Modified Paths: -------------- rdesktop/trunk/rdesktop.c Modified: rdesktop/trunk/rdesktop.c =================================================================== --- rdesktop/trunk/rdesktop.c 2010-01-27 07:40:47 UTC (rev 1562) +++ rdesktop/trunk/rdesktop.c 2010-01-27 07:41:14 UTC (rev 1563) @@ -351,7 +351,9 @@ rdesktop_reset_state(void) { rdp_reset_state(); +#ifdef WITH_SCARD scard_reset_state(); +#endif } static RD_BOOL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-27 07:40:52
|
Revision: 1562 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1562&view=rev Author: astrand Date: 2010-01-27 07:40:47 +0000 (Wed, 27 Jan 2010) Log Message: ----------- Indented Modified Paths: -------------- rdesktop/trunk/scard.c Modified: rdesktop/trunk/scard.c =================================================================== --- rdesktop/trunk/scard.c 2010-01-26 12:23:53 UTC (rev 1561) +++ rdesktop/trunk/scard.c 2010-01-27 07:40:47 UTC (rev 1562) @@ -2627,11 +2627,12 @@ pthread_mutex_unlock(scard_mutex[lock]); } -void scard_reset_state() +void +scard_reset_state() { - curDevice = 0; - curId = 0; - curBytesOut = 0; + curDevice = 0; + curId = 0; + curBytesOut = 0; - queueFirst = queueLast = NULL; + queueFirst = queueLast = NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-26 14:33:32
|
Revision: 1561 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1561&view=rev Author: astrand Date: 2010-01-26 12:23:53 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Reset smart card state before reconnect. This fixes stability problems when using smart cards in conjunction with RandR. Modified Paths: -------------- rdesktop/trunk/proto.h rdesktop/trunk/rdesktop.c rdesktop/trunk/scard.c Modified: rdesktop/trunk/proto.h =================================================================== --- rdesktop/trunk/proto.h 2010-01-26 10:24:26 UTC (rev 1560) +++ rdesktop/trunk/proto.h 2010-01-26 12:23:53 UTC (rev 1561) @@ -314,6 +314,7 @@ void scard_unlock(int lock); int scard_enum_devices(uint32 * id, char *optarg); void scardSetInfo(uint32 device, uint32 id, uint32 bytes_out); +void scard_reset_state(); /* *INDENT-OFF* */ #ifdef __cplusplus Modified: rdesktop/trunk/rdesktop.c =================================================================== --- rdesktop/trunk/rdesktop.c 2010-01-26 10:24:26 UTC (rev 1560) +++ rdesktop/trunk/rdesktop.c 2010-01-26 12:23:53 UTC (rev 1561) @@ -351,6 +351,7 @@ rdesktop_reset_state(void) { rdp_reset_state(); + scard_reset_state(); } static RD_BOOL Modified: rdesktop/trunk/scard.c =================================================================== --- rdesktop/trunk/scard.c 2010-01-26 10:24:26 UTC (rev 1560) +++ rdesktop/trunk/scard.c 2010-01-26 12:23:53 UTC (rev 1561) @@ -2626,3 +2626,12 @@ { pthread_mutex_unlock(scard_mutex[lock]); } + +void scard_reset_state() +{ + curDevice = 0; + curId = 0; + curBytesOut = 0; + + queueFirst = queueLast = NULL; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-26 10:24:32
|
Revision: 1560 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1560&view=rev Author: astrand Date: 2010-01-26 10:24:26 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Avoid a few more compile warnings. This file should now build without warnings on 32 bit platforms, when debugging is not enabled. Modified Paths: -------------- rdesktop/trunk/scard.c Modified: rdesktop/trunk/scard.c =================================================================== --- rdesktop/trunk/scard.c 2010-01-26 10:20:06 UTC (rev 1559) +++ rdesktop/trunk/scard.c 2010-01-26 10:24:26 UTC (rev 1560) @@ -39,7 +39,9 @@ /* variable segment */ #define SCARD_MAX_MEM 102400 +#ifndef SCARD_AUTOALLOCATE #define SCARD_AUTOALLOCATE -1 +#endif #define OUT_STREAM_SIZE 4096 #ifdef B_ENDIAN @@ -933,6 +935,8 @@ return rv; } +/* Currently unused */ +#if 0 static int needStatusRecheck(MYPCSC_DWORD rv, MYPCSC_LPSCARD_READERSTATE_A rsArray, SERVER_DWORD dwCount) { @@ -959,6 +963,7 @@ code &= 0x0000FFFF; return (code % 2); } +#endif static MYPCSC_DWORD incStatus(MYPCSC_DWORD code, RD_BOOL mapped) @@ -1851,6 +1856,8 @@ #ifndef WITH_PCSC120 +/* Currently unused */ +#if 0 static MYPCSC_DWORD TS_SCardListReaderGroups(STREAM in, STREAM out) { @@ -1910,6 +1917,7 @@ SC_xfreeallmemory(&lcHandle); return rv; } +#endif static MYPCSC_DWORD TS_SCardGetAttrib(STREAM in, STREAM out) @@ -2006,6 +2014,8 @@ return rv; } +/* Currently unused */ +#if 0 static MYPCSC_DWORD TS_SCardSetAttrib(STREAM in, STREAM out) { @@ -2059,6 +2069,7 @@ SC_xfreeallmemory(&lcHandle); return rv; } +#endif #endif @@ -2373,6 +2384,8 @@ return d; } +/* Currently unused */ +#if 0 static void freeStream(PMEM_HANDLE * handle, STREAM s) { @@ -2383,6 +2396,7 @@ SC_xfree(handle, s); } } +#endif static PSCThreadData SC_addToQueue(RD_NTHANDLE handle, uint32 request, STREAM in, STREAM out) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-26 10:20:12
|
Revision: 1559 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1559&view=rev Author: astrand Date: 2010-01-26 10:20:06 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Indented Modified Paths: -------------- rdesktop/trunk/scard.h Modified: rdesktop/trunk/scard.h =================================================================== --- rdesktop/trunk/scard.h 2010-01-26 10:13:53 UTC (rev 1558) +++ rdesktop/trunk/scard.h 2010-01-26 10:20:06 UTC (rev 1559) @@ -171,4 +171,3 @@ PSCThreadData data; struct _TThreadListElement *next; } TThreadListElement, *PThreadListElement; - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-26 10:14:04
|
Revision: 1558 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1558&view=rev Author: astrand Date: 2010-01-26 10:13:53 +0000 (Tue, 26 Jan 2010) Log Message: ----------- Need two more smart card prototypes, to avoid warnings. Modified Paths: -------------- rdesktop/trunk/proto.h rdesktop/trunk/scard.h Modified: rdesktop/trunk/proto.h =================================================================== --- rdesktop/trunk/proto.h 2010-01-21 09:24:40 UTC (rev 1557) +++ rdesktop/trunk/proto.h 2010-01-26 10:13:53 UTC (rev 1558) @@ -312,6 +312,8 @@ /* scard.c */ void scard_lock(int lock); void scard_unlock(int lock); +int scard_enum_devices(uint32 * id, char *optarg); +void scardSetInfo(uint32 device, uint32 id, uint32 bytes_out); /* *INDENT-OFF* */ #ifdef __cplusplus Modified: rdesktop/trunk/scard.h =================================================================== --- rdesktop/trunk/scard.h 2010-01-21 09:24:40 UTC (rev 1557) +++ rdesktop/trunk/scard.h 2010-01-26 10:13:53 UTC (rev 1558) @@ -172,4 +172,3 @@ struct _TThreadListElement *next; } TThreadListElement, *PThreadListElement; -int scard_enum_devices(uint32 * id, char *optarg); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <as...@us...> - 2010-01-21 09:24:46
|
Revision: 1557 http://rdesktop.svn.sourceforge.net/rdesktop/?rev=1557&view=rev Author: astrand Date: 2010-01-21 09:24:40 +0000 (Thu, 21 Jan 2010) Log Message: ----------- Committed load balancing fixes from Daniel Drown. Hopefully fixes bug #2845414. Modified Paths: -------------- rdesktop/trunk/constants.h rdesktop/trunk/rdp.c Modified: rdesktop/trunk/constants.h =================================================================== --- rdesktop/trunk/constants.h 2010-01-20 09:59:47 UTC (rev 1556) +++ rdesktop/trunk/constants.h 2010-01-21 09:24:40 UTC (rev 1557) @@ -455,3 +455,20 @@ #define SCARD_LOCK_CHANNEL 2 #define SCARD_LOCK_RDPDR 3 #define SCARD_LOCK_LAST 4 + + +/* redirect flags, from [MS-RDPBCGR] 2.2.13.1 */ +enum RDP_PDU_REDIRECT_FLAGS +{ + PDU_REDIRECT_HAS_IP = 0x1, + PDU_REDIRECT_HAS_COOKIE = 0x2, + PDU_REDIRECT_HAS_USERNAME = 0x4, + PDU_REDIRECT_HAS_DOMAIN = 0x8, + PDU_REDIRECT_HAS_PASSWORD = 0x10, + PDU_REDIRECT_DONT_STORE_USERNAME = 0x20, + PDU_REDIRECT_USE_SMARTCARD = 0x40, + PDU_REDIRECT_INFORMATIONAL = 0x80, + PDU_REDIRECT_HAS_TARGET_FQDN = 0x100, + PDU_REDIRECT_HAS_TARGET_NETBIOS = 0x200, + PDU_REDIRECT_HAS_TARGET_IP_ARRAY = 0x800 +}; Modified: rdesktop/trunk/rdp.c =================================================================== --- rdesktop/trunk/rdp.c 2010-01-20 09:59:47 UTC (rev 1556) +++ rdesktop/trunk/rdp.c 2010-01-21 09:24:40 UTC (rev 1557) @@ -1481,50 +1481,95 @@ /* read connection flags */ in_uint32_le(s, g_redirect_flags); - /* read length of ip string */ - in_uint32_le(s, len); + if (g_redirect_flags & PDU_REDIRECT_HAS_IP) + { + /* read length of ip string */ + in_uint32_le(s, len); - /* read ip string */ - rdp_in_unistr(s, g_redirect_server, sizeof(g_redirect_server), len); + /* read ip string */ + rdp_in_unistr(s, g_redirect_server, sizeof(g_redirect_server), len); + } - /* read length of cookie string */ - in_uint32_le(s, len); + if (g_redirect_flags & PDU_REDIRECT_HAS_COOKIE) + { + /* read length of cookie string */ + in_uint32_le(s, len); - /* read cookie string (plain ASCII) */ - if (len > sizeof(g_redirect_cookie) - 1) + /* read cookie string (plain ASCII) */ + if (len > sizeof(g_redirect_cookie) - 1) + { + uint32 rem = len - (sizeof(g_redirect_cookie) - 1); + len = sizeof(g_redirect_cookie) - 1; + + warning("Unexpectedly large redirection cookie\n"); + in_uint8a(s, g_redirect_cookie, len); + in_uint8s(s, rem); + } + else + { + in_uint8a(s, g_redirect_cookie, len); + } + g_redirect_cookie[len] = 0; + } + + if (g_redirect_flags & PDU_REDIRECT_HAS_USERNAME) { - uint32 rem = len - (sizeof(g_redirect_cookie) - 1); - len = sizeof(g_redirect_cookie) - 1; + /* read length of username string */ + in_uint32_le(s, len); - warning("Unexpectedly large redirection cookie\n"); - in_uint8a(s, g_redirect_cookie, len); - in_uint8s(s, rem); + /* read username string */ + g_redirect_username = (char *) xmalloc(len + 1); + rdp_in_unistr(s, g_redirect_username, strlen(g_redirect_username), len); } - else + + if (g_redirect_flags & PDU_REDIRECT_HAS_DOMAIN) { - in_uint8a(s, g_redirect_cookie, len); + /* read length of domain string */ + in_uint32_le(s, len); + + /* read domain string */ + rdp_in_unistr(s, g_redirect_domain, sizeof(g_redirect_domain), len); } - g_redirect_cookie[len] = 0; - /* read length of username string */ - in_uint32_le(s, len); + if (g_redirect_flags & PDU_REDIRECT_HAS_PASSWORD) + { + /* read length of password string */ + in_uint32_le(s, len); - /* read username string */ - g_redirect_username = (char *) xmalloc(len + 1); - rdp_in_unistr(s, g_redirect_username, strlen(g_redirect_username), len); + /* read password string */ + rdp_in_unistr(s, g_redirect_password, sizeof(g_redirect_password), len); + } - /* read length of domain string */ - in_uint32_le(s, len); + if (g_redirect_flags & PDU_REDIRECT_DONT_STORE_USERNAME) + { + warning("PDU_REDIRECT_DONT_STORE_USERNAME set\n"); + } - /* read domain string */ - rdp_in_unistr(s, g_redirect_domain, sizeof(g_redirect_domain), len); + if (g_redirect_flags & PDU_REDIRECT_USE_SMARTCARD) + { + warning("PDU_REDIRECT_USE_SMARTCARD set\n"); + } - /* read length of password string */ - in_uint32_le(s, len); + if (g_redirect_flags & PDU_REDIRECT_INFORMATIONAL) + { + warning("PDU_REDIRECT_INFORMATIONAL set\n"); + } - /* read password string */ - rdp_in_unistr(s, g_redirect_password, sizeof(g_redirect_password), len); + if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_FQDN) + { + warning("PDU_REDIRECT_HAS_TARGET_FQDN set\n"); + } + if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_NETBIOS) + { + warning("PDU_REDIRECT_HAS_TARGET_NETBIOS set\n"); + } + + if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_IP_ARRAY) + { + warning("PDU_REDIRECT_HAS_TARGET_IP_ARRAY set\n"); + } + g_redirect = True; return True; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |