|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
tcwmi.c
Abstract:
This module contains WMI support for traffic control
Author:
Ofer Bar (oferbar) Oct 1, 1997
Revision History:
--*/
#include "precomp.h"
static BOOLEAN _init = FALSE;
DWORD InitializeWmi(VOID) { DWORD Status = NO_ERROR;
if (!_init) {
__try {
Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_UP_INDICATION, TRUE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT ); Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_DOWN_INDICATION, TRUE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT ); Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_CHANGE_INDICATION, TRUE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT ); } __except (EXCEPTION_EXECUTE_HANDLER) {
Status = GetExceptionCode();
IF_DEBUG(ERRORS) { WSPRINT(("InitializeWmi: Exception Error: = %X\n", Status )); }
}
if (Status == NO_ERROR) _init = TRUE; }
return Status; }
DWORD DeInitializeWmi(VOID) { DWORD Status = NO_ERROR;
if (_init) {
__try {
Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_UP_INDICATION, FALSE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT ); Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_DOWN_INDICATION, FALSE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT ); Status = WmiNotificationRegistration( (LPGUID)&GUID_QOS_TC_INTERFACE_CHANGE_INDICATION, FALSE, CbWmiInterfaceNotification, 0, NOTIFICATION_CALLBACK_DIRECT );
} __except (EXCEPTION_EXECUTE_HANDLER) {
Status = GetExceptionCode();
IF_DEBUG(ERRORS) { WSPRINT(("DeInitializeWmi: Exception Error: = %X\n", Status )); }
}
if (Status == NO_ERROR) _init = FALSE; }
return Status; }
DWORD WalkWnode( IN PWNODE_HEADER pWnodeHdr, IN ULONG Context, IN CB_PER_INSTANCE_ROUTINE CbPerInstance ) { DWORD Status; ULONG Flags; PWCHAR NamePtr; USHORT NameSize; PBYTE DataBuffer; ULONG DataSize; PULONG NameOffset; WCHAR TmpName[512];
Flags = pWnodeHdr->Flags; if (Flags & WNODE_FLAG_ALL_DATA) {
//
// WNODE_ALL_DATA structure has multiple interfaces
//
PWNODE_ALL_DATA pWnode = (PWNODE_ALL_DATA)pWnodeHdr; UINT Instance; //PULONG NameOffsets;
NameOffset = (PULONG) OffsetToPtr(pWnode, pWnode->OffsetInstanceNameOffsets ); DataBuffer = (PBYTE) OffsetToPtr (pWnode, pWnode->DataBlockOffset); for ( Instance = 0; Instance < pWnode->InstanceCount; Instance++) { //
// Instance Name
//
NamePtr = (PWCHAR) OffsetToPtr(pWnode, NameOffset[Instance] + sizeof(USHORT)); NameSize = * (USHORT *) OffsetToPtr(pWnode, NameOffset[Instance]); //
// Instance Data
//
// Get size and pointer to the buffer
//
if ( Flags & WNODE_FLAG_FIXED_INSTANCE_SIZE ) { DataSize = pWnode->FixedInstanceSize; } else { DataSize = pWnode->OffsetInstanceDataAndLength[Instance].LengthInstanceData; DataBuffer = (PBYTE)OffsetToPtr(pWnode, pWnode->OffsetInstanceDataAndLength[Instance].OffsetInstanceData); }
//
// a call back to a notification handler that calls the client
//
CbPerInstance(Context, (LPGUID)&pWnode->WnodeHeader.Guid, (LPWSTR)NamePtr, DataSize, DataBuffer ); }
} else if (Flags & WNODE_FLAG_SINGLE_INSTANCE) {
//
// WNODE_SINGLE_INSTANCE structure has only one instance
//
PWNODE_SINGLE_INSTANCE pWnode = (PWNODE_SINGLE_INSTANCE)pWnodeHdr; if (Flags & WNODE_FLAG_STATIC_INSTANCE_NAMES) {
//
// What am I supposed to do with THAT ?!?
// NOTHING! (55686)
//
return (-1); }
NamePtr = (PWCHAR)OffsetToPtr(pWnode, pWnode->OffsetInstanceName + sizeof(USHORT) ); NameSize = * (USHORT *) OffsetToPtr(pWnode, pWnode->OffsetInstanceName);
memcpy(TmpName, NamePtr, NameSize); TmpName[NameSize/sizeof(WCHAR)] = L'\0';
//
// Data Size
//
DataSize = pWnode->SizeDataBlock; //
// Instance Data
//
DataBuffer = (PBYTE)OffsetToPtr (pWnode, pWnode->DataBlockOffset); //
// a call back to a notification handler that calls the client
//
CbPerInstance(Context, (LPGUID)&pWnode->WnodeHeader.Guid, (LPWSTR)TmpName, DataSize, DataBuffer );
} else if (Flags & WNODE_FLAG_SINGLE_ITEM) {
//
// WNODE_SINGLE_INSTANCE structure has only one instance
//
PWNODE_SINGLE_ITEM pWnode = (PWNODE_SINGLE_ITEM)pWnodeHdr; if (Flags & WNODE_FLAG_STATIC_INSTANCE_NAMES) {
//
// What am I supposed to do with THAT ?!?
// NOTHING! (55686)
//
return (-1); }
NamePtr = (PWCHAR)OffsetToPtr(pWnode, pWnode->OffsetInstanceName + sizeof(USHORT) ); NameSize = * (USHORT *) OffsetToPtr(pWnode, pWnode->OffsetInstanceName); //
// Data Size
//
DataSize = pWnode->SizeDataItem; //
// Instance Data
//
DataBuffer = (PBYTE)OffsetToPtr (pWnode, pWnode->DataBlockOffset); //
// a call back to a notification handler that calls the client
//
CbPerInstance(Context, (LPGUID)&pWnode->WnodeHeader.Guid, (LPWSTR)NamePtr, DataSize, DataBuffer ); } else {
ASSERT(0);
} return NO_ERROR; }
|