Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#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; }
|