?? finalusbdlg.cpp
字號:
driverKeyNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{
goto GetHCDDriverKeyNameError;
}
driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName);
free(driverKeyNameW);
return driverKeyNameA;
GetHCDDriverKeyNameError:
if (driverKeyNameW != NULL)
{
ShowMessage("出錯!\r\n");
free(driverKeyNameW);
driverKeyNameW = NULL;
}
return NULL;
}
PCHAR CFinalusbDlg::GetRootHubName(HANDLE HostController)
{
BOOL success;
ULONG nBytes;
USB_ROOT_HUB_NAME rootHubName;
PUSB_ROOT_HUB_NAME rootHubNameW;
PCHAR rootHubNameA;
rootHubNameW = NULL;
rootHubNameA = NULL;
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
0,
0,
&rootHubName,
sizeof(rootHubName),
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
nBytes = rootHubName.ActualLength;
rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes);
if (rootHubNameW == NULL)
{
goto GetRootHubNameError;
}
success = DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
NULL,
0,
rootHubNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{
goto GetRootHubNameError;
}
rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName);
free(rootHubNameW);
return rootHubNameA;
GetRootHubNameError:
if (rootHubNameW != NULL)
{
free(rootHubNameW);
rootHubNameW = NULL;
ShowMessage("出錯!\r\n");
}
return NULL;
}
PCHAR CFinalusbDlg::GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex)
{
BOOL success;
ULONG nBytes;
USB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyName;
PUSB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyNameW;
PCHAR driverKeyNameA;
driverKeyNameW = NULL;
driverKeyNameA = NULL;
driverKeyName.ConnectionIndex = ConnectionIndex;
success = DeviceIoControl(Hub,
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
&driverKeyName,
sizeof(driverKeyName),
&driverKeyName,
sizeof(driverKeyName),
&nBytes,
NULL);
if (!success)
{
goto GetDriverKeyNameError;
}
nBytes = driverKeyName.ActualLength;
if (nBytes <= sizeof(driverKeyName))
{
goto GetDriverKeyNameError;
}
driverKeyNameW = (PUSB_NODE_CONNECTION_DRIVERKEY_NAME)malloc(nBytes);
if (driverKeyNameW == NULL)
{
goto GetDriverKeyNameError;
}
driverKeyNameW->ConnectionIndex = ConnectionIndex;
success = DeviceIoControl(Hub,
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
driverKeyNameW,
nBytes,
driverKeyNameW,
nBytes,
&nBytes,
NULL);
if (!success)
{
goto GetDriverKeyNameError;
}
driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName);
free(driverKeyNameW);
return driverKeyNameA;
GetDriverKeyNameError:
if (driverKeyNameW != NULL)
{
free(driverKeyNameW);
driverKeyNameW = NULL;
}
return NULL;
}
PUSB_DESCRIPTOR_REQUEST CFinalusbDlg::GetConfigDescriptor(HANDLE hHubDevice, ULONG ConnectionIndex, UCHAR DescriptorIndex)
{
BOOL success;
ULONG nBytes;
ULONG nBytesReturned;
UCHAR configDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) +
sizeof(USB_CONFIGURATION_DESCRIPTOR)];
PUSB_DESCRIPTOR_REQUEST configDescReq;
PUSB_CONFIGURATION_DESCRIPTOR configDesc;
nBytes = sizeof(configDescReqBuf);
configDescReq = (PUSB_DESCRIPTOR_REQUEST)configDescReqBuf;
configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);
memset(configDescReq, 0, nBytes);
configDescReq->ConnectionIndex = ConnectionIndex;
configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
| DescriptorIndex;
configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
configDescReq,
nBytes,
configDescReq,
nBytes,
&nBytesReturned,
NULL);
if (!success)
{
return NULL;
}
if (nBytes != nBytesReturned)
{
return NULL;
}
if (configDesc->wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))
{
return NULL;
}
nBytes = sizeof(USB_DESCRIPTOR_REQUEST) + configDesc->wTotalLength;
configDescReq = (PUSB_DESCRIPTOR_REQUEST)malloc(nBytes);
if (configDescReq == NULL)
{
return NULL;
}
configDesc = (PUSB_CONFIGURATION_DESCRIPTOR)(configDescReq+1);
configDescReq->ConnectionIndex = ConnectionIndex;
configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)
| DescriptorIndex;
configDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));
success = DeviceIoControl(hHubDevice,
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
configDescReq,
nBytes,
configDescReq,
nBytes,
&nBytesReturned,
NULL);
if (!success)
{
free(configDescReq);
return NULL;
}
if (nBytes != nBytesReturned)
{
free(configDescReq);
return NULL;
}
if (configDesc->wTotalLength != (nBytes - sizeof(USB_DESCRIPTOR_REQUEST)))
{
free(configDescReq);
return NULL;
}
return configDescReq;
}
void CFinalusbDlg::ShowCenctInfo(PUSB_NODE_CONNECTION_INFORMATION connectionInfo)
{
CString strShow;
strShow.Format("connection index:[Port:%d]\r\n",connectionInfo->ConnectionIndex);
ShowMessage(strShow);
strShow.Format("Device class:0x%X,idVendor:0x%X,\r\nidProduct:0x%X,\r\n ",
connectionInfo->DeviceDescriptor.bDeviceClass,
connectionInfo->DeviceDescriptor.idVendor,
connectionInfo->DeviceDescriptor.idProduct);
ShowMessage(strShow);
strShow.Format("iManufacturer:0x%X,\r\niSerialNumber:0x%X,\r\n",
connectionInfo->DeviceDescriptor.iManufacturer,
connectionInfo->DeviceDescriptor.iSerialNumber);
ShowMessage(strShow);
if(connectionInfo->LowSpeed)
strShow="bus speed:low,\r\n";
else
strShow="bus speed:full,\r\n";
ShowMessage(strShow);
strShow.Format("Device Address:0x%X,\r\nOpen Pipes:0x%X\r\n",
connectionInfo->DeviceAddress,connectionInfo->NumberOfOpenPipes);
ShowMessage(strShow);
}
PCHAR CFinalusbDlg::WideStrToMultiStr(PWCHAR WideStr)
{
ULONG nBytes;
PCHAR MultiStr;
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
NULL,
0,
NULL,
NULL);
if (nBytes == 0)
{
return NULL;
}
MultiStr =(PCHAR) malloc(nBytes);
if (MultiStr == NULL)
{
return NULL;
}
nBytes = WideCharToMultiByte(
CP_ACP,
0,
WideStr,
-1,
MultiStr,
nBytes,
NULL,
NULL);
if (nBytes == 0)
{
free(MultiStr);
return NULL;
}
return MultiStr;
}
void CFinalusbDlg::ShowMore(HDEVINFO hDevInfo, SP_DEVICE_INTERFACE_DATA strtInterfaceData)
{
CString strShow;
PSP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
DWORD strSzie=0,requiesize=0;
SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,NULL,0,&strSzie,NULL);
requiesize=strSzie;
strtDetailData=(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiesize);
strtDetailData->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA infodata;
infodata.cbSize=sizeof(SP_DEVINFO_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,
strtDetailData,strSzie,&requiesize,NULL))
{
ShowMessage("查找設備路徑時出錯!");
SetupDiDestroyDeviceInfoList(hDevInfo);
free(strtDetailData);
return;
}
strShow.Format("設備路徑:\r\n%s\r\n",strtDetailData->DevicePath);
ShowMessage(strShow);
ShowMessage("打開通信端口....\r\n");
HANDLE hCom = CreateFile (
strtDetailData->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING, 0,
NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
ShowMessage("無法打開通信端口。不能讀取設備信息!(設備連接可能不正確?)\r\n");
SetupDiDestroyDeviceInfoList(hDevInfo);
free(strtDetailData);
return;
}
ShowMessage("打開通信端口成功!\r\n");
HIDD_ATTRIBUTES strtAttrib;
ShowMessage("正在讀取設備的標識...\r\n");
strtAttrib.Size=sizeof(HIDD_ATTRIBUTES);
if (!HidD_GetAttributes(hCom,&strtAttrib))
{
ShowMessage("查詢設備狀態時出錯!");
CloseHandle(hCom);
free(strtDetailData);
return;
}
ShowMessage("已讀取,如下所示:\r\n");
strShow.Format("VendorID:0x%X\r\n",strtAttrib.VendorID);
ShowMessage(strShow);
strShow.Format("ProductID:0x%X\r\n",strtAttrib.ProductID);
ShowMessage(strShow);
strShow.Format("VersionNumber:0x%X\r\n",strtAttrib.VersionNumber);
ShowMessage(strShow);
}
BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
STORAGE_PROPERTY_QUERY Query;
DWORD dwOutBytes;
BOOL bResult;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
bResult = ::DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
pDevDesc, pDevDesc->Size,
&dwOutBytes,
(LPOVERLAPPED)NULL);
return bResult;
}
BOOL CFinalusbDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::PreTranslateMessage(pMsg);
}
char CFinalusbDlg::chFirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -