VirtualBox

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

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

InnoTek -> innotek: all the headers and comments.

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