WindowsXP-SP1/base/wmi/enumguid/dspdatadlg.cpp
2020-09-30 16:53:49 +02:00

255 lines
7.2 KiB
C++

/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
dspdatadlg.c
Abstract:
Author:
16-Jan-1997 AlanWar
Revision History:
--*/
// DisplayDataDlg.cpp : implementation file
//
#include "stdafx.h"
#include "EnumGuid.h"
#include "DspDataDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDisplayDataDlg dialog
#include "wmihlp.h"
CDisplayDataDlg::CDisplayDataDlg(PWNODE_ALL_DATA pwNode,
CWnd* pParent /*=NULL*/)
: CDialog(CDisplayDataDlg::IDD, pParent), pwNode(pwNode), pwSingleNode(0)
{
//{{AFX_DATA_INIT(CDisplayDataDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CDisplayDataDlg::CDisplayDataDlg(PWNODE_SINGLE_INSTANCE pwNode,
CWnd* pParent /*=NULL*/)
: CDialog(CDisplayDataDlg::IDD, pParent), pwNode(0),
pwSingleNode(pwNode) {}
void CDisplayDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDisplayDataDlg)
DDX_Control(pDX, IDC_DATA, txtData);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDisplayDataDlg, CDialog)
//{{AFX_MSG_MAP(CDisplayDataDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDisplayDataDlg message handlers
BOOL CDisplayDataDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (pwNode)
DisplayAllData(pwNode);
else if (pwSingleNode)
DisplaySingleInstance(pwSingleNode);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDisplayDataDlg::DisplayAllData(PWNODE_ALL_DATA Wnode)
{
DWORD dwInstanceNum;
DWORD dwByteCount;
DWORD dwFlags;
DWORD dwStructureNum = 1;
DWORD dwTemp;
DWORD dwInstanceSize;
LPDWORD lpdwNameOffsets;
PBYTE lpbyteData;
BOOL bFixedSize = FALSE;
CString output, tmp;
do {
tmp.Format(_T("\r\nWNODE_ALL_DATA structure %d.\r\n"), dwStructureNum++);
output += tmp;
PrintHeader(Wnode->WnodeHeader, output);
dwFlags = Wnode->WnodeHeader.Flags;
if ( ! (dwFlags & WNODE_FLAG_ALL_DATA)) {
txtData.SetWindowText(_T("Not a WNODE_ALL_DATA structure\r\n"));
return;
}
// Check for fixed instance size
//
bFixedSize = FALSE;
if ( dwFlags & WNODE_FLAG_FIXED_INSTANCE_SIZE ) {
dwInstanceSize = Wnode->FixedInstanceSize;
bFixedSize = TRUE;
lpbyteData = OffsetToPtr((PBYTE)Wnode, Wnode->DataBlockOffset);
tmp.Format(_T("Fixed size: 0x%x\r\n"), dwInstanceSize);
output += tmp;
}
// 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++) {
tmp.Format(_T("Instance %d\r\n"), 1 + dwInstanceNum);
output += tmp;
PrintCountedString( (LPTSTR)
OffsetToPtr( Wnode,
lpdwNameOffsets[dwInstanceNum]),
output);
// Length and offset for variable data
//
if ( !bFixedSize) {
dwInstanceSize = Wnode->OffsetInstanceDataAndLength[dwInstanceNum].
LengthInstanceData;
tmp.Format(_T("Data size 0x%x\r\n"), dwInstanceSize);
output += tmp;
lpbyteData = (PBYTE) OffsetToPtr((PBYTE)Wnode,
Wnode->OffsetInstanceDataAndLength[dwInstanceNum].
OffsetInstanceData);
}
output += _T(" Data:");
for ( dwByteCount = 0; dwByteCount < dwInstanceSize; ) {
// Print data in groups of DWORDS but allow for single bytes.
//
if ( (dwByteCount % 16) == 0) {
output += _T("\r\n");
}
if ( (dwByteCount % 4) == 0) {
output += _T(" "); // _T(" 0x");
}
dwTemp = *((LPDWORD)lpbyteData);
tmp.Format(_T("%.8x"), dwTemp );
output += tmp;
lpbyteData += sizeof(DWORD);
dwByteCount += sizeof(DWORD);
} // for cByteCount
output += _T("\r\n\r\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);
txtData.SetWindowText(output);
}
void CDisplayDataDlg::DisplaySingleInstance(PWNODE_SINGLE_INSTANCE Wnode)
{
DWORD dwByteCount;
DWORD dwFlags;
LPDWORD lpdwData;
USHORT usNameLength;
CString tmp, output;
dwFlags = Wnode->WnodeHeader.Flags;
if ( ! (dwFlags & WNODE_FLAG_SINGLE_INSTANCE)) {
txtData.SetWindowText(_T("Not a WNODE_SINGLE_INSTANCE structure"));
return;
}
output = _T("WNODE_SINGLE_INSTANCE.\r\n");
PrintHeader(Wnode->WnodeHeader, output);
// Print name or index number
//
if ( dwFlags & WNODE_FLAG_STATIC_INSTANCE_NAMES ) {
tmp.Format(_T("Instance index: %d\r\n"), Wnode->InstanceIndex);
output += tmp;
}
usNameLength = * (USHORT *) OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
tmp.Format(_T("Name length 0x%x\r\n"), usNameLength);
output += tmp;
usNameLength /= 2;
PrintCountedString( (LPTSTR) OffsetToPtr( Wnode,
Wnode->OffsetInstanceName), output );
// wcscpy(lpNameW, (LPWSTR) (OffsetToPtr(Wnode, Wnode->OffsetInstanceName )
// + sizeof(USHORT)));
// wcsncpy( lpNameW + usNameLength, L" ", 2);
// wcstombs( lpName, lpNameW, 300);
// printf("%s\r\n", lpName);
// Print out the Data
//
tmp.Format(_T(" Data:\r\nData Size: 0x%x\r\n"), Wnode->SizeDataBlock);
output += tmp;
lpdwData = (PULONG) OffsetToPtr(Wnode, Wnode->DataBlockOffset);
for ( dwByteCount = 0; dwByteCount < Wnode->SizeDataBlock; dwByteCount+= sizeof(ULONG)) {
if ( (dwByteCount % 16) == 0) {
output += _T("\r\n");
}
tmp.Format(_T("0x%.8x "), *lpdwData);
output += tmp;
lpdwData++;
}
txtData.SetWindowText(output);
}