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.
235 lines
5.7 KiB
235 lines
5.7 KiB
/*++
|
|
|
|
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;
|
|
|
|
}
|
|
|