133 lines
2.2 KiB
C
133 lines
2.2 KiB
C
|
#include "brian.h"
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
InitEvents (
|
|||
|
)
|
|||
|
{
|
|||
|
NtCreateEvent( &EventEvent, SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
|
|||
|
NULL, SynchronizationEvent, TRUE );
|
|||
|
|
|||
|
RtlZeroMemory( Events, sizeof( Events ));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
UninitEvents (
|
|||
|
)
|
|||
|
{
|
|||
|
USHORT Index;
|
|||
|
|
|||
|
//
|
|||
|
// Release any current events.
|
|||
|
//
|
|||
|
|
|||
|
for (Index = 0; Index < MAX_EVENTS; Index++) {
|
|||
|
|
|||
|
if (Events[Index].Used) {
|
|||
|
|
|||
|
NtSetEvent( Events[Index].Handle, NULL );
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
ObtainEvent (
|
|||
|
OUT PUSHORT NewIndex
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
USHORT Index;
|
|||
|
|
|||
|
//
|
|||
|
// Wait for the handle event
|
|||
|
//
|
|||
|
|
|||
|
if ((Status = NtWaitForSingleObject( EventEvent,
|
|||
|
FALSE,
|
|||
|
NULL )) != STATUS_SUCCESS) {
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Find an available index. Return STATUS_INSUFFICIENT_RESOURCES
|
|||
|
// if not found.
|
|||
|
//
|
|||
|
|
|||
|
for (Index = 0; Index < MAX_EVENTS; Index++) {
|
|||
|
|
|||
|
if (!Events[Index].Used) {
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Index >= MAX_EVENTS) {
|
|||
|
|
|||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
|||
|
|
|||
|
//
|
|||
|
// Otherwise reserve this event index.
|
|||
|
//
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
Status = NtCreateEvent( &Events[Index].Handle,
|
|||
|
SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE,
|
|||
|
NULL,
|
|||
|
SynchronizationEvent,
|
|||
|
FALSE );
|
|||
|
|
|||
|
if (NT_SUCCESS( Status )) {
|
|||
|
|
|||
|
Events[Index].Used = TRUE;
|
|||
|
*NewIndex = Index;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
NtSetEvent( EventEvent, NULL );
|
|||
|
|
|||
|
return Status;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
FreeEvent (
|
|||
|
IN USHORT Index
|
|||
|
)
|
|||
|
{
|
|||
|
//
|
|||
|
// Return immediately if beyond the end of the valid events.
|
|||
|
//
|
|||
|
|
|||
|
if (Index >= MAX_EVENTS) {
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Grab the event for the events.
|
|||
|
//
|
|||
|
|
|||
|
if (NtWaitForSingleObject( EventEvent, FALSE, NULL ) != STATUS_SUCCESS) {
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Mark the index as unused and release the event if held.
|
|||
|
//
|
|||
|
|
|||
|
if (Events[Index].Used) {
|
|||
|
|
|||
|
Events[Index].Used = FALSE;
|
|||
|
NtSetEvent( Events[Index].Handle, NULL );
|
|||
|
}
|
|||
|
|
|||
|
NtSetEvent( EventEvent, NULL );
|
|||
|
|
|||
|
return;
|
|||
|
}
|