pciconfigdlg.cpp

来自「Windows下Hardware直接读写」· C++ 代码 · 共 227 行

CPP
227
字号
// PCIConfigDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "HW_sigal.h"
#include "PCIConfigDlg.h"
#include ".\pciconfigdlg.h"
#include "HwReadWrite.h"
#include "PCIName.h"

// CPCIConfigDlg 对话框

IMPLEMENT_DYNAMIC(CPCIConfigDlg, CDialog)
CPCIConfigDlg::CPCIConfigDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPCIConfigDlg::IDD, pParent)
	, m_nOffset(_T(""))
	, m_nValue(_T(""))
	, m_strStaticPciInfo(_T(""))
	, m_nCurBusNum(0)
	, m_nCurDevNum(0)
	, m_nCurFunNum(0)
{
	EnableActiveAccessibility();
	
}

CPCIConfigDlg::~CPCIConfigDlg()
{

}

void CPCIConfigDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_PCI_CONFREG, c_listPciConfReg);
	//	DDX_Control(pDX, IDC_COMBO_PCI_DEVICES, c_cbPciDevList);
	DDX_Control(pDX, IDC_COMBO_PCI_LIST, c_pciComboList);
	DDX_Text(pDX, IDC_EDIT_OFFSET, m_nOffset);
	DDX_Text(pDX, IDC_EDIT_VALUE, m_nValue);
	DDX_Text(pDX, IDC_STATIC_PCI_INFO, m_strStaticPciInfo);
	DDX_Control(pDX, IDC_STATIC_PCI_INFO, cStaticVDInfo);
}


BEGIN_MESSAGE_MAP(CPCIConfigDlg, CDialog)
	ON_WM_SHOWWINDOW()
	ON_CBN_SELCHANGE(IDC_COMBO_PCI_LIST, OnCbnSelchangeComboPciList)
	ON_NOTIFY(HDN_ITEMCLICK, 0, OnHdnItemclickListPciConfreg)
	ON_NOTIFY(NM_CLICK, IDC_LIST_PCI_CONFREG, OnNMClickListPciConfreg)
END_MESSAGE_MAP()


// CPCIConfigDlg 消息处理程序

void CPCIConfigDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	int pciDeviceNum;

	CDialog::OnShowWindow(bShow, nStatus);

	// TODO: 在此处添加消息处理程序代码
	
	pciDeviceNum = gpHwRw->GetAllPciConfig();
	
	// Dump the list elements to the debug window.
	POSITION pos = gpHwRw->listPciQueryResults.GetHeadPosition();
	for (int i=0;i < gpHwRw->listPciQueryResults.GetCount();i++)
	{
		PCIQUERYRESULT pciRet;
		CString strPciDes;
		pciRet = gpHwRw->listPciQueryResults.GetNext(pos);
		strPciDes.Format("pci %d, bus %2x, device %2x, function %2x", 
			i+1,
			pciRet.pciQuery.busNum,
			pciRet.pciQuery.slotNum.u.bits.DeviceNumber,
			pciRet.pciQuery.slotNum.u.bits.FunctionNumber);
		this->c_pciComboList.InsertString(-1,strPciDes);
	}
	this->c_pciComboList.SetCurSel(0);

	//this->c_cbPciDevList.AddString(

	// Set full row selection
	ListView_SetExtendedListViewStyleEx(c_listPciConfReg.GetSafeHwnd(), LVS_EX_FULLROWSELECT , LVS_EX_FULLROWSELECT);

	//Initialize the list box
	CHeaderCtrl *pHeader = c_listPciConfReg.GetHeaderCtrl();
	CRect rect;
	c_listPciConfReg.GetClientRect(&rect);
	int nInterval = rect.Width()/5;
	c_listPciConfReg.InsertColumn(0, _T("Offset"), LVCFMT_LEFT, nInterval);
	c_listPciConfReg.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nInterval);
	c_listPciConfReg.InsertColumn(2, _T("Description"), LVCFMT_LEFT, rect.Width()-2*nInterval-2); 
	//pHeader->ModifyStyle(
	ShowPciReg(0);
	ShowPciInfo(0);
	
}

int CPCIConfigDlg::ShowPciReg(int pciIndex)
{
	if(gpHwRw == NULL || pciIndex >= gpHwRw->listPciQueryResults.GetCount())
		return -1;
	POSITION pos = gpHwRw->listPciQueryResults.GetHeadPosition();
	for (int i=0;i < pciIndex;i++)
	{
		gpHwRw->listPciQueryResults.GetNext(pos);
	}
	PCIQUERYRESULT pciRet = gpHwRw->listPciQueryResults.GetAt(pos);

	m_nCurBusNum = pciRet.pciQuery.busNum;
	m_nCurDevNum = pciRet.pciQuery.slotNum.u.bits.DeviceNumber;
	m_nCurFunNum = pciRet.pciQuery.slotNum.u.bits.FunctionNumber;
	// Put 10 items in the list
	LV_ITEM lvi;
	TCHAR szItem[256];
	lvi.mask = LVIF_TEXT;

	TCHAR regDes[256];
	PCIName pciName;
	c_listPciConfReg.DeleteAllItems();
//	PCI_COMMON_CONFIG pciComConf;
	for (int i=0; i  < sizeof(PCI_COMMON_CONFIG)/sizeof(DWORD); i++)
	{
		DWORD* pciRegDword = (DWORD*) (&pciRet.pciComConfig);
		// First item
		lvi.iItem = i;
		lvi.iSubItem = 0;
		_stprintf(szItem, _T("%03x"), i*4);
		lvi.pszText = szItem;
		c_listPciConfReg.InsertItem(&lvi);

		// SubItem 1
		lvi.iSubItem = 1;
		_stprintf(szItem, _T("%08x"), *(pciRegDword+i));
		lvi.pszText = szItem;
		c_listPciConfReg.SetItem(&lvi);

		// SubItem 2
		lvi.iSubItem = 2;
		if( 0 == pciName.GetRegDes(i*4, regDes))
		{
			_stprintf(szItem, _T("%s"), regDes);
		}
		else
		{
			_stprintf(szItem, _T("%s"), "PCI Device Specific");
		}
		c_listPciConfReg.SetItem(&lvi);

	}
	return 0;
}

void CPCIConfigDlg::OnCbnSelchangeComboPciList()
{
	// TODO: 在此添加控件通知处理程序代码
	int curIndex = c_pciComboList.GetCurSel();
	this->ShowPciReg(curIndex);
	this->ShowPciInfo(curIndex);
}

void CPCIConfigDlg::OnHdnItemclickListPciConfreg(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);

	MessageBox("abcd");
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
}

void CPCIConfigDlg::OnNMClickListPciConfreg(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	unsigned long regConfReg;
	int offset;
	POSITION p = this->c_listPciConfReg.GetFirstSelectedItemPosition();
	int indexSelected = this->c_listPciConfReg.GetNextSelectedItem(p);

	
	TCHAR szBuffer[1024];
	DWORD cchBuf(1024);
	LVITEM lvi;
	lvi.iItem = indexSelected;
	lvi.iSubItem = 0;
	lvi.mask = LVIF_TEXT;
	lvi.pszText = szBuffer;
	lvi.cchTextMax = cchBuf;
	this->c_listPciConfReg.GetItem(&lvi);
	this->m_nOffset = CString(szBuffer);
	offset = _tcstoul(m_nOffset, 0, 16);

	regConfReg = 0x80000000|(m_nCurBusNum << 16) | (m_nCurDevNum << 11) | (m_nCurFunNum << 8) | offset;
	this->m_nOffset.Format("%08X", regConfReg);
	
	
	lvi.iSubItem = 1;
	this->c_listPciConfReg.GetItem(&lvi);
	this->m_nValue = CString(szBuffer);
	
	this->UpdateData(FALSE);
	*pResult = 0;
}

int CPCIConfigDlg::ShowPciInfo(int pciIndex)
{
	PCIName pciName;
	char vendorName[256] = {0};
	char deviceName[256] = {0};
	if(gpHwRw == NULL || pciIndex >= gpHwRw->listPciQueryResults.GetCount())
		return -1;
	POSITION pos = gpHwRw->listPciQueryResults.GetHeadPosition();
	for (int i=0;i < pciIndex;i++)
	{
		gpHwRw->listPciQueryResults.GetNext(pos);
	}
	PCIQUERYRESULT pciRet = gpHwRw->listPciQueryResults.GetAt(pos);

	if(-1 != pciName.GetVendorDeviceName(pciRet.pciComConfig.VendorID, pciRet.pciComConfig.DeviceID, vendorName, deviceName))
	{
		this->m_strStaticPciInfo.Format("Vendor:\n%s\n\nDevice:\n%s\n", vendorName, deviceName);
		SetDlgItemText(IDC_STATIC_PCI_INFO,m_strStaticPciInfo);
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?