summaryrefslogtreecommitdiffstats
path: root/private/ntos/se/ctlpcqos.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/se/ctlpcqos.c
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/ntos/se/ctlpcqos.c')
-rw-r--r--private/ntos/se/ctlpcqos.c1256
1 files changed, 1256 insertions, 0 deletions
diff --git a/private/ntos/se/ctlpcqos.c b/private/ntos/se/ctlpcqos.c
new file mode 100644
index 000000000..d3b2a7a22
--- /dev/null
+++ b/private/ntos/se/ctlpcqos.c
@@ -0,0 +1,1256 @@
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Global Definitions //
+// //
+//////////////////////////////////////////////////////////////////////////////
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Global Variables //
+// //
+//////////////////////////////////////////////////////////////////////////////
+
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ STRING EventName;
+ UNICODE_STRING UnicodeEventName;
+ HANDLE EventHandle;
+ UNICODE_STRING PortName;
+ HANDLE EarPort;
+ HANDLE TalkPort;
+ PORT_MESSAGE RequestMessage;
+ SECURITY_QUALITY_OF_SERVICE SecurityQos;
+ ULONG RequestCount;
+ HANDLE ClientToken;
+ TOKEN_STATISTICS ClientTokenStatistics;
+ ULONG IgnoreLength;
+
+ HANDLE SepServerThread;
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Test Routine Definitions //
+// //
+//////////////////////////////////////////////////////////////////////////////
+BOOLEAN
+SepClientTestStatic(VOID);
+
+BOOLEAN
+SepClientTestDynamic(VOID);
+
+BOOLEAN
+SepClientTestEffectiveOnly(
+ BOOLEAN StaticTest
+ );
+
+BOOLEAN
+SepClientTestNotEffectiveOnly(
+ BOOLEAN StaticTest
+ );
+
+BOOLEAN
+SepClientTestAnonymous(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+BOOLEAN
+SepClientTestIdentification(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+BOOLEAN
+SepClientTestImpersonation(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+VOID
+SepClientConnect(
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
+ SECURITY_CONTEXT_TRACKING_MODE TrackingMode,
+ BOOLEAN EffectiveOnly
+ );
+
+VOID
+SepClientMakeRemoteCall( VOID );
+
+VOID
+SepClientDropConnection( VOID );
+
+BOOLEAN
+SepClientTest(VOID);
+
+NTSTATUS
+SepClientInitialize(
+ );
+
+
+
+
+
+
+BOOLEAN
+SepServerTestStatic(VOID);
+
+BOOLEAN
+SepServerTestDynamic(VOID);
+
+BOOLEAN
+SepServerTestEffectiveOnly(
+ BOOLEAN StaticTest
+ );
+
+BOOLEAN
+SepServerTestNotEffectiveOnly(
+ BOOLEAN StaticTest
+ );
+
+BOOLEAN
+SepServerTestAnonymous(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+BOOLEAN
+SepServerTestIdentification(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+BOOLEAN
+SepServerTestImpersonation(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ );
+
+VOID
+SepServerWaitForNextConnect( VOID );
+
+VOID
+SepServerGetNextMessage( VOID );
+
+VOID
+SepServerCompleteMessage( VOID );
+
+VOID
+SepServerDropConnection( VOID );
+
+
+
+BOOLEAN
+SepServerTest(VOID);
+
+NTSTATUS
+SepServerInitialize(
+ );
+
+VOID
+SepServerSpawnClientProcess(VOID);
+
+
+
+
+BOOLEAN
+CtLpcQos (VOID);
+
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Client-Side Test Routines //
+// //
+//////////////////////////////////////////////////////////////////////////////
+
+
+VOID
+SepClientConnect(
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
+ SECURITY_CONTEXT_TRACKING_MODE TrackingMode,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+
+ SecurityQos.ImpersonationLevel = ImpersonationLevel;
+ SecurityQos.ContextTrackingMode = TrackingMode;
+ SecurityQos.EffectiveOnly = EffectiveOnly;
+
+ Status = NtConnectPort(
+ &TalkPort,
+ &PortName,
+ &SecurityQos,
+ 0L,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ ); SEASSERT_SUCCESS(Status);
+
+ return;
+}
+
+
+VOID
+SepClientMakeRemoteCall( VOID )
+
+{
+ PORT_MESSAGE ReplyMessage;
+
+ Status = NtRequestWaitReplyPort(
+ TalkPort,
+ &RequestMessage,
+ &ReplyMessage
+ );
+
+ RequestCount += 1;
+
+ return;
+}
+
+
+VOID
+SepClientDropConnection( VOID )
+
+{
+
+ Status = NtClose( TalkPort ); SEASSERT_SUCCESS(Status);
+
+ return;
+
+}
+
+
+BOOLEAN
+SepClientTestStatic(VOID)
+
+{
+
+ BOOLEAN CompletionStatus;
+
+ //
+ // Static Context Tracking ... Suite
+ //
+
+ CompletionStatus = SepClientTestEffectiveOnly( TRUE );
+
+
+ if (CompletionStatus == TRUE) {
+
+ CompletionStatus = SepClientTestNotEffectiveOnly( TRUE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepClientTestDynamic(VOID)
+
+{
+ BOOLEAN CompletionStatus;
+
+ //
+ // Dynamic Context Tracking ... Suite
+ //
+
+ CompletionStatus = SepClientTestEffectiveOnly( FALSE );
+
+
+ if (CompletionStatus == TRUE) {
+
+ CompletionStatus = SepClientTestNotEffectiveOnly( FALSE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepClientTestEffectiveOnly(
+ BOOLEAN StaticTest
+ )
+
+
+{
+
+ BOOLEAN CompletionStatus;
+
+ //
+ // Effective Only ... Test
+ //
+
+ CompletionStatus = SepClientTestAnonymous( StaticTest, TRUE );
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepClientTestIdentification( StaticTest, TRUE );
+ }
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepClientTestImpersonation( StaticTest, TRUE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepClientTestNotEffectiveOnly(
+ BOOLEAN StaticTest
+ )
+
+{
+ BOOLEAN CompletionStatus;
+
+ //
+ // Not Effective Only ... Test
+ //
+
+ CompletionStatus = SepClientTestAnonymous( StaticTest, FALSE );
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepClientTestIdentification( StaticTest, FALSE );
+ }
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepClientTestImpersonation( StaticTest, FALSE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepClientTestAnonymous(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Anonymous Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+ SECURITY_CONTEXT_TRACKING_MODE TrackingMode;
+
+ if (StaticTest) {
+ TrackingMode = SECURITY_STATIC_TRACKING;
+ } else {
+ TrackingMode = SECURITY_DYNAMIC_TRACKING;
+ }
+
+ if (!StaticTest) {
+ //
+ // No action for dynamic test
+ //
+ return TRUE;
+ }
+
+ //
+ // Anonymous Use ... Test
+ //
+
+
+ SepClientConnect(
+ SecurityAnonymous,
+ TrackingMode,
+ EffectiveOnly
+ );
+
+ SepClientMakeRemoteCall();
+
+ SepClientDropConnection();
+
+
+ return TRUE;
+}
+
+
+BOOLEAN
+SepClientTestIdentification(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Identification Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+ SECURITY_CONTEXT_TRACKING_MODE TrackingMode;
+
+ if (StaticTest) {
+ TrackingMode = SECURITY_STATIC_TRACKING;
+ } else {
+ TrackingMode = SECURITY_DYNAMIC_TRACKING;
+ }
+
+ //
+ // Identification Use ... Test
+ //
+
+
+ SepClientConnect(
+ SecurityIdentification,
+ TrackingMode,
+ EffectiveOnly
+ );
+
+ SepClientMakeRemoteCall();
+
+ SepClientDropConnection();
+
+
+ return TRUE;
+
+}
+
+
+BOOLEAN
+SepClientTestImpersonation(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Impersonation Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+ SECURITY_CONTEXT_TRACKING_MODE TrackingMode;
+
+ if (StaticTest) {
+ TrackingMode = SECURITY_STATIC_TRACKING;
+ } else {
+ TrackingMode = SECURITY_DYNAMIC_TRACKING;
+ }
+
+
+ //
+ // Impersonation Use ... Test
+ //
+
+
+ SepClientConnect(
+ SecurityImpersonation,
+ TrackingMode,
+ EffectiveOnly
+ );
+
+ SepClientMakeRemoteCall();
+
+ SepClientDropConnection();
+
+
+
+ return TRUE;
+
+}
+
+
+
+
+BOOLEAN
+SepClientTest(VOID)
+//
+// Tests:
+//
+// Static Context Tracking Tests
+// Effective Only
+// Anonymous
+// Identification
+// Impersonation
+// Not Effective Only
+// Anonymous
+// Identification
+// Impersonation
+//
+// Dynamic Context Tracking Tests
+// Effective Only
+// Identification
+// Impersonation
+// Not Effective Only
+// Identification
+// Impersonation
+//
+{
+
+ BOOLEAN CompletionStatus;
+
+
+
+
+ //
+ // Run the static test suite...
+ //
+
+ CompletionStatus = SepClientTestStatic();
+
+ //
+ // Run the dynamic test suite...
+ //
+
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepClientTestDynamic();
+ }
+
+ DbgPrint("Se: Client Test Complete.\n");
+
+
+ return CompletionStatus;
+}
+
+
+NTSTATUS
+SepClientInitialize(
+ )
+
+{
+
+
+
+ DbgPrint("Se: Client Initializing ...\n");
+
+ //
+ // Initialize global variables
+ //
+
+ RequestMessage.u1.s1.DataLength = 0;
+ RequestMessage.u1.s1.TotalLength = (CSHORT)sizeof(PORT_MESSAGE);
+ RequestMessage.u2.ZeroInit = 0;
+
+ RequestCount = 0;
+
+
+ //
+ // Signal the named event to start the test
+ //
+
+ DbgPrint("Se: Client Starting Test ...\n");
+ Status = NtSetEvent( EventHandle, NULL ); SEASSERT_SUCCESS(Status);
+
+ Status = NtClose( EventHandle ); SEASSERT_SUCCESS(Status);
+
+
+ return STATUS_SUCCESS;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Server-Side Test Routines //
+// //
+//////////////////////////////////////////////////////////////////////////////
+
+
+VOID
+SepServerWaitForNextConnect( VOID )
+{
+
+ CONNECTION_REQUEST ConnectionRequest;
+
+ ConnectionRequest.Length = (ULONG)sizeof(CONNECTION_REQUEST);
+
+ //
+ // Wait for the client to connect to the port
+ //
+
+ Status = NtListenPort(
+ EarPort,
+ &ConnectionRequest,
+ NULL,
+ 0L
+ ); SEASSERT_SUCCESS(Status);
+
+ Status = NtAcceptConnectPort(
+ &TalkPort,
+ NULL,
+ &ConnectionRequest,
+ TRUE,
+ NULL,
+ NULL,
+ NULL,
+ 0L
+ ); SEASSERT_SUCCESS(Status);
+
+ Status = NtCompleteConnectPort( TalkPort ); SEASSERT_SUCCESS(Status);
+
+ return;
+
+}
+
+VOID
+SepServerGetNextMessage( VOID )
+
+{
+
+ //
+ // Wait for the next message to come in...
+ //
+
+ Status = NtReplyWaitReceivePort(
+ EarPort,
+ NULL,
+ NULL,
+ &RequestMessage
+ ); SEASSERT_SUCCESS(Status);
+
+ RequestCount += 1;
+
+ return;
+}
+
+VOID
+SepServerCompleteMessage( VOID )
+
+{
+ PORT_MESSAGE ReplyMessage;
+
+ ReplyMessage.u1.s1.DataLength = 0;
+ ReplyMessage.u1.s1.TotalLength = (CSHORT)sizeof(PORT_MESSAGE);
+ ReplyMessage.u2.ZeroInit = 0;
+ ReplyMessage.ClientId = RequestMessage.ClientId;
+ ReplyMessage.MessageId = RequestMessage.MessageId;
+
+ //
+ // Send the response message
+ //
+
+ Status = NtReplyPort(
+ EarPort,
+ &ReplyMessage
+ ); SEASSERT_SUCCESS(Status);
+
+ return;
+}
+
+VOID
+SepServerImpersonateClient( VOID )
+
+{
+
+ Status = NtImpersonateClientOfPort(
+ TalkPort,
+ &RequestMessage
+ ); SEASSERT_SUCCESS(Status);
+
+}
+
+
+VOID
+SepServerRevertToSelf( VOID )
+
+{
+ NTSTATUS TmpStatus;
+ HANDLE NullHandle;
+
+ NullHandle = NULL;
+ TmpStatus = NtSetInformationThread(
+ SepServerThread,
+ ThreadImpersonationToken,
+ (PVOID)&NullHandle,
+ (ULONG)sizeof(HANDLE)
+ ); SEASSERT_SUCCESS(TmpStatus);
+
+}
+
+
+VOID
+SepServerDropConnection( VOID )
+
+{
+ Status = NtClose( TalkPort ); SEASSERT_SUCCESS(Status);
+
+ return;
+}
+
+BOOLEAN
+SepServerTestStatic(VOID)
+
+{
+ BOOLEAN CompletionStatus;
+
+ DbgPrint("Se: Static Context Tracking ... Suite\n");
+
+ CompletionStatus = SepServerTestEffectiveOnly( TRUE );
+
+
+ if (CompletionStatus == TRUE) {
+
+ CompletionStatus = SepServerTestNotEffectiveOnly( TRUE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepServerTestDynamic(VOID)
+
+{
+ BOOLEAN CompletionStatus;
+
+ DbgPrint("Se: Dynamic Context Tracking ... Suite\n");
+
+ CompletionStatus = SepServerTestEffectiveOnly( FALSE );
+
+
+ if (CompletionStatus == TRUE) {
+
+ CompletionStatus = SepServerTestNotEffectiveOnly( FALSE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepServerTestEffectiveOnly(
+ BOOLEAN StaticTest
+ )
+
+{
+
+ BOOLEAN CompletionStatus;
+
+ DbgPrint("Se: Effective Only ... Test\n");
+
+ CompletionStatus = SepServerTestAnonymous( StaticTest, TRUE );
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepServerTestIdentification( StaticTest, TRUE );
+ }
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepServerTestImpersonation( StaticTest, TRUE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepServerTestNotEffectiveOnly(
+ BOOLEAN StaticTest
+ )
+
+{
+
+ BOOLEAN CompletionStatus;
+
+ DbgPrint("Se: Not Effective Only ... Test\n");
+
+ CompletionStatus = SepServerTestAnonymous( StaticTest, FALSE );
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepServerTestIdentification( StaticTest, FALSE );
+ }
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepServerTestImpersonation( StaticTest, FALSE );
+ }
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepServerTestAnonymous(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+ BOOLEAN CompletionStatus = TRUE;
+
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Anonymous Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+
+ if (!StaticTest) {
+ //
+ // No action for dynamic test
+ //
+
+ return TRUE;
+ }
+
+ DbgPrint("Se: Anonymous Use ... ");
+
+ SepServerWaitForNextConnect();
+
+ SepServerGetNextMessage();
+
+
+ SepServerImpersonateClient();
+ Status = NtOpenThreadToken(
+ SepServerThread,
+ TOKEN_ALL_ACCESS,
+ TRUE,
+ &ClientToken
+ );
+ SepServerRevertToSelf();
+ if (Status == STATUS_CANT_OPEN_ANONYMOUS) {
+
+ DbgPrint(" Succeeded\n");
+
+ } else {
+ DbgPrint("* ! FAILED (srvr) ! *\n");
+ DbgPrint("Status is: 0x%lx \n", Status );
+ CompletionStatus = FALSE;
+ }
+
+
+ SepServerCompleteMessage();
+
+ SepServerDropConnection();
+
+ //
+ // Appease the compiler Gods..
+ //
+
+ if (EffectiveOnly) {;}
+
+
+ return CompletionStatus;
+
+}
+
+
+BOOLEAN
+SepServerTestIdentification(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+
+ BOOLEAN CompletionStatus = TRUE;
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Identification Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+ DbgPrint("Se: Identification Use ... ");
+
+ SepServerWaitForNextConnect();
+
+ SepServerGetNextMessage();
+
+ SepServerImpersonateClient();
+ Status = NtOpenThreadToken(
+ SepServerThread,
+ TOKEN_ALL_ACCESS,
+ TRUE,
+ &ClientToken
+ ); SEASSERT_SUCCESS(Status);
+ SepServerRevertToSelf();
+ Status = NtQueryInformationToken(
+ ClientToken,
+ TokenStatistics,
+ &ClientTokenStatistics,
+ (ULONG)sizeof(TOKEN_STATISTICS),
+ &IgnoreLength
+ ); SEASSERT_SUCCESS(Status);
+
+ if ( (ClientTokenStatistics.TokenType == TokenImpersonation) &&
+ (ClientTokenStatistics.ImpersonationLevel == SecurityIdentification)
+ ) {
+ DbgPrint(" Succeeded\n");
+
+ } else {
+ DbgPrint("* ! FAILED (srvr) ! *\n");
+ CompletionStatus = FALSE;
+ }
+
+
+ SepServerCompleteMessage();
+
+ SepServerDropConnection();
+
+ //
+ // Appease the compiler Gods..
+ //
+ if (StaticTest) {;}
+ if (EffectiveOnly) {;}
+
+ return CompletionStatus;
+}
+
+
+BOOLEAN
+SepServerTestImpersonation(
+ BOOLEAN StaticTest,
+ BOOLEAN EffectiveOnly
+ )
+
+{
+ BOOLEAN CompletionStatus = TRUE;
+
+ //////////////////////////////////////////////////////////////////////////
+ // //
+ // Impersonation Use Test //
+ // //
+ //////////////////////////////////////////////////////////////////////////
+
+ DbgPrint("Se: Impersonation Use ... ");
+
+
+ SepServerWaitForNextConnect();
+
+ SepServerGetNextMessage();
+
+
+
+ SepServerImpersonateClient();
+ Status = NtOpenThreadToken(
+ SepServerThread,
+ TOKEN_ALL_ACCESS,
+ TRUE,
+ &ClientToken
+ ); SEASSERT_SUCCESS(Status);
+ SepServerRevertToSelf();
+ Status = NtQueryInformationToken(
+ ClientToken,
+ TokenStatistics,
+ &ClientTokenStatistics,
+ (ULONG)sizeof(TOKEN_STATISTICS),
+ &IgnoreLength
+ ); SEASSERT_SUCCESS(Status);
+
+ if ( (ClientTokenStatistics.TokenType == TokenImpersonation) &&
+ (ClientTokenStatistics.ImpersonationLevel == SecurityImpersonation)
+ ) {
+ DbgPrint(" Succeeded\n");
+
+ } else {
+ DbgPrint("* ! FAILED (srvr) ! *\n");
+ CompletionStatus = FALSE;
+ }
+
+
+
+
+ SepServerCompleteMessage();
+
+ SepServerDropConnection();
+
+ //
+ // Appease the compiler gods
+ //
+ if (StaticTest) {;}
+ if (EffectiveOnly) {;}
+
+ return CompletionStatus;
+}
+
+
+BOOLEAN
+SepServerTest(VOID)
+//
+// Tests:
+//
+// Static Context Tracking Tests
+// Effective Only
+// Anonymous
+// Identification
+// Impersonation
+// Not Effective Only
+// Anonymous
+// Identification
+// Impersonation
+//
+// Dynamic Context Tracking Tests
+// Effective Only
+// Identification
+// Impersonation
+// Not Effective Only
+// Identification
+// Impersonation
+//
+{
+
+ BOOLEAN CompletionStatus;
+
+
+ DbgPrint("Se: Server Starting Test ...\n");
+
+ //
+ // Run the static test suite...
+ //
+
+ CompletionStatus = SepServerTestStatic();
+
+ //
+ // Run the dynamic test suite...
+ //
+
+ if (CompletionStatus == TRUE) {
+ CompletionStatus = SepServerTestDynamic();
+ }
+
+ DbgPrint("Se: Server Test Complete.\n");
+
+ //
+ // Print test results
+ //
+
+ DbgPrint("\n");
+ DbgPrint("\n");
+ DbgPrint("**********************\n");
+ DbgPrint("** **\n");
+
+ if (CompletionStatus == TRUE) {
+ DbgPrint("** Test Succeeded **\n");
+ } else {
+ DbgPrint("** Test Failed !! **\n");
+ }
+
+ DbgPrint("** **\n");
+ DbgPrint("**********************\n");
+
+ return CompletionStatus;
+
+}
+
+NTSTATUS
+SepServerInitialize(
+ )
+
+{
+
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ThreadAttributes;
+ PTEB CurrentTeb;
+
+
+ DbgPrint("Se: Server Initializing ...\n");
+
+ //
+ // Initialize global variables
+ //
+
+ RequestCount = 0;
+
+ //
+ // Get a handle to our thread to so that we can access our thread
+ // even when impersonating an anonymous client (which we can't do
+ // using NtCurrentThread()).
+ //
+
+ CurrentTeb = NtCurrentTeb();
+ InitializeObjectAttributes(&ThreadAttributes, NULL, 0, NULL, NULL);
+ Status = NtOpenThread(
+ &SepServerThread, // TargetHandle
+ THREAD_ALL_ACCESS, // DesiredAccess
+ &ThreadAttributes, // ObjectAttributes
+ &CurrentTeb->ClientId // ClientId
+ );
+ ASSERT( NT_SUCCESS(Status) );
+
+
+ //
+ // Create the server's port
+ //
+
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &PortName,
+ 0,
+ NULL,
+ NULL );
+
+ Status = NtCreatePort(
+ &EarPort,
+ &ObjectAttributes,
+ 0,
+ 4,
+ 4 * 256
+ ); SEASSERT_SUCCESS(Status);
+
+
+
+ //
+ // Spawn a copy of ourselves...
+ //
+
+ DbgPrint("Se: Server Spawning client process ...\n");
+ SepServerSpawnClientProcess();
+
+
+ DbgPrint("Se: Server waiting for start of test signal ...\n");
+
+ Status = NtWaitForSingleObject(
+ EventHandle,
+ TRUE,
+ NULL
+ ); SEASSERT_SUCCESS(Status);
+
+ Status = NtClose( EventHandle ); SEASSERT_SUCCESS(Status);
+
+
+ return STATUS_SUCCESS;
+}
+
+VOID
+SepServerSpawnClientProcess(VOID)
+
+{
+
+
+ RTL_USER_PROCESS_INFORMATION ProcessInformation;
+ STRING ImagePathName, ProgramName;
+ UNICODE_STRING UnicodeImagePathName, UnicodeProgramName;
+ PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+
+ RtlInitString( &ProgramName, "\\SystemRoot\\Bin\\utlpcqos.exe" );
+ Status = RtlAnsiStringToUnicodeString(
+ &UnicodeProgramName,
+ &ProgramName,
+ TRUE ); SEASSERT_SUCCESS( NT_SUCCESS(Status) );
+ RtlInitString( &ImagePathName, "utlpcqos.exe");
+ Status = RtlAnsiStringToUnicodeString(
+ &UnicodeImagePathName,
+ &ImagePathName,
+ TRUE ); SEASSERT_SUCCESS( NT_SUCCESS(Status) );
+
+ Status = RtlCreateProcessParameters(
+ &ProcessParameters,
+ &ImagePathName, //UNICODEFIX &UnicodeImagePathName,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ );
+
+ SEASSERT_SUCCESS(Status);
+
+
+ Status = RtlCreateUserProcess(
+ &ProgramName, // UNICODEFIX &UnicodeProgramName,
+ ProcessParameters, // ProcessParameters
+ NULL, // ProcessSecurityDescriptor
+ NULL, // ThreadSecurityDescriptor
+ NtCurrentProcess(), // ParentProcess
+ FALSE, // InheritHandles
+ NULL, // DebugPort
+ NULL, // ExceptionPort
+ &ProcessInformation // ProcessInformation
+ ); SEASSERT_SUCCESS(Status);
+
+ Status = NtResumeThread(
+ ProcessInformation.Thread,
+ NULL
+ ); SEASSERT_SUCCESS(Status);
+
+ RtlDestroyProcessParameters( ProcessParameters );
+ RtlFreeUnicodeString( &UnicodeProgramName );
+ RtlFreeUnicodeString( &UnicodeImagePathName );
+
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// //
+// Main Program Entry Routine //
+// //
+//////////////////////////////////////////////////////////////////////////////
+
+BOOLEAN
+CtLpcQos (VOID)
+{
+
+ BOOLEAN Result = TRUE;
+
+ RtlInitUnicodeString( &PortName, L"\\TestLpcQosServerPort" );
+
+ //
+ // Determine whether we are the client or server side of the test.
+ // This is done by creating or opening a named event object. If the
+ // event does not yet exist, then we are the client, and must create
+ // the server process. Otherwise, we are the server and the client
+ // is waiting for us to signal the event.
+ //
+
+ RtlInitString( &EventName, "\\TestLpcQosEvent" );
+ Status = RtlAnsiStringToUnicodeString(
+ &UnicodeEventName,
+ &EventName,
+ TRUE ); SEASSERT_SUCCESS( NT_SUCCESS(Status) );
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &UnicodeEventName,
+ OBJ_OPENIF,
+ NULL,
+ NULL
+ );
+ Status = NtCreateEvent(
+ &EventHandle,
+ EVENT_ALL_ACCESS,
+ &ObjectAttributes,
+ SynchronizationEvent,
+ FALSE
+ );
+
+ if (Status == STATUS_OBJECT_NAME_EXISTS) {
+
+ //
+ // Server is already running, therefore, this process gets to be
+ // the client.
+ //
+
+ Status = SepClientInitialize(); SEASSERT_SUCCESS(Status);
+ Result = SepClientTest();
+
+ } else {
+
+ SEASSERT_SUCCESS(Status);
+
+ //
+ // Event wasn't yet there, so we must be the server.
+ //
+
+ DbgPrint("Se: Starting LPC Impersonation Test.\n");
+
+ Status = SepServerInitialize(); SEASSERT_SUCCESS(Status);
+ Result = SepServerTest();
+
+ DbgPrint("Se: End Test.\n");
+
+ }
+
+
+
+ Status = NtTerminateThread( NtCurrentThread(), STATUS_SUCCESS);
+ SEASSERT_SUCCESS(Status);
+
+ return Result;
+
+}