summaryrefslogblamecommitdiffstats
path: root/private/ntos/rtl/uexec2.c
blob: 8174d71b6e99b5d8d47df855edaad21c2104cbe6 (plain) (tree)

































































































































































































































































                                                                                                   
/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    uexec.c

Abstract:

    Test program for the NT OS User Mode Runtime Library (URTL)

Author:

    Mark Lucovsyt (markl) 14-Jun-1990

Revision History:

--*/

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>

NTSTATUS
main(
    IN ULONG argc,
    IN PCH argv[],
    IN PCH envp[],
    IN ULONG DebugParameter OPTIONAL
    )
{
    NTSTATUS st;
    STRING ImagePathName;
    UNICODE_STRING ConfigFilePathname;
    RTL_USER_PROCESS_INFORMATION ProcessInformation;
    PEB_SM_DATA PebSessionInformation;
    HANDLE FileHandle;
    ULONG FileIndexNumber;
    IO_STATUS_BLOCK IoStatus;
    OBJECT_ATTRIBUTES ObjectAttributes;
    FILE_INTERNAL_INFORMATION FileInformation;
    PPEB Peb;

    Peb = NtCurrentPeb();
    RtlZeroMemory(&PebSessionInformation,sizeof(PebSessionInformation));

    //
    // If we started from cli then do all this work to
    // pass thru stdin
    //

    if ( !Peb->Sm.StandardInput.FileHandle ) {

        RtlInitUnicodeString(&ConfigFilePathname,L"\\SystemRoot\\nt.cfg");

        //
        // Open the file
        //

        InitializeObjectAttributes(
            &ObjectAttributes,
            &ConfigFilePathname,
            OBJ_CASE_INSENSITIVE,
            NULL,
            NULL
            );

        st = NtOpenFile(
                &FileHandle,
                SYNCHRONIZE | FILE_READ_DATA,
                &ObjectAttributes,
                &IoStatus,
                FILE_SHARE_READ,
                0
                );

        if (!NT_SUCCESS( st )) {
            DbgPrint("NtOpenFile: %wZ failed 0x%lx\n",&ConfigFilePathname,st);
            ASSERT(NT_SUCCESS(st));
        }

        //
        // get the file serial number
        //

        st = NtQueryInformationFile(
                FileHandle,
                &IoStatus,
                (PVOID) &FileInformation,
                sizeof(FileInformation),
                FileInternalInformation
                );

        if (!NT_SUCCESS( st )) {
            DbgPrint("NtQueryInformationFile: %wZ failed 0x%lx\n",&ConfigFilePathname,st);
            ASSERT(NT_SUCCESS(st));
        }

        PebSessionInformation.Length = sizeof(PebSessionInformation);
        PebSessionInformation.StandardInput.FileHandle = FileHandle;
        PebSessionInformation.StandardInput.Context = (PVOID) FileInformation.IndexNumber;

        RtlInitString(&ImagePathName,"\\A:\\uexec2.exe");

        st = RtlCreateUserProcess(
                &ImagePathName,
                NULL,
                NULL,
                NULL,
                FALSE,
                NULL,
                NULL,
                NULL,
                &ProcessInformation,
                &PebSessionInformation
                );

        ASSERT(NT_SUCCESS(st));

        NtResumeThread(ProcessInformation.Thread,NULL);
        NtWaitForSingleObject(ProcessInformation.Process,FALSE,NULL);
        NtClose(ProcessInformation.Process);
        NtClose(ProcessInformation.Thread);
        NtTerminateProcess(NtCurrentProcess(),STATUS_SUCCESS);

    } else {

        if ( !Peb->Sm.StandardOutput.FileHandle ) {

            //
            // Started from this program. Stdin is inherited
            //

            st = NtQueryInformationFile(
                    Peb->Sm.StandardInput.FileHandle,
                    &IoStatus,
                    (PVOID) &FileInformation,
                    sizeof(FileInformation),
                    FileInternalInformation
                    );

            if (!NT_SUCCESS( st )) {
                DbgPrint("NtQueryInformationFile: failed 0x%lx\n",st);
                ASSERT(NT_SUCCESS(st));
            }

            ASSERT(Peb->Sm.StandardInput.Context == (PVOID) FileInformation.IndexNumber);

            PebSessionInformation.Length = sizeof(PebSessionInformation);
            PebSessionInformation.StandardInput.FileHandle = (HANDLE)PEB_STDIO_HANDLE_SUBSYS;
            PebSessionInformation.StandardOutput.FileHandle = Peb->Sm.StandardInput.FileHandle;
            PebSessionInformation.StandardOutput.Context = (PVOID) FileInformation.IndexNumber;

            RtlInitString(&ImagePathName,"\\A:\\uexec2.exe");

            st = RtlCreateUserProcess(
                    &ImagePathName,
                    NULL,
                    NULL,
                    NULL,
                    FALSE,
                    NULL,
                    NULL,
                    NULL,
                    &ProcessInformation,
                    &PebSessionInformation
                    );

            ASSERT(NT_SUCCESS(st));

            NtResumeThread(ProcessInformation.Thread,NULL);
            NtWaitForSingleObject(ProcessInformation.Process,FALSE,NULL);
            NtClose(ProcessInformation.Process);
            NtClose(ProcessInformation.Thread);
            NtTerminateProcess(NtCurrentProcess(),STATUS_SUCCESS);

        } else {

            ASSERT(Peb->Sm.StandardInput.FileHandle == (HANDLE)PEB_STDIO_HANDLE_SUBSYS);

            if ( !Peb->Sm.StandardError.FileHandle ) {

                //
                // Started by this program with StandardOutput Inherited
                //

                st = NtQueryInformationFile(
                        Peb->Sm.StandardOutput.FileHandle,
                        &IoStatus,
                        (PVOID) &FileInformation,
                        sizeof(FileInformation),
                        FileInternalInformation
                        );

                if (!NT_SUCCESS( st )) {
                    DbgPrint("NtQueryInformationFile: failed 0x%lx\n",st);
                    ASSERT(NT_SUCCESS(st));
                }

                ASSERT(Peb->Sm.StandardOutput.Context == (PVOID) FileInformation.IndexNumber);

                PebSessionInformation.Length = sizeof(PebSessionInformation);
                PebSessionInformation.StandardInput.FileHandle = (HANDLE)PEB_STDIO_HANDLE_SUBSYS;
                PebSessionInformation.StandardOutput.FileHandle = (HANDLE)PEB_STDIO_HANDLE_PM;
                PebSessionInformation.StandardError.FileHandle = Peb->Sm.StandardOutput.FileHandle;
                PebSessionInformation.StandardError.Context = (PVOID) FileInformation.IndexNumber;

                RtlInitString(&ImagePathName,"\\A:\\uexec2.exe");

                st = RtlCreateUserProcess(
                        &ImagePathName,
                        NULL,
                        NULL,
                        NULL,
                        FALSE,
                        NULL,
                        NULL,
                        NULL,
                        &ProcessInformation,
                        &PebSessionInformation
                        );

                ASSERT(NT_SUCCESS(st));

                NtResumeThread(ProcessInformation.Thread,NULL);
                NtWaitForSingleObject(ProcessInformation.Process,FALSE,NULL);
                NtClose(ProcessInformation.Process);
                NtClose(ProcessInformation.Thread);
                NtTerminateProcess(NtCurrentProcess(),STATUS_SUCCESS);

            } else {

                ASSERT(Peb->Sm.StandardOutput.FileHandle == (HANDLE)PEB_STDIO_HANDLE_PM);

                //
                // Started by this program with StandardError Inherited
                //

                st = NtQueryInformationFile(
                        Peb->Sm.StandardError.FileHandle,
                        &IoStatus,
                        (PVOID) &FileInformation,
                        sizeof(FileInformation),
                        FileInternalInformation
                        );

                if (!NT_SUCCESS( st )) {
                    DbgPrint("NtQueryInformationFile: failed 0x%lx\n",st);
                    ASSERT(NT_SUCCESS(st));
                }

                ASSERT(Peb->Sm.StandardError.Context == (PVOID) FileInformation.IndexNumber);
                NtTerminateProcess(NtCurrentProcess(),STATUS_SUCCESS);
            }
        }
    }
}