/* GLOBALS ********************************************************************/
-// NOTE: We cannot use ARRAYSIZE in this macro. GCC would complain otherwise.
#define ENV_NAME_ENTRY(type, name) \
- {(type), (sizeof(name)/sizeof(*((ENV_INFO*)0)->Name)) - 1, (name)}
+ {(type), _ARRAYSIZE(name) - 1, (name)}
static ENV_INFO BasepEnvNameType[] =
{
{
NTSTATUS Status;
PBASE_CHECK_VDM CheckVdm = &ApiMessage->Data.CheckVDMRequest;
- PCSR_CAPTURE_BUFFER CaptureBuffer;
+ PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
PWCHAR CurrentDir = NULL;
PWCHAR ShortAppName = NULL;
PWCHAR ShortCurrentDir = NULL;
AnsiCmdLine = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CheckVdm->CmdLen + 2);
AnsiAppName = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CheckVdm->AppLen);
AnsiCurDirectory = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CheckVdm->CurDirectoryLen);
- if (StartupInfo->lpDesktop) AnsiDesktop = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- CheckVdm->DesktopLen);
- if (StartupInfo->lpTitle) AnsiTitle = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- CheckVdm->TitleLen);
- if (StartupInfo->lpReserved) AnsiReserved = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- CheckVdm->ReservedLen);
+ if (StartupInfo->lpDesktop)
+ AnsiDesktop = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ CheckVdm->DesktopLen);
+ if (StartupInfo->lpTitle)
+ AnsiTitle = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ CheckVdm->TitleLen);
+ if (StartupInfo->lpReserved)
+ AnsiReserved = (PCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ CheckVdm->ReservedLen);
if (!AnsiCmdLine
|| !AnsiAppName
}
/* Fill the ANSI startup info structure */
- RtlCopyMemory(&AnsiStartupInfo, StartupInfo, sizeof(STARTUPINFO));
+ RtlCopyMemory(&AnsiStartupInfo, StartupInfo, sizeof(AnsiStartupInfo));
AnsiStartupInfo.lpReserved = AnsiReserved;
AnsiStartupInfo.lpDesktop = AnsiDesktop;
AnsiStartupInfo.lpTitle = AnsiTitle;
+ CheckVdm->TitleLen
+ CheckVdm->ReservedLen
+ CheckVdm->EnvLen
- + sizeof(STARTUPINFOA));
+ + sizeof(*CheckVdm->StartupInfo));
if (CaptureBuffer == NULL)
{
Status = STATUS_NO_MEMORY;
/* Capture the startup info structure */
CsrCaptureMessageBuffer(CaptureBuffer,
&AnsiStartupInfo,
- sizeof(STARTUPINFOA),
+ sizeof(*CheckVdm->StartupInfo),
(PVOID*)&CheckVdm->StartupInfo);
if (StartupInfo->lpDesktop)
if (AnsiReserved) RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiReserved);
/* Free the capture buffer */
- CsrFreeCaptureBuffer(CaptureBuffer);
+ if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer);
/* Free the current directory, if it was allocated here, and its short path */
if (ShortCurrentDir) RtlFreeHeap(RtlGetProcessHeap(), 0, ShortCurrentDir);
// Can be put in some .h ??
#define IS_PATH_SEPARATOR(x) ((x) == L'\\' || (x) == L'/')
- BOOL Result;
+ BOOL Success = FALSE;
NTSTATUS Status;
ULONG RegionSize, EnvironmentSize = 0;
PWCHAR Environment, NewEnvironment = NULL;
else
{
/* Everything went okay, so return success */
- Result = TRUE;
+ Success = TRUE;
NewEnvironment = NULL;
}
}
/* Return the result */
- return Result;
+ return Success;
}
BOOL
WINAPI
GetNextVDMCommand(PVDM_COMMAND_INFO CommandData)
{
+ BOOL Success = FALSE;
NTSTATUS Status;
- BOOL Result = FALSE;
BASE_API_MESSAGE ApiMessage;
PBASE_GET_NEXT_VDM_COMMAND GetNextVdmCommand = &ApiMessage.Data.GetNextVDMCommandRequest;
PBASE_IS_FIRST_VDM IsFirstVdm = &ApiMessage.Data.IsFirstVDMRequest;
PCSR_CAPTURE_BUFFER CaptureBuffer = NULL;
ULONG NumStrings = 0;
- if (CommandData != NULL)
+ /*
+ * Special case to test whether the VDM is the first one.
+ */
+ if (CommandData == NULL)
{
- if ((CommandData->VDMState == VDM_INC_REENTER_COUNT)
- || (CommandData->VDMState == VDM_DEC_REENTER_COUNT))
+ /* Call CSRSS */
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepIsFirstVDM),
+ sizeof(*IsFirstVdm));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- /* Setup the input parameters */
- SetReenterCount->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
- SetReenterCount->fIncDec = CommandData->VDMState;
-
- /* Call CSRSS */
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSetReenterCount),
- sizeof(*SetReenterCount));
- BaseSetLastNTError(Status);
- Result = NT_SUCCESS(Status);
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
}
- else
+
+ /* Return TRUE if this is the first VDM */
+ return IsFirstVdm->FirstVDM;
+ }
+
+ /* CommandData != NULL */
+
+ /*
+ * Special case to increment or decrement the reentrancy count.
+ */
+ if ((CommandData->VDMState == VDM_INC_REENTER_COUNT) ||
+ (CommandData->VDMState == VDM_DEC_REENTER_COUNT))
+ {
+ /* Setup the input parameters */
+ SetReenterCount->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ SetReenterCount->fIncDec = CommandData->VDMState;
+
+ /* Call CSRSS */
+ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ NULL,
+ CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepSetReenterCount),
+ sizeof(*SetReenterCount));
+ if (!NT_SUCCESS(ApiMessage.Status))
{
- /* Clear the structure */
- ZeroMemory(GetNextVdmCommand, sizeof(*GetNextVdmCommand));
-
- /* Setup the input parameters */
- GetNextVdmCommand->iTask = CommandData->TaskId;
- GetNextVdmCommand->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
- GetNextVdmCommand->CmdLen = CommandData->CmdLen;
- GetNextVdmCommand->AppLen = CommandData->AppLen;
- GetNextVdmCommand->PifLen = CommandData->PifLen;
- GetNextVdmCommand->CurDirectoryLen = CommandData->CurDirectoryLen;
- GetNextVdmCommand->EnvLen = CommandData->EnvLen;
- GetNextVdmCommand->DesktopLen = CommandData->DesktopLen;
- GetNextVdmCommand->TitleLen = CommandData->TitleLen;
- GetNextVdmCommand->ReservedLen = CommandData->ReservedLen;
- GetNextVdmCommand->VDMState = CommandData->VDMState;
-
- /* Count the number of strings */
- if (CommandData->CmdLen) NumStrings++;
- if (CommandData->AppLen) NumStrings++;
- if (CommandData->PifLen) NumStrings++;
- if (CommandData->CurDirectoryLen) NumStrings++;
- if (CommandData->EnvLen) NumStrings++;
- if (CommandData->DesktopLen) NumStrings++;
- if (CommandData->TitleLen) NumStrings++;
- if (CommandData->ReservedLen) NumStrings++;
-
- /* Allocate the capture buffer */
- CaptureBuffer = CsrAllocateCaptureBuffer(NumStrings + 1,
- GetNextVdmCommand->CmdLen
- + GetNextVdmCommand->AppLen
- + GetNextVdmCommand->PifLen
- + GetNextVdmCommand->CurDirectoryLen
- + GetNextVdmCommand->EnvLen
- + GetNextVdmCommand->DesktopLen
- + GetNextVdmCommand->TitleLen
- + GetNextVdmCommand->ReservedLen
- + sizeof(STARTUPINFOA));
- if (CaptureBuffer == NULL)
- {
- BaseSetLastNTError(STATUS_NO_MEMORY);
- goto Cleanup;
- }
+ BaseSetLastNTError(ApiMessage.Status);
+ return FALSE;
+ }
- /* Allocate memory for the startup info */
- CsrAllocateMessagePointer(CaptureBuffer,
- sizeof(STARTUPINFOA),
- (PVOID*)&GetNextVdmCommand->StartupInfo);
+ return TRUE;
+ }
- if (CommandData->CmdLen)
- {
- /* Allocate memory for the command line */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->CmdLen,
- (PVOID*)&GetNextVdmCommand->CmdLine);
- }
+ /*
+ * TODO!
+ * Special case to retrieve or set WOW information.
+ */
+ // TODO: if CommandData->VDMState & (VDM_LIST_WOW_PROCESSES | VDM_LIST_WOW_TASKS | VDM_ADD_WOW_TASK)
+ // then call BasepGetNextVDMCommand in a simpler way!
- if (CommandData->AppLen)
- {
- /* Allocate memory for the application name */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->AppLen,
- (PVOID*)&GetNextVdmCommand->AppName);
- }
+ /*
+ * Regular case.
+ */
- if (CommandData->PifLen)
- {
- /* Allocate memory for the PIF file name */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->PifLen,
- (PVOID*)&GetNextVdmCommand->PifFile);
- }
+ /* Clear the structure */
+ RtlZeroMemory(GetNextVdmCommand, sizeof(*GetNextVdmCommand));
- if (CommandData->CurDirectoryLen)
- {
- /* Allocate memory for the current directory */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->CurDirectoryLen,
- (PVOID*)&GetNextVdmCommand->CurDirectory);
- }
+ /* Setup the input parameters */
+ GetNextVdmCommand->iTask = CommandData->TaskId;
+ GetNextVdmCommand->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle;
+ GetNextVdmCommand->CmdLen = CommandData->CmdLen;
+ GetNextVdmCommand->AppLen = CommandData->AppLen;
+ GetNextVdmCommand->PifLen = CommandData->PifLen;
+ GetNextVdmCommand->CurDirectoryLen = CommandData->CurDirectoryLen;
+ GetNextVdmCommand->EnvLen = CommandData->EnvLen;
+ GetNextVdmCommand->DesktopLen = CommandData->DesktopLen;
+ GetNextVdmCommand->TitleLen = CommandData->TitleLen;
+ GetNextVdmCommand->ReservedLen = CommandData->ReservedLen;
+ GetNextVdmCommand->VDMState = CommandData->VDMState;
+
+ /* Count the number of strings */
+ if (CommandData->CmdLen) NumStrings++;
+ if (CommandData->AppLen) NumStrings++;
+ if (CommandData->PifLen) NumStrings++;
+ if (CommandData->CurDirectoryLen) NumStrings++;
+ if (CommandData->EnvLen) NumStrings++;
+ if (CommandData->DesktopLen) NumStrings++;
+ if (CommandData->TitleLen) NumStrings++;
+ if (CommandData->ReservedLen) NumStrings++;
- if (CommandData->EnvLen)
- {
- /* Allocate memory for the environment */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->EnvLen,
- (PVOID*)&GetNextVdmCommand->Env);
- }
+ /* Allocate the capture buffer */
+ CaptureBuffer = CsrAllocateCaptureBuffer(NumStrings + 1,
+ GetNextVdmCommand->CmdLen
+ + GetNextVdmCommand->AppLen
+ + GetNextVdmCommand->PifLen
+ + GetNextVdmCommand->CurDirectoryLen
+ + GetNextVdmCommand->EnvLen
+ + GetNextVdmCommand->DesktopLen
+ + GetNextVdmCommand->TitleLen
+ + GetNextVdmCommand->ReservedLen
+ + sizeof(*GetNextVdmCommand->StartupInfo));
+ if (CaptureBuffer == NULL)
+ {
+ BaseSetLastNTError(STATUS_NO_MEMORY);
+ goto Cleanup;
+ }
- if (CommandData->DesktopLen)
- {
- /* Allocate memory for the desktop name */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->DesktopLen,
- (PVOID*)&GetNextVdmCommand->Desktop);
- }
+ /* Capture the data */
- if (CommandData->TitleLen)
- {
- /* Allocate memory for the title */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->TitleLen,
- (PVOID*)&GetNextVdmCommand->Title);
- }
+ CsrAllocateMessagePointer(CaptureBuffer,
+ sizeof(*GetNextVdmCommand->StartupInfo),
+ (PVOID*)&GetNextVdmCommand->StartupInfo);
- if (CommandData->ReservedLen)
- {
- /* Allocate memory for the reserved parameter */
- CsrAllocateMessagePointer(CaptureBuffer,
- CommandData->ReservedLen,
- (PVOID*)&GetNextVdmCommand->Reserved);
- }
+ if (CommandData->CmdLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->CmdLen,
+ (PVOID*)&GetNextVdmCommand->CmdLine);
+ }
- do
- {
- /* Call CSRSS */
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- CaptureBuffer,
- CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetNextVDMCommand),
- sizeof(*GetNextVdmCommand));
- if (!NT_SUCCESS(Status))
- {
- /* Store the correct lengths */
- CommandData->CmdLen = GetNextVdmCommand->CmdLen;
- CommandData->AppLen = GetNextVdmCommand->AppLen;
- CommandData->PifLen = GetNextVdmCommand->PifLen;
- CommandData->CurDirectoryLen = GetNextVdmCommand->CurDirectoryLen;
- CommandData->EnvLen = GetNextVdmCommand->EnvLen;
- CommandData->DesktopLen = GetNextVdmCommand->DesktopLen;
- CommandData->TitleLen = GetNextVdmCommand->TitleLen;
- CommandData->ReservedLen = GetNextVdmCommand->ReservedLen;
-
- BaseSetLastNTError(Status);
- goto Cleanup;
- }
+ if (CommandData->AppLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->AppLen,
+ (PVOID*)&GetNextVdmCommand->AppName);
+ }
- /* Did we receive an event handle? */
- if (GetNextVdmCommand->WaitObjectForVDM != NULL)
- {
- /* Wait for the event to become signaled and try again */
- Status = NtWaitForSingleObject(GetNextVdmCommand->WaitObjectForVDM,
- FALSE,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- goto Cleanup;
- }
+ if (CommandData->PifLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->PifLen,
+ (PVOID*)&GetNextVdmCommand->PifFile);
+ }
- /* Set the retry flag and clear the exit code */
- GetNextVdmCommand->VDMState |= VDM_FLAG_RETRY;
- GetNextVdmCommand->ExitCode = 0;
- }
- }
- while (GetNextVdmCommand->WaitObjectForVDM != NULL);
+ if (CommandData->CurDirectoryLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->CurDirectoryLen,
+ (PVOID*)&GetNextVdmCommand->CurDirectory);
+ }
- /* Write back the standard handles */
- CommandData->StdIn = GetNextVdmCommand->StdIn;
- CommandData->StdOut = GetNextVdmCommand->StdOut;
- CommandData->StdErr = GetNextVdmCommand->StdErr;
+ if (CommandData->EnvLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->EnvLen,
+ (PVOID*)&GetNextVdmCommand->Env);
+ }
- /* Write back the startup info */
- RtlMoveMemory(&CommandData->StartupInfo,
- GetNextVdmCommand->StartupInfo,
- sizeof(STARTUPINFOA));
+ if (CommandData->DesktopLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->DesktopLen,
+ (PVOID*)&GetNextVdmCommand->Desktop);
+ }
- if (CommandData->CmdLen)
- {
- /* Write back the command line */
- RtlMoveMemory(CommandData->CmdLine,
- GetNextVdmCommand->CmdLine,
- GetNextVdmCommand->CmdLen);
+ if (CommandData->TitleLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->TitleLen,
+ (PVOID*)&GetNextVdmCommand->Title);
+ }
- /* Set the actual length */
- CommandData->CmdLen = GetNextVdmCommand->CmdLen;
- }
+ if (CommandData->ReservedLen)
+ {
+ CsrAllocateMessagePointer(CaptureBuffer,
+ CommandData->ReservedLen,
+ (PVOID*)&GetNextVdmCommand->Reserved);
+ }
- if (CommandData->AppLen)
- {
- /* Write back the application name */
- RtlMoveMemory(CommandData->AppName,
- GetNextVdmCommand->AppName,
- GetNextVdmCommand->AppLen);
+ while (TRUE)
+ {
+ /* Call CSRSS */
+ Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
+ CaptureBuffer,
+ CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetNextVDMCommand),
+ sizeof(*GetNextVdmCommand));
- /* Set the actual length */
- CommandData->AppLen = GetNextVdmCommand->AppLen;
- }
+ /* Exit the waiting loop if we did not receive any event handle */
+ if (GetNextVdmCommand->WaitObjectForVDM == NULL)
+ break;
- if (CommandData->PifLen)
- {
- /* Write back the PIF file name */
- RtlMoveMemory(CommandData->PifFile,
- GetNextVdmCommand->PifFile,
- GetNextVdmCommand->PifLen);
+ /* Wait for the event to become signaled and try again */
+ Status = NtWaitForSingleObject(GetNextVdmCommand->WaitObjectForVDM,
+ FALSE, NULL);
+ if (Status != STATUS_SUCCESS)
+ {
+ /* Fail if we timed out, or if some other error happened */
+ BaseSetLastNTError(Status);
+ goto Cleanup;
+ }
- /* Set the actual length */
- CommandData->PifLen = GetNextVdmCommand->PifLen;
- }
+ /* Set the retry flag, clear the exit code, and retry a query */
+ GetNextVdmCommand->VDMState |= VDM_FLAG_RETRY;
+ GetNextVdmCommand->ExitCode = 0;
+ }
- if (CommandData->CurDirectoryLen)
- {
- /* Write back the current directory */
- RtlMoveMemory(CommandData->CurDirectory,
- GetNextVdmCommand->CurDirectory,
- GetNextVdmCommand->CurDirectoryLen);
+ if (!NT_SUCCESS(Status))
+ {
+ if (Status == STATUS_INVALID_PARAMETER)
+ {
+ /*
+ * One of the buffer lengths was less than required. Store the correct ones.
+ * Note that the status code is not STATUS_BUFFER_TOO_SMALL as one would expect,
+ * in order to keep compatibility with Windows 2003 BASESRV.DLL.
+ */
+ CommandData->CmdLen = GetNextVdmCommand->CmdLen;
+ CommandData->AppLen = GetNextVdmCommand->AppLen;
+ CommandData->PifLen = GetNextVdmCommand->PifLen;
+ CommandData->CurDirectoryLen = GetNextVdmCommand->CurDirectoryLen;
+ CommandData->EnvLen = GetNextVdmCommand->EnvLen;
+ CommandData->DesktopLen = GetNextVdmCommand->DesktopLen;
+ CommandData->TitleLen = GetNextVdmCommand->TitleLen;
+ CommandData->ReservedLen = GetNextVdmCommand->ReservedLen;
+ }
+ else
+ {
+ /* Any other failure */
+ CommandData->CmdLen = 0;
+ CommandData->AppLen = 0;
+ CommandData->PifLen = 0;
+ CommandData->CurDirectoryLen = 0;
+ CommandData->EnvLen = 0;
+ CommandData->DesktopLen = 0;
+ CommandData->TitleLen = 0;
+ CommandData->ReservedLen = 0;
+ }
- /* Set the actual length */
- CommandData->CurDirectoryLen = GetNextVdmCommand->CurDirectoryLen;
- }
+ BaseSetLastNTError(Status);
+ goto Cleanup;
+ }
- if (CommandData->EnvLen)
- {
- /* Write back the environment */
- RtlMoveMemory(CommandData->Env,
- GetNextVdmCommand->Env,
- GetNextVdmCommand->EnvLen);
+ /* Write back the standard handles */
+ CommandData->StdIn = GetNextVdmCommand->StdIn;
+ CommandData->StdOut = GetNextVdmCommand->StdOut;
+ CommandData->StdErr = GetNextVdmCommand->StdErr;
- /* Set the actual length */
- CommandData->EnvLen = GetNextVdmCommand->EnvLen;
- }
+ /* Write back the startup info */
+ RtlMoveMemory(&CommandData->StartupInfo,
+ GetNextVdmCommand->StartupInfo,
+ sizeof(*GetNextVdmCommand->StartupInfo));
- if (CommandData->DesktopLen)
- {
- /* Write back the desktop name */
- RtlMoveMemory(CommandData->Desktop,
- GetNextVdmCommand->Desktop,
- GetNextVdmCommand->DesktopLen);
+ if (CommandData->CmdLen)
+ {
+ /* Write back the command line */
+ RtlMoveMemory(CommandData->CmdLine,
+ GetNextVdmCommand->CmdLine,
+ GetNextVdmCommand->CmdLen);
- /* Set the actual length */
- CommandData->DesktopLen = GetNextVdmCommand->DesktopLen;
- }
+ /* Set the actual length */
+ CommandData->CmdLen = GetNextVdmCommand->CmdLen;
+ }
- if (CommandData->TitleLen)
- {
- /* Write back the title */
- RtlMoveMemory(CommandData->Title,
- GetNextVdmCommand->Title,
- GetNextVdmCommand->TitleLen);
+ if (CommandData->AppLen)
+ {
+ /* Write back the application name */
+ RtlMoveMemory(CommandData->AppName,
+ GetNextVdmCommand->AppName,
+ GetNextVdmCommand->AppLen);
- /* Set the actual length */
- CommandData->TitleLen = GetNextVdmCommand->TitleLen;
- }
+ /* Set the actual length */
+ CommandData->AppLen = GetNextVdmCommand->AppLen;
+ }
- if (CommandData->ReservedLen)
- {
- /* Write back the reserved parameter */
- RtlMoveMemory(CommandData->Reserved,
- GetNextVdmCommand->Reserved,
- GetNextVdmCommand->ReservedLen);
+ if (CommandData->PifLen)
+ {
+ /* Write back the PIF file name */
+ RtlMoveMemory(CommandData->PifFile,
+ GetNextVdmCommand->PifFile,
+ GetNextVdmCommand->PifLen);
- /* Set the actual length */
- CommandData->ReservedLen = GetNextVdmCommand->ReservedLen;
- }
+ /* Set the actual length */
+ CommandData->PifLen = GetNextVdmCommand->PifLen;
+ }
- /* Write the remaining output parameters */
- CommandData->TaskId = GetNextVdmCommand->iTask;
- CommandData->CreationFlags = GetNextVdmCommand->dwCreationFlags;
- CommandData->CodePage = GetNextVdmCommand->CodePage;
- CommandData->ExitCode = GetNextVdmCommand->ExitCode;
- CommandData->CurrentDrive = GetNextVdmCommand->CurrentDrive;
- CommandData->VDMState = GetNextVdmCommand->VDMState;
- CommandData->ComingFromBat = GetNextVdmCommand->fComingFromBat;
-
- /* It was successful */
- Result = TRUE;
- }
+ if (CommandData->CurDirectoryLen)
+ {
+ /* Write back the current directory */
+ RtlMoveMemory(CommandData->CurDirectory,
+ GetNextVdmCommand->CurDirectory,
+ GetNextVdmCommand->CurDirectoryLen);
+
+ /* Set the actual length */
+ CommandData->CurDirectoryLen = GetNextVdmCommand->CurDirectoryLen;
}
- else
+
+ if (CommandData->EnvLen)
{
- /* Call CSRSS */
- Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage,
- NULL,
- CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepIsFirstVDM),
- sizeof(*IsFirstVdm));
- if (!NT_SUCCESS(Status))
- {
- BaseSetLastNTError(Status);
- goto Cleanup;
- }
+ /* Write back the environment */
+ RtlMoveMemory(CommandData->Env,
+ GetNextVdmCommand->Env,
+ GetNextVdmCommand->EnvLen);
- /* Return TRUE if this is the first VDM */
- Result = IsFirstVdm->FirstVDM;
+ /* Set the actual length */
+ CommandData->EnvLen = GetNextVdmCommand->EnvLen;
+ }
+
+ if (CommandData->DesktopLen)
+ {
+ /* Write back the desktop name */
+ RtlMoveMemory(CommandData->Desktop,
+ GetNextVdmCommand->Desktop,
+ GetNextVdmCommand->DesktopLen);
+
+ /* Set the actual length */
+ CommandData->DesktopLen = GetNextVdmCommand->DesktopLen;
}
+ if (CommandData->TitleLen)
+ {
+ /* Write back the title */
+ RtlMoveMemory(CommandData->Title,
+ GetNextVdmCommand->Title,
+ GetNextVdmCommand->TitleLen);
+
+ /* Set the actual length */
+ CommandData->TitleLen = GetNextVdmCommand->TitleLen;
+ }
+
+ if (CommandData->ReservedLen)
+ {
+ /* Write back the reserved parameter */
+ RtlMoveMemory(CommandData->Reserved,
+ GetNextVdmCommand->Reserved,
+ GetNextVdmCommand->ReservedLen);
+
+ /* Set the actual length */
+ CommandData->ReservedLen = GetNextVdmCommand->ReservedLen;
+ }
+
+ /* Write the remaining output parameters */
+ CommandData->TaskId = GetNextVdmCommand->iTask;
+ CommandData->CreationFlags = GetNextVdmCommand->dwCreationFlags;
+ CommandData->CodePage = GetNextVdmCommand->CodePage;
+ CommandData->ExitCode = GetNextVdmCommand->ExitCode;
+ CommandData->CurrentDrive = GetNextVdmCommand->CurrentDrive;
+ CommandData->VDMState = GetNextVdmCommand->VDMState;
+ CommandData->ComingFromBat = GetNextVdmCommand->fComingFromBat;
+
+ /* It was successful */
+ Success = TRUE;
+
Cleanup:
if (CaptureBuffer != NULL) CsrFreeCaptureBuffer(CaptureBuffer);
- return Result;
+ return Success;
}