| | 940 | /*===========================================================================*/ |
| | 941 | /* Command line conversion routines */ |
| | 942 | /*===========================================================================*/ |
| | 943 | |
| | 944 | /* Returns the first character in the next argument */ |
| | 945 | |
| | 946 | char *winDrvCmdLineGetNextFirst(char *lpCmdLine) { |
| | 947 | while (*lpCmdLine == ' ' && *lpCmdLine != '\0') |
| | 948 | lpCmdLine++; |
| | 949 | return (*lpCmdLine == '\0') ? NULL : lpCmdLine; |
| | 950 | } |
| | 951 | |
| | 952 | |
| | 953 | /* Returns the first character after the next argument */ |
| | 954 | |
| | 955 | char *winDrvCmdLineGetNextEnd(char *lpCmdLine) { |
| | 956 | int InString = FALSE; |
| | 957 | |
| | 958 | while (((*lpCmdLine != ' ') && (*lpCmdLine != '\0')) || |
| | 959 | (InString && (*lpCmdLine != '\0'))) { |
| | 960 | if (*lpCmdLine == '\"') |
| | 961 | InString = !InString; |
| | 962 | lpCmdLine++; |
| | 963 | } |
| | 964 | return lpCmdLine; |
| | 965 | } |
| | 966 | |
| | 967 | /* Returns an argv vector and takes argc as a pointer parameter */ |
| | 968 | /* Must free memory argv on exit */ |
| | 969 | |
| | 970 | char **winDrvCmdLineMakeArgv(char *lpCmdLine, int *argc) { |
| | 971 | int elements = 0, i; |
| | 972 | char *tmp; |
| | 973 | char **argv; |
| | 974 | char *argstart, *argend; |
| | 975 | |
| | 976 | tmp = winDrvCmdLineGetNextFirst(lpCmdLine); |
| | 977 | if (tmp != 0) { |
| | 978 | while ((tmp = winDrvCmdLineGetNextFirst(tmp)) != NULL) { |
| | 979 | tmp = winDrvCmdLineGetNextEnd(tmp); |
| | 980 | elements++; |
| | 981 | } |
| | 982 | } |
| | 983 | argv = (char **) malloc(4*(elements + 2)); |
| | 984 | argv[0] = "VBoxHeadless.exe"; |
| | 985 | argend = lpCmdLine; |
| | 986 | for (i = 1; i <= elements; i++) { |
| | 987 | argstart = winDrvCmdLineGetNextFirst(argend); |
| | 988 | argend = winDrvCmdLineGetNextEnd(argstart); |
| | 989 | if (*argstart == '\"') |
| | 990 | argstart++; |
| | 991 | if (*(argend - 1) == '\"') |
| | 992 | argend--; |
| | 993 | *argend++ = '\0'; |
| | 994 | argv[i] = argstart; |
| | 995 | } |
| | 996 | argv[elements + 1] = NULL; |
| | 997 | *argc = elements + 1; |
| | 998 | return argv; |
| | 999 | } |
| | 1000 | |
| 942 | | */ |
| 943 | | int main (int argc, char **argv, char **envp) |
| 944 | | { |
| 945 | | // initialize VBox Runtime |
| 946 | | RTR3InitAndSUPLib(); |
| 947 | | return TrustedMain (argc, argv, envp); |
| 948 | | } |
| | 1003 | */ |
| | 1004 | int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance |
| | 1005 | HINSTANCE hPrevInstance, // handle to previous instance |
| | 1006 | LPSTR lpCmdLine, // pointer to command line |
| | 1007 | int nCmdShow) { // show state of window |
| | 1008 | char *cmdline = (char *) malloc(strlen(lpCmdLine) + 1); |
| | 1009 | char **argv; |
| | 1010 | int argc; |
| | 1011 | int result; |
| | 1012 | |
| | 1013 | strcpy(cmdline, lpCmdLine); |
| | 1014 | argv = winDrvCmdLineMakeArgv(cmdline, &argc); |
| | 1015 | |
| | 1016 | // initialize VBox Runtime |
| | 1017 | RTR3InitAndSUPLib(); |
| | 1018 | result = TrustedMain (argc, argv, _environ); |
| | 1019 | free(cmdline); |
| | 1020 | free(argv); |
| | 1021 | return result; |
| | 1022 | } |
| | 1023 | |