📄 usbviewdlg.cpp
字号:
// UsbviewDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Usbview.h"
#include "UsbviewDlg.h"
#include "vndrlist.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
#define NUM_HCS_TO_CHECK 10
#define BUFFERALLOCINCREMENT 8192
#define BUFFERMINFREESPACE 1024
int TotalHubs;
int TotalDevicesConnected;
HWND ghTreeWnd;
CMenu *ghMainMenu;
CHAR *TextBuffer = NULL;
int TextBufferLen = 0;
int TextBufferPos = 0;
HIMAGELIST himl;
//Icon索引
int giUsbDevice;
int giBangDevice;
int giComputer;
int giHub;
int giPort;
PCHAR PConnectionStatuse[]={
"NoDeviceConnected",
"DeviceConnected",
"DeviceFailedEnumeration",
"DeviceGeneralFailure",
"DeviceCausedOvercurrent",
"DeviceNotEnoughPower"
};
TERMTYPE TermTypes[] =
{
// 2.1 USB Terminal Types
{0x0100, "USB Undefined"},
{0x0101, "USB streaming"},
{0x01FF, "USB vendor specific"},
// 2.2 Input Terminal Types
{0x0200, "Input Undefined"},
{0x0201, "Microphone"},
{0x0202, "Desktop microphone"},
{0x0203, "Personal microphone"},
{0x0204, "Omni-directional microphone"},
{0x0205, "Microphone array"},
{0x0206, "Processing microphone array"},
// 2.3 Output Terminal Types
{0x0300, "Output Undefined"},
{0x0301, "Speaker"},
{0x0302, "Headphones"},
{0x0303, "Head Mounted Display Audio"},
{0x0304, "Desktop speaker"},
{0x0305, "Room speaker"},
{0x0306, "Communication speaker"},
{0x0307, "Low frequency effects speaker"},
// 2.4 Bi-directional Terminal Types
{0x0400, "Bi-directional Undefined"},
{0x0401, "Handset"},
{0x0402, "Headset"},
{0x0403, "Speakerphone, no echo reduction"},
{0x0404, "Echo-suppressing speakerphone"},
{0x0405, "Echo-canceling speakerphone"},
// 2.5 Telephony Terminal Types
{0x0500, "Telephony Undefined"},
{0x0501, "Phone line"},
{0x0502, "Telephone"},
{0x0503, "Down Line Phone"},
// 2.6 External Terminal Types
{0x0600, "External Undefined"},
{0x0601, "Analog connector"},
{0x0602, "Digital audio interface"},
{0x0603, "Line connector"},
{0x0604, "Legacy audio connector"},
{0x0605, "S/PDIF interface"},
{0x0606, "1394 DA stream"},
{0x0607, "1394 DV stream soundtrack"},
// Embedded Function Terminal Types
{0x0700, "Embedded Undefined"},
{0x0701, "Level Calibration Noise Source"},
{0x0702, "Equalization Noise"},
{0x0703, "CD player"},
{0x0704, "DAT"},
{0x0705, "DCC"},
{0x0706, "MiniDisk"},
{0x0707, "Analog Tape"},
{0x0708, "Phonograph"},
{0x0709, "VCR Audio"},
{0x070A, "Video Disc Audio"},
{0x070B, "DVD Audio"},
{0x070C, "TV Tuner Audio"},
{0x070D, "Satellite Receiver Audio"},
{0x070E, "Cable Tuner Audio"},
{0x070F, "DSS Audio"},
{0x0710, "Radio Receiver"},
{0x0711, "Radio Transmitter"},
{0x0712, "Multi-track Recorder"},
{0x0713, "Synthesizer"},
// Terminate List
{0xFFFF, NULL}
};
// USB Device Class Definition for Audio Data Formats 0.9 Draft Revision
FORMATTYPE FormatTypes[] =
{
// A.1.1 Audio Data Format Type I Codes
{0x0000, "TYPE_I_UNDEFINED"},
{0x0001, "PCM"},
{0x0002, "PCM8"},
{0x0003, "IEEE_FLOAT"},
{0x0004, "ALAW"},
{0x0005, "MULAW"},
// A.1.2 Audio Data Format Type II Codes
{0x1000, "TYPE_II_UNDEFINED"},
{0x1001, "MPEG"},
{0x1002, "AC-3"},
// A.1.3 Audio Data Format Type III Codes
{0x2000, "TYPE_III_UNDEFINED"},
{0x2001, "IEC1937_AC-3"},
{0x2002, "IEC1937_MPEG-1_Layer1"},
{0x2003, "IEC1937_MPEG-1_Layer2/3 or IEC1937_MPEG-2_NOEXT"},
{0x2004, "IEC1937_MPEG-2_EXT"},
{0x2005, "IEC1937_MPEG-2_Layer1_LS"},
{0x2006, "IEC1937_MPEG-2_Layer2/3_LS"},
// Terminate List
{0xFFFF, NULL}
};
/////////////////////////////////////////////////////////////////////////////
// CUsbviewDlg dialog
CUsbviewDlg::CUsbviewDlg(CWnd* pParent /*=NULL*/)
: CWinCtrl(CUsbviewDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUsbviewDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CUsbviewDlg::DoDataExchange(CDataExchange* pDX)
{
CWinCtrl::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUsbviewDlg)
DDX_Control(pDX, IDC_TREE, m_tree);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUsbviewDlg, CDialog)
//{{AFX_MSG_MAP(CUsbviewDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DEVICECHANGE()
ON_COMMAND(IDM_REFRESH, OnRefresh)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree)
ON_WM_SIZE()
ON_COMMAND(IDM_AUTOREFRESH, OnAutorefresh)
ON_COMMAND(IDM_CONFIG_DESCRIPTOR, OnConfigDescriptor)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUsbviewDlg message handlers
BOOL CUsbviewDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
// TODO: Add extra initialization here
bAutoRefresh=false;
bConfigDesc=true;
ghMainMenu=this->GetMenu();
CWinCtrl::OnInitDialog();
CWinCtrl::ShowSizeIcon(TRUE);//显示可以调整大小的图标
// 控件信息数组
/*
typedef struct _dlgControlTag
{
int iId; // 控件ID
int iFlag; // 标志,表示怎样改变控件的位置或者大小
int iPercent; // 改变值占对话框改变值的百分比
} DLGCTLINFO, *PDLGCTLINFO;
enum
{
MOVEX = 0, // 控件在X方向(左右)移动
MOVEY, // 控件在Y方向(上下)移动
MOVEXY, // 控件在X方向和Y方向同时移动
ELASTICX, // 控件在X方向(宽度)改变大小
ELASTICY, // 控件在Y方向改(高度)改变大小
ELASTICXY // 控件在X方向和Y方向同时改变大小
};
*/
static DLGCTLINFO dcMenuGroup[] =
{
// {IDC_TREE,MOVEX,50},
{IDC_EDIT,MOVEX,45},
{IDC_STATIC,MOVEX,45},
// {IDC_TREE,MOVEY,100},
// {IDC_EDIT,MOVEY,50},
// {IDC_STATIC,MOVEY,50},
{IDC_TREE,ELASTICX,50},
{IDC_TREE,ELASTICY,100},
{IDC_EDIT,ELASTICX,50},
{IDC_EDIT,ELASTICY,100},
{IDC_STATIC,ELASTICX,50},
{IDC_STATIC,ELASTICY,100},
};
SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));
GetDlgItem(IDC_EDIT)->SetWindowText("");
if(CreateTextBuffer()==FALSE)
return FALSE;
ghTreeWnd=::GetDlgItem(this->m_hWnd,IDC_TREE);
DWORD dwStyle=GetWindowLong(m_tree.m_hWnd,GWL_STYLE);
dwStyle|=TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);
if(CreateIcon()==FALSE)
return false;
m_hRoot=NULL;
m_hRoot=AddLeaf(TVI_ROOT, 0, "USB root");
// m_hRoot=m_tree.InsertItem("USB root");
EnumerateHostControllers(m_hRoot);
return TRUE; // return TRUE unless you set the focus to a control
}
void CUsbviewDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
/* MENUITEMINFO menuInfo;
if((nID&0xfff0)==IDM_AUTOREFRESH)
{
bAutoRefresh = !bAutoRefresh;
menuInfo.cbSize = sizeof(menuInfo);
menuInfo.fMask = MIIM_STATE;
menuInfo.fState = bAutoRefresh ? MFS_CHECKED : MFS_UNCHECKED;
SetMenuItemInfo(ghMainMenu->m_hMenu,nID,FALSE,&menuInfo);
}
else if((nID&0xfff0)==IDM_CONFIG_DESCRIPTOR)
{
bConfigDesc = !bConfigDesc;
menuInfo.cbSize = sizeof(menuInfo);
menuInfo.fMask = MIIM_STATE;
menuInfo.fState = bConfigDesc ? MFS_CHECKED : MFS_UNCHECKED;
SetMenuItemInfo(ghMainMenu->m_hMenu,nID,FALSE,&menuInfo);
}
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 CUsbviewDlg::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 CUsbviewDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/*
计算机上的USB主控制器以HCD1,HCD2等命名。通过控制器名称,使用CCreateFile 打开它.
使用DeviceIoControl即可得到其驱动程序名,以及与它连接的HUB的名称。用CCreateFile打
开HUB,获得连接信息。再枚举HUB的各个端口即可获得连接的设备信息
通过枚举USB控制器->枚举此控制器上的USB HUB->枚举HUB的各个端口->获得设备信息
*/
void CUsbviewDlg::EnumerateHostControllers(HTREEITEM hTreeParent)
{
char HCName[16];
int HCNum;
HANDLE hHCDev;
PCHAR leafName;
// HDEVINFO deviceInfo;
// SP_DEVICE_INTERFACE_DATA deviceInfoData;
// PSP_DEVICE_INTERFACE_DETAIL_DATA deviceDetailData;
// ULONG index;
// ULONG requiredLength;
// TotalDevicesConnected = 0;
// TotalHubs = 0;
// Iterate over some Host Controller names and try to open them.
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
// for(HCNum=0;HCNum<1;HCNum++) //先设为1,用于详细理解获取一个设备信息的全过程
{
//计算机上的USB主控制器以HCD1,HCD2等命名(HCD:host controller driver)
wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
hHCDev=CreateFile(HCName,GENERIC_WRITE,FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,0,NULL);
// If the handle is valid, then we've successfully opened a Host
// Controller. Display some info about the Host Controller itself,
// then enumerate the Root Hub attached to the Host Controller.
//
if (hHCDev != INVALID_HANDLE_VALUE)
{
leafName = HCName + sizeof("\\\\.\\") - sizeof("");
EnumerateHostController(hTreeParent,hHCDev,leafName);
CloseHandle(hHCDev);
}
}
return;
}
VOID CUsbviewDlg::EnumerateHostController(HTREEITEM hTreeParent,
HANDLE hHCDev,PCHAR leafName)
{
PCHAR driverKeyName;
PCHAR deviceDesc;
HTREEITEM hHCItem;
PCHAR rootHubName;
driverKeyName = GetHCDDriverKeyName(hHCDev);
if (driverKeyName)
{
deviceDesc = DriverNameToDeviceDesc(driverKeyName);
if (deviceDesc)
{
leafName = NULL;
leafName = deviceDesc;
}
CString str;
str.Empty();
str=leafName;
// hHCItem=m_tree.InsertItem(str.operator LPCTSTR(),hTreeParent);
hHCItem=AddLeaf(hTreeParent,0,(char*)str.operator LPCTSTR());
m_tree.Expand(hTreeParent,TVE_EXPAND);
GlobalFree(driverKeyName);
}
if (hHCItem)
{
rootHubName=GetRootHubName(hHCDev);
//rootHubName="USB#ROOT_HUB#4&ea3064f&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}"
if(rootHubName!=NULL)
{
EnumerateHub(hHCItem,
rootHubName,
NULL, // ConnectionInfo
NULL, // ConfigDesc
NULL, // StringDescs
"RootHub" // DeviceDesc
);
}
}
return;
}
/*++
*函数:
EnumerateHub();
*参数:
hTreeParent TreeItem句柄
HubName root hub name
ConnectionInfo
ConfigDesc
StringDescs
DeviceDesc "RootHub"
*作用:
枚举root hub name下面的usb hub
*返回:
VOID
--*/
/*
EnumerateHub(hHCItem,
rootHubName,
NULL, // ConnectionInfo
NULL, // ConfigDesc
NULL, // StringDescs
"RootHub" // DeviceDesc
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -