/*++ Copyright (c) 1997-1999 Microsoft Corporation Revision History: --*/ /************STARTDOC********************************************************* * * print.c * * This file contains the functions print specific WMI structures * out to stdout. * * * Modification History: * -------------------- * * Drew McDaniel (drewm) - Sept. 16, 1997 - Original Source * * *************ENDDOC**********************************************************/ #include #include #include #include #include #include #include "print.h" // Defined constants // // Modular Data // // Function Prototypes // //+---------------------------------------------------------- // // Function: PrintGuid // // Descrip: Prints a singe guid. Does not print the end // new line or cariage return // // Returns: VOID // // Notes: Does not print end cariage return or new line // // History: 09/16/97 drewm Created //----------------------------------------------------------- VOID PrintGuid( LPGUID lpGuid ) { printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", lpGuid->Data1, lpGuid->Data2, lpGuid->Data3, lpGuid->Data4[0], lpGuid->Data4[1], lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]); } /* VOID PrintClassInfoHeader( PMOFCLASSINFO pMofClassInfo ) { printf("Guid: "); PrintGuid(&(pMofClassInfo->Guid)); printf("\n"); _tprintf(__T("Name: %s\n"), pMofClassInfo->Name); _tprintf(__T("Description: %s\n"), pMofClassInfo->Description); printf("Language ID: %u\n", pMofClassInfo->Language); printf("Flags: 0x%x\n", pMofClassInfo->Flags); printf("Version: %u\n", pMofClassInfo->Version); printf("\n"); } VOID PrintDataItem( PMOFDATAITEM lpDataItem ) { _tprintf(__T("Name: %s\n"), lpDataItem->Name); _tprintf(__T("Description: %s\n"), lpDataItem->Description); printf("Data Type: "); PrintDataType(lpDataItem->DataType); printf("\n"); printf("Version: %u\n", lpDataItem->Version); printf("Size: 0x%x\n", lpDataItem->SizeInBytes); printf("Flags: 0x%x\n", lpDataItem->Flags); printf("Embedded Class Guid: "); PrintGuid(&(lpDataItem->EmbeddedClassGuid)); printf("\n"); if (lpDataItem->Flags & MOFDI_FLAG_FIXED_ARRAY) { printf("Fixed array elements: %u\n", lpDataItem->FixedArrayElements); } if (lpDataItem->Flags & MOFDI_FLAG_VARIABLE_ARRAY) { printf("Variable length size ID: %u\n", lpDataItem->VariableArraySizeId); } } VOID PrintClassQualifier( LPTSTR lpQualifier, MOFHANDLE hMofHandle ) { BYTE Buffer[MAX_NAME_LENGTH]; DWORD dwBufferSize = MAX_NAME_LENGTH; DWORD dwRet; MOFDATATYPE MofDataType; dwRet = WmiMofQueryClassQualifier( hMofHandle, lpQualifier, &MofDataType, &dwBufferSize, Buffer); if (dwRet != ERROR_SUCCESS) { printf("WmiMofQueryClassQualifier failed. (%u)\n", dwRet); exit (0); } switch( MofDataType ) { case MOFInt32: case MOFUInt32: case MOFInt64: case MOFUInt64: case MOFInt16: case MOFUInt16: _tprintf(__T("%s: %u\n"), lpQualifier, Buffer); break; case MOFChar: case MOFString: case MOFWChar: _tprintf(__T("%s: %s\n"), lpQualifier, Buffer); break; case MOFByte: _tprintf(__T("%s: Unsupported type MOFByte\n"), lpQualifier); break; case MOFDate: _tprintf(__T("%s: Unsupported type MOFDate\n"), lpQualifier); break; case MOFBoolean: if (*Buffer == TRUE) { _tprintf(__T("%s: TRUE\n"), lpQualifier); } else { _tprintf(__T("%s: FALSE\n"), lpQualifier); } break; case MOFEmbedded: _tprintf(__T("%s: Unsupported type MOFEmbedded\n"), lpQualifier); break; case MOFUnknown: _tprintf(__T("%s: Unsupported type MOFUnknown\n"), lpQualifier); break; default: printf("Invalid Data Type\n"); } } VOID PrintDataType( MOFDATATYPE E_DataType ) { switch( E_DataType ) { case MOFInt32: printf("MOFInt32"); break; case MOFUInt32: printf("MOFUInt32"); break; case MOFInt64: printf("MOFInt64"); break; case MOFUInt64: printf("MOFUInt64"); break; case MOFInt16: printf("MOFInt16"); break; case MOFUInt16: printf("MOFUInt16"); break; case MOFChar: printf("MOFChar"); break; case MOFByte: printf("MOFByte"); break; case MOFWChar: printf("MOFWChar"); break; case MOFDate: printf("MOFDate"); break; case MOFBoolean: printf("MOFBoolean"); break; case MOFEmbedded: printf("MOFEmbedded"); break; case MOFString: printf("MOFString"); break; case MOFUnknown: printf("Unknown"); break; default: printf("Invalid Data Type\n"); } } */ VOID ClearScreen() { UINT i; for (i = 0; i < 40; i++) { printf("\n"); } } VOID WaitForUser() { printf("Hit Enter to Continue\n"); getchar (); getchar (); } /* //+---------------------------------------------------------- // // Function: PrintDescription // // Descrip: Prints the description of the selected guid // // Returns: VOID // // Notes: If there is an error in opening or printing // the description, an error message an error // code will be printed instead of the description. // // History: 09/16/97 drewm Created //----------------------------------------------------------- VOID PrintDescription( LPGUID lpGuid ) { DWORD dwRet; USHORT LangID; PMOFCLASSINFO pMofClassInfo; MOFHANDLE MofClassHandle; // Make the language ID // // LangID = MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US); LangID = MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL); // Get the class ID // dwRet = WmiMofOpenClassInfo( lpGuid, LangID, &(pMofClassInfo), &MofClassHandle); if (dwRet != ERROR_SUCCESS) { printf("Unable to open MofClassInfo handle (%u)\n", dwRet); return; } _tprintf(__T("%s\n"), pMofClassInfo->Description); WmiMofCloseClassInfo( MofClassHandle, pMofClassInfo ); } */ //+---------------------------------------------------------- // // Function: PrintHeader // // Descrip: Prints a wnode header structure. // // Returns: VOID // // Notes: None // // History: 04/08/97 drewm Created //----------------------------------------------------------- VOID PrintHeader( IN WNODE_HEADER Header ) { SYSTEMTIME sysTime; FILETIME fileTime; FILETIME localFileTime; // Convert the file time // fileTime.dwLowDateTime = Header.TimeStamp.LowPart; fileTime.dwHighDateTime = Header.TimeStamp.HighPart; FileTimeToLocalFileTime( &fileTime, &localFileTime ); FileTimeToSystemTime( &localFileTime, &sysTime); // Print the info // printf("Buffer Size: 0x%x\n" "Provider Id: 0x%x\n" "Version : %u\n" "Linkage : 0x%x\n" "Time Stamp : %u:%02u %u\\%u\\%u\n" "Guid : 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n" "Flags : 0x%02x\n", Header.BufferSize, Header.ProviderId, Header.Version, Header.Linkage, sysTime.wHour, sysTime.wMinute, sysTime.wMonth, sysTime.wDay, sysTime.wYear, Header.Guid.Data1, Header.Guid.Data2, Header.Guid.Data3, Header.Guid.Data4[0], Header.Guid.Data4[1], Header.Guid.Data4[2], Header.Guid.Data4[3], Header.Guid.Data4[4], Header.Guid.Data4[5], Header.Guid.Data4[6], Header.Guid.Data4[7], Header.Flags ); // Print readable flags // if (Header.Flags & WNODE_FLAG_ALL_DATA) { printf("WNODE_FLAG_ALL_DATA\n"); } if (Header.Flags & WNODE_FLAG_SINGLE_INSTANCE) { printf("WNODE_FLAG_SINGLE_INSTANCE\n"); } if (Header.Flags & WNODE_FLAG_SINGLE_ITEM) { printf("WNODE_FLAG_SINGLE_ITEM\n"); } if (Header.Flags & WNODE_FLAG_EVENT_ITEM) { printf("WNODE_FLAG_EVENT_ITEM\n"); } if (Header.Flags & WNODE_FLAG_FIXED_INSTANCE_SIZE) { printf("WNODE_FLAG_FIXED_INSTANCE_SIZE\n"); } if (Header.Flags & WNODE_FLAG_TOO_SMALL) { printf("WNODE_FLAG_TOO_SMALL\n"); } if (Header.Flags & WNODE_FLAG_INSTANCES_SAME) { printf("WNODE_FLAG_INSTANCES_SAME\n"); } if (Header.Flags & WNODE_FLAG_INTERNAL) { printf("WNODE_FLAG_INTERNAL\n"); } if (Header.Flags & WNODE_FLAG_USE_TIMESTAMP) { printf("WNODE_FLAG_USE_TIMESTAMP\n"); } if (Header.Flags & WNODE_FLAG_TRACED_GUID) { printf("WNODE_FLAG_TRACED_GUID\n"); } if (Header.Flags & WNODE_FLAG_EVENT_REFERENCE) { printf("WNODE_FLAG_EVENT_REFERENCE\n"); } if (Header.Flags & WNODE_FLAG_ANSI_INSTANCENAMES) { printf("WNODE_FLAG_ANSI_INSTANCENAMES\n"); } if (Header.Flags & WNODE_FLAG_METHOD_ITEM) { printf("WNODE_FLAG_METHOD_ITEM\n"); } if (Header.Flags & WNODE_FLAG_PDO_INSTANCE_NAMES) { printf("WNODE_FLAG_PDO_INSTANCE_NAMES\n"); } printf("\n"); } //+---------------------------------------------------------- // // Function: PrintAllData // // Descrip: Prints a WNODE_ALL_DATA structure. // // Returns: VOID // // Notes: None // // History: 04/08/97 drewm Created //----------------------------------------------------------- VOID PrintAllData( IN PWNODE_ALL_DATA Wnode ) { DWORD dwInstanceNum; DWORD dwByteCount; DWORD dwFlags; DWORD dwStructureNum = 1; DWORD dwTemp; DWORD dwInstanceSize; LPDWORD lpdwNameOffsets; PBYTE lpbyteData; BOOL bFixedSize = FALSE; USHORT usNameLength; WCHAR lpNameW[MAX_NAME_LENGTH]; CHAR lpName[MAX_NAME_LENGTH]; printf("\n\n"); do{ printf("\n\nPrinting WNODE_ALL_DATA structure %d.\n", dwStructureNum++); PrintHeader(Wnode->WnodeHeader); dwFlags = Wnode->WnodeHeader.Flags; if ( ! (dwFlags & WNODE_FLAG_ALL_DATA)) { printf("Not a WNODE_ALL_DATA structure\n"); return; } // Check for fixed instance size // if ( dwFlags & WNODE_FLAG_FIXED_INSTANCE_SIZE ) { dwInstanceSize = Wnode->FixedInstanceSize; bFixedSize = TRUE; lpbyteData = OffsetToPtr((PBYTE)Wnode, Wnode->DataBlockOffset); printf("Fixed size: 0x%x\n", dwInstanceSize); } // Get a pointer to the array of offsets to the instance names // lpdwNameOffsets = (LPDWORD) OffsetToPtr(Wnode, Wnode->OffsetInstanceNameOffsets); // Print out each instance name and data. The name will always be // in UNICODE so it needs to be translated to ASCII before it can be // printed out. // for ( dwInstanceNum = 0; dwInstanceNum < Wnode->InstanceCount; dwInstanceNum++) { printf("Instance %d\n", 1 + dwInstanceNum); PrintCountedString( (LPTSTR) OffsetToPtr( Wnode, lpdwNameOffsets[dwInstanceNum]) ); // Length and offset for variable data // if ( !bFixedSize) { dwInstanceSize = Wnode->OffsetInstanceDataAndLength[dwInstanceNum]. LengthInstanceData; printf("Data size 0x%x\n", dwInstanceSize); lpbyteData = (PBYTE) OffsetToPtr( (PBYTE)Wnode, Wnode->OffsetInstanceDataAndLength[dwInstanceNum]. OffsetInstanceData); } printf("Data:"); for ( dwByteCount = 0; dwByteCount < dwInstanceSize;) { // Print data in groups of DWORDS but allow for single bytes. // if ( (dwByteCount % 16) == 0) { printf("\n"); } if ( (dwByteCount % 4) == 0) { printf(" 0x"); } dwTemp = *((LPDWORD)lpbyteData); printf("%08x", dwTemp ); lpbyteData += sizeof(DWORD); dwByteCount += sizeof(DWORD); } // for cByteCount printf("\n\n"); } // for cInstanceNum // Update Wnode to point to next node // if ( Wnode->WnodeHeader.Linkage != 0) { Wnode = (PWNODE_ALL_DATA) OffsetToPtr( Wnode, Wnode->WnodeHeader.Linkage); } else { Wnode = 0; } }while(Wnode != 0); } //+---------------------------------------------------------- // // Function: PrintSingleInstance // // Descrip: Prints a WNODE_SINGLE_INSTANCE structure. // // Returns: VOID // // Notes: None // // History: 04/08/97 drewm Created //----------------------------------------------------------- VOID PrintSingleInstance( IN PWNODE_SINGLE_INSTANCE Wnode ) { DWORD dwByteCount; DWORD dwFlags; LPDWORD lpdwData; USHORT usNameLength; WCHAR lpNameW[MAX_NAME_LENGTH]; CHAR lpName[MAX_NAME_LENGTH]; dwFlags = Wnode->WnodeHeader.Flags; if ( ! (dwFlags & WNODE_FLAG_SINGLE_INSTANCE)) { printf("Not a WNODE_SINGLE_INSTANCE structure\n"); return; } printf("\nPrinting WNODE_SINGLE_INSTANCE.\n"); PrintHeader(Wnode->WnodeHeader); // Print name or index number // if ( dwFlags & WNODE_FLAG_STATIC_INSTANCE_NAMES ) { printf("Instance index: %d\n", Wnode->InstanceIndex); } usNameLength = * (USHORT *) OffsetToPtr(Wnode, Wnode->OffsetInstanceName); printf("Name length 0x%x\n", usNameLength); usNameLength /= 2; PrintCountedString( (LPTSTR) OffsetToPtr( Wnode, Wnode->OffsetInstanceName) ); // wcscpy(lpNameW, (LPWSTR) (OffsetToPtr(Wnode, Wnode->OffsetInstanceName ) // + sizeof(USHORT))); // wcsncpy( lpNameW + usNameLength, L" ", 2); // wcstombs( lpName, lpNameW, 300); // printf("%s\n", lpName); // Print out the Data // printf("Data:\n"); printf("Data Size: 0x%x\n", Wnode->SizeDataBlock); lpdwData = (PULONG) OffsetToPtr(Wnode, Wnode->DataBlockOffset); for ( dwByteCount = 0; dwByteCount < Wnode->SizeDataBlock; dwByteCount+= sizeof(ULONG)) { if ( (dwByteCount % 16) == 0) { printf("\n"); } printf("0x%08x ", *lpdwData ); lpdwData++; } printf("\n"); } // PrintSingleInstance VOID PrintCountedString( LPTSTR lpString ) { SHORT usNameLength; LPTSTR lpStringPlusNull; usNameLength = * (USHORT *) lpString; lpStringPlusNull = (LPTSTR) malloc ( usNameLength + sizeof(TCHAR) ); if (lpStringPlusNull != NULL) { lpString = (LPTSTR) ((PBYTE)lpString + sizeof(USHORT)); if (MyIsTextUnicode(lpString)) { usNameLength /= 2; } _tcsncpy( lpStringPlusNull, lpString, usNameLength ); _tcscpy( lpStringPlusNull + usNameLength, __T("") ); _tprintf(__T("%s\n"), lpStringPlusNull); free(lpStringPlusNull); } }