windows-nt/Source/XPSP1/NT/net/qos/tc/dll/tcnotify.c
2020-09-26 16:20:57 +08:00

236 lines
5.4 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
tcnotify.c
Abstract:
This module contains the notification interaction with WMI
Author:
Shreedhar Madhavapeddi ( shreem ) Jan 12, 1999.
Revision History:
--*/
#include "precomp.h"
int
IsEqualGUIDx(
LPGUID guid1,
LPGUID guid2
)
{
return !memcmp(guid1, guid2, sizeof(GUID));
}
//
// Add the guid/ifchandle to the NotificationList.
// Although it shouldn't happen - check for dupes before adding it.
// Interface handle leads to Client handle
//
ULONG
TcipAddToNotificationList(
IN LPGUID Guid,
IN PINTERFACE_STRUC IfcHandle,
IN ULONG Flags
)
{
PLIST_ENTRY pCurrent;
PNOTIFICATION_ELEMENT pNotifyElem, pNewElem;
int i = 0;
//
// Take the List Lock.
//
pNotifyElem = NULL;
GetLock(NotificationListLock);
pCurrent = NotificationListHead.Flink;
while (&NotificationListHead != pCurrent) {
pNotifyElem = CONTAINING_RECORD(pCurrent, NOTIFICATION_ELEMENT, Linkage.Flink);
if ((pNotifyElem->IfcHandle != IfcHandle) ||
(FALSE == IsEqualGUIDx(&pNotifyElem->NotificationGuid, Guid))) {
pCurrent = pNotifyElem->Linkage.Flink;
} else {
//
// We found a guid/ifchandle combo already!
//DEBUGBREAK();
goto exit;
}
}
//
// If we are here, we couldnt find the GUID/IfcHAndle combo
// Allocate a new element and add it to the list, return TRUE;
//
AllocMem(&pNewElem, sizeof(NOTIFICATION_ELEMENT));
if (!pNewElem) {
// cant alloc memory;
goto exit;
}
pNewElem->IfcHandle = IfcHandle;
pNewElem->NotificationGuid = *Guid;
InsertHeadList(&NotificationListHead, &pNewElem->Linkage);
FreeLock(NotificationListLock);
return TRUE;
exit:
FreeLock(NotificationListLock);
return FALSE;
}
//
// Remove the guid/ifchandle from the NotificationListHead.
// If DBG - check for more than one entries.
//
ULONG
TcipDeleteFromNotificationList(
IN LPGUID Guid,
IN PINTERFACE_STRUC IfcHandle,
IN ULONG Flags
)
{
PLIST_ENTRY pCurrent;
PNOTIFICATION_ELEMENT pNotifyElem;
pNotifyElem = NULL;
GetLock(NotificationListLock);
pCurrent = NotificationListHead.Flink;
while (&NotificationListHead != pCurrent) {
pNotifyElem = CONTAINING_RECORD(pCurrent, NOTIFICATION_ELEMENT, Linkage.Flink);
if ((pNotifyElem->IfcHandle == IfcHandle) &&
(TRUE == IsEqualGUIDx(&pNotifyElem->NotificationGuid, Guid))) {
//
// We found the guid/ifchandle combo - remove it.
RemoveEntryList(&pNotifyElem->Linkage);
FreeMem(pNotifyElem);
break;
} else {
pCurrent = pNotifyElem->Linkage.Flink;
}
}
FreeLock(NotificationListLock);
return TRUE;
}
// Take a Interface & GUID that has a notification from WMI, and
// find if this Client registered to be notified.
ULONG
TcipClientRegisteredForNotification(
IN LPGUID Guid,
IN PINTERFACE_STRUC IfcHandle,
IN ULONG Flags
)
{
PLIST_ENTRY pCurrent;
PNOTIFICATION_ELEMENT pNotifyElem;
pNotifyElem = NULL;
// make sure the list doesn't change under us.
GetLock(NotificationListLock);
pCurrent = NotificationListHead.Flink;
while (&NotificationListHead != pCurrent) {
pNotifyElem = CONTAINING_RECORD(pCurrent, NOTIFICATION_ELEMENT, Linkage.Flink);
if ((pNotifyElem->IfcHandle == IfcHandle) &&
(IsEqualGUIDx(&pNotifyElem->NotificationGuid, Guid))) {
FreeLock(NotificationListLock);
return TRUE;
}
pCurrent = pNotifyElem->Linkage.Flink;
}
FreeLock(NotificationListLock);
return FALSE;
}
//
// Remove the guid/ifchandle from the NotificationListHead.
//
ULONG
TcipDeleteInterfaceFromNotificationList(
IN PINTERFACE_STRUC IfcHandle,
IN ULONG Flags
)
{
PLIST_ENTRY pCurrent;
PNOTIFICATION_ELEMENT pNotifyElem;
pNotifyElem = NULL;
ASSERT(IfcHandle);
GetLock(NotificationListLock);
pCurrent = NotificationListHead.Flink;
while (&NotificationListHead != pCurrent) {
pNotifyElem = CONTAINING_RECORD(pCurrent, NOTIFICATION_ELEMENT, Linkage.Flink);
if (pNotifyElem->IfcHandle == IfcHandle) {
pCurrent = pNotifyElem->Linkage.Flink;
//
// We found the guid/ifchandle combo - remove it.
RemoveEntryList(&pNotifyElem->Linkage);
FreeMem(pNotifyElem);
} else {
pCurrent = pNotifyElem->Linkage.Flink;
}
}
FreeLock(NotificationListLock);
return TRUE;
}