255 lines
6.9 KiB
C++
255 lines
6.9 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);
|
||
|
}
|
||
|
|