//*************************************************************************** // // (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* ; // // --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 ::= ; // // // 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 of the null-terminated name. DWORD dwOffsetValue; // Offset in 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\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 of the null-terminated name. DWORD dwOffsetValue; // Offset in 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