/** * FreeRDP: A Remote Desktop Protocol Implementation * Windows Client * * Copyright 2009-2011 Jay Sorg * Copyright 2010-2011 Vic Lee * Copyright 2010-2011 Marc-Andre Moreau * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include "resource.h" #include "wf_client.h" #include INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int status; HANDLE thread; wfContext* wfc; DWORD dwExitCode; rdpContext* context; rdpSettings* settings; LPWSTR cmd; char** argv = NULL; RDP_CLIENT_ENTRY_POINTS clientEntryPoints = { 0 }; int ret = 1; int argc = 0, i; LPWSTR* args = NULL; WINPR_UNUSED(hInstance); WINPR_UNUSED(hPrevInstance); WINPR_UNUSED(lpCmdLine); WINPR_UNUSED(nCmdShow); RdpClientEntry(&clientEntryPoints); context = freerdp_client_context_new(&clientEntryPoints); if (!context) return -1; cmd = GetCommandLineW(); if (!cmd) goto out; args = CommandLineToArgvW(cmd, &argc); if (!args || (argc <= 0)) goto out; argv = calloc((size_t)argc, sizeof(char*)); if (!argv) goto out; for (i = 0; i < argc; i++) { int size = WideCharToMultiByte(CP_UTF8, 0, args[i], -1, NULL, 0, NULL, NULL); if (size <= 0) goto out; argv[i] = calloc((size_t)size, sizeof(char)); if (!argv[i]) goto out; if (WideCharToMultiByte(CP_UTF8, 0, args[i], -1, argv[i], size, NULL, NULL) != size) goto out; } settings = context->settings; wfc = (wfContext*)context; if (!settings || !wfc) goto out; status = freerdp_client_settings_parse_command_line(settings, argc, argv, FALSE); if (status) { freerdp_client_settings_command_line_status_print(settings, status, argc, argv); goto out; } if (freerdp_client_start(context) != 0) goto out; thread = freerdp_client_get_thread(context); if (thread) { if (WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0) { GetExitCodeThread(thread, &dwExitCode); ret = (int)dwExitCode; } } if (freerdp_client_stop(context) != 0) goto out; out: freerdp_client_context_free(context); if (argv) { for (i = 0; i < argc; i++) free(argv[i]); free(argv); } LocalFree(args); return ret; }