2025-04-27 07:49:33 -04:00

439 lines
10 KiB
C++

// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
// NTDEVICETESTDlg.cpp : implementation file
//
#include "stdafx.h"
#include "NTDEVICETEST.h"
#include "NTDEVICETESTDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNTDEVICETESTDlg dialog
CNTDEVICETESTDlg::CNTDEVICETESTDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNTDEVICETESTDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNTDEVICETESTDlg)
m_nDeviceList = -1;
m_strClassType = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CNTDEVICETESTDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNTDEVICETESTDlg)
DDX_Control(pDX, IDC_SIBLING, m_wndSibling);
DDX_Control(pDX, IDC_CHILD, m_wndChild);
DDX_Control(pDX, IDC_PARENT, m_wndParent);
DDX_Control(pDX, IDC_BUSNUMBER, m_wndBusNumber);
DDX_Control(pDX, IDC_BUSTYPE, m_wndBusType);
DDX_Control(pDX, IDC_HARDWAREID, m_wndHardwareIDList);
DDX_Control(pDX, IDC_CONFIGFLAGS, m_wndConfigFlags);
DDX_Control(pDX, IDC_DEVICEID, m_wndDeviceID);
DDX_Control(pDX, IDC_IRQ, m_wndIRQ);
DDX_Control(pDX, IDC_PROBLEM, m_wndProblem);
DDX_Control(pDX, IDC_STATUS, m_wndStatus);
DDX_Control(pDX, IDC_SERVICE, m_wndService);
DDX_Control(pDX, IDC_CLASS, m_wndClass);
DDX_Control(pDX, IDC_DRIVER, m_wndDriver);
DDX_Control(pDX, IDC_DEVICELIST, m_wndDeviceList);
DDX_LBIndex(pDX, IDC_DEVICELIST, m_nDeviceList);
DDX_Text(pDX, IDC_CLASSTYPE, m_strClassType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNTDEVICETESTDlg, CDialog)
//{{AFX_MSG_MAP(CNTDEVICETESTDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_CONTROL( LBN_SELCHANGE, IDC_DEVICELIST, OnDeviceListSelChange )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNTDEVICETESTDlg message handlers
BOOL CNTDEVICETESTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
FillDeviceList( NULL, NULL );
return TRUE; // return TRUE unless you set the focus to a control
}
void CNTDEVICETESTDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CNTDEVICETESTDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CNTDEVICETESTDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CNTDEVICETESTDlg::FillDeviceList( LPCTSTR pszClassType, LPCTSTR pszDeviceID )
{
// Dump the list first
ClearDeviceList();
// Clear out the list
m_wndDeviceList.ResetContent();
DEVNODE dnRoot;
if ( CR_SUCCESS == g_configmgr.CM_Locate_DevNode(&dnRoot, (LPSTR) pszDeviceID, 0) )
{
if ( NULL == pszDeviceID )
{
DEVNODE dnFirst;
if ( CR_SUCCESS == g_configmgr.CM_Get_Child(&dnFirst, dnRoot, 0) )
{
CreateSubtree( NULL, NULL, dnFirst, pszClassType );
}
}
else
{
CreateSubtree( NULL, NULL, dnRoot, pszClassType );
}
}
}
void CNTDEVICETESTDlg::ClearDeviceList( void )
{
// Dump the list first
CConfigMgrDevice* pDevice = NULL;
while ( !m_DeviceList.IsEmpty() )
{
if ( NULL != ( pDevice = (CConfigMgrDevice*) m_DeviceList.RemoveHead() ) )
{
delete pDevice;
}
}
}
BOOL
CNTDEVICETESTDlg::CreateSubtree(
CConfigMgrDevice* pParent,
CConfigMgrDevice* pSibling,
DEVNODE dn,
LPCTSTR pszClassType
)
{
CConfigMgrDevice* pDevice;
DEVNODE dnSibling, dnChild;
CString strDeviceDesc,
strClass;
do
{
if (CR_SUCCESS != g_configmgr.CM_Get_Sibling(&dnSibling, dn, 0))
dnSibling = NULL;
pDevice = new CConfigMgrDevice( NULL, dn );
BOOL fGotDeviceDesc = pDevice->GetDeviceDesc( strDeviceDesc ),
fGotClass = pDevice->GetClass( strClass );
if ( ( fGotDeviceDesc && !strDeviceDesc.IsEmpty() )
&& ( NULL == pszClassType
|| 0 == strClass.CompareNoCase( pszClassType )
)
)
{
m_wndDeviceList.AddString( strDeviceDesc );
m_DeviceList.AddTail( pDevice );
}
else
{
delete pDevice;
}
/*
pDevice->Create(*m_pComputer, dn);
pDevice->SetParent(pParent);
if (pSibling)
pSibling->SetSibling(pDevice);
else if (pParent)
pParent->SetChild(pDevice);
TCHAR GuidString[MAX_GUID_STRING_LEN];
ULONG Size = sizeof(GuidString);
if (CR_SUCCESS == CM_Get_DevNode_Registry_Property_Ex(dn,
CM_DRP_CLASSGUID, NULL,
GuidString, &Size, 0, *m_pComputer) &&
_T('{') == GuidString[0] && _T('}') == GuidString[MAX_GUID_STRING_LEN - 2])
{
GUID Guid;
GuidString[MAX_GUID_STRING_LEN - 2] = _T('\0');
UuidFromString(&GuidString[1], &Guid);
pDevice->SetClassGuid(&Guid);
int Index;
if (SetupDiGetClassImageIndex(&m_ImageListData, &Guid, &Index))
pDevice->SetImageIndex(Index);
}
*/
if (CR_SUCCESS == g_configmgr.CM_Get_Child(&dnChild, dn, 0))
{
CreateSubtree(pDevice, NULL, dnChild, pszClassType);
}
dn = dnSibling;
pSibling = pDevice;
} while (NULL != dn);
return TRUE;
}
void CNTDEVICETESTDlg::OnOK()
{
UpdateData( TRUE );
FillDeviceList( ( m_strClassType.IsEmpty() ? (LPCTSTR) NULL : (LPCTSTR) m_strClassType ), NULL );
}
void CNTDEVICETESTDlg::OnCancel()
{
ClearDeviceList();
CDialog::OnCancel();
}
void CNTDEVICETESTDlg::OnDeviceListSelChange()
{
UpdateData( TRUE );
m_wndHardwareIDList.ResetContent();
POSITION pos = m_DeviceList.FindIndex( m_nDeviceList );
if ( NULL != pos )
{
CString strDeviceID;
CConfigMgrDevice* pDevice = (CConfigMgrDevice*) m_DeviceList.GetAt( pos );
if ( NULL != pDevice )
{
CString strTemp;
pDevice->GetClass( strTemp );
m_wndClass.SetWindowText( strTemp );
pDevice->GetDriver( strTemp );
m_wndDriver.SetWindowText( strTemp );
pDevice->GetService( strTemp );
m_wndService.SetWindowText( strTemp );
DWORD dwStatus = 0, dwProblem = 0,
dwIRQ = 0, dwConfigFlags;
pDevice->GetStatus( &dwStatus, &dwProblem );
strTemp.Format( "0x%x", dwStatus );
m_wndStatus.SetWindowText( strTemp );
strTemp.Format( "0x%x", dwProblem );
m_wndProblem.SetWindowText( strTemp );
// Do the IRQ Dance, BABY!
strTemp.Empty();
if ( pDevice->GetIRQ( &dwIRQ ) )
{
strTemp.Format( "%d", dwIRQ );
}
m_wndIRQ.SetWindowText( strTemp );
strTemp.Empty();
if ( pDevice->GetConfigFlags( dwConfigFlags ) )
{
strTemp.Format( "%d", dwConfigFlags );
}
m_wndConfigFlags.SetWindowText( strTemp );
pDevice->GetDeviceID( strDeviceID );
m_wndDeviceID.SetWindowText( strDeviceID );
CStringArray strArray;
if ( pDevice->GetHardwareID( strArray ) )
{
DWORD dwNumElements = strArray.GetSize();
for ( DWORD x = 0; x < dwNumElements; x++ )
{
m_wndHardwareIDList.AddString( strArray.GetAt(x) );
}
}
DWORD dwBusType = 0, dwBusNumber = 0;
strTemp.Empty();
if ( pDevice->GetBusInfo( &dwBusType, &dwBusNumber ) )
{
strTemp.Format( "%d", dwBusType );
m_wndBusType.SetWindowText( strTemp );
strTemp.Format( "%d", dwBusNumber );
m_wndBusNumber.SetWindowText( strTemp );
}
else
{
m_wndBusType.SetWindowText( strTemp );
m_wndBusNumber.SetWindowText( strTemp );
}
CConfigMgrDevice* pRelative = NULL;
strTemp.Empty();
if ( pDevice->GetParent( &pRelative ) )
{
pRelative->GetDeviceDesc( strTemp );
delete pRelative;
}
m_wndParent.SetWindowText( strTemp );
strTemp.Empty();
if ( pDevice->GetSibling( &pRelative ) )
{
pRelative->GetDeviceDesc( strTemp );
delete pRelative;
}
m_wndSibling.SetWindowText( strTemp );
strTemp.Empty();
if ( pDevice->GetChild( &pRelative ) )
{
pRelative->GetDeviceDesc( strTemp );
delete pRelative;
}
m_wndChild.SetWindowText( strTemp );
pDevice->GetRegistryStringValue( "Fred", strTemp );
}
}
}