VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Installer/Loader/VBoxWindowsAdditions.cpp@ 34079

Last change on this file since 34079 was 31661, checked in by vboxsync, 14 years ago

Additions header fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
1/* $Id: VBoxWindowsAdditions.cpp 31661 2010-08-13 15:49:24Z vboxsync $ */
2/** @file
3 * VBoxWindowsAdditions - The Windows Guest Additions Loader
4 */
5
6/*
7 * Copyright (C) 2006-2007 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef UNICODE
19#define UNICODE
20#endif
21
22#include <windows.h>
23#include <stdio.h>
24#include <tchar.h>
25
26typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
27
28LPFN_ISWOW64PROCESS fnIsWow64Process;
29
30BOOL IsWow64 ()
31{
32 BOOL bIsWow64 = FALSE;
33 fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
34
35 if (NULL != fnIsWow64Process)
36 {
37 if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
38 {
39 _tprintf(_T("ERROR: Could not determine process type!\n"));
40
41 /* Error in retrieving process type - assume that we're running on 32bit. */
42 return FALSE;
43 }
44 }
45 return bIsWow64;
46}
47
48int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
49{
50 int iRet = 0;
51
52 LPWSTR *pszArgList = NULL;
53 int nArgs = 0;
54
55 TCHAR szCurDir[_MAX_PATH + 1] = { 0 };
56 GetCurrentDirectory(_MAX_PATH, szCurDir);
57
58 SHELLEXECUTEINFOW TempInfo = { 0 };
59 TempInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
60
61 TCHAR szModule[_MAX_PATH + 1] = { 0 };
62 TCHAR szApp[_MAX_PATH + 1] = { 0 };
63 TCHAR szProg[_MAX_PATH + 1] = { 0 };
64
65 pszArgList = CommandLineToArgvW(GetCommandLineW(), &nArgs);
66 if (0 == GetModuleFileName(NULL, szModule, _MAX_PATH))
67 {
68 /* Module not found, use a default name. */
69 _stprintf(szModule, _T("%ws"), (pszArgList != NULL) ? pszArgList[0] : _T("VBoxWindowsAdditions.exe"));
70 }
71
72 TCHAR* pcExt = wcsrchr(szModule, _T('.'));
73 if (NULL != pcExt)
74 wcsncpy(szApp, szModule, (pcExt - szModule));
75
76 if (IsWow64()) /* 64bit Windows. */
77 {
78 _stprintf(szProg, _T("%ws-amd64.exe"), szApp);
79 }
80 else /* 32bit Windows. */
81 {
82 _stprintf(szProg, _T("%ws-x86.exe"), szApp);
83 }
84
85 /* Construct parameter list. */
86 TCHAR *pszParams = (TCHAR*)LocalAlloc(LPTR, _MAX_PATH*sizeof(TCHAR));
87 TCHAR szDelim = _T(' ');
88
89 if (pszParams)
90 {
91 wcsncat(pszParams, szProg,
92 __min(wcslen(szProg),_MAX_PATH-wcslen(pszParams)));
93 wcsncat(pszParams, &szDelim,
94 __min(1,_MAX_PATH-wcslen(pszParams)));
95
96 if (nArgs > 1)
97 {
98 for (int i=0; i<nArgs-1; i++)
99 {
100 if (i > 0)
101 {
102 wcsncat(pszParams, &szDelim,
103 __min(1,_MAX_PATH-wcslen(pszParams)));
104 }
105 wcsncat(pszParams, pszArgList[i+1],
106 __min(wcslen(pszArgList[i+1]),_MAX_PATH-wcslen(pszParams)));
107 }
108 }
109 }
110
111 /* Struct for ShellExecute. */
112 TempInfo.fMask = 0;
113 TempInfo.hwnd = NULL;
114 TempInfo.lpVerb =L"runas" ;
115 TempInfo.lpFile = szProg;
116 TempInfo.lpParameters = pszParams;
117 TempInfo.lpDirectory = szCurDir;
118 TempInfo.nShow = SW_NORMAL;
119
120 STARTUPINFOW si;
121 PROCESS_INFORMATION pi;
122 DWORD dwRes = 0;
123
124 ZeroMemory(&si, sizeof(si));
125 si.cb = sizeof(si);
126 ZeroMemory(&pi, sizeof(pi));
127
128 dwRes = CreateProcessW(szProg, pszParams, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
129 if (!dwRes && GetLastError() == 740) /* 740 = ERROR_ELEVATION_REQUIRED -> Only for Windows Vista. */
130 {
131 if (FALSE == ::ShellExecuteExW(&TempInfo))
132 {
133 _tprintf (_T("ERROR: Could not launch program! Code: %ld\n"), GetLastError());
134 iRet = 1;
135 }
136 }
137
138 if (pszParams)
139 LocalFree(pszParams);
140
141 if (pszArgList)
142 LocalFree(pszArgList);
143
144 return iRet;
145}
146
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette