From 5036028dd4d5e004e016cfebb07ede6d526516a8 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Mon, 24 Feb 2014 03:51:49 +0000 Subject: [PATCH] [BASESRV] Implement BaseSrvExitVDM. svn path=/branches/ntvdm/; revision=62315 --- subsystems/win/basesrv/vdm.c | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/subsystems/win/basesrv/vdm.c b/subsystems/win/basesrv/vdm.c index 42273116104..d9cab1ccfae 100644 --- a/subsystems/win/basesrv/vdm.c +++ b/subsystems/win/basesrv/vdm.c @@ -190,8 +190,61 @@ CSR_API(BaseSrvGetNextVDMCommand) CSR_API(BaseSrvExitVDM) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PBASE_EXIT_VDM ExitVdmRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.ExitVDMRequest; + PRTL_CRITICAL_SECTION CriticalSection = NULL; + PVDM_CONSOLE_RECORD ConsoleRecord = NULL; + PVDM_DOS_RECORD DosRecord; + + CriticalSection = (ExitVdmRequest->iWowTask == 0) + ? &DosCriticalSection + : &WowCriticalSection; + + /* Enter the critical section */ + RtlEnterCriticalSection(CriticalSection); + + if (ExitVdmRequest->iWowTask == 0) + { + /* Get the console record */ + Status = BaseSrvGetConsoleRecord(ExitVdmRequest->ConsoleHandle, &ConsoleRecord); + if (!NT_SUCCESS(Status)) goto Cleanup; + + /* Cleanup the DOS records */ + while (ConsoleRecord->DosListHead.Flink != &ConsoleRecord->DosListHead) + { + DosRecord = CONTAINING_RECORD(ConsoleRecord->DosListHead.Flink, + VDM_DOS_RECORD, + Entry); + + /* Remove the DOS entry */ + RemoveEntryList(&DosRecord->Entry); + RtlFreeHeap(BaseSrvHeap, 0, DosRecord); + } + + if (ConsoleRecord->CurrentDirs != NULL) + { + /* Free the current directories */ + RtlFreeHeap(BaseSrvHeap, 0, ConsoleRecord->CurrentDirs); + ConsoleRecord->CurrentDirs = NULL; + ConsoleRecord->CurDirsLength = 0; + } + + /* Remove the console record */ + RemoveEntryList(&ConsoleRecord->Entry); + RtlFreeHeap(BaseSrvHeap, 0, ConsoleRecord); + } + else + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + +Cleanup: + /* Leave the critical section */ + RtlLeaveCriticalSection(CriticalSection); + + return Status; } CSR_API(BaseSrvIsFirstVDM) -- 2.17.1