GUID_DEVINTERFACE_WINUSB 头文件
时间: 2023-08-26 17:06:50 浏览: 239
GUID_DEVINTERFACE_WINUSB 是一个 GUID,用于标识 Windows USB 设备接口,它定义在 Winusbio.h 头文件中。在使用 WinUSB 驱动程序时,可以使用该 GUID 来打开 USB 设备接口。以下是该头文件的示例代码:
```c
#ifndef _WINUSBIO_H_
#define _WINUSBIO_H_
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
// GUID_DEVINTERFACE_WINUSB
DEFINE_GUID(GUID_DEVINTERFACE_WINUSB, 0x88BAE032L, 0x5A81, 0x49f0, 0xBC, 0x3D, 0x4F, 0xB0, 0x1B, 0x6C, 0x62, 0x7F);
// WinUSB interface functions
...
#ifdef __cplusplus
}
#endif
#endif // _WINUSBIO_H_
```
相关问题
winusb.h
winusb.h是Windows Driver Kit中的头文件,定义了WinUSB API,用于与USB设备进行通信。
WinUSB是Microsoft推出的一种通用USB驱动程序,它不需要特定的硬件驱动程序,可以直接通过USB接口与设备通信。WinUSB支持批量传输、中断传输和控制传输等多种数据传输方式,可以满足不同USB设备的通信需求。
winusb.h头文件中包含了WinUSB API的函数原型、结构体定义和常量定义等内容,可以在C/C++程序中直接使用。常用的函数包括:
- WinUsb_Initialize:初始化WinUSB,打开设备并获得WinUSB接口句柄。
- WinUsb_Free:释放WinUSB接口句柄。
- WinUsb_ReadPipe:从设备读取数据。
- WinUsb_WritePipe:向设备写入数据。
- WinUsb_ControlTransfer:发送控制传输命令。
- WinUsb_QueryInterfaceSettings:查询设备接口设置。
使用WinUSB API时,需要先调用SetupAPI中的函数获取设备接口信息,然后使用WinUSB API与设备进行通信。需要注意的是,使用WinUSB API需要管理员权限。
下面是使用WinUSB API读取USB设备数据的一个简单示例:
```c
#include <Windows.h>
#include <Winusb.h>
#define VID 0x1234
#define PID 0x5678
int main() {
GUID guid;
HDEVINFO deviceInfoSet;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData;
HANDLE deviceHandle;
WINUSB_INTERFACE_HANDLE winusbHandle;
UCHAR buffer[1024];
DWORD bytesRead;
BOOL result;
// 初始化GUID
result = WinUsb_Initialize(VID, PID, &guid);
if (!result) {
printf("Failed to initialize GUID.\n");
return 1;
}
// 获取设备信息列表
deviceInfoSet = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (deviceInfoSet == INVALID_HANDLE_VALUE) {
printf("Failed to get device information set.\n");
return 1;
}
// 获取设备接口信息
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
result = SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &guid, 0, &deviceInterfaceData);
if (!result) {
printf("Failed to enumerate device interfaces.\n");
return 1;
}
// 获取设备接口的详细信息
DWORD size;
result = SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &size, NULL);
if (!result && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
printf("Failed to get device interface detail size.\n");
return 1;
}
deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(size);
deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
result = SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, deviceInterfaceDetailData, size, NULL, NULL);
if (!result) {
printf("Failed to get device interface detail.\n");
return 1;
}
// 打开设备
deviceHandle = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (deviceHandle == INVALID_HANDLE_VALUE) {
printf("Failed to open device.\n");
return 1;
}
// 初始化WinUSB
result = WinUsb_Initialize(deviceHandle, &winusbHandle);
if (!result) {
printf("Failed to initialize WinUSB.\n");
CloseHandle(deviceHandle);
return 1;
}
// 读取数据
result = WinUsb_ReadPipe(winusbHandle, 0x81, buffer, sizeof(buffer), &bytesRead, NULL);
if (!result) {
printf("Failed to read pipe.\n");
WinUsb_Free(winusbHandle);
CloseHandle(deviceHandle);
return 1;
}
// 关闭设备
WinUsb_Free(winusbHandle);
CloseHandle(deviceHandle);
return 0;
}
```
这个示例代码中,使用了Winusb.h头文件中的函数和结构体,通过SetupAPI获取了设备接口信息,然后使用WinUSB API与USB设备进行通信,最终读取了USB设备的数据。
win10系统 已知USB设备的PID和VID,如何枚举USB设备,然后打开,读写,最后关闭设备。
可以使用Windows API函数来实现枚举、打开、读写和关闭USB设备。
以下是示例代码:
```c++
#include <Windows.h>
#include <SetupAPI.h>
#include <devguid.h>
#include <iostream>
int main()
{
// 枚举指定VID和PID的USB设备
GUID guidDevInterface = GUID_DEVINTERFACE_USB_DEVICE;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidDevInterface, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to get device information set.\n";
return 1;
}
SP_DEVINFO_DATA devInfoData = { 0 };
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD dwMemberIndex = 0;
BOOL bFoundDevice = FALSE;
while (SetupDiEnumDeviceInfo(hDevInfo, dwMemberIndex, &devInfoData))
{
dwMemberIndex++;
// 获取设备的硬件ID
WCHAR szHardwareId[MAX_DEVICE_ID_LEN] = { 0 };
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_HARDWAREID, NULL, (BYTE*)szHardwareId,
sizeof(szHardwareId), NULL))
{
if (wcsstr(szHardwareId, L"VID_XXXX&PID_XXXX") != NULL)
{
std::wcout << L"Found matching device with hardware ID: " << szHardwareId << std::endl;
// 打开设备
HANDLE hDevice = CreateFile(L"\\\\.\\USB#VID_XXXX&PID_XXXX#", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
std::cout << "Device opened successfully." << std::endl;
// 读写设备
DWORD dwBytesWritten = 0;
DWORD dwBytesRead = 0;
BYTE bufWrite[] = { 0x01 };
BYTE bufRead[64] = { 0 };
if (WriteFile(hDevice, bufWrite, sizeof(bufWrite), &dwBytesWritten, NULL) &&
ReadFile(hDevice, bufRead, sizeof(bufRead), &dwBytesRead, NULL))
{
std::cout << "Data written and read successfully." << std::endl;
}
else
{
std::cerr << "Failed to read/write data to device." << std::endl;
}
// 关闭设备
CloseHandle(hDevice);
}
else
{
std::cerr << "Failed to open device." << std::endl;
}
bFoundDevice = TRUE;
break;
}
}
}
if (!bFoundDevice)
{
std::cerr << "Matching device not found." << std::endl;
}
// 释放设备信息集合
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
```
需要替换代码中的`VID_XXXX&PID_XXXX`为实际的VID和PID值。此外,需要在代码中添加相应的头文件和链接到相应的库文件。
阅读全文