NT4/private/ntos/ex/eventid.c
2020-09-30 17:12:29 +02:00

142 lines
3.2 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
eventid.c
Abstract:
This module implements a data base for Event Ids for use by the Rtl
Event package. This insures that Event Ids are global for the system.
Author:
Steve Wood (stevewo) 16-Sep-1993
Revision History:
--*/
#include "exp.h"
#if DBG
FAST_MUTEX ExpEventIdListMutex;
LIST_ENTRY ExpEventIdListHead;
ULONG ExpNextEventId;
BOOLEAN
ExpInitializeEventIds( VOID )
{
ExInitializeFastMutex( &ExpEventIdListMutex );
InitializeListHead( &ExpEventIdListHead );
ExpNextEventId = 1;
return TRUE;
}
PRTL_EVENT_ID_INFO
ExDefineEventId(
IN PRTL_EVENT_ID_INFO EventId
)
{
PLIST_ENTRY Head, Next;
PRTL_EVENT_ID_INFO EventId1;
ExAcquireFastMutex( &ExpEventIdListMutex );
try {
Head = &ExpEventIdListHead;
Next = Head->Flink;
while (Next != Head) {
EventId1 = CONTAINING_RECORD( Next, RTL_EVENT_ID_INFO, Entry );
if (EventId->EventId == 0) {
if (!_stricmp( EventId->Name, EventId1->Name )) {
EventId->EventId = EventId1->EventId;
EventId = EventId1;
leave;
}
}
else
if (EventId->EventId == EventId1->EventId) {
EventId = EventId1;
leave;
}
Next = Next->Flink;
}
if (ExpNextEventId > 0xFFFF) {
EventId = NULL;
leave;
}
EventId->EventId = (USHORT)ExpNextEventId++;
InsertTailList( &ExpEventIdListHead, &EventId->Entry );
}
finally {
ExReleaseFastMutex( &ExpEventIdListMutex );
}
return EventId;
}
NTSTATUS
ExpQueryEventIds(
OUT PRTL_EVENT_ID_INFO EventIds,
IN ULONG EventIdsLength,
OUT PULONG ReturnLength OPTIONAL
)
{
NTSTATUS Status;
PLIST_ENTRY Head, Next;
PRTL_EVENT_ID_INFO EventId;
ULONG TotalLength;
ExAcquireFastMutex( &ExpEventIdListMutex );
Status = STATUS_SUCCESS;
try {
Head = &ExpEventIdListHead;
Next = Head->Flink;
TotalLength = sizeof( ULONG );
while (Next != Head) {
EventId = CONTAINING_RECORD( Next, RTL_EVENT_ID_INFO, Entry );
TotalLength += EventId->Length;
Next = Next->Flink;
}
if (ARGUMENT_PRESENT( ReturnLength )) {
*ReturnLength = TotalLength;
}
if (TotalLength > EventIdsLength) {
Status = STATUS_INFO_LENGTH_MISMATCH;
leave;
}
Head = &ExpEventIdListHead;
Next = Head->Flink;
TotalLength = 0;
while (Next != Head) {
EventId = CONTAINING_RECORD( Next, RTL_EVENT_ID_INFO, Entry );
RtlMoveMemory( (PCHAR)EventIds + TotalLength,
EventId,
EventId->Length
);
TotalLength += EventId->Length;
Next = Next->Flink;
}
RtlZeroMemory( (PCHAR)EventIds + TotalLength, sizeof( ULONG ) );
}
finally {
ExReleaseFastMutex( &ExpEventIdListMutex );
}
return Status;
}
#endif // DBG