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 + -
显示快捷键?