|
|
/*++
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); }
|