/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    ctseacc.c

Abstract:

    Common security accessibility test routines.

    These routines are used in both the kernel and user mode RTL tests.

    This test assumes the security runtime library routines are
    functioning correctly.



Author:

    Jim Kelly       (JimK)     23-Mar-1990

Environment:

    Test of security.

Revision History:

    v5: robertre
        Updated ACL_REVISION

--*/

#include "tsecomm.c"    // Mode dependent macros and routines.



////////////////////////////////////////////////////////////////
//                                                            //
// Module wide variables                                      //
//                                                            //
////////////////////////////////////////////////////////////////

    NTSTATUS Status;
    STRING  Event1Name, Process1Name;
    UNICODE_STRING UnicodeEvent1Name, UnicodeProcess1Name;

    OBJECT_ATTRIBUTES NullObjectAttributes;

    HANDLE Event1;
    OBJECT_ATTRIBUTES Event1ObjectAttributes;
    PSECURITY_DESCRIPTOR Event1SecurityDescriptor;
    PSID Event1Owner;
    PSID Event1Group;
    PACL Event1Dacl;
    PACL Event1Sacl;

    PACL TDacl;
    BOOLEAN TDaclPresent;
    BOOLEAN TDaclDefaulted;

    PACL TSacl;
    BOOLEAN TSaclPresent;
    BOOLEAN TSaclDefaulted;

    PSID TOwner;
    BOOLEAN TOwnerDefaulted;
    PSID TGroup;
    BOOLEAN TGroupDefaulted;


HANDLE Process1;
OBJECT_ATTRIBUTES Process1ObjectAttributes;




////////////////////////////////////////////////////////////////
//                                                            //
// Initialization Routine                                     //
//                                                            //
////////////////////////////////////////////////////////////////

BOOLEAN
TestSeInitialize()
{

    Event1SecurityDescriptor = (PSECURITY_DESCRIPTOR)TstAllocatePool( PagedPool, 1024 );

    RtlInitString(&Event1Name, "\\SecurityTestEvent1");
    Status = RtlAnsiStringToUnicodeString(
                 &UnicodeEvent1Name,
                 &Event1Name,
                 TRUE );  SEASSERT_SUCCESS( NT_SUCCESS(Status) );
    RtlInitString(&Process1Name, "\\SecurityTestProcess1");
    Status = RtlAnsiStringToUnicodeString(
                 &UnicodeProcess1Name,
                 &Process1Name,
                 TRUE );  SEASSERT_SUCCESS( NT_SUCCESS(Status) );

    InitializeObjectAttributes(&NullObjectAttributes, NULL, 0, NULL, NULL);

    //
    // Build an ACL or two for use.

    TDacl        = (PACL)TstAllocatePool( PagedPool, 256 );
    TSacl        = (PACL)TstAllocatePool( PagedPool, 256 );

    TDacl->AclRevision=TSacl->AclRevision=ACL_REVISION;
    TDacl->Sbz1=TSacl->Sbz1=0;
    TDacl->Sbz2=TSacl->Sbz2=0;
    TDacl->AclSize=256;
    TSacl->AclSize=8;
    TDacl->AceCount=TSacl->AceCount=0;

    return TRUE;
}



////////////////////////////////////////////////////////////////
//                                                            //
// Test routines                                              //
//                                                            //
////////////////////////////////////////////////////////////////

BOOLEAN
TestSeUnnamedCreate()
//
//  Test:
//      No Security Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl Inheritence With Creator ID
//          Dacl & Sacl Inheritence
//
//      Empty Security Descriptor Explicitly Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Dacl Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Sacl Specified (W/Privilege)
//          No Inheritence
//          Dacl & Sacl Inheritence
//
//      Default Dacl Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Default Sacl Specified (W/Privilege)
//          No Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Sacl Specified (W/O Privilege - should be rejected)
//      Default Sacl Specified (W/O Privilege - should be rejected)
//
//      Valid Owner Explicitly Specified
//      Invalid Owner Explicitly Specified
//
//      Explicit Group Specified
//
{


    BOOLEAN CompletionStatus = TRUE;

    InitializeObjectAttributes(&Event1ObjectAttributes, NULL, 0, NULL, NULL);
    DbgPrint("Se:     No Security Descriptor...                            Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");

    Status = NtCreateEvent(
                 &Event1,
                 DELETE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    if (NT_SUCCESS(Status)) {
        DbgPrint("Succeeded.\n");
    } else {
        DbgPrint(" **** Failed ****\n");
        CompletionStatus = FALSE;
    }
    ASSERT(NT_SUCCESS(Status));
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:         Dacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Sacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl Inheritence W/ Creator ID...                  ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl And Sacl Inheritence...                       ");
    DbgPrint("  Not Implemented.\n");

    return CompletionStatus;

}

BOOLEAN
TestSeNamedCreate()
//
//  Test:
//      No Security Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl Inheritence With Creator ID
//          Dacl & Sacl Inheritence
//
//      Empty Security Descriptor Explicitly Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Dacl Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Sacl Specified (W/Privilege)
//          No Inheritence
//          Dacl & Sacl Inheritence
//
//      Default Dacl Specified
//          No Inheritence
//          Dacl Inheritence
//          Sacl Inheritence
//          Dacl & Sacl Inheritence
//
//      Default Sacl Specified (W/Privilege)
//          No Inheritence
//          Dacl & Sacl Inheritence
//
//      Explicit Sacl Specified (W/O Privilege - should be rejected)
//      Default Sacl Specified (W/O Privilege - should be rejected)
//
//      Valid Owner Explicitly Specified
//      Invalid Owner Explicitly Specified
//
//      Explicit Group Specified
//
{

    BOOLEAN CompletionStatus = TRUE;


    InitializeObjectAttributes(
        &Event1ObjectAttributes,
        &UnicodeEvent1Name,
        0,
        NULL,
        NULL);

    DbgPrint("Se:     No Security Specified...                             Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");
    Status = NtCreateEvent(
                 &Event1,
                 DELETE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    if (NT_SUCCESS(Status)) {
        DbgPrint("Succeeded.\n");
    } else {
        DbgPrint(" **** Failed ****\n");
        CompletionStatus = FALSE;
    }
    ASSERT(NT_SUCCESS(Status));
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:         Dacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Sacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl Inheritence With Creator ID...                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Empty Security Descriptor Explicitly Specified...    Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");

    RtlCreateSecurityDescriptor( Event1SecurityDescriptor, 1 );
    InitializeObjectAttributes(&Event1ObjectAttributes,
                               &UnicodeEvent1Name,
                               0,
                               NULL,
                               Event1SecurityDescriptor);
    Status = NtCreateEvent(
                 &Event1,
                 DELETE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    if (NT_SUCCESS(Status)) {
        DbgPrint("Succeeded.\n");
    } else {
        DbgPrint(" **** Failed ****\n");
        CompletionStatus = FALSE;
    }
    ASSERT(NT_SUCCESS(Status));
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));




    DbgPrint("Se:         Dacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Sacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Explicit Dacl Specified...                           Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");

    RtlCreateSecurityDescriptor( Event1SecurityDescriptor, 1 );
    RtlSetDaclSecurityDescriptor( Event1SecurityDescriptor, TRUE, TDacl, FALSE );

    InitializeObjectAttributes(&Event1ObjectAttributes,
                               &UnicodeEvent1Name,
                               0,
                               NULL,
                               Event1SecurityDescriptor);
    Status = NtCreateEvent(
                 &Event1,
                 DELETE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    if (NT_SUCCESS(Status)) {
        DbgPrint("Succeeded.\n");
    } else {
        DbgPrint(" **** Failed ****\n");
        CompletionStatus = FALSE;
    }
    ASSERT(NT_SUCCESS(Status));
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:         Dacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Sacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Explicit Sacl Specified (W/Privilege)...             Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Default Dacl Specified...                            Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Sacl Inheritence...                                ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Default Sacl  (W/Privilege)...                       Test\n");
    DbgPrint("Se:         No Inheritence...                                  ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Dacl & Sacl Inheritence...                         ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Explicit Sacl (W/O Privilege)...                     Test\n");
    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:     Default Sacl (W/O Privilege)...                      Test\n");
    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Valid Owner Explicitly Specified...                  Test\n");
    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:     Invalid Owner Explicitly Specified...                Test\n");
    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Explicit Group Specified...                          Test\n");
    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");



    return CompletionStatus;

}

BOOLEAN
TestSeQuerySecurity()
//
//  Test:
//      No Security Descriptor
//          Query Owner
//          Query Group
//          Query  Dacl
//          Query Sacl (Privileged)
//          Query Sacl (Unprivileged - should be rejected)
//
//      Empty Security Descriptor
//          Query Owner
//          Query Group
//          Query  Dacl
//          Query Sacl (Privileged)
//          Query Sacl (Unprivileged - should be rejected)
//
//      Security Descriptor W/ Owner & Group
//          Query Owner
//          Query Group
//          Query  Dacl
//          Query Sacl (Privileged)
//          Query Sacl (Unprivileged - should be rejected)
//
//      Full Security Descriptor
//          Query Owner
//          Query Group
//          Query  Dacl
//          Query Sacl (Privileged)
//          Query Sacl (Unprivileged - should be rejected)
//
{

    BOOLEAN CompletionStatus = TRUE;

    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");

#if 0
    DbgPrint("Se:     No Security Descriptor... \n");
    DbgPrint("Se:         Query Owner... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query  Dacl... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Unprivileged)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Empty Security Descriptor... \n");
    DbgPrint("Se:         Query Owner... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query  Dacl... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Unprivileged)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Security Descriptor W/ Owner & Group... \n");
    DbgPrint("Se:         Query Owner... ");
    DbgPrint("  Not Implemented. \n");
    DbgPrint("Se:         Query Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query  Dacl... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Unprivileged)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Full Security Descriptor...\n");
    DbgPrint("Se:         Query Owner... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query  Dacl... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Query Sacl (Unprivileged)... ");
    DbgPrint("  Not Implemented.\n");
#endif //0

    return CompletionStatus;
}

BOOLEAN
TestSeSetSecurity()
//
//  Test:
//      No Security Descriptor
//          Set Valid Owner SID
//          Set Invalid Owner SID
//          Set Group
//          Set Dacl (explicitly granted by dacl)
//          Set Dacl (by virtue of ownership)
//          Set Dacl (invalid attempt)
//          Set Sacl (privileged)
//          Set Sacl (unprivileged - should be rejected)
//
//      Empty Security Descriptor
//          Set Valid Owner SID
//          Set Invalid Owner SID
//          Set Group
//          Set Dacl (explicitly granted by dacl)
//          Set Dacl (by virtue of ownership)
//          Set Dacl (invalid attempt)
//          Set Sacl (privileged)
//          Set Sacl (unprivileged - should be rejected)
//
//      Security Descriptor W/ Owner & Group Only
//          Set Valid Owner SID
//          Set Invalid Owner SID
//          Set Group
//          Set Dacl (explicitly granted by dacl)
//          Set Dacl (by virtue of ownership)
//          Set Dacl (invalid attempt)
//          Set Sacl (privileged)
//          Set Sacl (unprivileged - should be rejected)
//
//      Full Security Descriptor
//          Set Valid Owner SID
//          Set Invalid Owner SID
//          Set Group
//          Set Dacl (explicitly granted by dacl)
//          Set Dacl (by virtue of ownership)
//          Set Dacl (invalid attempt)
//          Set Sacl (privileged)
//          Set Sacl (unprivileged - should be rejected)
//
{

    BOOLEAN CompletionStatus = TRUE;

    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");
#if 0
    DbgPrint("Se:     No Security Descriptor...\n");
    DbgPrint("Se:         Set Valid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Invalid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (explicitly granted by dacl)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (by virtue of ownership)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (invalid attempt)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (unprivileged - should be rejected)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Empty Security Descriptor...\n");
    DbgPrint("Se:         Set Valid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Invalid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (explicitly granted by dacl)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (by virtue of ownership)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (invalid attempt)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (unprivileged - should be rejected)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Security Descriptor W/ Owner & Group Only...\n");
    DbgPrint("Se:         Set Valid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Invalid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (explicitly granted by dacl)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (by virtue of ownership)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (invalid attempt)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (unprivileged - should be rejected)... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:     Full Security Descriptor...\n");
    DbgPrint("Se:         Set Valid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Invalid Owner SID... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Group... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (explicitly granted by dacl)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (by virtue of ownership)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Dacl (invalid attempt)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (privileged)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Set Sacl (unprivileged - should be rejected)... ");
    DbgPrint("  Not Implemented.\n");

#endif //0

    return CompletionStatus;

}

BOOLEAN
TestSeAccess()
//
//  Test:
//
//      Creation
//          No Access Requested (should be rejected)
//          Specific Access Requested
//              - Attempted Granted
//              - Attempt Ungranted
//          Access System Security
//
//       Open Existing
//          No Access Requested (should be rejected)
//          Specific Access Requested
//              - Attempted Granted
//              - Attempt Ungranted
//          Access System Security
//

{
    BOOLEAN CompletionStatus = TRUE;

    DbgPrint("                                                               ");
    DbgPrint("  Not Implemented.\n");
#if 0

    DbgPrint("Se:     Creation...\n");
    DbgPrint("Se:         No Access Requested (should be rejected)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Specific Access Requested... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:             - Attempted Granted... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:             - Attempt Ungranted... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Access System Security... ");
    DbgPrint("  Not Implemented.\n");

    DbgPrint("Se:      Open Existing...\n");
    DbgPrint("Se:         No Access Requested (should be rejected)... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Specific Access Requested... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:             - Attempted Granted... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:             - Attempt Ungranted... ");
    DbgPrint("  Not Implemented.\n");
    DbgPrint("Se:         Access System Security... ");
    DbgPrint("  Not Implemented.\n");
#endif //0

#if 0  //old code
// Without security descriptor
// Simple desired access mask...
//

    DbgPrint("Se:     Test1b... \n");         // Attempt ungranted access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(!NT_SUCCESS(Status));

    DbgPrint("Se:     Test1c... \n");         // Delete object
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));


    //
    // Without security descriptor
    // Simple desired access mask...
    //

    DbgPrint("Se:     Test2a... \n");         // unnamed object, specific access
    Status = NtCreateEvent(
                 &Event1,
                 (EVENT_MODIFY_STATE | STANDARD_DELETE),
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test2b... \n");         // Attempt granted specific access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test2c... \n");         // Delete object


    //
    // Without security descriptor
    // Generic desired access mask...
    //

    DbgPrint("Se:     Test3a... \n");         // Unnamed object, generic mask
    Status = NtCreateEvent(
                 &Event1,
                 GENERIC_EXECUTE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test3b... \n");         // Attempt implied granted access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test3c... \n");         // Delete object
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));


    //
    // Without security descriptor
    // Empty desired access mask...
    //

    DbgPrint("Se:     Test4a... \n");         // Empty desired access
    Status = NtCreateEvent(
                 &Event1,
                 0,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(!NT_SUCCESS(Status));


    RtlCreateSecurityDescriptor( Event1SecurityDescriptor,
                                 SECURITY_DESCRIPTOR_REVISION);
    InitializeObjectAttributes(&Event1ObjectAttributes,
                               NULL, 0, NULL,
                               Event1SecurityDescriptor);
    DbgPrint("Se:     Empty Security Descriptor... \n");

    //
    // Without security descriptor
    // Simple desired access mask...
    //

    DbgPrint("Se:     Test1a... \n");         // Create unnamed object
    Status = NtCreateEvent(
                 &Event1,
                 STANDARD_DELETE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test1b... \n");         // Attempt ungranted access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(!NT_SUCCESS(Status));

    DbgPrint("Se:     Test1c... \n");         // Delete object
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));


    //
    // Without security descriptor
    // Simple desired access mask...
    //

    DbgPrint("Se:     Test2a... \n");         // unnamed object, specific access
    Status = NtCreateEvent(
                 &Event1,
                 (EVENT_MODIFY_STATE | STANDARD_DELETE),
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test2b... \n");         // Attempt granted specific access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test2c... \n");         // Delete object
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));


    //
    // Without security descriptor
    // Generic desired access mask...
    //

    DbgPrint("Se:     Test3a... \n");         // Unnamed object, generic mask
    Status = NtCreateEvent(
                 &Event1,
                 GENERIC_EXECUTE,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test3b... \n");         // Attempt implied granted access
    Status = NtSetEvent(
                 Event1,
                 NULL
                 );
    ASSERT(NT_SUCCESS(Status));

    DbgPrint("Se:     Test3c... \n");         // Delete object
    Status = NtClose(Event1);
    ASSERT(NT_SUCCESS(Status));


    //
    // Without security descriptor
    // Empty desired access mask...
    //

    DbgPrint("Se:     Test4a... \n");         // Empty desired access
    Status = NtCreateEvent(
                 &Event1,
                 0,
                 &Event1ObjectAttributes,
                 NotificationEvent,
                 FALSE
                 );
    ASSERT(!NT_SUCCESS(Status));
#endif // old code

    return CompletionStatus;
}

BOOLEAN
TSeAcc()
{
    BOOLEAN Result = TRUE;

    DbgPrint("Se:   Initialization...                                        ");
    TestSeInitialize();
    DbgPrint("Succeeded.\n");

    DbgPrint("Se:   Unnamed Object Creation Test...                      Suite\n");
    if (!TestSeUnnamedCreate()) {
        Result = FALSE;
    }
    DbgPrint("Se:   Named Object Creation Test...                        Suite\n");
    if (!TestSeNamedCreate()) {
        Result = FALSE;
    }
    DbgPrint("Se:   Query Object Security Descriptor Test...             Suite\n");
    if (!TestSeQuerySecurity()) {
        Result = FALSE;
    }
    DbgPrint("Se:   Set Object Security Descriptor Test...               Suite\n");
    if (!TestSeSetSecurity()) {
        Result = FALSE;
    }
    DbgPrint("Se:   Access Test...                                       Suite\n");
    if (!TestSeAccess()) {
        Result = FALSE;
    }

    DbgPrint("\n");
    DbgPrint("\n");
    DbgPrint("    ********************\n");
    DbgPrint("    **                **\n");

    if (Result = TRUE) {
        DbgPrint("    ** Test Succeeded **\n");
    } else {
        DbgPrint("    **  Test Failed   **\n");
    }

    DbgPrint("    **                **\n");
    DbgPrint("    ********************\n");
    DbgPrint("\n");
    DbgPrint("\n");

    return Result;
}