www.pudn.com > wave-bulktransfer.rar > usbhostDlg.cpp


// usbhostDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "usbhost.h" 
#include "usbhostDlg.h" 
 
#include "usb100.h" 
#include "winioctl.h" 
#include "usbdriver.h"  
 
#include "math.h" 
#include "process.h" 
 
#define PI 3.1415926 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
unsigned char  PacketoutBuffer[1024];  
bool g_KeepGoing = false; 
void __cdecl SendThreadFunction(HANDLE hDevice); 
///////////////////////////////////////////////////////////////////////////// 
// 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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CUsbhostDlg dialog 
 
CUsbhostDlg::CUsbhostDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CUsbhostDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CUsbhostDlg) 
		// 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); 
} 
 
CUsbhostDlg::~CUsbhostDlg() 
{ 
	delete m_PointList; 
} 
 
void CUsbhostDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CUsbhostDlg) 
	DDX_Control(pDX, IDC_USB_LIST, m_UsbList); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CUsbhostDlg, CDialog) 
	//{{AFX_MSG_MAP(CUsbhostDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_DEVICE_BUTTON, OnDeviceButton) 
	ON_BN_CLICKED(IDC_CONFIG_BUTTON, OnConfigButton) 
	ON_BN_CLICKED(IDC_INTERFACE_BUTTON, OnInterfaceButton) 
	ON_BN_CLICKED(IDC_ENDPOINT_BUTTON, OnEndpointButton) 
	ON_BN_CLICKED(IDC_STRING_BUTTON, OnStringButton) 
	ON_BN_CLICKED(IDC_CLEAR_BUTTON, OnClearButton) 
	ON_BN_CLICKED(IDC_FRAME_BUTTON, OnFrameButton) 
	ON_BN_CLICKED(IDC_END_BUTTON, OnEndButton) 
	ON_BN_CLICKED(IDC_EXIT_BUTTON, OnExitButton) 
	ON_BN_CLICKED(IDC_PHACKLE_BUTTON, OnPhackleButton) 
	ON_BN_CLICKED(IDC_NHACKLE_BUTTON, OnNhackleButton) 
	ON_BN_CLICKED(IDC_TRIANGLE_BUTTON, OnTriangleButton) 
	ON_BN_CLICKED(IDC_SQUARE_BUTTON, OnSquareButton) 
	ON_BN_CLICKED(IDC_SIN_BUTTON, OnSinButton) 
	ON_BN_CLICKED(IDC_RANDOM_BUTTON, OnRandomButton) 
	ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CUsbhostDlg message handlers 
 
BOOL CUsbhostDlg::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);		 
	SetIcon(m_hIcon, FALSE);	 
	 
	// TODO: Add extra initialization here 
	m_LeftDis=250; 
	m_RightDis=15; 
	m_UpDis=15; 
	m_DownDis=200; 
 
    m_LeftRim=50; 
	m_RightRim=40; 
    m_UpRim=40; 
    m_DownRim=40; 
 
	m_xStart=0;  
	m_yStart=-64; 
 
    m_XLineStart.SetSize(20); 
    m_xn=0; 
 
    m_YLineStart.SetSize(20); 
    m_yn=0; 
 
	m_PointList=new PointP[1024]; 
 
	for(int i=0;i<1024;i++)     
	{		 
		m_PointList[i].x = (float)i; 
		m_PointList[i].y = 0; 
	} 
 
	index=0; 
	BigSmall=true; 
	 
	strcpy(DeviceName,"Ezusb-0"); 
	 
	OnPhackleButton(); 
 
	return TRUE;  
} 
 
void CUsbhostDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{	 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else if (nID == SC_CLOSE) 
	{ 
         if(g_KeepGoing) 
		 { 
			 MessageBox("请首先结束当前线程!", "错误", MB_ICONERROR | MB_OK); 
		     return; 
		 }	 
         OnOK(); 
	} 
    else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
void CUsbhostDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this);  
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		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; 
 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	 
		GetUDLRrect(); 
         
		GetRectBlc(0,-64,1024,320); 
         
		CDC* pDC;   
        pDC = GetDC(); 		 
		 
		CBrush brush(RGB(0,0,0)); 
	    pDC->FillRect(InnerRect,&brush); 
	     
		DrawBackLines(pDC); 
 
		DrawCurve(pDC); 
 
		DrawUDLRrect(pDC);  
		 
		DrawLab(pDC);     
		 
		ReleaseDC(pDC); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CUsbhostDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
/////////////////////////////////////////////////////////////////// 
// 
// 以下是画图的相关函数。 
// 
/////////////////////////////////////////////////////////////////// 
void CUsbhostDlg::GetUDLRrect() 
{ 
    CRect rect; 
    GetClientRect(&rect); 
 
    m_InnerUHScreen = m_UpRim+m_UpDis;   
    m_InnerDHScreen = rect.bottom - m_DownRim-m_DownDis;  
    m_InnerLWScreen = m_LeftRim + m_LeftDis;    
	m_InnerRWScreen = rect.right - m_RightRim-m_RightDis;    
     
	Urect.top=m_UpDis; 
	Urect.bottom=m_InnerUHScreen; 
	Urect.left=m_LeftDis; 
	Urect.right=rect.right-m_RightDis; 
 
	Drect.top=m_InnerDHScreen; 
	Drect.bottom=rect.bottom-m_DownDis; 
	Drect.left=m_LeftDis; 
	Drect.right=rect.right-m_RightDis; 
 
	Lrect.top=m_InnerUHScreen; 
	Lrect.bottom=m_InnerDHScreen; 
    Lrect.left=m_LeftDis; 
	Lrect.right=m_InnerLWScreen; 
 
	Rrect.top=m_InnerUHScreen; 
	Rrect.bottom=m_InnerDHScreen; 
    Rrect.left=m_InnerRWScreen; 
	Rrect.right=rect.right-m_RightDis; 
 
	InnerRect.top=m_InnerUHScreen; 
	InnerRect.bottom=m_InnerDHScreen; 
    InnerRect.left=m_InnerLWScreen; 
	InnerRect.right=m_InnerRWScreen;  
 
	TotalRect.top=m_UpDis; 
	TotalRect.bottom=rect.bottom-m_DownDis; 
    TotalRect.left=m_LeftDis; 
	TotalRect.right=rect.right-m_RightDis; 
} 
 
void CUsbhostDlg::GetRectBlc(float xRectStart,float yRectStart,float xRectEnd,float yRectEnd) 
{ 
	float m1,m2;   
	float x1,y1,x2,y2; 
	x1=min(xRectStart,xRectEnd); 
	x2=max(xRectStart,xRectEnd); 
	y1=min(yRectStart,yRectEnd); 
	y2=max(yRectStart,yRectEnd); 
	 
	float lx,ly; 
 
	lx=x2-x1;	 
    if(lx<0) return;   
 
    ly=y2-y1; 
	if(ly<0) return;   
 
    m1=lx/(m_InnerRWScreen-m_InnerLWScreen);   
	m2=ly/(m_InnerDHScreen-m_InnerUHScreen);	 
	m_XOriginScale =m1;    
	m_YOriginScale =m2;    
} 
 
void CUsbhostDlg::DrawBackLines (CDC *pDC) 
{ 
	float xx1; 
	float yy1; 
	float xx2; 
	float yy2; 
 
    XLPtoXVP(m_InnerLWScreen ,&xx1);  
	XLPtoXVP(m_InnerRWScreen ,&xx2); 
	YLPtoYVP(m_InnerDHScreen ,&yy1); 
	YLPtoYVP(m_InnerUHScreen ,&yy2); 
 
    GetBackLines(xx1,yy1,xx2,yy2); 
							 
    CPen penGray; 
    CPen* pOldPen; 
 
    penGray.CreatePen(PS_SOLID | PS_COSMETIC, 1, RGB(128, 128, 128)); 
 
	pOldPen = pDC->SelectObject(&penGray);  
 
	int i;	 
	for(i=0;iMoveTo (m_XLineStart[i],m_InnerUHScreen); 
	    pDC->LineTo (m_XLineStart[i],m_InnerDHScreen); 
	} 
	 
    for(i=0;iMoveTo (m_InnerLWScreen,m_YLineStart[i]); 
	    pDC->LineTo (m_InnerRWScreen,m_YLineStart[i]); 
    } 
	 
    pDC->SelectObject (pOldPen); 
} 
 
void CUsbhostDlg::XLPtoXVP (int x,float *X) 
{ 
   *X=m_xStart+(x-m_InnerLWScreen)*m_XOriginScale;  
} 
 
void CUsbhostDlg::YLPtoYVP (int y,float *Y) 
{  	 
	*Y=m_yStart+(m_InnerDHScreen-y)*m_YOriginScale;	 
} 
 
void CUsbhostDlg::XVPtoXLP(float x,int *X) 
{ 
	float TempX; 
 
	TempX=((x-m_xStart)/m_XOriginScale+(float)0.5)+m_InnerLWScreen; 
	if(TempX > 3000) TempX = 3000; 
	*X=(int)TempX; 
} 
 
void CUsbhostDlg::YVPtoYLP(float y,int *Y) 
{ 
	float TempY;	 
 
	TempY=m_InnerDHScreen-((y-m_yStart)/m_YOriginScale+(float)0.5); 
	if(TempY > 3000) TempY = 3000; 
	*Y = (int)TempY; 
} 
 
void CUsbhostDlg::GetBackLines(float xRectStart,float yRectStart,float xRectEnd,float yRectEnd) 
{ 
		 
	if(m_XLineStart.GetSize()>0) 
	        m_XLineStart.RemoveAll(); 
	if(m_YLineStart.GetSize()>0) 
	        m_YLineStart.RemoveAll(); 
 
	    float xL; 
	    float xd; 
	    float xLine; 
 
        xL=xRectEnd-xRectStart;			 
		if(xL<0) xL=-xL; 
		if(xL==0) return; 
         
		xd=xL/8;  
         
        m_xLineStart[0]=xRectStart;      
		m_XLineStart.Add(m_InnerLWScreen);  
		m_xn=0;		 
 
		xLine=xd; 
 
		while(xLineSelectObject (&npen); 
 
    pDC->SetROP2(R2_COPYPEN);   
     
    XVPtoXLP(m_PointList[0].x,&x1); 
    YVPtoYLP(m_PointList[0].y,&y1); 
 
    pDC->MoveTo (x1,y1); 
    for(int i=1;i<1024;i++) 
    { 
       XVPtoXLP(m_PointList[i].x,&x1); 
       YVPtoYLP(m_PointList[i].y,&y1); 
 	   pDC->LineTo (x1,y1); 
	} 
    pDC->SelectObject (npOldPen); 
} 
 
void CUsbhostDlg::DrawUDLRrect (CDC *pDC) 
{ 
	pDC->SetBkColor(12632256);   
 
	CBrush brush(pDC->GetBkColor ()); 
	pDC->FillRect(Urect,&brush); 
	pDC->FillRect(Drect,&brush); 
	pDC->FillRect(Lrect,&brush); 
	pDC->FillRect(Rrect,&brush); 
 
	pDC->DrawEdge(TotalRect,EDGE_SUNKEN,BF_RECT); 
} 
 
void CUsbhostDlg::DrawLab(CDC *pDC) 
{	 
	pDC->SetBkMode (OPAQUE); 
	CFont fontText; 
	fontText.CreateFont(14,0,0,0,50,FALSE,0,0,0,0,0,0,0,"Arial"); 
	CFont* pOldFont=(CFont*)pDC->SelectObject(&fontText); 
 
    pDC->TextOut(m_InnerLWScreen-30,m_InnerUHScreen-27,"幅度值");  
	pDC->TextOut(m_InnerLWScreen/2-15 + m_InnerRWScreen/2,m_InnerDHScreen+ 20, "点数值"); 
 
	char str[10]; 
    	 
    for(int i=0;iTextOut(m_InnerLWScreen-25,m_YLineStart[i]-10,str);  
    } 
	 
	for(i=0;iTextOut(m_XLineStart[i]-5,m_InnerDHScreen+5,str);  
    } 
 
	fontText.CreateFont(20,0,0,0,50,FALSE,0,0,0,0,0,0,0,"Arial"); 
	pOldFont=(CFont*)pDC->SelectObject(&fontText);	 
	pDC->TextOut(m_InnerLWScreen+150,m_InnerUHScreen-27,"波形显示");  
	 
	pDC->SelectObject(pOldFont); 
} 
 
/////////////////////////////////////////////////////////////////// 
// 
// 以下是AN2131相关函数。 
// 
/////////////////////////////////////////////////////////////////// 
BOOLEAN CUsbhostDlg::UsbOpenDriver (HANDLE *phDeviceHandle, PCHAR devname) 
{ 
   char completeDeviceName[64] = ""; 
   char pcMsg[64] = ""; 
    
   strcat (completeDeviceName,"\\\\.\\"); 
    
   strcat (completeDeviceName,devname); 
    
   *phDeviceHandle = CreateFile(completeDeviceName, 
                                GENERIC_WRITE, 
                                FILE_SHARE_WRITE, 
                                NULL, 
                                OPEN_EXISTING, 
                                0, 
                                NULL); 
    
   if (*phDeviceHandle == INVALID_HANDLE_VALUE)  
      return (FALSE); 
   else  
      return (TRUE);    
} 
 
void CUsbhostDlg::OnDeviceButton()  
{ 
	// TODO: Add your control notification handler code here 
    USB_DEVICE_DESCRIPTOR output; 
    HANDLE  hDevice = NULL; 
	BOOLEAN bResult = FALSE; 
    ULONG   nBytes;	 
	CString str; 
 
    if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)  
	{ 
		MessageBox("无效设备,请重试!", "错误", MB_ICONERROR | MB_OK); 
		hDevice = NULL; 
		return; 
	} 
 
	if (hDevice != NULL) 
    { 
        bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output, 
                                   sizeof(USB_DEVICE_DESCRIPTOR), 
                                   &nBytes, 
                                   NULL); 
    } 
 
	if (bResult==TRUE) 
    { 
		m_UsbList.AddString("USB Device Descriptor"); 
		str.Format(_T("bLength:0x%x"),output.bLength);   
        m_UsbList.AddString(str); 
		str.Format(_T("bDescriptorType:0x%x"),output.bDescriptorType);  
		m_UsbList.AddString(str); 
		str.Format(_T("bcdUSB:0x%x"),output.bcdUSB);  
		m_UsbList.AddString(str); 
        str.Format(_T("bDeviceClass:0x%x"),output.bDeviceClass);   
		m_UsbList.AddString(str); 
		str.Format(_T("bDeviceSubClass:0x%x"),output.bDeviceSubClass);  
		m_UsbList.AddString(str); 
        str.Format(_T("bDeviceProtocol:0x%x"),output.bDeviceProtocol);  
		m_UsbList.AddString(str); 
        str.Format(_T("bMaxPacketSize0:0x%x"),output.bMaxPacketSize0);  
        m_UsbList.AddString(str); 
        str.Format(_T("idVendor:0x%x"),output.idVendor);  
        m_UsbList.AddString(str); 
		str.Format(_T("idProduct:0x%x"),output.idProduct);  
		m_UsbList.AddString(str); 
		str.Format(_T("bcdDevice:0x%x"),output.bcdDevice);  
        m_UsbList.AddString(str); 
		str.Format(_T("iManufacturer:0x%x"),output.iManufacturer);  
        m_UsbList.AddString(str); 
		str.Format(_T("iProduct:0x%x"),output.iProduct);  
        m_UsbList.AddString(str); 
        str.Format(_T("iSerialNumber:0x%x"),output.iSerialNumber);  
        m_UsbList.AddString(str); 
		str.Format(_T("bNumConfigurations:0x%x"),output.bNumConfigurations);  
        m_UsbList.AddString(str);		 
    } 
    else 
		MessageBox("读取设备描述符失败!", "错误", MB_ICONERROR | MB_OK); 
 
    CloseHandle (hDevice); 
} 
 
void CUsbhostDlg::OnConfigButton()  
{ 
	// TODO: Add your control notification handler code here 
    USB_CONFIGURATION_DESCRIPTOR output; 
    HANDLE  hDevice = NULL; 
	BOOLEAN bResult = FALSE; 
    ULONG   nBytes; 
	CString str; 
 
 
    if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)  
	{ 
		MessageBox("无效设备,请重试!", "错误", MB_ICONERROR | MB_OK); 
		hDevice = NULL; 
		return; 
	} 
 
	if (hDevice != NULL) 
    { 
        bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output, 
                                   sizeof(USB_CONFIGURATION_DESCRIPTOR), 
                                   &nBytes, 
                                   NULL); 
    } 
 
	if (bResult==TRUE) 
    { 
		m_UsbList.AddString("USB Configuration Descriptor"); 
		str.Format(_T("bLength:0x%x"),output.bLength);   
        m_UsbList.AddString(str); 
		str.Format(_T("bDescriptorType:0x%x"),output.bDescriptorType);  
		m_UsbList.AddString(str); 
		str.Format(_T("wTotalLength:0x%x"),output.wTotalLength);  
		m_UsbList.AddString(str); 
        str.Format(_T("bNumInterfaces:0x%x"),output.bNumInterfaces);  
		m_UsbList.AddString(str); 
		str.Format(_T("bConfigurationValue:0x%x"),output.bConfigurationValue);  
		m_UsbList.AddString(str); 
        str.Format(_T("iConfiguration:0x%x"),output.iConfiguration);  
		m_UsbList.AddString(str); 
        str.Format(_T("bmAttributes:0x%x"),output.bmAttributes);  
        m_UsbList.AddString(str); 
        str.Format(_T("MaxPower:0x%x"),output.MaxPower);  
        m_UsbList.AddString(str); 
    } 
    else 
		MessageBox("读取配置描述符失败!", "错误", MB_ICONERROR | MB_OK); 
           
    CloseHandle (hDevice); 
} 
 
void CUsbhostDlg::OnInterfaceButton()  
{ 
	// TODO: Add your control notification handler code here 
	USB_CONFIGURATION_DESCRIPTOR output; 
	unsigned char output2[200]; 
    USB_INTERFACE_DESCRIPTOR *output0; 
    HANDLE  hDevice = NULL; 
	BOOLEAN bResult = FALSE; 
    ULONG   nBytes; 
	CString str; 
 
    if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)  
	{ 
		MessageBox("无效设备,请重试!", "错误", MB_ICONERROR | MB_OK); 
		hDevice = NULL; 
		return; 
	} 
 
	if (hDevice != NULL) 
    { 
		bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output, 
                                   sizeof(USB_CONFIGURATION_DESCRIPTOR), 
                                   &nBytes, 
                                   NULL); 
	} 
 
	if (bResult==TRUE) 		 
	{ 
	    bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output2, 
                                   output.wTotalLength, 
                                   &nBytes, 
                                   NULL); 
 
        if (bResult!=TRUE)  
			MessageBox("读取接口描述符失败!", "错误", MB_ICONERROR | MB_OK); 
    	else 
		{ 
			m_UsbList.AddString("USB Interface Descriptor"); 
			output0=(USB_INTERFACE_DESCRIPTOR *)&output2[9]; 
			str.Format(_T("bLength:0x%x"),output0->bLength);   
            m_UsbList.AddString(str); 
		    str.Format(_T("bDescriptorType:0x%x"),output0->bDescriptorType);  
		    m_UsbList.AddString(str); 
		    str.Format(_T("bInterfaceNumber:0x%x"),output0->bInterfaceNumber);  
			m_UsbList.AddString(str); 
            str.Format(_T("bAlternateSetting:0x%x"),output0->bAlternateSetting);  
		    m_UsbList.AddString(str); 
		    str.Format(_T("bNumEndpoints:0x%x"),output0->bNumEndpoints);  
			m_UsbList.AddString(str); 
            str.Format(_T("bInterfaceClass:0x%x"),output0->bInterfaceClass);  
		    m_UsbList.AddString(str); 
            str.Format(_T("bInterfaceSubClass:0x%x"),output0->bInterfaceSubClass);  
            m_UsbList.AddString(str); 
            str.Format(_T("bInterfaceProtocol:0x%x"),output0->bInterfaceProtocol);  
            m_UsbList.AddString(str); 
			str.Format(_T("iInterface:0x%x"),output0->iInterface);  
            m_UsbList.AddString(str); 
		} 
	} 
	else 
		MessageBox("读取接口描述符失败!", "错误", MB_ICONERROR | MB_OK); 
 
    CloseHandle (hDevice); 
} 
 
void CUsbhostDlg::OnEndpointButton()  
{ 
	// TODO: Add your control notification handler code here 
	USB_CONFIGURATION_DESCRIPTOR output; 
	unsigned char output2[200]; 
    USB_ENDPOINT_DESCRIPTOR *output0; 
    HANDLE  hDevice = NULL; 
	BOOLEAN bResult = FALSE; 
    ULONG   nBytes; 
	CString str; 
 
    if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)  
	{ 
		MessageBox("无效设备,请重试!", "错误", MB_ICONERROR | MB_OK); 
		hDevice = NULL; 
		return; 
	} 
 
	if (hDevice != NULL) 
    { 
		bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output, 
                                   sizeof(USB_CONFIGURATION_DESCRIPTOR), 
                                   &nBytes, 
                                   NULL); 
	} 
 
	if (bResult==TRUE) 		 
	{ 
	    bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR, 
                                   NULL, 
                                   0, 
                                   &output2, 
                                   output.wTotalLength, 
                                   &nBytes, 
                                   NULL); 
 
        if (bResult!=TRUE)  
			MessageBox("读取端点描述符失败!", "错误", MB_ICONERROR | MB_OK); 
    	else 
		{ 
			m_UsbList.AddString("USB Endpoint Descriptor"); 
			for (int i=0;i<14;i++) 
			{ 
				output0=(USB_ENDPOINT_DESCRIPTOR *)&output2[18+i*7]; 
				str.Format(_T("Endpoint:%d"),i+1); 
				m_UsbList.AddString(str); 
				str.Format(_T("bLength:0x%x"),output0->bLength);  
                m_UsbList.AddString(str); 
		        str.Format(_T("bDescriptorType:0x%x"),output0->bDescriptorType);  
		        m_UsbList.AddString(str);			     
		        str.Format(_T("bEndpointAddress:0x%x"),output0->bEndpointAddress);  
			    m_UsbList.AddString(str); 
                str.Format(_T("bmAttributes:0x%x"),output0->bmAttributes);  
		        m_UsbList.AddString(str); 
                str.Format(_T("wMaxPacketSize:0x%x"),output0->wMaxPacketSize);  
		        m_UsbList.AddString(str); 
                str.Format(_T("bInterval:0x%x"),output0->bInterval);  
		        m_UsbList.AddString(str); 
				m_UsbList.AddString(""); 
			} 
		} 
	} 
	else 
		MessageBox("读取端点描述符失败!", "错误", MB_ICONERROR | MB_OK); 
 
    CloseHandle (hDevice); 
} 
 
void CUsbhostDlg::OnStringButton()  
{ 
	// TODO: Add your control notification handler code here 
	HANDLE hDevice=NULL;	 
	BOOL   bResult = FALSE; 
	ULONG  nBytes; 
	char output0[50]; 
	GET_STRING_DESCRIPTOR_IN input; 
	USB_STRING_DESCRIPTOR    output;	 
	char   tempbuff[2][256]; 
	CString str; 
 
    if (UsbOpenDriver (&hDevice, DeviceName) != TRUE)  
	{ 
		MessageBox("无效设备,请重试!", "错误", MB_ICONERROR | MB_OK); 
		hDevice = NULL; 
		return; 
	} 
 
	input.Index=1; 
	input.LanguageId=0; 
	bResult = DeviceIoControl (hDevice, 
                               IOCTL_Ezusb_GET_STRING_DESCRIPTOR, 
                               &input, 
                               sizeof(GET_STRING_DESCRIPTOR_IN), 
                               &output, 
                               4,  
                               &nBytes, 
                               NULL); 
	if (bResult!=TRUE)  
	{ 
		MessageBox("读取字符串描述符失败!", "错误", MB_ICONERROR | MB_OK); 
        CloseHandle (hDevice); 
		return; 
	} 
    else 
	{ 
		bResult = DeviceIoControl (hDevice, 
                                   IOCTL_Ezusb_GET_STRING_DESCRIPTOR, 
                                   &input, 
                                   sizeof(GET_STRING_DESCRIPTOR_IN), 
                                   &output0, 
                                   output.bLength,  
                                   &nBytes, 
                                   NULL); 
		if (bResult!=TRUE)  
		{ 
			MessageBox("读取字符串描述符失败!", "错误", MB_ICONERROR | MB_OK); 
            CloseHandle (hDevice); 
		    return; 
		} 
		else  
		{ 
			m_UsbList.AddString("USB String Descriptor");			 
			m_UsbList.AddString("String Descriptor 1"); 
			str.Format(_T("bLength:0x%x"),output0[0]);  
            m_UsbList.AddString(str); 
		    str.Format(_T("bDescriptorType:0x%x"),output0[1]);  
		    m_UsbList.AddString(str);		     
	        sprintf(tempbuff[0],"bString:"); 
		    for (int i=0;i