* PROJECT: ReactOS Win32 Base API
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/win32/kernel32/client/vdm.c
- * PURPOSE: Virtual Dos Machine (VDM) Support
+ * PURPOSE: Virtual DOS Machines (VDM) Support
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
*/
ENV_INFO BasepEnvNameType[] =
{
- {3, sizeof(L"PATH"), L"PATH"},
- {2, sizeof(L"WINDIR"), L"WINDIR"},
+ {3, sizeof(L"PATH") , L"PATH" },
+ {2, sizeof(L"WINDIR") , L"WINDIR" },
{2, sizeof(L"SYSTEMROOT"), L"SYSTEMROOT"},
- {3, sizeof(L"TEMP"), L"TEMP"},
- {3, sizeof(L"TMP"), L"TMP"},
+ {3, sizeof(L"TEMP") , L"TEMP" },
+ {3, sizeof(L"TMP") , L"TMP" },
};
UNICODE_STRING BaseDotComSuffixName = RTL_CONSTANT_STRING(L".com");
/* Is it a .com? */
String.Length = BaseDotComSuffixName.Length;
String.Buffer = &PathName->Buffer[(PathName->Length - String.Length) / sizeof(WCHAR)];
- if (RtlEqualUnicodeString(&String, &BaseDotComSuffixName, TRUE)) return 2;
+ if (RtlEqualUnicodeString(&String, &BaseDotComSuffixName, TRUE)) return BINARY_TYPE_COM;
/* Is it a .pif? */
String.Length = BaseDotPifSuffixName.Length;
String.Buffer = &PathName->Buffer[(PathName->Length - String.Length) / sizeof(WCHAR)];
- if (RtlEqualUnicodeString(&String, &BaseDotPifSuffixName, TRUE)) return 3;
+ if (RtlEqualUnicodeString(&String, &BaseDotPifSuffixName, TRUE)) return BINARY_TYPE_PIF;
/* Is it an exe? */
String.Length = BaseDotExeSuffixName.Length;
String.Buffer = &PathName->Buffer[(PathName->Length - String.Length) / sizeof(WCHAR)];
- if (RtlEqualUnicodeString(&String, &BaseDotExeSuffixName, TRUE)) return 1;
+ if (RtlEqualUnicodeString(&String, &BaseDotExeSuffixName, TRUE)) return BINARY_TYPE_EXE;
+
return 0;
}
IN PCWCH CommandLine,
IN PCWCH CurrentDirectory,
IN PANSI_STRING AnsiEnvironment,
- IN PCSR_API_MESSAGE Msg,
+ IN PBASE_API_MESSAGE ApiMessage,
IN OUT PULONG iTask,
IN DWORD CreationFlags,
- IN LPSTARTUPINFOW StartupInfo)
+ IN LPSTARTUPINFOW StartupInfo,
+ IN HANDLE hUserToken OPTIONAL)
{
/* This is not supported */
UNIMPLEMENTED;
IN ULONG IndexInfo,
IN ULONG BinaryType)
{
+#if 0 // Unimplemented in BASESRV
NTSTATUS Status;
- CSR_API_MESSAGE Msg;
- ULONG CsrRequest = MAKE_CSR_API(UPDATE_VDM_ENTRY, CSR_CONSOLE);
+ BASE_API_MESSAGE ApiMessage;
+ PBASE_UPDATE_VDM_ENTRY UpdateVdmEntry = &ApiMessage.Data.UpdateVdmEntry;
/* Check what update is being sent */
switch (UpdateIndex)
{
/* VDM is being undone */
case VdmEntryUndo:
-
+ {
/* Tell the server how far we had gotten along */
- Msg.Data.UpdateVdmEntry.iTask = (ULONG)*WaitHandle;
- Msg.Data.UpdateVdmEntry.VDMCreationState = IndexInfo;
+ UpdateVdmEntry->iTask = HandleToUlong(*WaitHandle);
+ UpdateVdmEntry->VDMCreationState = IndexInfo;
break;
+ }
/* VDM is ready with a new process handle */
case VdmEntryUpdateProcess:
-
+ {
/* Send it the process handle */
- Msg.Data.UpdateVdmEntry.VDMProcessHandle = *WaitHandle;
- Msg.Data.UpdateVdmEntry.iTask = IndexInfo;
+ UpdateVdmEntry->VDMProcessHandle = *WaitHandle;
+ UpdateVdmEntry->iTask = IndexInfo;
break;
+ }
}
/* Also check what kind of binary this is for the console handle */
if (BinaryType == BINARY_TYPE_WOW)
{
/* Magic value for 16-bit apps */
- Msg.Data.UpdateVdmEntry.ConsoleHandle = (HANDLE)-1;
+ UpdateVdmEntry->ConsoleHandle = (HANDLE)-1;
}
- else if (Msg.Data.UpdateVdmEntry.iTask)
+ else if (UpdateVdmEntry->iTask)
{
/* No handle for true VDM */
- Msg.Data.UpdateVdmEntry.ConsoleHandle = 0;
+ UpdateVdmEntry->ConsoleHandle = NULL;
}
else
{
- /* Otherwise, send the regular consoel handle */
- Msg.Data.UpdateVdmEntry.ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ /* Otherwise, use the regular console handle */
+ UpdateVdmEntry->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
}
/* Finally write the index and binary type */
- Msg.Data.UpdateVdmEntry.EntryIndex = UpdateIndex;
- Msg.Data.UpdateVdmEntry.BinaryType = BinaryType;
+ UpdateVdmEntry->EntryIndex = UpdateIndex;
+ UpdateVdmEntry->BinaryType = BinaryType;
/* Send the message to CSRSS */
- Status = CsrClientCallServer(&Msg, NULL, CsrRequest, sizeof(Msg));
- if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(Msg.Status)))
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepUpdateVDMEntry),
+ sizeof(BASE_UPDATE_VDM_ENTRY));
+ if (!NT_SUCCESS(Status))
{
/* Handle failure */
- BaseSetLastNTError(Msg.Status);
+ BaseSetLastNTError(Status);
return FALSE;
}
if (UpdateIndex == VdmEntryUpdateProcess)
{
/* Return it to the caller */
- *WaitHandle = Msg.Data.UpdateVdmEntry.WaitObjectForParent;
+ *WaitHandle = UpdateVdmEntry->WaitObjectForParent;
}
-
+#endif
/* We made it */
return TRUE;
}
BaseCheckForVDM(IN HANDLE ProcessHandle,
OUT LPDWORD ExitCode)
{
+#if 0 // Unimplemented in BASESRV
NTSTATUS Status;
EVENT_BASIC_INFORMATION EventBasicInfo;
- CSR_API_MESSAGE Msg;
- ULONG CsrRequest = MAKE_CSR_API(GET_VDM_EXIT_CODE, CSR_CONSOLE);
+ BASE_API_MESSAGE ApiMessage;
+ PBASE_GET_VDM_EXIT_CODE GetVdmExitCode = &ApiMessage.Data.GetVdmExitCode;
/* It's VDM if the process is actually a wait handle (an event) */
Status = NtQueryEvent(ProcessHandle,
if (!NT_SUCCESS(Status)) return FALSE;
/* Setup the input parameters */
- Msg.Data.GetVdmExitCode.ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
- Msg.Data.GetVdmExitCode.hParent = ProcessHandle;
+ GetVdmExitCode->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetVdmExitCode->hParent = ProcessHandle;
/* Call CSRSS */
- Status = CsrClientCallServer(&Msg, NULL, CsrRequest, sizeof(Msg));
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetVDMExitCode),
+ sizeof(BASE_GET_VDM_EXIT_CODE));
if (!NT_SUCCESS(Status)) return FALSE;
/* Get the exit code from the reply */
- *ExitCode = Msg.Data.GetVdmExitCode.ExitCode;
+ *ExitCode = GetVdmExitCode->ExitCode;
+#endif
return TRUE;
}
BOOL
WINAPI
-BaseGetVdmConfigInfo(IN LPCWSTR Reserved,
+BaseGetVdmConfigInfo(IN LPCWSTR CommandLineReserved,
IN ULONG DosSeqId,
IN ULONG BinaryType,
IN PUNICODE_STRING CmdLineString,
/* Clear the buffer in case we fail */
CmdLineString->Buffer = 0;
- /* Always return the same size */
+ /* Always return the same size: 16 Mb */
*VdmSize = 0x1000000;
/* Get the system directory */
/* Check if this is VDM with a DOS Sequence ID */
if (DosSeqId)
{
- /* Build the VDM string for it */
+ /*
+ * Build the VDM string for it:
+ * -i%lx : Gives the DOS Sequence ID;
+ * %s%c : Nothing if DOS VDM, -w if WoW VDM, -ws if separate WoW VDM.
+ */
_snwprintf(CommandLine,
sizeof(CommandLine),
L"\"%s\\ntvdm.exe\" -i%lx %s%c",
Buffer,
DosSeqId,
- (BinaryType == 0x10) ? L" " : L"-w",
- (BinaryType == 0x40) ? 's' : ' ');
+ (BinaryType == BINARY_TYPE_DOS) ? L" " : L"-w",
+ (BinaryType == BINARY_TYPE_SEPARATE_WOW) ? L's' : L' ');
}
else
{
- /* Non-DOS, build the stirng for it without the task ID */
+ /*
+ * Build the string for it without the DOS Sequence ID:
+ * %s%c : Nothing if DOS VDM, -w if WoW VDM, -ws if separate WoW VDM.
+ */
_snwprintf(CommandLine,
sizeof(CommandLine),
- L"\"%s\\ntvdm.exe\" %s%c",
+ L"\"%s\\ntvdm.exe\" %s%c",
Buffer,
- (BinaryType == 0x10) ? L" " : L"-w",
- (BinaryType == 0x40) ? 's' : ' ');
+ (BinaryType == BINARY_TYPE_DOS) ? L" " : L"-w",
+ (BinaryType == BINARY_TYPE_SEPARATE_WOW) ? L's' : L' ');
}
/* Create the actual string */
{
BOOL Result;
ULONG RegionSize, EnvironmentSize = 0;
- PWCHAR p, Environment, NewEnvironment;
+ PWCHAR p, Environment, NewEnvironment = NULL;
NTSTATUS Status;
/* Make sure we have both strings */
/* Initialize the unicode string to hold it */
EnvironmentSize = (p - NewEnvironment) * sizeof(WCHAR);
- RtlInitEmptyUnicodeString(UnicodeEnv, NewEnvironment, EnvironmentSize);
- UnicodeEnv->Length = EnvironmentSize;
+ RtlInitEmptyUnicodeString(UnicodeEnv, NewEnvironment, (USHORT)EnvironmentSize);
+ UnicodeEnv->Length = (USHORT)EnvironmentSize;
/* Create the ASCII version of it */
Status = RtlUnicodeStringToAnsiString(AnsiEnv, UnicodeEnv, TRUE);
}
}
- DPRINT1("Invalid binary type returned!\n", BinType);
+ DPRINT1("Invalid binary type %lu returned!\n", BinType);
return FALSE;
}