--- vditool.cpp.orig	2007-05-10 13:23:38.096758351 +0200
+++ vditool.cpp	2007-05-11 11:54:36.391076483 +0200
@@ -33,14 +33,6 @@
 #include <stdlib.h>
 
 
-
-static void ascii2upper(char *psz)
-{
-    for (;*psz; psz++)
-        if (*psz >= 'a' && *psz <= 'z')
-            *psz += 'A' - 'z';
-}
-
 static int UsageExit()
 {
     RTPrintf("Usage:   vditool <Command> [Params]\n" \
@@ -50,6 +42,7 @@
              "    CONVERT Filename             - convert VDI image from old format;\n" \
              "    DUMP Filename                - debug dump;\n" \
              "    RESETGEO Filename            - reset geometry information;\n" \
+             "    SETGEO Filename              - set C/H/S geometry information;\n" \
              "    COPY FromImage ToImage       - make image copy;\n" \
              "    COPYDD FromImage DDFilename  - make a DD copy of the image;\n" \
              "    SHRINK Filename              - optimize (reduce) VDI image size.\n");
@@ -200,14 +193,26 @@
     return PrintDone(rc);
 }
 
-static int ResetImageGeometry(const char *pszFilename)
+static int SetImageGeometry(const char *pszFilename, const char *strCylinders, const char *strHeads, const char *strSectors)
 {
-    RTPrintf("Resetting geometry info of VDI image file=\"%s\"\n", pszFilename);
+    RTPrintf("(Re)Setting geometry info of VDI image file=\"%s\" with %s/%s/%s\n", pszFilename, strCylinders, strHeads, strSectors);
     PVDIDISK pVdi = VDIDiskCreate();
     int rc = VDIDiskOpenImage(pVdi, pszFilename, VDI_OPEN_FLAGS_NORMAL);
+	int cCylinders = 0;
+	int cHeads = 0;
+	int cSectors = 0;
+
     if (VBOX_SUCCESS(rc))
     {
-        rc = VDIDiskSetGeometry(pVdi, 0, 0, 0);
+		if (strCylinders != NULL && strHeads != NULL && strSectors != NULL)
+		{
+			cCylinders = RTStrToUInt32 (strCylinders);
+			cHeads = RTStrToUInt32 (strHeads);
+			cSectors = RTStrToUInt32 (strSectors);
+			RTPrintf ("C/H/S = %u:%u:%u\n", cCylinders, cHeads, cSectors);
+		}
+
+        rc = VDIDiskSetGeometry(pVdi, cCylinders, cHeads, cSectors);
         if (VBOX_SUCCESS(rc))
             rc = VDIDiskSetTranslation(pVdi, PDMBIOSTRANSLATION_AUTO);
     }
@@ -292,7 +297,6 @@
     if (strlen(argv[1]) >= sizeof(szCmd))
         return SyntaxError("Invalid command!");
     strcpy(szCmd, argv[1]);
-    ascii2upper(szCmd);
 
     PRTLOGGER pLogger;
     static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
@@ -301,7 +305,7 @@
                           RTLOGDEST_STDOUT, NULL);
     RTLogRelSetDefaultInstance(pLogger);
 
-    if (strcmp(szCmd, "NEW") == 0)
+    if (strcasecmp(szCmd, "NEW") == 0)
     {
         if (argc != 4)
             return SyntaxError("Invalid argument count!");
@@ -320,43 +324,49 @@
 
         rc = NewImage(argv[2], cMBs);
     }
-    else if (strcmp(szCmd, "DD") == 0)
+    else if (strcasecmp(szCmd, "DD") == 0)
     {
         if (argc != 4)
             return SyntaxError("Invalid argument count!");
         rc = ConvertDDImage(argv[2], argv[3]);
     }
-    else if (strcmp(szCmd, "CONVERT") == 0)
+    else if (strcasecmp(szCmd, "CONVERT") == 0)
     {
         if (argc != 3)
             return SyntaxError("Invalid argument count!");
         rc = ConvertOldImage(argv[2]);
     }
-    else if (strcmp(szCmd, "DUMP") == 0)
+    else if (strcasecmp(szCmd, "DUMP") == 0)
     {
         if (argc != 3)
             return SyntaxError("Invalid argument count!");
         rc = DumpImage(argv[2]);
     }
-    else if (strcmp(szCmd, "RESETGEO") == 0)
+    else if (strcasecmp(szCmd, "RESETGEO") == 0)
     {
         if (argc != 3)
             return SyntaxError("Invalid argument count!");
-        rc = ResetImageGeometry(argv[2]);
+        rc = SetImageGeometry(argv[2], NULL, NULL, NULL);
+    }
+    else if (strcasecmp(szCmd, "SETGEO") == 0)
+    {
+        if (argc < 3)
+            return SyntaxError("Invalid argument count!");
+        rc = SetImageGeometry(argv[2], argv[3], argv[4], argv[5]);
     }
-    else if (strcmp(szCmd, "COPY") == 0)
+    else if (strcasecmp(szCmd, "COPY") == 0)
     {
         if (argc != 4)
             return SyntaxError("Invalid argument count!");
         rc = CopyImage(argv[3], argv[2]);
     }
-    else if (strcmp(szCmd, "COPYDD") == 0)
+    else if (strcasecmp(szCmd, "COPYDD") == 0)
     {
         if (argc != 4)
             return SyntaxError("Invalid argument count!");
         rc = CopyToDD(argv[3], argv[2]);
     }
-    else if (strcmp(szCmd, "SHRINK") == 0)
+    else if (strcasecmp(szCmd, "SHRINK") == 0)
     {
         if (argc != 3)
             return SyntaxError("Invalid argument count!");
