mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 08:15:41 +00:00
[KERNEL32]
Implement BasepCheckDosApp. Enable NTVDM in CreateProcessInternalW. [NTVDM] Remove the old command line parser code. The entire command line is for the DOS application now. svn path=/branches/ntvdm/; revision=59310
This commit is contained in:
parent
7befc34a4f
commit
4c459af487
2 changed files with 26 additions and 38 deletions
|
@ -49,6 +49,7 @@ VOID WINAPI
|
|||
RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
|
||||
|
||||
#define CMD_STRING L"cmd /c "
|
||||
#define NTVDM_STRING L"\\ntvdm.exe"
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
|
@ -182,6 +183,22 @@ BasepConfigureAppCertDlls(IN PWSTR ValueName,
|
|||
return BasepSaveAppCertRegistryValue(Context, ValueName, ValueData);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
BasepCheckDosApp(IN PUNICODE_STRING ApplicationName)
|
||||
{
|
||||
PWCHAR Extension;
|
||||
|
||||
/* Get the extension from the file name */
|
||||
Extension = &ApplicationName->Buffer[ApplicationName->Length /
|
||||
sizeof(WCHAR) - 4];
|
||||
|
||||
/* Check if the extension is .COM */
|
||||
if (_wcsnicmp(Extension, L".com", 4) == 0) return TRUE;
|
||||
else return FALSE;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
WINAPI
|
||||
BasepIsProcessAllowed(IN PCHAR ApplicationName)
|
||||
|
@ -2531,6 +2548,7 @@ CreateProcessInternalW(HANDLE hToken,
|
|||
PPEB RemotePeb;
|
||||
SIZE_T EnvSize = 0;
|
||||
BOOL Ret = FALSE;
|
||||
WCHAR VdmPath[MAX_PATH];
|
||||
|
||||
/* FIXME should process
|
||||
* HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
|
||||
|
@ -2611,6 +2629,10 @@ CreateProcessInternalW(HANDLE hToken,
|
|||
}
|
||||
}
|
||||
|
||||
/* Get the path to the VDM host */
|
||||
ASSERT(GetSystemDirectoryW(VdmPath, MAX_PATH - wcslen(NTVDM_STRING)) != 0);
|
||||
wcscat(VdmPath, NTVDM_STRING);
|
||||
|
||||
/*
|
||||
* According to some sites, ShellExecuteEx uses an undocumented flag to
|
||||
* send private handle data (such as HMONITOR or HICON). See:
|
||||
|
@ -2847,14 +2869,13 @@ GetAppName:
|
|||
case STATUS_INVALID_IMAGE_PROTECT:
|
||||
case STATUS_INVALID_IMAGE_NOT_MZ:
|
||||
|
||||
#if 0
|
||||
/* If it's a DOS app, use VDM */
|
||||
if ((BasepCheckDosApp(&ApplicationName)))
|
||||
{
|
||||
DPRINT1("Launching VDM...\n");
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, NameBuffer);
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, ApplicationName.Buffer);
|
||||
return CreateProcessW(L"ntvdm.exe",
|
||||
return CreateProcessW(VdmPath,
|
||||
(LPWSTR)((ULONG_PTR)lpApplicationName), /* FIXME: Buffer must be writable!!! */
|
||||
lpProcessAttributes,
|
||||
lpThreadAttributes,
|
||||
|
@ -2865,7 +2886,6 @@ GetAppName:
|
|||
&StartupInfo,
|
||||
lpProcessInformation);
|
||||
}
|
||||
#endif
|
||||
/* It's a batch file */
|
||||
Extension = &ApplicationName.Buffer[ApplicationName.Length /
|
||||
sizeof(WCHAR) - 4];
|
||||
|
@ -2925,7 +2945,7 @@ GetAppName:
|
|||
DPRINT1("Launching VDM...\n");
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, NameBuffer);
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, ApplicationName.Buffer);
|
||||
return CreateProcessW(L"ntvdm.exe",
|
||||
return CreateProcessW(VdmPath,
|
||||
(LPWSTR)((ULONG_PTR)lpApplicationName), /* FIXME: Buffer must be writable!!! */
|
||||
lpProcessAttributes,
|
||||
lpThreadAttributes,
|
||||
|
|
|
@ -55,7 +55,6 @@ BOOL WINAPI ConsoleCtrlHandler(DWORD ControlType)
|
|||
INT wmain(INT argc, WCHAR *argv[])
|
||||
{
|
||||
INT i;
|
||||
BOOLEAN PrintUsage = TRUE;
|
||||
CHAR CommandLine[128];
|
||||
DWORD CurrentTickCount, LastTickCount = 0, Cycles = 0, LastCyclePrintout = 0;
|
||||
LARGE_INTEGER Frequency, LastTimerTick, Counter;
|
||||
|
@ -64,39 +63,8 @@ INT wmain(INT argc, WCHAR *argv[])
|
|||
/* Set the handler routine */
|
||||
SetConsoleCtrlHandler(ConsoleCtrlHandler, TRUE);
|
||||
|
||||
/* Parse the command line arguments */
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (argv[i][0] != L'-' && argv[i][0] != L'/') continue;
|
||||
|
||||
switch (argv[i][1])
|
||||
{
|
||||
case L'f':
|
||||
case L'F':
|
||||
{
|
||||
if (argv[i+1] != NULL)
|
||||
{
|
||||
/* The DOS command line must be ASCII */
|
||||
WideCharToMultiByte(CP_ACP, 0, argv[i+1], -1, CommandLine, 128, NULL, NULL);
|
||||
|
||||
/* This is the only mandatory parameter */
|
||||
PrintUsage = FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
wprintf(L"Unknown option: %s", argv[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (PrintUsage)
|
||||
{
|
||||
wprintf(L"ReactOS Virtual DOS Machine\n\n");
|
||||
wprintf(L"Usage: NTVDM /F <PROGRAM>\n");
|
||||
return 0;
|
||||
}
|
||||
/* The DOS command line must be ASCII */
|
||||
WideCharToMultiByte(CP_ACP, 0, GetCommandLine(), -1, CommandLine, 128, NULL, NULL);
|
||||
|
||||
if (!EmulatorInitialize()) return 1;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue