VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxControl/VBoxControl.cpp@ 4663

Last change on this file since 4663 was 4071, checked in by vboxsync, 17 years ago

Biggest check-in ever. New source code headers for all (C) innotek files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.1 KB
Line 
1/** @file
2 *
3 * VBoxControl - Guest Additions Utility
4 *
5 * Copyright (C) 2006-2007 innotek GmbH
6 *
7 * This file is part of VirtualBox Open Source Edition (OSE), as
8 * available from http://www.virtualbox.org. This file is free software;
9 * you can redistribute it and/or modify it under the terms of the GNU
10 * General Public License as published by the Free Software Foundation,
11 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
12 * distribution. VirtualBox OSE is distributed in the hope that it will
13 * be useful, but WITHOUT ANY WARRANTY of any kind.
14 */
15
16#include <windows.h>
17#include <stdio.h>
18
19void printHelp()
20{
21 printf("VBoxControl getvideoacceleration\n"
22 "\n"
23 "VBoxControl setvideoacceleration <on|off>\n"
24 "\n"
25 "VBoxControl listcustommodes\n"
26 "\n"
27 "VBoxControl addcustommode <width> <height> <bpp>\n"
28 "\n"
29 "VBoxControl removecustommode <width> <height> <bpp>\n");
30}
31
32
33HKEY getVideoKey(bool writable)
34{
35 HKEY hkeyDeviceMap = 0;
36 HKEY hkeyVideo = 0;
37 LONG status;
38
39 status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO", 0, KEY_READ, &hkeyDeviceMap);
40 if ((status != ERROR_SUCCESS) || !hkeyDeviceMap)
41 {
42 printf("Error opening video device map registry key!\n");
43 return 0;
44 }
45 char szVideoLocation[256];
46 DWORD dwKeyType;
47 szVideoLocation[0] = 0;
48 DWORD len = sizeof(szVideoLocation);
49 status = RegQueryValueExA(hkeyDeviceMap, "\\Device\\Video0", NULL, &dwKeyType, (LPBYTE)szVideoLocation, &len);
50 /*
51 * This value will start with a weird value: \REGISTRY\Machine
52 * Make sure this is true.
53 */
54 if ( (status == ERROR_SUCCESS)
55 && (dwKeyType == REG_SZ)
56 && (_strnicmp(szVideoLocation, "\\REGISTRY\\Machine", 17) == 0))
57 {
58 /* open that branch */
59 status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, &szVideoLocation[18], 0, KEY_READ | (writable ? KEY_WRITE : 0), &hkeyVideo);
60 }
61 else
62 {
63 printf("Error opening registry key '%s'\n", &szVideoLocation[18]);
64 }
65 RegCloseKey(hkeyDeviceMap);
66 return hkeyVideo;
67}
68
69void handleGetVideoAcceleration(int argc, char *argv[])
70{
71 ULONG status;
72 HKEY hkeyVideo = getVideoKey(false);
73
74 if (hkeyVideo)
75 {
76 /* query the actual value */
77 DWORD fAcceleration = 1;
78 DWORD len = sizeof(fAcceleration);
79 DWORD dwKeyType;
80 status = RegQueryValueExA(hkeyVideo, "EnableVideoAccel", NULL, &dwKeyType, (LPBYTE)&fAcceleration, &len);
81 if (status != ERROR_SUCCESS)
82 printf("Video acceleration: default\n");
83 else
84 printf("Video acceleration: %s\n", fAcceleration ? "on" : "off");
85 RegCloseKey(hkeyVideo);
86 }
87}
88
89void handleSetVideoAcceleration(int argc, char *argv[])
90{
91 ULONG status;
92 HKEY hkeyVideo;
93
94 /* must have exactly one argument: the new offset */
95 if ( (argc != 1)
96 || ( strcmp(argv[0], "on")
97 && strcmp(argv[0], "off")))
98 {
99 printf("Error: invalid video acceleration status!\n");
100 return;
101 }
102
103 hkeyVideo = getVideoKey(true);
104
105 if (hkeyVideo)
106 {
107 int fAccel = 0;
108 if (!strcmp(argv[0], "on"))
109 fAccel = 1;
110 /* set a new value */
111 status = RegSetValueExA(hkeyVideo, "EnableVideoAccel", 0, REG_DWORD, (LPBYTE)&fAccel, sizeof(fAccel));
112 if (status != ERROR_SUCCESS)
113 {
114 printf("Error %d writing video acceleration status!\n", status);
115 }
116 RegCloseKey(hkeyVideo);
117 }
118}
119
120#define MAX_CUSTOM_MODES 128
121
122/* the table of custom modes */
123struct
124{
125 DWORD xres;
126 DWORD yres;
127 DWORD bpp;
128} customModes[MAX_CUSTOM_MODES] = {0};
129
130void getCustomModes(HKEY hkeyVideo)
131{
132 ULONG status;
133 int curMode = 0;
134
135 /* null out the table */
136 memset(customModes, 0, sizeof(customModes));
137
138 do
139 {
140 char valueName[20];
141 DWORD xres, yres, bpp = 0;
142 DWORD dwType;
143 DWORD dwLen = sizeof(DWORD);
144
145 sprintf(valueName, "CustomMode%dWidth", curMode);
146 status = RegQueryValueExA(hkeyVideo, valueName, NULL, &dwType, (LPBYTE)&xres, &dwLen);
147 if (status != ERROR_SUCCESS)
148 break;
149 sprintf(valueName, "CustomMode%dHeight", curMode);
150 status = RegQueryValueExA(hkeyVideo, valueName, NULL, &dwType, (LPBYTE)&yres, &dwLen);
151 if (status != ERROR_SUCCESS)
152 break;
153 sprintf(valueName, "CustomMode%dBPP", curMode);
154 status = RegQueryValueExA(hkeyVideo, valueName, NULL, &dwType, (LPBYTE)&bpp, &dwLen);
155 if (status != ERROR_SUCCESS)
156 break;
157
158 /* check if the mode is OK */
159 if ( (xres > (1 << 16))
160 && (yres > (1 << 16))
161 && ( (bpp != 16)
162 || (bpp != 24)
163 || (bpp != 32)))
164 break;
165
166 /* add mode to table */
167 customModes[curMode].xres = xres;
168 customModes[curMode].yres = yres;
169 customModes[curMode].bpp = bpp;
170
171 ++curMode;
172
173 if (curMode >= MAX_CUSTOM_MODES)
174 break;
175 } while(1);
176}
177
178void writeCustomModes(HKEY hkeyVideo)
179{
180 ULONG status;
181 int tableIndex = 0;
182 int modeIndex = 0;
183
184 /* first remove all values */
185 for (int i = 0; i < MAX_CUSTOM_MODES; i++)
186 {
187 char valueName[20];
188 sprintf(valueName, "CustomMode%dWidth", i);
189 RegDeleteValueA(hkeyVideo, valueName);
190 sprintf(valueName, "CustomMode%dHeight", i);
191 RegDeleteValueA(hkeyVideo, valueName);
192 sprintf(valueName, "CustomMode%dBPP", i);
193 RegDeleteValueA(hkeyVideo, valueName);
194 }
195
196 do
197 {
198 if (tableIndex >= MAX_CUSTOM_MODES)
199 break;
200
201 /* is the table entry present? */
202 if ( (!customModes[tableIndex].xres)
203 || (!customModes[tableIndex].yres)
204 || (!customModes[tableIndex].bpp))
205 {
206 tableIndex++;
207 continue;
208 }
209
210 printf("writing mode %d (%dx%dx%d)\n", modeIndex, customModes[tableIndex].xres, customModes[tableIndex].yres, customModes[tableIndex].bpp);
211 char valueName[20];
212 sprintf(valueName, "CustomMode%dWidth", modeIndex);
213 status = RegSetValueExA(hkeyVideo, valueName, 0, REG_DWORD, (LPBYTE)&customModes[tableIndex].xres,
214 sizeof(customModes[tableIndex].xres));
215 sprintf(valueName, "CustomMode%dHeight", modeIndex);
216 RegSetValueExA(hkeyVideo, valueName, 0, REG_DWORD, (LPBYTE)&customModes[tableIndex].yres,
217 sizeof(customModes[tableIndex].yres));
218 sprintf(valueName, "CustomMode%dBPP", modeIndex);
219 RegSetValueExA(hkeyVideo, valueName, 0, REG_DWORD, (LPBYTE)&customModes[tableIndex].bpp,
220 sizeof(customModes[tableIndex].bpp));
221
222 modeIndex++;
223 tableIndex++;
224
225 } while(1);
226
227}
228
229void handleListCustomModes(int argc, char *argv[])
230{
231 if (argc != 0)
232 {
233 printf("Error: too many parameters!");
234 return;
235 }
236
237 HKEY hkeyVideo = getVideoKey(false);
238
239 if (hkeyVideo)
240 {
241 getCustomModes(hkeyVideo);
242 for (int i = 0; i < (sizeof(customModes) / sizeof(customModes[0])); i++)
243 {
244 if ( !customModes[i].xres
245 || !customModes[i].yres
246 || !customModes[i].bpp)
247 continue;
248
249 printf("Mode: %d x %d x %d\n",
250 customModes[i].xres, customModes[i].yres, customModes[i].bpp);
251 }
252 RegCloseKey(hkeyVideo);
253 }
254}
255
256void handleAddCustomMode(int argc, char *argv[])
257{
258 if (argc != 3)
259 {
260 printf("Error: not enough parameters!\n");
261 return;
262 }
263
264 DWORD xres = atoi(argv[0]);
265 DWORD yres = atoi(argv[1]);
266 DWORD bpp = atoi(argv[2]);
267
268 /** @todo better check including xres mod 8 = 0! */
269 if ( (xres > (1 << 16))
270 && (yres > (1 << 16))
271 && ( (bpp != 16)
272 || (bpp != 24)
273 || (bpp != 32)))
274 {
275 printf("Error: invalid mode specified!\n");
276 return;
277 }
278
279 HKEY hkeyVideo = getVideoKey(true);
280
281 if (hkeyVideo)
282 {
283 getCustomModes(hkeyVideo);
284 for (int i = 0; i < MAX_CUSTOM_MODES; i++)
285 {
286 /* item free? */
287 if (!customModes[i].xres)
288 {
289 customModes[i].xres = xres;
290 customModes[i].yres = yres;
291 customModes[i].bpp = bpp;
292 break;
293 }
294 }
295 writeCustomModes(hkeyVideo);
296 RegCloseKey(hkeyVideo);
297 }
298}
299
300void handleRemoveCustomMode(int argc, char *argv[])
301{
302 if (argc != 3)
303 {
304 printf("Error: not enough parameters!\n");
305 return;
306 }
307
308 DWORD xres = atoi(argv[0]);
309 DWORD yres = atoi(argv[1]);
310 DWORD bpp = atoi(argv[2]);
311
312 HKEY hkeyVideo = getVideoKey(true);
313
314 if (hkeyVideo)
315 {
316 getCustomModes(hkeyVideo);
317 for (int i = 0; i < MAX_CUSTOM_MODES; i++)
318 {
319 /* correct item? */
320 if ( (customModes[i].xres == xres)
321 && (customModes[i].yres == yres)
322 && (customModes[i].bpp == bpp))
323 {
324printf("found mode at index %d\n", i);
325 memset(&customModes[i], 0, sizeof(customModes[i]));
326 break;
327 }
328 }
329 writeCustomModes(hkeyVideo);
330 RegCloseKey(hkeyVideo);
331 }
332}
333
334
335/**
336 * Main function
337 */
338int main(int argc, char *argv[])
339{
340 if (argc < 2)
341 {
342 printHelp();
343 return 1;
344 }
345
346 /* determine which command */
347 if (strcmp(argv[1], "getvideoacceleration") == 0)
348 {
349 handleGetVideoAcceleration(argc - 2, &argv[2]);
350 }
351 else if (strcmp(argv[1], "setvideoacceleration") == 0)
352 {
353 handleSetVideoAcceleration(argc - 2, &argv[2]);
354 }
355 else if (strcmp(argv[1], "listcustommodes") == 0)
356 {
357 handleListCustomModes(argc - 2, &argv[2]);
358 }
359 else if (strcmp(argv[1], "addcustommode") == 0)
360 {
361 handleAddCustomMode(argc - 2, &argv[2]);
362 }
363 else if (strcmp(argv[1], "removecustommode") == 0)
364 {
365 handleRemoveCustomMode(argc - 2, &argv[2]);
366 }
367 else
368 {
369 printHelp();
370 return 1;
371 }
372
373 return 0;
374}
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