--- VBoxHeadless-orig.cpp	2008-11-06 16:48:05.000000000 +0100
+++ VBoxHeadless-noout.cpp	2008-11-06 16:43:58.000000000 +0100
@@ -937,14 +937,89 @@
 
 
 #ifndef VBOX_WITH_HARDENING
+/*===========================================================================*/
+/* Command line conversion routines                                          */
+/*===========================================================================*/
+
+/* Returns the first character in the next argument                          */
+
+char *winDrvCmdLineGetNextFirst(char *lpCmdLine) {
+  while (*lpCmdLine == ' ' && *lpCmdLine != '\0')
+    lpCmdLine++;
+  return (*lpCmdLine == '\0') ? NULL : lpCmdLine;
+}
+
+
+/* Returns the first character after the next argument                       */
+
+char *winDrvCmdLineGetNextEnd(char *lpCmdLine) {
+  int InString = FALSE;
+  
+  while (((*lpCmdLine != ' ') && (*lpCmdLine != '\0')) ||
+    (InString && (*lpCmdLine != '\0'))) {
+    if (*lpCmdLine == '\"')
+      InString = !InString;
+    lpCmdLine++;
+  }
+  return lpCmdLine;
+}
+
+/* Returns an argv vector and takes argc as a pointer parameter              */
+/* Must free memory argv on exit                                             */
+
+char **winDrvCmdLineMakeArgv(char *lpCmdLine, int *argc) {
+  int elements = 0, i;
+  char *tmp;
+  char **argv;
+  char *argstart, *argend;
+  
+  tmp = winDrvCmdLineGetNextFirst(lpCmdLine);
+  if (tmp != 0) {
+    while ((tmp = winDrvCmdLineGetNextFirst(tmp)) != NULL) {
+      tmp = winDrvCmdLineGetNextEnd(tmp);
+      elements++;
+    }
+  }
+  argv = (char **) malloc(4*(elements + 2));
+  argv[0] = "VBoxHeadless.exe";
+  argend = lpCmdLine;
+  for (i = 1; i <= elements; i++) {
+    argstart = winDrvCmdLineGetNextFirst(argend);
+    argend = winDrvCmdLineGetNextEnd(argstart);
+    if (*argstart == '\"')
+      argstart++;
+    if (*(argend - 1) == '\"')
+      argend--;
+    *argend++ = '\0';
+    argv[i] = argstart;
+  }
+  argv[elements + 1] = NULL;
+  *argc = elements + 1;
+  return argv;
+}
+
 /**
  * Main entry point.
- */
-int main (int argc, char **argv, char **envp)
-{
-    // initialize VBox Runtime
-    RTR3InitAndSUPLib();
-    return TrustedMain (argc, argv, envp);
-}
+ */
+int WINAPI WinMain(HINSTANCE hInstance,	    // handle to current instance 
+		   HINSTANCE hPrevInstance, // handle to previous instance 
+		   LPSTR lpCmdLine,	    // pointer to command line 
+		   int nCmdShow) {	    // show state of window 
+  char *cmdline = (char *) malloc(strlen(lpCmdLine) + 1);
+  char **argv;
+  int argc;
+  int result;
+  
+  strcpy(cmdline, lpCmdLine);
+  argv = winDrvCmdLineMakeArgv(cmdline, &argc);
+
+  // initialize VBox Runtime
+  RTR3InitAndSUPLib();
+  result = TrustedMain (argc, argv, _environ);
+  free(cmdline);
+  free(argv);
+  return result;
+}
+
 #endif /* !VBOX_WITH_HARDENING */
 
