338 lines
11 KiB
C
338 lines
11 KiB
C
//***************************************************************************
|
||
//
|
||
// (c) 1997 by Microsoft Corporation
|
||
//
|
||
// bmof.h
|
||
//
|
||
// a-davj 14-April-97 Created.
|
||
//
|
||
// Describes the format of binary MOF files. In addition, it defines some
|
||
// structures which specify the details of the format and also defines some
|
||
// addtional structures and helper functions for navigating a BMOF file.
|
||
//
|
||
//***************************************************************************
|
||
|
||
#ifndef __BMOF__
|
||
#define __BMOF__
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
// Binary mof files contain a large blob of data which consists of stuctures
|
||
// which contain other structures, etc. The layout of that blob is detailed in
|
||
// the following comments. However, the binary files are compressed and always
|
||
// starts off with the following DWORDS
|
||
// [Signature] [Compression Type, Always 1] [Compressed size] [Expanded size] The blob follows!
|
||
// An example of decompressing the file is in test.c
|
||
//
|
||
// The following is a BNF description of the structures that make up
|
||
// a BMOF file and also serve to illustrate the basic layout of WBEM
|
||
// objects.
|
||
//
|
||
// --A MOF is zero or more objects
|
||
//
|
||
// WBEM_Binary_MOF ::= WBEM_Object*;
|
||
//
|
||
// --An object is a qualifier list (applying to the entire object) and
|
||
// --a property list
|
||
//
|
||
// WBEM_Object ::= WBEM_QualifierList WBEM_PropertyList;
|
||
//
|
||
// --A property list is zero or more properties
|
||
//
|
||
// WBEM_PropertyList ::= WBEM_Property*; / zero or more properties
|
||
//
|
||
// --A property is a set of qualifiers applying to the property, and
|
||
// --a type, a name, and a value
|
||
//
|
||
// WBEM_Property ::= WBEM_QualifierList* <type> <name> <value>;
|
||
//
|
||
// --A qualifier list is zero or more qualifiers
|
||
//
|
||
// WBEM_QualifierList ::= WBEM_Qualifier*; -- zero or more qualifiers
|
||
//
|
||
// --A qualifier is a type, a name, and a value. However, the supported types
|
||
// --are not as extensive as for properties.
|
||
//
|
||
// WBEM_Qualifier ::= <type> <name> <value>;
|
||
//
|
||
//
|
||
// Note that a qualifier set (a list of qualifiers) can be applied
|
||
// to the entire object or to individual properties. However, qualifiers
|
||
// cannot be applied to other qualifiers:
|
||
//
|
||
// object = quals + props
|
||
// prop = quals + name + value
|
||
// qual = name + value
|
||
//
|
||
// Information such as the name of a class, the super class, etc., are coded
|
||
// as property values. Finding the value of the property __CLASS, for example,
|
||
// gives the name of the class. All properties beginning with a double
|
||
// underscore are well-known system properties common to all WBEM objects.
|
||
// All other properties are user-defined.
|
||
//
|
||
// The list of predefined properties is found in WBEM documentation.
|
||
//
|
||
// Offsets are relative to their owning structure, not absolute to the
|
||
// entire encoding image. This allows moving the subcomponents around
|
||
// without rencoding everything.
|
||
//
|
||
// Note that an offset of 0xFFFFFFFF indicates that the field is not used.
|
||
//
|
||
// Both properties and qualifiers have value fields which contain data based
|
||
// on Ole Automation types. Qualifiers are simple types (no arrays or
|
||
// embedded objects) while property values might contain arrays and/or
|
||
// embedded objects.
|
||
//
|
||
// One difference from Ole is that BSTRs are actually stored as WCHAR
|
||
// strings even if the data type is marked as BSTR.
|
||
//
|
||
// In addition, some qualifiers or properties are actually aliases which
|
||
// must be resolved later. Aliases are stored as BSTR values and the type
|
||
// field is set to VT_BSTR | VT_BYREF. An array of alias strings is a bit
|
||
// more complicated since not all the elements need be aliases. In the array
|
||
// case, each actual alias string is prepended with a L'$' while each
|
||
// "regular" string is prepended by a L' '.
|
||
//
|
||
// Currently, only scalars and single dimensional arrays are supported.
|
||
// However, the BMOF file layout is designed so as to accommodate multi-
|
||
// dimensional array in the future. For array data, the data is layout out
|
||
//
|
||
// ArrayData ::= ArrayHeaderData + RowOfData*;
|
||
//
|
||
// The ArrayHeaderData has the form;
|
||
// dwtotalsize, dwNumDimenstions, dwMostSigDimension... dwLeastSigDimension
|
||
//
|
||
// Currently only 1 dimensional arrays are supported, a 5 element
|
||
// array would start with;
|
||
// dwSize, 1, 5
|
||
//
|
||
// After the header, one or more rows would follow. A row represents the
|
||
// "most rapidly changing" data. Currently, there is only one row.
|
||
//
|
||
// The row format is;
|
||
//
|
||
// dwSizeOfRow, MostSigDimension ... dwLeastSignificentDimension+1,data
|
||
// For a one dimensional array, it would just be
|
||
// dwSizeOfRow, Data
|
||
//
|
||
|
||
// The extension for supporting qualifier flavors is to add the following data after the current blob.
|
||
//
|
||
// typedef struct
|
||
// {
|
||
// WCHAR wcSignature; // the string BMOFQUALFLAVOR11
|
||
// DWORD dwNumPair;
|
||
// // BYTE FlavorInfo[]; // Blob containing array of WBEM_Object structs
|
||
// }WBEM_Binary_FLAVOR;
|
||
//
|
||
// The FlavorInfo blob will be a series of DWORD pairs of the form
|
||
//
|
||
// Typedef struct
|
||
// {
|
||
// DWORD dwOffsetInOriginalBlob;
|
||
// DWORD dwFlavor;
|
||
// }
|
||
|
||
// Each Binary MOF file starts off with these signature bytes.
|
||
|
||
#define BMOF_SIG 0x424d4f46
|
||
|
||
// The following structures exactly describe the contents of a BMOF file.
|
||
// These can be used to navigate the file using the various offsets and
|
||
// lots of casting.
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwSignature; // four characters, BMOF
|
||
DWORD dwLength;
|
||
DWORD dwVersion; // 0x1
|
||
DWORD dwEncoding; // 0x1 = little endian, DWORD-aligned, no compression
|
||
|
||
DWORD dwNumberOfObjects; // Total classes and instances in MOF
|
||
|
||
// BYTE Info[]; // Blob containing array of WBEM_Object structs
|
||
// First object is at offset 0.
|
||
}WBEM_Binary_MOF;
|
||
|
||
typedef struct // Describes a class or instance
|
||
{
|
||
DWORD dwLength;
|
||
DWORD dwOffsetQualifierList;
|
||
DWORD dwOffsetPropertyList;
|
||
DWORD dwOffsetMethodList;
|
||
DWORD dwType; // 0 = class, 1 = instance
|
||
|
||
// BYTE Info[]; // Blob of qualifier set and properties
|
||
}WBEM_Object;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwLength;
|
||
DWORD dwNumberOfProperties;
|
||
|
||
// BYTE Info[]; // Blob with all properties placed end-to-end
|
||
}WBEM_PropertyList;
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwLength; // Length of this struct
|
||
DWORD dwType; // A VT_ type from WTYPES.H (VT_I4, VT_UI8, etc)
|
||
DWORD dwOffsetName; // Offset in <Info> of the null-terminated name.
|
||
DWORD dwOffsetValue; // Offset in <Info> of the value.
|
||
DWORD dwOffsetQualifierSet; //
|
||
|
||
|
||
// BYTE Info[]; // Contains qualifier set, name, and value
|
||
}WBEM_Property;
|
||
|
||
// Rough encoding example for a string:
|
||
//
|
||
// dwLength = 10;
|
||
// dwType = VT_LPWSTR;
|
||
// dwOffsetName = 0;
|
||
// dwOffsetValue = 8;
|
||
// dwOffsetQualifierSet = 0xFFFFFFFF; // Indicates not used
|
||
//
|
||
// Info[] = "CounterValue\0<default value>\0";
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwLength;
|
||
DWORD dwNumQualifiers;
|
||
// BYTE Info[]; // Array of WBEM_Qualifiers placed end-to-end
|
||
}WBEM_QualifierList;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
DWORD dwLength; // Length of this struct
|
||
DWORD dwType; // A VT_ type from WTYPES.H (VT_I4, VT_UI8, etc)
|
||
DWORD dwOffsetName; // Offset in <Info> of the null-terminated name.
|
||
DWORD dwOffsetValue; // Offset in <Info> of the value.
|
||
// BYTE Info[];
|
||
}WBEM_Qualifier;
|
||
|
||
|
||
// These structures and the helper functions that go with them can be used
|
||
// to easily navigate a BMOF file. These structures "wrap" the above
|
||
// structures so as to provide features such as searching and enumeration.
|
||
|
||
typedef struct
|
||
{
|
||
WBEM_QualifierList * m_pql;
|
||
WBEM_Qualifier * m_pInfo;
|
||
DWORD m_CurrQual;
|
||
WBEM_Qualifier * m_pCurr;
|
||
|
||
}CBMOFQualList;
|
||
|
||
typedef struct
|
||
{
|
||
WBEM_Object * m_pob;
|
||
BYTE * m_pInfo;
|
||
WBEM_PropertyList * m_ppl;
|
||
DWORD m_CurrProp;
|
||
WBEM_Property * m_pCurrProp;
|
||
|
||
WBEM_PropertyList * m_pml;
|
||
DWORD m_CurrMeth;
|
||
WBEM_Property * m_pCurrMeth;
|
||
|
||
}CBMOFObj;
|
||
|
||
typedef struct
|
||
{
|
||
WBEM_Binary_MOF * m_pol;
|
||
DWORD m_CurrObj;
|
||
WBEM_Object * m_pInfo;
|
||
WBEM_Object * m_pCurrObj;
|
||
}CBMOFObjList;
|
||
|
||
|
||
typedef struct
|
||
{
|
||
BYTE * m_pData;
|
||
DWORD m_dwType;
|
||
}CBMOFDataItem;
|
||
|
||
|
||
//
|
||
// Qualifier flavor definitions
|
||
#define FlavorAmended 0x80
|
||
#define FlavorDisableOverride 0x10
|
||
#define FlavorToSubclass 0x02
|
||
#define FlavorToInstance 0x01
|
||
|
||
|
||
|
||
// Using any of the following help functions requires that these two
|
||
// functions be provided in another module and allow independence from
|
||
// any particular allocation method.
|
||
|
||
//
|
||
// redefine the BMOF allocation routines to be the same as the WMI allocation
|
||
// routines.
|
||
#define BMOFFree(p) WmipFree(p)
|
||
#define BMOFAlloc(s) WmipAlloc(s)
|
||
|
||
|
||
// These functions wrap the object list and provider for enumeration of
|
||
// the objects.
|
||
|
||
CBMOFObjList * _stdcall CreateObjList(BYTE * pBuff);
|
||
void _stdcall ResetObjList(CBMOFObjList * pol);
|
||
CBMOFObj * _stdcall NextObj(CBMOFObjList *pol);
|
||
CBMOFObj * _stdcall FindObj(CBMOFObjList *pol, WCHAR * pName);
|
||
|
||
// These functions allow access to the parts of a class or instance object
|
||
|
||
void _stdcall ResetObj(CBMOFObj * pol);
|
||
CBMOFQualList * _stdcall GetQualList(CBMOFObj * pol);
|
||
CBMOFQualList * _stdcall GetPropQualList(CBMOFObj * pol, WCHAR * pName);
|
||
CBMOFQualList * _stdcall GetMethQualList(CBMOFObj * pol, WCHAR * pName);
|
||
BOOL _stdcall NextProp(CBMOFObj * pob, WCHAR ** ppName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall NextMeth(CBMOFObj * pob, WCHAR ** ppName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall FindProp(CBMOFObj * pob, WCHAR * pName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall FindMeth(CBMOFObj * pob, WCHAR * pName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall GetName(CBMOFObj * pob, WCHAR ** ppName);
|
||
DWORD _stdcall GetType(CBMOFObj * pob);
|
||
WBEM_Property * _stdcall FindPropPtr(CBMOFObj * pob, WCHAR * pName);
|
||
WBEM_Property * _stdcall FindMethPtr(CBMOFObj * pob, WCHAR * pName);
|
||
|
||
// These functions provide easy access to a qualifier list.
|
||
|
||
void _stdcall ResetQualList(CBMOFQualList * pql);
|
||
BOOL _stdcall NextQual(CBMOFQualList * pql,WCHAR ** ppName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall NextQualEx(CBMOFQualList * pql,WCHAR ** ppName, CBMOFDataItem * pItem,
|
||
DWORD * pdwFlavor, BYTE * pBuff);
|
||
BOOL _stdcall FindQual(CBMOFQualList * pql,WCHAR * pName, CBMOFDataItem * pItem);
|
||
BOOL _stdcall FindQualEx(CBMOFQualList * pql,WCHAR * pName, CBMOFDataItem * pItem,
|
||
DWORD * pdwFlavor, BYTE * pBuff);
|
||
|
||
// These functions provide easy access to a data item. Note that data items
|
||
// might be stored in arrays.
|
||
|
||
int _stdcall GetNumDimensions(CBMOFDataItem *);
|
||
int _stdcall GetNumElements(CBMOFDataItem *, long lDim);
|
||
int _stdcall GetData(CBMOFDataItem *, BYTE * pRet, long * plDims);
|
||
|
||
// These functions are mainly useful to the above helper functions
|
||
|
||
int _stdcall iTypeSize(DWORD vtTest);
|
||
BOOL _stdcall SetValue(CBMOFDataItem * pItem, BYTE * pInfo, DWORD dwOffset, DWORD dwType);
|
||
BOOL _stdcall SetName(WCHAR ** ppName, BYTE * pInfo, DWORD dwOffset);
|
||
CBMOFQualList * _stdcall CreateQualList(WBEM_QualifierList *pql);
|
||
CBMOFObj * _stdcall CreateObj(WBEM_Object * pob);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|
||
|
||
|