mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
[BASESRV]
Implement BaseSrvGetVDMExitCode. svn path=/branches/ntvdm/; revision=62237
This commit is contained in:
parent
9b24de4f64
commit
60dd86e7ac
2 changed files with 49 additions and 2 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue