[BASESRV]

Implement BaseSrvGetVDMExitCode.


svn path=/branches/ntvdm/; revision=62237
This commit is contained in:
Aleksandar Andrejevic 2014-02-18 02:15:33 +00:00
parent 9b24de4f64
commit 60dd86e7ac
2 changed files with 49 additions and 2 deletions

View file

@ -209,8 +209,52 @@ CSR_API(BaseSrvIsFirstVDM)
CSR_API(BaseSrvGetVDMExitCode)
{
DPRINT1("%s not yet implemented\n", __FUNCTION__);
return STATUS_NOT_IMPLEMENTED;
NTSTATUS Status;
PBASE_GET_VDM_EXIT_CODE GetVDMExitCodeRequest = &((PBASE_API_MESSAGE)ApiMessage)->Data.GetVDMExitCodeRequest;
PLIST_ENTRY i = NULL;
PVDM_CONSOLE_RECORD ConsoleRecord = NULL;
PVDM_DOS_RECORD DosRecord = NULL;
/* Enter the critical section */
RtlEnterCriticalSection(&DosCriticalSection);
/* Get the console record */
Status = BaseSrvGetConsoleRecord(GetVDMExitCodeRequest->ConsoleHandle, &ConsoleRecord);
if (!NT_SUCCESS(Status)) goto Cleanup;
/* Search for a DOS record that has the same parent process handle */
for (i = ConsoleRecord->DosListHead.Flink; i != &ConsoleRecord->DosListHead; i = i->Flink)
{
DosRecord = CONTAINING_RECORD(i, VDM_DOS_RECORD, Entry);
if (DosRecord->ParentProcess == GetVDMExitCodeRequest->hParent) break;
}
/* Check if no DOS record was found */
if (i == &ConsoleRecord->DosListHead)
{
Status = STATUS_NOT_FOUND;
goto Cleanup;
}
/* Check if this task is still running */
if (DosRecord->State == VDM_READY)
{
GetVDMExitCodeRequest->ExitCode = STATUS_PENDING;
goto Cleanup;
}
/* Return the exit code */
GetVDMExitCodeRequest->ExitCode = DosRecord->ExitCode;
/* Since this is a zombie task record, remove it */
RemoveEntryList(&DosRecord->Entry);
RtlFreeHeap(BaseSrvHeap, 0, DosRecord);
Cleanup:
/* Leave the critical section */
RtlLeaveCriticalSection(&DosCriticalSection);
return Status;
}
CSR_API(BaseSrvSetReenterCount)

View file

@ -27,6 +27,9 @@ typedef struct _VDM_CONSOLE_RECORD
typedef struct _VDM_DOS_RECORD
{
LIST_ENTRY Entry;
USHORT State;
ULONG ExitCode;
HANDLE ParentProcess;
// TODO: Structure incomplete!!!
} VDM_DOS_RECORD, *PVDM_DOS_RECORD;