WindowsXP/Source/XPSP1/NT/base/ntos/ex/tex.c
2024-08-03 16:30:48 +02:00

2380 lines
62 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
tex.c
Abstract:
Test program for the EX subcomponent of the NTOS project
Author:
Steve Wood (stevewo) 31-Mar-1989
Revision History:
--*/
#include "exp.h"
//#include "zwapi.h"
#include <version.h>
#include <string.h>
#define DumpPool(x, y)
BOOLEAN
ExTest (
VOID
);
PTESTFCN TestFunction = ExTest;
#ifndef MIPS
USHORT TestEvent = 0;
USHORT TestHandle = 0;
USHORT TestInfo = 0;
USHORT TestLuid = 0;
USHORT TestMemory = 0;
USHORT TestParty = 0;
USHORT TestPool = 0;
USHORT TestResource = 0;
USHORT TestBitMap = 0;
USHORT TestSemaphore = 0;
USHORT TestTimer = 0;
USHORT TestZone = 0;
USHORT TestMutant = 0;
USHORT TestException = 0;
#else
USHORT TestEvent = 1;
USHORT TestHandle = 0;
USHORT TestInfo = 0;
USHORT TestLuid = 0;
USHORT TestMemory = 0;
USHORT TestParty = 0;
USHORT TestPool = 0;
USHORT TestResource = 0;
USHORT TestBitMap = 0;
USHORT TestSemaphore = 2;
USHORT TestTimer = 3;
USHORT TestZone = 0;
USHORT TestMutant = 4;
USHORT TestException = 0;
#endif // MIPS
BOOLEAN
DoEventTest(
)
{
ULONG DesiredAccess = EVENT_ALL_ACCESS;
EVENT_BASIC_INFORMATION EventInformation;
HANDLE Handle1;
HANDLE Handle1c;
HANDLE Handle2;
HANDLE Handle2c;
ULONG Length;
UNICODE_STRING Name1;
UNICODE_STRING Name2;
OBJECT_ATTRIBUTES Object1Attributes;
OBJECT_ATTRIBUTES Object2Attributes;
LONG State;
NTSTATUS Status;
//
// Announce start of event test.
//
DbgPrint(" ** Start of Event Test **\n");
//
// Initialize strings and fill in object attributes structures.
//
RtlInitUnicodeString(&Name1, L "\\Event1");
RtlInitUnicodeString(&Name2, L "\\Event2");
InitializeObjectAttributes(&Object1Attributes, &Name1, 0, NULL, NULL);
InitializeObjectAttributes(&Object2Attributes, &Name2, 0, NULL, NULL);
//
// Create event 1.
//
Status = ZwCreateEvent(&Handle1c, DesiredAccess, &Object1Attributes,
NotificationEvent, TRUE);
if (Status < 0) {
DbgPrint(" Event test - create event 1 failed, status = %lx\n", Status);
}
//
// Open event 1.
//
Status = ZwOpenEvent(&Handle1, DesiredAccess, &Object1Attributes);
if (Status < 0) {
DbgPrint(" Event test - open event 1 failed, status = %lx\n", Status);
}
//
// Query event 1.
//
EventInformation.EventState = 0;
Length = 0;
Status = ZwQueryEvent(Handle1, EventBasicInformation,
(PVOID)&EventInformation, sizeof(EVENT_BASIC_INFORMATION),
&Length);
if (Status < 0) {
DbgPrint(" Event test - query event 1 failed, status = %lx\n", Status);
}
if (EventInformation.EventType != NotificationEvent) {
DbgPrint(" Event test - query event 1 wrong event type\n");
}
if (EventInformation.EventState == 0) {
DbgPrint(" Event test - query event 1 current state wrong\n");
}
if (Length != sizeof(EVENT_BASIC_INFORMATION)) {
DbgPrint(" Event test - query event 1 return length wrong\n");
}
//
// Pulse event 1.
//
State = 0;
Status = ZwPulseEvent(Handle1, &State);
if (Status < 0) {
DbgPrint(" Event test - pulse event 1 failed, status = %lx\n", Status);
}
if (State == 0) {
DbgPrint(" Event test - pulse event 1 previous state wrong\n");
}
//
// Set event 1.
//
State = 1;
Status = ZwSetEvent(Handle1, &State);
if (Status < 0) {
DbgPrint(" Event test - set event 1 failed, status = %lx\n", Status);
}
if (State == 1) {
DbgPrint(" Event test - set event 1 previous state wrong\n");
}
//
// Wait on event 1.
//
Status = ZwWaitForSingleObject(Handle1, FALSE, NULL);
if (Status < 0) {
DbgPrint(" Event test - wait event 1 failed\n");
}
//
// Reset event 1.
//
State = 0;
Status = ZwResetEvent(Handle1, &State);
if (Status < 0) {
DbgPrint(" Event test - reset event 1 failed, status = %lx\n", Status);
}
if (State == 0) {
DbgPrint(" Event test - reset event 1 previous state wrong\n");
}
//
// Create event 2.
//
Status = ZwCreateEvent(&Handle2c, DesiredAccess, &Object2Attributes,
NotificationEvent, FALSE);
if (Status < 0) {
DbgPrint(" Event test - create event 2 failed, status = %lx\n", Status);
}
//
// Open event 2.
//
Status = ZwOpenEvent(&Handle2, DesiredAccess, &Object2Attributes);
if (Status < 0) {
DbgPrint(" Event test - open event 2 failed, status = %lx\n", Status);
}
//
// Query event 2.
//
EventInformation.EventState = 1;
Length = 0;
Status = ZwQueryEvent(Handle2, EventBasicInformation,
(PVOID)&EventInformation, sizeof(EVENT_BASIC_INFORMATION),
&Length);
if (Status < 0) {
DbgPrint(" Event test - query event 2 failed, status = %lx\n", Status);
}
if (EventInformation.EventType != NotificationEvent) {
DbgPrint(" Event test - query event 2 wrong event type\n");
}
if (EventInformation.EventState == 1) {
DbgPrint(" Event test - query event 2 current state wrong\n");
}
if (Length != sizeof(EVENT_BASIC_INFORMATION)) {
DbgPrint(" Event test - query event 2 return length wrong\n");
}
//
// Pulse event 2.
//
State = 1;
Status = ZwPulseEvent(Handle2, &State);
if (Status < 0) {
DbgPrint(" Event test - pulse event 2 failed, status = %lx\n", Status);
}
if (State == 1) {
DbgPrint(" Event test - pulse event 2 previous state wrong\n");
}
//
// Set event 2.
//
State = 1;
Status = ZwSetEvent(Handle2, &State);
if (Status < 0) {
DbgPrint(" Event test - set event 2 failed, status = %lx\n", Status);
}
if (State == 1) {
DbgPrint(" Event test - set event 2 previous state wrong\n");
}
//
// Wait on event 2.
//
Status = ZwWaitForSingleObject(Handle2, FALSE, NULL);
if (Status < 0) {
DbgPrint(" Event test - wait event 2 failed\n");
}
//
// Reset event 2.
//
State = 0;
Status = ZwResetEvent(Handle2, &State);
if (Status < 0) {
DbgPrint(" Event test - reset event 2 failed, status = %lx\n", Status);
}
if (State == 0) {
DbgPrint(" Event test - reset event 2 previous state wrong\n");
}
//
// Close all handles.
//
Status = NtClose(Handle1);
if (Status < 0) {
DbgPrint(" Event test - event 1 close failed, status = %lx\n", Status);
}
Status = NtClose(Handle1c);
if (Status < 0) {
DbgPrint(" Event test - event 1c close failed, status = %lx\n", Status);
}
Status = NtClose(Handle2);
if (Status < 0) {
DbgPrint(" Event test - event 2 close failed, status = %lx\n", Status);
}
Status = NtClose(Handle2c);
if (Status < 0) {
DbgPrint(" Event test - event 2c close failed, status = %lx\n", Status);
}
//
// Announce end of event test.
//
DbgPrint(" ** End of Event Test **\n");
return TRUE;
}
BOOLEAN
DoExceptionTest(
)
{
#ifndef i386
NTSTATUS Status;
//
// Announce start of system service exception test.
//
DbgPrint(" ** Start of System Service Exception Test **\n");
//
// Eventually this should have a test case for each system service that
// has input of output arguments which are addressed by pointers. The
// intent of this test is to make sure that each service correctly
// handles access violations.
//
//
// Query system time test.
//
Status = ZwQuerySystemTime((PLARGE_INTEGER)NULL);
if (Status != STATUS_ACCESS_VIOLATION) {
DbgPrint(" Exception test - NtQuerySystemTime failed, status = %lx\n", Status);
}
//
// Set system time test.
//
Status = ZwSetSystemTime((PLARGE_INTEGER)NULL, (PLARGE_INTEGER)NULL);
if (Status != STATUS_ACCESS_VIOLATION) {
DbgPrint(" Exception test - NtSetSystemTime failed, status = %lx\n", Status);
}
//
// Announce end of system service exception test.
//
DbgPrint(" ** End of System Service Exception Test **\n");
#else
DbgPrint(" ** Skip System Service Exception Test for 386 **\n");
#endif // i386
return TRUE;
}
BOOLEAN
DoMutantTest(
)
{
LONG Count;
ULONG DesiredAccess = MUTANT_ALL_ACCESS;
HANDLE Handle1;
HANDLE Handle1c;
HANDLE Handle2;
HANDLE Handle2c;
ULONG Length;
STRING Name1;
STRING Name2;
OBJECT_ATTRIBUTES Object1Attributes;
OBJECT_ATTRIBUTES Object2Attributes;
MUTANT_BASIC_INFORMATION MutantInformation;
NTSTATUS Status;
//
// Announce start of mutant test.
//
DbgPrint(" ** Start of Mutant Test **\n");
//
// Initialize strings and fill in object attributes structures.
//
RtlInitUnicodeString(&Name1, L"\\Mutant1");
RtlInitUnicodeString(&Name2, L"\\Mutant2");
InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL);
InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL);
//
// Create mutant 1.
//
Status = ZwCreateMutant(&Handle1c, DesiredAccess, &Object1Attributes,
FALSE);
if (Status < 0) {
DbgPrint(" Mutant test - create mutant 1 failed, status = %lx\n",
Status);
}
//
// Open mutant 1.
//
Status = ZwOpenMutant(&Handle1, DesiredAccess, &Object1Attributes);
if (Status < 0) {
DbgPrint(" Mutant test - open mutant 1 failed, status = %lx\n",
Status);
}
//
// Query mutant 1.
//
MutantInformation.CurrentCount = 10;
MutantInformation.AbandonedState = TRUE;
Length = 0;
Status = ZwQueryMutant(Handle1, MutantBasicInformation,
(PVOID)&MutantInformation,
sizeof(MUTANT_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Mutant test - query mutant 1 failed, status = %lx\n",
Status);
}
if (MutantInformation.CurrentCount != 1) {
DbgPrint(" Mutant test - query mutant 1 current count wrong\n");
}
if (MutantInformation.AbandonedState != FALSE) {
DbgPrint(" Mutant test - query mutant 1 abandoned state wrong\n");
}
if (Length != sizeof(MUTANT_BASIC_INFORMATION)) {
DbgPrint(" Mutant test - query mutant 1 return length wrong\n");
}
//
// Acquire mutant 1.
//
Status = ZwWaitForSingleObject(Handle1, FALSE, NULL);
if (Status < 0) {
DbgPrint(" Mutant test - wait mutant 1 failed, status = %lx\n",
Status);
}
//
// Release mutant 1.
//
Count = 100;
Status = ZwReleaseMutant(Handle1, &Count);
if (Status < 0) {
DbgPrint(" Mutant test - release mutant 1 failed, status = %lx\n",
Status);
}
if (Count != 0) {
DbgPrint(" Mutant test - release mutant 1 previous count wrong\n");
}
//
// Create mutant 2.
//
Status = ZwCreateMutant(&Handle2c, DesiredAccess, &Object2Attributes,
FALSE);
if (Status < 0) {
DbgPrint(" Mutant test - create mutant 2 failed, status = %lx\n",
Status);
}
//
// Open mutant 2.
//
Status = ZwOpenMutant(&Handle2, DesiredAccess, &Object2Attributes);
if (Status < 0) {
DbgPrint(" Mutant test - open mutant 2 failed, status = %lx\n",
Status);
}
//
// Acquire mutant 2.
//
Status = ZwWaitForSingleObject(Handle2, FALSE, NULL);
if (Status < 0) {
DbgPrint(" Mutant test - wait mutant 2 failed, status = %lx\n",
Status);
}
//
// Query mutant 2.
//
MutantInformation.CurrentCount = 20;
MutantInformation.AbandonedState = TRUE;
Length = 0;
Status = ZwQueryMutant(Handle2, MutantBasicInformation,
(PVOID)&MutantInformation,
sizeof(MUTANT_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Mutant test - query mutant 2 failed, status = %lx\n",
Status);
}
if (MutantInformation.CurrentCount != 0) {
DbgPrint(" Mutant test - query mutant 2 current count wrong\n");
}
if (MutantInformation.AbandonedState != FALSE) {
DbgPrint(" Mutant test - query mutant 2 abandoned state wrong\n");
}
if (Length != sizeof(MUTANT_BASIC_INFORMATION)) {
DbgPrint(" Mutant test - query mutant 2 return length wrong\n");
}
//
// Acquire mutant 2.
//
Status = ZwWaitForSingleObject(Handle2, FALSE, NULL);
if (Status < 0) {
DbgPrint(" Mutant test - wait mutant 2 failed, status = %lx\n",
Status);
}
//
// Release mutant 2.
//
Count = 100;
Status = ZwReleaseMutant(Handle2, &Count);
if (Status < 0) {
DbgPrint(" Mutant test - release mutant 2 failed, status = %lx\n",
Status);
}
if (Count != - 1) {
DbgPrint(" Mutant test - release mutant 2 previous count wrong\n");
}
//
// Release mutant 2.
//
Count = 100;
Status = ZwReleaseMutant(Handle2, &Count);
if (Status < 0) {
DbgPrint(" Mutant test - release mutant 2 failed, status = %lx\n",
Status);
}
if (Count != 0) {
DbgPrint(" Mutant test - release mutant 2 previous count wrong\n");
}
//
// Close all handles.
//
Status = NtClose(Handle1);
if (Status < 0) {
DbgPrint(" Mutant test - mutant 1 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle1c);
if (Status < 0) {
DbgPrint(" Mutant test - mutant 1c close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2);
if (Status < 0) {
DbgPrint(" Mutant test - mutant 2 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2c);
if (Status < 0) {
DbgPrint(" Mutant test - mutant 2c close failed, status = %lx\n",
Status);
}
//
// Announce end of mutant test.
//
DbgPrint(" ** End of Mutant Test **\n");
return TRUE;
}
BOOLEAN
DoSemaphoreTest(
)
{
LONG Count;
ULONG DesiredAccess = SEMAPHORE_ALL_ACCESS;
HANDLE Handle1;
HANDLE Handle1c;
HANDLE Handle2;
HANDLE Handle2c;
ULONG Length;
STRING Name1;
STRING Name2;
OBJECT_ATTRIBUTES Object1Attributes;
OBJECT_ATTRIBUTES Object2Attributes;
SEMAPHORE_BASIC_INFORMATION SemaphoreInformation;
NTSTATUS Status;
//
// Announce start of semaphore test.
//
DbgPrint(" ** Start of Semaphore Test **\n");
//
// Initialize strings and fill in object attributes structures.
//
RtlInitUnicodeString(&Name1, L"\\Semaphore1");
RtlInitUnicodeString(&Name2, L"\\Semaphore2");
InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL);
InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL);
//
// Create semaphore 1.
//
Status = ZwCreateSemaphore(&Handle1c, DesiredAccess, &Object1Attributes,
0, 10);
if (Status < 0) {
DbgPrint(" Semaphore test - create semaphore 1 failed, status = %lx\n",
Status);
}
//
// Open semaphore 1.
//
Status = ZwOpenSemaphore(&Handle1, DesiredAccess, &Object1Attributes);
if (Status < 0) {
DbgPrint(" Semaphore test - open semaphore 1 failed, status = %lx\n",
Status);
}
//
// Query semaphore 1.
//
SemaphoreInformation.CurrentCount = 10;
SemaphoreInformation.MaximumCount = 0;
Length = 0;
Status = ZwQuerySemaphore(Handle1, SemaphoreBasicInformation,
(PVOID)&SemaphoreInformation,
sizeof(SEMAPHORE_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Semaphore test - query semaphore 1 failed, status = %lx\n",
Status);
}
if (SemaphoreInformation.CurrentCount != 0) {
DbgPrint(" Semaphore test - query semaphore 1 current count wrong\n");
}
if (SemaphoreInformation.MaximumCount != 10) {
DbgPrint(" Semaphore test - query semaphore 1 maximum count wrong\n");
}
if (Length != sizeof(SEMAPHORE_BASIC_INFORMATION)) {
DbgPrint(" Semaphore test - query semaphore 1 return length wrong\n");
}
//
// Release semaphore 1.
//
Count = 100;
Status = ZwReleaseSemaphore(Handle1, 2, &Count);
if (Status < 0) {
DbgPrint(" Semaphore test - release semaphore 1 failed, status = %lx\n",
Status);
}
if (Count != 0) {
DbgPrint(" Semaphore test - release semaphore 1 previous count wrong\n");
}
//
// Release semaphore 1.
//
Count = 100;
Status = ZwReleaseSemaphore(Handle1, 5, &Count);
if (Status < 0) {
DbgPrint(" Semaphore test - release semaphore 1 failed, status = %lx\n",
Status);
}
if (Count != 2) {
DbgPrint(" Semaphore test - release semaphore 1 previous count wrong\n");
}
//
// Create semaphore 2.
//
Status = ZwCreateSemaphore(&Handle2c, DesiredAccess, &Object2Attributes,
5, 20);
if (Status < 0) {
DbgPrint(" Semaphore test - create semaphore 2 failed, status = %lx\n",
Status);
}
//
// Open semaphore 2.
//
Status = ZwOpenSemaphore(&Handle2, DesiredAccess, &Object2Attributes);
if (Status < 0) {
DbgPrint(" Semaphore test - open semaphore 2 failed, status = %lx\n",
Status);
}
//
// Query semaphore 2.
//
SemaphoreInformation.CurrentCount = 20;
SemaphoreInformation.MaximumCount = 5;
Length = 0;
Status = ZwQuerySemaphore(Handle2, SemaphoreBasicInformation,
(PVOID)&SemaphoreInformation,
sizeof(SEMAPHORE_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Semaphore test - query semaphore 2 failed, status = %lx\n",
Status);
}
if (SemaphoreInformation.CurrentCount != 5) {
DbgPrint(" Semaphore test - query semaphore 2 current count wrong\n");
}
if (SemaphoreInformation.MaximumCount != 20) {
DbgPrint(" Semaphore test - query semaphore 2 maximum count wrong\n");
}
if (Length != sizeof(SEMAPHORE_BASIC_INFORMATION)) {
DbgPrint(" Semaphore test - query semaphore 2 return length wrong\n");
}
//
// Release semaphore 2.
//
Count = 100;
Status = ZwReleaseSemaphore(Handle2, 3, &Count);
if (Status < 0) {
DbgPrint(" Semaphore test - release semaphore 2 failed, status = %lx\n",
Status);
}
if (Count != 5) {
DbgPrint(" Semaphore test - release semaphore 2 previous count wrong\n");
}
//
// Release semaphore 2.
//
Count = 100;
Status = ZwReleaseSemaphore(Handle2, 5, &Count);
if (Status < 0) {
DbgPrint(" Semaphore test - release semaphore 2 failed, status = %lx\n",
Status);
}
if (Count != 8) {
DbgPrint(" Semaphore test - release semaphore 2 previous count wrong\n");
}
//
// Close all handles.
//
Status = NtClose(Handle1);
if (Status < 0) {
DbgPrint(" Semaphore test - semaphore 1 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle1c);
if (Status < 0) {
DbgPrint(" Semaphore test - semaphore 1c close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2);
if (Status < 0) {
DbgPrint(" Semaphore test - semaphore 2 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2c);
if (Status < 0) {
DbgPrint(" Semaphore test - semaphore 2c close failed, status = %lx\n",
Status);
}
//
// Announce end of semaphore test.
//
DbgPrint(" ** End of Semaphore Test **\n");
return TRUE;
}
VOID
TimerApcRoutine (
IN PVOID TimerContext,
IN ULONG TimerLowValue,
IN LONG TimerHighValue
)
{
*((PBOOLEAN)TimerContext) = TRUE;
return;
}
BOOLEAN
DoTimerTest (
)
{
BOOLEAN ApcHappened;
BOOLEAN CurrentState;
ULONG DesiredAccess = TIMER_ALL_ACCESS;
LARGE_INTEGER DueTime;
HANDLE Handle1;
HANDLE Handle1c;
HANDLE Handle2;
HANDLE Handle2c;
ULONG Length;
STRING Name1;
STRING Name2;
OBJECT_ATTRIBUTES Object1Attributes;
OBJECT_ATTRIBUTES Object2Attributes;
BOOLEAN PreviousState;
TIMER_BASIC_INFORMATION TimerInformation;
NTSTATUS Status;
//
// Announce start of timer test.
//
DbgPrint(" ** Start of Timer Test **\n");
//
// Initialize strings and fill in object attributes structures.
//
RtlInitUnicodeString(&Name1, L"\\Timer1");
RtlInitUnicodeString(&Name2, L"\\Timer2");
InitializeObjectAttributes(&Object1Attributes,&Name1,0,NULL,NULL);
InitializeObjectAttributes(&Object2Attributes,&Name2,0,NULL,NULL);
//
// Create timer 1.
//
Status = ZwCreateTimer(&Handle1c, DesiredAccess, &Object1Attributes);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - create timer 1 failed, status = %lx\n",
Status);
}
//
// Open timer 1.
//
Status = ZwOpenTimer(&Handle1, DesiredAccess, &Object1Attributes);
if (Status < 0) {
DbgPrint(" Timer test - open timer 1 failed, status = %lx\n",
Status);
}
//
// Query timer 1.
//
TimerInformation.TimerState = TRUE;
Length = 0;
Status = ZwQueryTimer(Handle1, TimerBasicInformation,
(PVOID)&TimerInformation,
sizeof(TIMER_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Timer test - query timer 1 failed, status = %lx\n",
Status);
}
if (TimerInformation.TimerState) {
DbgPrint(" Timer test - query timer 1 state wrong\n");
}
if (Length != sizeof(TIMER_BASIC_INFORMATION)) {
DbgPrint(" Timer test - query timer 1 return length wrong\n");
}
//
// Set timer 1 and then cancel timer 1.
//
DueTime.LowPart = -100000;
DueTime.HighPart = -1;
PreviousState = TRUE;
Status = ZwSetTimer(Handle1, &DueTime, NULL, NULL, &PreviousState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - set timer 1 failed, status = %lx\n",
Status);
}
if (PreviousState) {
DbgPrint(" Timer test - set timer 1 previous state wrong\n");
}
CurrentState = TRUE;
Status = ZwCancelTimer(Handle1, &CurrentState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n",
Status);
}
if (CurrentState) {
DbgPrint(" Timer test - cancel timer 1 current state wrong\n");
}
//
// Set timer 1, wait for timer to expire, and then cancel timer 1.
//
DueTime.LowPart = -5;
DueTime.HighPart = -1;
PreviousState = TRUE;
Status = ZwSetTimer(Handle1, &DueTime, NULL, NULL, &PreviousState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - set timer 1 failed, status = %lx\n",
Status);
}
if (PreviousState) {
DbgPrint(" Timer test - set timer 1 previous state wrong\n");
}
Status = ZwWaitForSingleObject(Handle1, FALSE, NULL);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - wait timer 1 failed, status = %lx\n",
Status);
}
CurrentState = FALSE;
Status = ZwCancelTimer(Handle1, &CurrentState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n",
Status);
}
if (!CurrentState) {
DbgPrint(" Timer test - cancel timer 1 current state wrong\n");
}
//
// Set timer 1 with APC, then cancel timer 1.
//
ApcHappened = FALSE;
DueTime.LowPart = -100000;
DueTime.HighPart = -1;
PreviousState = FALSE;
Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened,
&PreviousState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - set timer 1 failed, status = %lx\n",
Status);
}
if (!PreviousState) {
DbgPrint(" Timer test - set timer 1 previous state wrong\n");
}
CurrentState = TRUE;
Status = ZwCancelTimer(Handle1, &CurrentState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n",
Status);
}
if (CurrentState) {
DbgPrint(" Timer test - cancel timer 1 current state wrong\n");
}
if (ApcHappened) {
DbgPrint(" Timer test - cancel timer 1 APC happened state wrong\n");
}
//
// Set timer 1 with APC, set timer again with APC, wait for timer, then
// cancel timer 1.
//
ApcHappened = FALSE;
DueTime.LowPart = -100000;
DueTime.HighPart = -1;
PreviousState = TRUE;
Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened,
&PreviousState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - set timer 1 failed, status = %lx\n",
Status);
}
if (PreviousState) {
DbgPrint(" Timer test - set timer 1 previous state wrong\n");
}
DueTime.LowPart = -5;
DueTime.HighPart = -1;
PreviousState = TRUE;
Status = ZwSetTimer(Handle1, &DueTime, TimerApcRoutine, &ApcHappened,
&PreviousState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - set timer 1 failed, status = %lx\n",
Status);
}
if (PreviousState) {
DbgPrint(" Timer test - set timer 1 previous state wrong\n");
}
Status = ZwWaitForSingleObject(Handle1, FALSE, NULL);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - wait timer 1 failed, status = %lx\n",
Status);
}
CurrentState = FALSE;
Status = ZwCancelTimer(Handle1, &CurrentState);
if (!NT_SUCCESS(Status)) {
DbgPrint(" Timer test - cancel timer 1 failed, status = %lx\n",
Status);
}
if (!CurrentState) {
DbgPrint(" Timer test - cancel timer 1 current state wrong\n");
}
if (!ApcHappened) {
DbgPrint(" Timer test - cancel timer 1 APC happened state wrong\n");
}
//
// Create timer 2.
//
Status = ZwCreateTimer(&Handle2c, DesiredAccess, &Object2Attributes);
if (Status < 0) {
DbgPrint(" Timer test - create timer 2 failed, status = %lx\n",
Status);
}
//
// Open timer 2.
//
Status = ZwOpenTimer(&Handle2, DesiredAccess, &Object2Attributes);
if (Status < 0) {
DbgPrint(" Timer test - open timer 2 failed, status = %lx\n",
Status);
}
//
// Query timer 2.
//
TimerInformation.TimerState = TRUE;
Length = 0;
Status = ZwQueryTimer(Handle2, TimerBasicInformation,
(PVOID)&TimerInformation,
sizeof(TIMER_BASIC_INFORMATION), &Length);
if (Status < 0) {
DbgPrint(" Timer test - query timer 2 failed, status = %lx\n",
Status);
}
if (TimerInformation.TimerState) {
DbgPrint(" Timer test - query timer 2 state wrong\n");
}
if (Length != sizeof(TIMER_BASIC_INFORMATION)) {
DbgPrint(" Timer test - query timer 2 return length wrong\n");
}
//
// Close all handles.
//
Status = NtClose(Handle1);
if (Status < 0) {
DbgPrint(" Timer test - timer 1 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle1c);
if (Status < 0) {
DbgPrint(" Timer test - timer 1c close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2);
if (Status < 0) {
DbgPrint(" Timer test - timer 2 close failed, status = %lx\n",
Status);
}
Status = NtClose(Handle2c);
if (Status < 0) {
DbgPrint(" Timer test - timer 2c close failed, status = %lx\n",
Status);
}
//
// Announce end of timer test.
//
DbgPrint(" ** End of Timer Test **\n");
return TRUE;
}
BOOLEAN
TestDupHandle1(
IN PVOID HandleTableEntry
)
{
DbgPrint( "Dupping %lx\n", HandleTableEntry );
return( TRUE );
}
BOOLEAN
TestDupHandle4(
IN PVOID HandleTableEntry
)
{
PULONG p = (PULONG)HandleTableEntry;
ULONG i;
if (!((*p>>4) % 4)) {
return( FALSE );
}
DbgPrint( "Dupping " );
for (i=0; i<4; i++) {
DbgPrint( " %lx", *p++ );
}
DbgPrint( "\n" );
return( TRUE );
}
BOOLEAN
TestEnumHandle1(
IN PVOID HandleTableEntry,
IN PVOID EnumParameter
)
{
if (EnumParameter == HandleTableEntry) {
return( TRUE );
}
else {
return( FALSE );
}
}
BOOLEAN
TestEnumHandle4(
IN PVOID HandleTableEntry,
IN PVOID EnumParameter
)
{
if (EnumParameter == (PVOID)*(PULONG)HandleTableEntry) {
return( TRUE );
}
else {
return( FALSE );
}
}
#define HANDLE_TEST_SIZE 30
BOOLEAN
DoHandleTest( void )
{
PVOID HandleTable1;
PVOID HandleTable4;
PVOID HandleTable1a;
PVOID HandleTable4a;
HANDLE HandlesForTable1[ HANDLE_TEST_SIZE ];
HANDLE HandlesForTable4[ HANDLE_TEST_SIZE ];
HANDLE h;
PULONG HandleValue;
BOOLEAN LockFlag;
ULONG i, v[4];
HandleTable1 = ExCreateHandleTable( (PEPROCESS)NULL, 0L, 0L, 0L, MUTEX_LEVEL_PS_CID_TABLE, FALSE );
HandleTable4 = ExCreateHandleTable( (PEPROCESS)NULL, 16L, 8L, 2L, MUTEX_LEVEL_OB_TABLE, TRUE );
ExDumpHandleTable( (PEPROCESS)NULL, HandleTable1, NULL );
ExDumpHandleTable( (PEPROCESS)NULL, HandleTable4, NULL );
for (i=0; i<HANDLE_TEST_SIZE; i++) {
v[0] = (i+1) << 4;
v[1] = (i+1) << 3;
v[2] = (i+1) << 2;
v[3] = (i+1) << 1;
HandlesForTable1[ i ] = ExCreateHandle( HandleTable1, (PVOID)(v[0]) );
DbgPrint( "HandleTable1: %lx => %lx\n", HandlesForTable1[ i ], v[0] );
HandlesForTable4[ i ] = ExCreateHandle( HandleTable4, (PVOID)(&v[0]) );
DbgPrint( "HandleTable4: %lx => %lx\n", HandlesForTable4[ i ], v[0] );
}
ExDumpHandleTable( HandleTable1, NULL, NULL );
ExDumpHandleTable( HandleTable4, NULL, NULL );
for (i=0; i<=HANDLE_TEST_SIZE; i++) {
v[0] = (i+1) << 4;
v[1] = (i+1) << 3;
v[2] = (i+1) << 2;
v[3] = (i+1) << 1;
if (ExEnumHandleTable( HandleTable1, TestEnumHandle1, (PVOID)(v[0]), &h )) {
DbgPrint( "HandleTable1: Found: %lx <= %lx\n", v[0], h );
}
else {
DbgPrint( "HandleTable1: %lx not found\n", v[0] );
}
if (ExEnumHandleTable( HandleTable4, TestEnumHandle4, (PVOID)(v[0]), &h )) {
DbgPrint( "HandleTable4: Found: %lx <= %lx\n", v[0], h );
}
else {
DbgPrint( "HandleTable4: %lx not found\n", v[0] );
}
}
for (i=0; i<HANDLE_TEST_SIZE; i++) {
LockFlag = ExMapHandleToPointer( HandleTable1,
HandlesForTable1[ i ],
(PVOID)&HandleValue
);
DbgPrint( "HandleTable1: %lx => %lx\n",
HandlesForTable1[ i ], HandleValue
);
ExUnlockHandleTable( HandleTable1, LockFlag );
LockFlag = ExMapHandleToPointer( HandleTable4,
HandlesForTable4[ i ],
(PVOID)&HandleValue
);
DbgPrint( "HandleTable4: %lx => %lx\n",
HandlesForTable4[ i ], *HandleValue
);
ExUnlockHandleTable( HandleTable4, LockFlag );
}
HandleTable1a = ExDupHandleTable( (PEPROCESS)NULL, HandleTable1, TestDupHandle1 );
HandleTable4a = ExDupHandleTable( (PEPROCESS)NULL, HandleTable4, TestDupHandle4 );
ExDumpHandleTable( HandleTable1a, NULL, NULL );
ExDumpHandleTable( HandleTable4a, NULL, NULL );
for (i=0; i<HANDLE_TEST_SIZE; i++) {
ExDestroyHandle( HandleTable1, HandlesForTable1[ i ] );
ExDestroyHandle( HandleTable4, HandlesForTable4[ i ] );
}
ExDumpHandleTable( HandleTable1, NULL, NULL );
ExDumpHandleTable( HandleTable4, NULL, NULL );
ExDestroyHandleTable( HandleTable1, NULL );
ExDestroyHandleTable( HandleTable4, NULL );
ExDestroyHandleTable( HandleTable1a, NULL );
ExDestroyHandleTable( HandleTable4a, NULL );
return( TRUE );
}
BOOLEAN
DoInfoTest( void )
{
BOOLEAN Result = FALSE;
NTSTATUS Status;
SYSTEM_BASIC_INFORMATION BasicInfo;
SYSTEM_PROCESSOR_INFORMATION ProcessorInfo;
ULONG ReturnedLength;
DbgPrint(" ** Start of System Information Test **\n");
Status = ZwQuerySystemInformation( SystemBasicInformation,
(PVOID)&BasicInfo,
sizeof( BasicInfo ),
&ReturnedLength
);
if (NT_SUCCESS( Status )) {
DbgPrint( "NtQuerySystemInformation returns:\n" );
DbgPrint( " Number of Processors: %ld\n",
BasicInfo.NumberOfProcessors
);
DbgPrint( " OEM Machine Id: %lx\n",
BasicInfo.OemMachineId
);
DbgPrint( " Timer Resolution: %ld microseconds\n",
BasicInfo.TimerResolutionInMicroSeconds
);
DbgPrint( " Page Size: %ld Allocation Granularity: %ld\n",
BasicInfo.PageSize,
BasicInfo.AllocationGranularity
);
DbgPrint( " User Mode Address Range: 0x%08lx <-> 0x%08lx\n",
BasicInfo.MinimumUserModeAddress,
BasicInfo.MaximumUserModeAddress
);
}
else {
DbgPrint( "NtQuerySystemInformation failed. Status == %X\n",
Status
);
}
DbgPrint(" ** End of System Information Test **\n");
return( Result );
}
BOOLEAN
DoLuidTest( void )
{
BOOLEAN Result = TRUE;
NTSTATUS Status;
LUID FirstLuid;
LUID SecondLuid;
FirstLuid.LowPart = 0;
FirstLuid.HighPart = 0;
SecondLuid.LowPart = 0;
SecondLuid.HighPart = 0;
DbgPrint(" ** Start of Locally Unique ID Test **\n");
Status = ZwAllocateLocallyUniqueId( &FirstLuid );
if (!NT_SUCCESS( Status )) {
DbgPrint( "First Luid Allocation Error.\n" );
Result = FALSE;
}
if (LiLeqZero( FirstLuid )) {
DbgPrint( "First Luid Allocation Failed - Bad Value.\n" );
Result = FALSE;
}
if (Result) {
Status = ZwAllocateLocallyUniqueId( &SecondLuid );
if (!NT_SUCCESS( Status )) {
DbgPrint( "Second Luid Allocation Error.\n" );
Result = FALSE;
}
if (LiLeqZero( SecondLuid )) {
DbgPrint( "Second Luid Allocation Failed - Bad Value.\n" );
Result = FALSE;
}
if (LiLeq( FirstLuid, SecondLuid )) {
DbgPrint( "Second Luid Allocation Failed - Not larger than first value.\n" );
Result = FALSE;
}
}
DbgPrint(" ** End of Locally Unique ID Test **\n");
return( Result );
}
char MemoryTestBuffer1[ 128 ];
char TestString1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char TestString2[] = "123456789012345678901234567890123456789012345678901234567890";
char MemoryTestBuffer2[ 128 ];
BOOLEAN
DoMemoryTest( void )
{
LONG i,j,k;
BOOLEAN Result;
DbgPrint(" ** Start of Memory Test **\n");
Result = TRUE;
strcpy( MemoryTestBuffer1, TestString1 );
for (i=15; i>=0; i--) {
MemoryTestBuffer1[16] = 0xFF;
RtlZeroMemory( &MemoryTestBuffer1[i], 16-i );
if (strncmp( MemoryTestBuffer1, TestString1, i ) || MemoryTestBuffer1[i] || !MemoryTestBuffer1[16]) {
DbgPrint( "*** failed *** - RtlZeroMemory( %s, %ld )\n",
MemoryTestBuffer1, 16-i );
Result = FALSE;
}
}
for (k = 0; k < 8; k++) {
DbgPrint("k = %d, j = ",k);
for (j = 0; j < 8; j++) {
DbgPrint(" %d ",j);
for (i=0; i<26; i++) {
RtlZeroMemory( MemoryTestBuffer1, (ULONG)sizeof( MemoryTestBuffer1 ) );
RtlMoveMemory( &MemoryTestBuffer1[j], &TestString2[k], i );
if (strncmp( &MemoryTestBuffer1[j], &TestString2[k], i ) || MemoryTestBuffer1[j+i]) {
DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n",
&MemoryTestBuffer1[j], TestString2, i );
Result = FALSE;
}
}
}
DbgPrint("\n");
}
for (k = 0; k < 8; k++) {
DbgPrint("k = %d, j = ",k);
for (j = 0; j < 8; j++) {
DbgPrint(" %d ",j);
for (i=0; i<26; i++) {
RtlZeroMemory( MemoryTestBuffer2, (ULONG)sizeof( MemoryTestBuffer2 ) );
RtlMoveMemory( &MemoryTestBuffer2[j], &TestString2[k], i );
if (strncmp( &MemoryTestBuffer2[j], &TestString2[k], i ) || MemoryTestBuffer2[j+i]) {
DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n",
&MemoryTestBuffer2[j], TestString2, i );
Result = FALSE;
}
}
}
DbgPrint("\n");
}
for (k = 0; k < 8; k++) {
DbgPrint("k = %d, j = ",k);
for (j = 0; j < 8; j++) {
DbgPrint(" %d ",j);
for (i=0; i<26; i++) {
strcpy( MemoryTestBuffer1, TestString1 );
RtlMoveMemory( &MemoryTestBuffer1[j], &MemoryTestBuffer1[k], i );
if (strncmp( &MemoryTestBuffer1[j], &TestString1[k], i )) {
DbgPrint( "*** failed *** - RtlMoveMemory( %s, %s, %ld )\n",
&MemoryTestBuffer2[j], TestString2, i );
Result = FALSE;
}
}
}
DbgPrint("\n");
}
DbgPrint(" ** End of Memory Test **\n");
return( Result );
}
BOOLEAN
DoPartyTest( void )
{
BOOLEAN Result = TRUE;
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE Handle;
DbgPrint(" ** Start of Party By Number Test **\n");
NtPartyByNumber( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 );
InitializeObjectAttributes( &ObjectAttributes, NULL, 0, NULL, NULL );
Status = ZwCreateEvent( &Handle,
EVENT_ALL_ACCESS,
&ObjectAttributes, NotificationEvent ,TRUE);
NtPartyByNumber( PARTY_DUMP_OBJECT_BY_HANDLE, Handle, NULL );
ZwClose( Handle );
NtPartyByNumber( PARTY_DUMP_OBJECT_BY_HANDLE, Handle, NULL );
DbgPrint(" ** End of Party By Number Test **\n");
return( Result );
}
BOOLEAN
DoPoolTest( void )
{
PVOID p,p0,p1,p2,p3;
p = ExAllocatePool(NonPagedPool,4000L);
DumpPool("After 4000 byte Allocation",NonPagedPool);
p = ExAllocatePool(NonPagedPool,2000L);
DumpPool("After 2000 byte Allocation",NonPagedPool);
p = ExAllocatePool(NonPagedPool,2000L);
DumpPool("After 2000 byte Allocation",NonPagedPool);
p0 = ExAllocatePool(NonPagedPool,24L);
DumpPool("After 24 byte Allocation p0",NonPagedPool);
p1 = ExAllocatePool(NonPagedPool,24L);
DumpPool("After 24 byte Allocation p1",NonPagedPool);
p2 = ExAllocatePool(NonPagedPool,24L);
DumpPool("After 24 byte Allocation p2",NonPagedPool);
p3 = ExAllocatePool(NonPagedPool,24L);
DumpPool("After 24 byte Allocation p3",NonPagedPool);
ExFreePool(p1);
DumpPool("After 24 byte Deallocation p1",NonPagedPool);
ExFreePool(p3);
DumpPool("After 24 byte Deallocation p3",NonPagedPool);
ExFreePool(p2);
DumpPool("After 24 byte Deallocation p2",NonPagedPool);
ExFreePool(p0);
DumpPool("After 24 byte Deallocation p0",NonPagedPool);
p0 = ExAllocatePool(NonPagedPool,120L);
DumpPool("After 120 byte Allocation p0",NonPagedPool);
p1 = ExAllocatePool(NonPagedPool,24L);
DumpPool("After 24 byte Allocation p1",NonPagedPool);
ExFreePool(p1);
DumpPool("After 24 byte Deallocation p1",NonPagedPool);
ExFreePool(p0);
DumpPool("After 120 byte Deallocation p0",NonPagedPool);
return( TRUE );
}
BOOLEAN
DoZoneTest( void )
{
PULONG p1,p2;
PZONE_HEADER z;
NTSTATUS st;
PVOID b1, b2, b3, b4, b5;
z = ExAllocatePool(NonPagedPool,(ULONG)sizeof(ZONE_HEADER));
p1 = ExAllocatePool(NonPagedPool,2048L);
p2 = ExAllocatePool(NonPagedPool,1024L);
st = ExInitializeZone(z,512L,p1,2048L);
ExDumpZone(z);
b1 = ExAllocateFromZone(z);
DbgPrint("b1 = 0x%lx\n",b1);
ExDumpZone(z);
b2 = ExAllocateFromZone(z);
DbgPrint("b2 = 0x%lx\n",b2);
ExDumpZone(z);
b3 = ExAllocateFromZone(z);
DbgPrint("b3 = 0x%lx\n",b3);
ExDumpZone(z);
b4 = ExAllocateFromZone(z);
DbgPrint("b4 = 0x%lx\n",b4);
ExDumpZone(z);
b5 = ExAllocateFromZone(z);
DbgPrint("b5 = 0x%lx\n",b5);
ExDumpZone(z);
ExFreeToZone(z,b4);
ExDumpZone(z);
ExFreeToZone(z,b3);
ExDumpZone(z);
ExFreeToZone(z,b2);
ExDumpZone(z);
ExFreeToZone(z,b1);
ExDumpZone(z);
st = ExExtendZone(z,p2,1024L);
ExDumpZone(z);
return( TRUE );
}
ERESOURCE Resource;
ULONG ResourceCount;
KSEMAPHORE ResourceSemaphore;
PVOID ExDumpResource( IN PERESOURCE Resource );
VOID
Reader (
IN PVOID StartContext
)
{
LARGE_INTEGER Time;
//KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 2 );
DbgPrint("Starting Reader %lx...\n", StartContext);
Time.LowPart = -(1+(ULONG)StartContext);
Time.HighPart = -1;
while (TRUE) {
(VOID)ExAcquireResourceShared(&Resource,TRUE);
DbgPrint("%lx with shared access\n", StartContext);
if (ResourceCount >= 10) {
ExReleaseResourceLite(&Resource);
break;
}
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
ExReleaseResourceLite(&Resource);
DbgPrint("%lx released shared access\n", StartContext);
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
}
DbgPrint("Reader %lx exiting\n", StartContext);
KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE);
}
VOID
Writer (
IN PVOID StartContext
)
{
LARGE_INTEGER Time;
//KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 3 );
DbgPrint("Starting Writer %lx...\n", StartContext);
Time.LowPart = -(1+(ULONG)StartContext);
Time.HighPart = -1;
while (TRUE) {
(VOID)ExAcquireResourceExclusive(&Resource,TRUE);
DbgPrint("%lx with Exclusive access\n", StartContext);
ResourceCount += 1;
if (ResourceCount >= 10) {
ExReleaseResourceLite(&Resource);
break;
}
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
ExReleaseResourceLite(&Resource);
DbgPrint("%lx released Exclusive access\n", StartContext);
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
}
DbgPrint("Writer %lx exiting\n", StartContext);
KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE);
}
VOID
ReaderTurnedWriter (
IN PVOID StartContext
)
{
LARGE_INTEGER Time;
//KeSetPriorityThread( &PsGetCurrentThread()->Tcb, 4 );
DbgPrint("Starting Reader turned Writer %lx\n", StartContext);
Time.LowPart = -(1+(ULONG)StartContext);
Time.HighPart = -1;
while (TRUE) {
(VOID)ExAcquireResourceShared(&Resource,TRUE);
DbgPrint("%lx with shared access\n", StartContext);
if (ResourceCount >= 10) {
ExReleaseResourceLite(&Resource);
break;
}
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
ExConvertSharedToExclusive(&Resource);
DbgPrint("%lx Shared turned Exclusive access\n", StartContext);
ResourceCount += 1;
if (ResourceCount >= 10) {
ExReleaseResourceLite(&Resource);
break;
}
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
ExConvertExclusiveToShared(&Resource);
DbgPrint("%lx Exclusive turned Shared access\n", StartContext);
if (ResourceCount >= 10) {
ExReleaseResourceLite(&Resource);
break;
}
ExReleaseResourceLite(&Resource);
DbgPrint("%lx release Shared access\n", StartContext);
KeDelayExecutionThread ( KernelMode, FALSE, &Time);
}
DbgPrint("Reader turned Writer %lx exiting\n", StartContext);
KeReleaseSemaphore(&ResourceSemaphore, 0, 1, FALSE);
}
BOOLEAN
DoResourceTest( void )
{
HANDLE Handles[32];
ULONG i;
DbgPrint("Start DoResourceTest...\n");
ExInitializeResource(&Resource);
ResourceCount = 0;
KeInitializeSemaphore(&ResourceSemaphore, 0, MAXLONG);
for (i = 0; i < 4; i += 1) {
if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i],
0,
NULL,
0,
NULL,
Reader,
(PVOID)i))) {
DbgPrint("Create system thread error %8lx\n", i);
}
}
for (i = 4; i < 6; i += 1) {
if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i],
0,
NULL,
0,
NULL,
Writer,
(PVOID)i))) {
DbgPrint("Create system thread error %8lx\n", i);
}
}
for (i = 6; i < 8; i += 1) {
if (!NT_SUCCESS(PsCreateSystemThread(&Handles[i],
0,
NULL,
0,
NULL,
ReaderTurnedWriter,
(PVOID)i))) {
DbgPrint("Create system thread error %8lx\n", i);
}
}
DbgPrint("DoResourceTest wait for everyone to complete...\n");
for (i = 0; i < 8; i += 1) {
KeWaitForSingleObject( &ResourceSemaphore,
Executive,
KernelMode,
FALSE,
NULL);
}
DbgPrint("DoResourceTest Done\n");
return( TRUE );
}
BOOLEAN
DoBitMapTest( void )
{
ULONG Size;
PRTL_BITMAP BitMap;
DbgPrint("Start DoBitMapTest...\n");
//
// First create a new bitmap
//
Size = sizeof(RTL_BITMAP) + (((2048*8 + 31) / 32) * 4);
BitMap = (PRTL_BITMAP)(ExAllocatePool( NonPagedPool, Size ));
RtlInitializeBitMap( BitMap, (PULONG)(BitMap+1), 2048*8 );
//
// >>>> Test setting bits
//
//
// Now clear all bits
//
RtlClearAllBits( BitMap );
//
// Now set some bit patterns, and test them
//
RtlSetBits( BitMap, 0, 1 );
RtlSetBits( BitMap, 63, 1 );
RtlSetBits( BitMap, 65, 30 );
RtlSetBits( BitMap, 127, 2 );
RtlSetBits( BitMap, 191, 34 );
if ((BitMap->Buffer[0] != 0x00000001) ||
(BitMap->Buffer[1] != 0x80000000) ||
(BitMap->Buffer[2] != 0x7ffffffe) ||
(BitMap->Buffer[3] != 0x80000000) ||
(BitMap->Buffer[4] != 0x00000001) ||
(BitMap->Buffer[5] != 0x80000000) ||
(BitMap->Buffer[6] != 0xffffffff) ||
(BitMap->Buffer[7] != 0x00000001)) {
DbgPrint("RtlSetBits Error\n");
return FALSE;
}
//
// Now test some RtlFindClearBitsAndSet
//
RtlSetAllBits( BitMap );
RtlClearBits( BitMap, 0 + 10*32, 1 );
RtlClearBits( BitMap, 5 + 11*32, 1 );
RtlClearBits( BitMap, 7 + 12*32, 1 );
RtlClearBits( BitMap, 0 + 13*32, 9 );
RtlClearBits( BitMap, 4 + 14*32, 9 );
RtlClearBits( BitMap, 7 + 15*32, 9 );
RtlClearBits( BitMap, 0 + 16*32, 10 );
RtlClearBits( BitMap, 4 + 17*32, 10 );
RtlClearBits( BitMap, 6 + 18*32, 10 );
RtlClearBits( BitMap, 7 + 19*32, 10 );
RtlClearBits( BitMap, 0 + 110*32, 14 );
RtlClearBits( BitMap, 1 + 111*32, 14 );
RtlClearBits( BitMap, 2 + 112*32, 14 );
RtlClearBits( BitMap, 0 + 113*32, 15 );
RtlClearBits( BitMap, 1 + 114*32, 15 );
RtlClearBits( BitMap, 2 + 115*32, 15 );
// {
// ULONG i;
// for (i = 0; i < 16; i++) {
// DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]);
// }
// }
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 0 + 113*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 113*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 1 + 114*32) {
DbgPrint("RtlFindClearBitsAndSet Error 1 + 114*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 2 + 115*32) {
DbgPrint("RtlFindClearBitsAndSet Error 2 + 115*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 0 + 110*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 110*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 1 + 111*32) {
DbgPrint("RtlFindClearBitsAndSet Error 1 + 111*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 2 + 112*32) {
DbgPrint("RtlFindClearBitsAndSet Error 2 + 112*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 0 + 16*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 16*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 4 + 17*32) {
DbgPrint("RtlFindClearBitsAndSet Error 4 + 17*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 6 + 18*32) {
DbgPrint("RtlFindClearBitsAndSet Error 6 + 18*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 7 + 19*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 19*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 0 + 13*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 13*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 4 + 14*32) {
DbgPrint("RtlFindClearBitsAndSet Error 4 + 14*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 7 + 15*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 15*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 0 + 10*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 10*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 5 + 11*32) {
DbgPrint("RtlFindClearBitsAndSet Error 5 + 11*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 7 + 12*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 12*32\n");
return FALSE;
}
//
// Now test some RtlFindClearBitsAndSet
//
RtlSetAllBits( BitMap );
RtlClearBits( BitMap, 0 + 0*32, 1 );
RtlClearBits( BitMap, 5 + 1*32, 1 );
RtlClearBits( BitMap, 7 + 2*32, 1 );
RtlClearBits( BitMap, 0 + 3*32, 9 );
RtlClearBits( BitMap, 4 + 4*32, 9 );
RtlClearBits( BitMap, 7 + 5*32, 9 );
RtlClearBits( BitMap, 0 + 6*32, 10 );
RtlClearBits( BitMap, 4 + 7*32, 10 );
RtlClearBits( BitMap, 6 + 8*32, 10 );
RtlClearBits( BitMap, 7 + 9*32, 10 );
RtlClearBits( BitMap, 0 + 10*32, 14 );
RtlClearBits( BitMap, 1 + 11*32, 14 );
RtlClearBits( BitMap, 2 + 12*32, 14 );
RtlClearBits( BitMap, 0 + 13*32, 15 );
RtlClearBits( BitMap, 1 + 14*32, 15 );
RtlClearBits( BitMap, 2 + 15*32, 15 );
// {
// ULONG i;
// for (i = 0; i < 16; i++) {
// DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]);
// }
// }
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 0 + 13*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 13*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 1 + 14*32) {
DbgPrint("RtlFindClearBitsAndSet Error 1 + 14*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 15, 0) != 2 + 15*32) {
DbgPrint("RtlFindClearBitsAndSet Error 2 + 15*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 0 + 10*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 10*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 1 + 11*32) {
DbgPrint("RtlFindClearBitsAndSet Error 1 + 11*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 14, 0) != 2 + 12*32) {
DbgPrint("RtlFindClearBitsAndSet Error 2 + 12*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 0 + 6*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 6*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 4 + 7*32) {
DbgPrint("RtlFindClearBitsAndSet Error 4 + 7*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 6 + 8*32) {
DbgPrint("RtlFindClearBitsAndSet Error 6 + 8*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 10, 0) != 7 + 9*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 9*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 0 + 3*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 3*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 4 + 4*32) {
DbgPrint("RtlFindClearBitsAndSet Error 4 + 4*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 9, 0) != 7 + 5*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 5*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 0 + 0*32) {
DbgPrint("RtlFindClearBitsAndSet Error 0 + 0*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 5 + 1*32) {
DbgPrint("RtlFindClearBitsAndSet Error 5 + 1*32\n");
return FALSE;
}
if (RtlFindClearBitsAndSet( BitMap, 1, 0) != 7 + 2*32) {
DbgPrint("RtlFindClearBitsAndSet Error 7 + 2*32\n");
return FALSE;
}
//
// >>>> Test clearing bits
//
//
// Now clear all bits
//
RtlSetAllBits( BitMap );
//
// Now set some bit patterns, and test them
//
RtlClearBits( BitMap, 0, 1 );
RtlClearBits( BitMap, 63, 1 );
RtlClearBits( BitMap, 65, 30 );
RtlClearBits( BitMap, 127, 2 );
RtlClearBits( BitMap, 191, 34 );
if ((BitMap->Buffer[0] != ~0x00000001) ||
(BitMap->Buffer[1] != ~0x80000000) ||
(BitMap->Buffer[2] != ~0x7ffffffe) ||
(BitMap->Buffer[3] != ~0x80000000) ||
(BitMap->Buffer[4] != ~0x00000001) ||
(BitMap->Buffer[5] != ~0x80000000) ||
(BitMap->Buffer[6] != ~0xffffffff) ||
(BitMap->Buffer[7] != ~0x00000001)) {
DbgPrint("RtlClearBits Error\n");
return FALSE;
}
//
// Now test some RtlFindSetBitsAndClear
//
RtlClearAllBits( BitMap );
RtlSetBits( BitMap, 0 + 0*32, 1 );
RtlSetBits( BitMap, 5 + 1*32, 1 );
RtlSetBits( BitMap, 7 + 2*32, 1 );
RtlSetBits( BitMap, 0 + 3*32, 9 );
RtlSetBits( BitMap, 4 + 4*32, 9 );
RtlSetBits( BitMap, 7 + 5*32, 9 );
RtlSetBits( BitMap, 0 + 6*32, 10 );
RtlSetBits( BitMap, 4 + 7*32, 10 );
RtlSetBits( BitMap, 6 + 8*32, 10 );
RtlSetBits( BitMap, 7 + 9*32, 10 );
RtlSetBits( BitMap, 0 + 10*32, 14 );
RtlSetBits( BitMap, 1 + 11*32, 14 );
RtlSetBits( BitMap, 2 + 12*32, 14 );
RtlSetBits( BitMap, 0 + 13*32, 15 );
RtlSetBits( BitMap, 1 + 14*32, 15 );
RtlSetBits( BitMap, 2 + 15*32, 15 );
{
ULONG i;
for (i = 0; i < 16; i++) {
DbgPrint("%2d: %08lx\n", i, BitMap->Buffer[i]);
}
}
if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 0 + 13*32) {
DbgPrint("RtlFindSetBitsAndClear Error 0 + 13*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 1 + 14*32) {
DbgPrint("RtlFindSetBitsAndClear Error 1 + 14*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 15, 0) != 2 + 15*32) {
DbgPrint("RtlFindSetBitsAndClear Error 2 + 15*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 0 + 10*32) {
DbgPrint("RtlFindSetBitsAndClear Error 0 + 10*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 1 + 11*32) {
DbgPrint("RtlFindSetBitsAndClear Error 1 + 11*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 14, 0) != 2 + 12*32) {
DbgPrint("RtlFindSetBitsAndClear Error 2 + 12*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 0 + 6*32) {
DbgPrint("RtlFindSetBitsAndClear Error 0 + 6*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 4 + 7*32) {
DbgPrint("RtlFindSetBitsAndClear Error 4 + 7*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 6 + 8*32) {
DbgPrint("RtlFindSetBitsAndClear Error 6 + 8*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 10, 0) != 7 + 9*32) {
DbgPrint("RtlFindSetBitsAndClear Error 7 + 9*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 0 + 3*32) {
DbgPrint("RtlFindSetBitsAndClear Error 0 + 3*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 4 + 4*32) {
DbgPrint("RtlFindSetBitsAndClear Error 4 + 4*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 9, 0) != 7 + 5*32) {
DbgPrint("RtlFindSetBitsAndClear Error 7 + 5*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 0 + 0*32) {
DbgPrint("RtlFindSetBitsAndClear Error 0 + 0*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 5 + 1*32) {
DbgPrint("RtlFindSetBitsAndClear Error 5 + 1*32\n");
return FALSE;
}
if (RtlFindSetBitsAndClear( BitMap, 1, 0) != 7 + 2*32) {
DbgPrint("RtlFindSetBitsAndClear Error 7 + 2*32\n");
return FALSE;
}
DbgPrint("DoBitMapTest Done.\n");
return TRUE;
}
BOOLEAN
ExTest (
VOID
)
{
USHORT i;
DbgPrint( "In extest\n" );
for (i=1; i<16; i++) {
if (i == TestEvent)
DoEventTest();
else
if (i == TestHandle)
DoHandleTest();
else
if (i == TestInfo)
DoInfoTest();
else
if (i == TestLuid) {
DoLuidTest();
}
else
if (i == TestMemory) {
DoMemoryTest();
}
else
if (i == TestParty)
DoPartyTest();
else
if (i == TestPool)
DoPoolTest();
else
if (i == TestResource)
DoResourceTest();
else
if (i == TestBitMap)
DoBitMapTest();
else
if (i == TestSemaphore)
DoSemaphoreTest();
else
if (i == TestTimer)
DoTimerTest();
else
if (i == TestZone)
DoZoneTest();
else
if (i == TestMutant)
DoMutantTest();
else
if (i == TestException)
DoExceptionTest();
}
TestFunction = NULL; // Invoke the CLI
return TRUE;
}
#ifndef MIPS
int
_CDECL
main(
int argc,
char *argv[]
)
{
#ifdef SIMULATOR
char c, *s;
USHORT i;
i = 1;
if (argc > 1 ) {
while (--argc) {
s = *++argv;
while ((c = *s++) != '\0') {
switch (c) {
case 'B':
case 'b':
TestBitMap = i++;
break;
case 'C':
case 'c':
TestException = i++;
break;
case 'E':
case 'e':
TestEvent = i++;
break;
case 'H':
case 'h':
TestHandle = i++;
break;
case 'I':
case 'i':
TestInfo = i++;
break;
case 'L':
case 'l':
TestLuid = i++;
break;
case 'M':
case 'm':
TestMemory = i++;
break;
case 'P':
case 'p':
TestPool = i++;
break;
case 'R':
case 'r':
TestResource = i++;
break;
case 'S':
case 's':
TestSemaphore = i++;
break;
case 'T':
case 't':
TestTimer = i++;
break;
case 'X':
case 'x':
TestMutant = i++;
break;
case 'Z':
case 'z':
TestZone = i++;
break;
default:
DbgPrint( "tex: invalid test code - '%s'", *argv );
break;
}
}
}
} else {
if (!strcmp( "DAVEC", szVerUser )) {
TestEvent = 1;
TestSemaphore = 2;
TestTimer = 3;
TestMutant = 4;
TestException = 5;
}
else
if (!strcmp( "MARKL", szVerUser )) {
TestPool = 1;
TestZone = 2;
}
else
if (!strcmp( "STEVEWO", szVerUser )) {
TestInfo = 1;
TestParty = 2;
TestMemory = 3;
TestHandle = 4;
}
else
if (!strcmp( "GARYKI", szVerUser )) {
TestResource = 1;
TestMemory = 2;
TestBitMap = 3;
}
else
if (!strcmp( "JIMK", szVerUser )) {
TestLuid = 1;
}
else {
DbgPrint( "*** Warning *** - %s is an unauthorized user of tex\n",
szVerUser
);
}
}
#else
TestEvent = 1;
TestSemaphore = 2;
TestTimer = 3;
TestMutant = 4;
TestException = 5;
#endif // SIMULATOR
TestFunction = extest;
KiSystemStartup();
return 0;
}
#endif // MIPS
void
oops()
{
ExTimerRundown();
}