[NTVDM]: Fix (again) command-line parsing in DosCreateProcess.

svn path=/trunk/; revision=67618
This commit is contained in:
Hermès Bélusca-Maïto 2015-05-10 11:34:35 +00:00
parent 2225244d03
commit 122a0a5ccc

View file

@ -259,10 +259,12 @@ DWORD DosLoadExecutable(IN DOS_EXEC_TYPE LoadType,
/* Buffer for command line conversion: 1 byte for size; 127 bytes for contents */ /* Buffer for command line conversion: 1 byte for size; 127 bytes for contents */
CHAR CmdLineBuffer[1 + DOS_CMDLINE_LENGTH]; CHAR CmdLineBuffer[1 + DOS_CMDLINE_LENGTH];
DPRINT1("DosLoadExecutable(%d, %s, 0x%08X, 0x%08X)\n", DPRINT1("DosLoadExecutable(%d, '%s', 0x%08X, 0x%08X, 0x%08X)\n",
LoadType, LoadType,
ExecutablePath, ExecutablePath,
Parameters); Parameters,
CommandLine,
Environment);
/* Try to get the full path to the executable */ /* Try to get the full path to the executable */
if (GetFullPathNameA(ExecutablePath, sizeof(FullPath), FullPath, NULL)) if (GetFullPathNameA(ExecutablePath, sizeof(FullPath), FullPath, NULL))
@ -683,7 +685,7 @@ WORD DosCreateProcess(LPCSTR ProgramName,
DWORD BinaryType; DWORD BinaryType;
LPVOID Environment = NULL; LPVOID Environment = NULL;
VDM_COMMAND_INFO CommandInfo; VDM_COMMAND_INFO CommandInfo;
CHAR CmdLine[MAX_PATH]; // DOS_CMDLINE_LENGTH + 1 CHAR CmdLine[MAX_PATH + DOS_CMDLINE_LENGTH + 1];
CHAR AppName[MAX_PATH]; CHAR AppName[MAX_PATH];
CHAR PifFile[MAX_PATH]; CHAR PifFile[MAX_PATH];
CHAR Desktop[MAX_PATH]; CHAR Desktop[MAX_PATH];
@ -714,18 +716,23 @@ WORD DosCreateProcess(LPCSTR ProgramName,
StartupInfo.cb = sizeof(StartupInfo); StartupInfo.cb = sizeof(StartupInfo);
/* /*
* Convert the DOS command line to Win32-compatible format. * Convert the DOS command line to Win32-compatible format, by concatenating
* the program name with the converted command line.
* Format of the DOS command line: 1 byte for size; 127 bytes for contents. * Format of the DOS command line: 1 byte for size; 127 bytes for contents.
*/ */
CmdLinePtr = CmdLine;
strncpy(CmdLinePtr, ProgramName, MAX_PATH); // Concatenate the program name
CmdLinePtr += strlen(CmdLinePtr);
*CmdLinePtr++ = ' '; // Add separating space
CmdLineSize = min(*(PBYTE)FAR_POINTER(Parameters->CommandLine), DOS_CMDLINE_LENGTH); CmdLineSize = min(*(PBYTE)FAR_POINTER(Parameters->CommandLine), DOS_CMDLINE_LENGTH);
RtlCopyMemory(CmdLine, RtlCopyMemory(CmdLinePtr,
(LPSTR)FAR_POINTER(Parameters->CommandLine) + 1, (LPSTR)FAR_POINTER(Parameters->CommandLine) + 1,
CmdLineSize); CmdLineSize);
/* NULL-terminate it */ /* NULL-terminate it */
CmdLine[CmdLineSize] = '\0'; CmdLinePtr[CmdLineSize] = '\0';
/* Remove any trailing return carriage character and NULL-terminate the command line */ /* Remove any trailing return carriage character and NULL-terminate the command line */
CmdLinePtr = CmdLine;
while (*CmdLinePtr && *CmdLinePtr != '\r' && *CmdLinePtr != '\n') CmdLinePtr++; while (*CmdLinePtr && *CmdLinePtr != '\r' && *CmdLinePtr != '\n') CmdLinePtr++;
*CmdLinePtr = '\0'; *CmdLinePtr = '\0';