求助各位:
我想给电脑安装一个自己做的设备的winusb驱动,目前的状况是,上位机已经可以通过INF识别设备,也就是在设备管理器中已经有该设备的标志,但该设备还不在通用串行总线的结点之下,我查了手册,说:在设备枚举过程中,USB 驱动程序堆栈会从设备读取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 会将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配,然后将 Winusb.sys 作为设备的功能驱动程序加载。
所以我开始做设备枚举,按照[http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff540174(v=vs.85).aspx]中的代码,已完成
创建设备的文件句柄一步,函数的返回值已为1,而且没有任何error信息,但第二步WinUsb_Initialize时就出错了,错误代码为error6,我查了一下手册,是ERROR_INVALID_HANDLE,说是 FILE_FLAG_OVERLAPPED 没设置,但我的CreateFile是设置了
CreateFile ( lpDevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
两段代码如下:
#include "stdafx.h" BOOL GetDeviceHandle (GUID guidDeviceInterface, PHANDLE hDeviceHandle); BOOL GetWinUSBHandle(HANDLE hDeviceHandle, PWINUSB_INTERFACE_HANDLE phWinUSBHandle); int _tmain(int argc, _TCHAR* argv[]) { /*9d7debbc-c85d-11d1-9eb4-006008c3a19a*/ static const GUID OSR_DEVICE_INTERFACE = { 0x9d7debbc, 0xc85d, 0x11d1, { 0x9e, 0xb4, 0x00, 0x60, 0x08, 0xc3, 0xa1, 0x9a } }; HANDLE h; PHANDLE hDeviceHandle = &h; BOOL getDeviceHandle = GetDeviceHandle (OSR_DEVICE_INTERFACE, hDeviceHandle); PVOID p; PWINUSB_INTERFACE_HANDLE phWinUSBHandle = &p; BOOL getWinUSBHandle = GetWinUSBHandle(hDeviceHandle, phWinUSBHandle); std::cout << "getDeviceHandle = " << getDeviceHandle << std::endl; std::cout << "getWinUSBHandle = " << getWinUSBHandle << std::endl; system("PAUSE"); return 0; } /**********************************************************************************/ /*下面的示例代码创建一个支持对设备进行同步读写访问的文件句柄。有关如何打开异步 I/O 的文件句柄的详细信息,请参阅 CreateFile 中的“备注”部分。*/ /**********************************************************************************/ BOOL GetDeviceHandle (GUID guidDeviceInterface, PHANDLE hDeviceHandle) { if (guidDeviceInterface==GUID_NULL) { return FALSE; } BOOL bResult = TRUE; HDEVINFO hDeviceInfo; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA deviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA pInterfaceDetailData = NULL; ULONG requiredLength=0; LPTSTR lpDevicePath = NULL; DWORD index = 0; // Get information about all the installed devices for the specified // device interface class. hDeviceInfo = SetupDiGetClassDevs( &guidDeviceInterface, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDeviceInfo == INVALID_HANDLE_VALUE) { // ERROR printf("Error SetupDiGetClassDevs: %d.\n", GetLastError()); goto done; } //Enumerate all the device interfaces in the device information set. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (index = 0; SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData); index++) { //Reset for this iteration if (lpDevicePath) { LocalFree(lpDevicePath); } if (pInterfaceDetailData) { LocalFree(pInterfaceDetailData); } deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); //Get information about the device interface. bResult = SetupDiEnumDeviceInterfaces( hDeviceInfo, &DeviceInfoData, &guidDeviceInterface, 0, &deviceInterfaceData); // Check if last item if (GetLastError () == ERROR_NO_MORE_ITEMS) { break; } //Check for some other error if (!bResult) { printf("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError()); goto done; } //Interface data is returned in SP_DEVICE_INTERFACE_DETAIL_DATA //which we need to allocate, so we have to call this function twice. //First to get the size so that we know how much to allocate //Second, the actual call with the allocated buffer bResult = SetupDiGetDeviceInterfaceDetail( hDeviceInfo, &deviceInterfaceData, NULL, 0, &requiredLength, NULL); //Check for some other error if (!bResult) { if ((ERROR_INSUFFICIENT_BUFFER==GetLastError()) && (requiredLength>0)) { //we got the size, allocate buffer pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength); if (!pInterfaceDetailData) { // ERROR printf("Error allocating memory for the device detail buffer.\n"); goto done; } } else { printf("Error SetupDiEnumDeviceInterfaces: %d.\n", GetLastError()); goto done; } } //get the interface detailed data pInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //Now call it with the correct size and allocated buffer bResult = SetupDiGetDeviceInterfaceDetail( hDeviceInfo, &deviceInterfaceData, pInterfaceDetailData, requiredLength, NULL, &DeviceInfoData); //Check for some other error if (!bResult) { printf("Error SetupDiGetDeviceInterfaceDetail: %d.\n", GetLastError()); goto done; } //copy device path size_t nLength = wcslen (pInterfaceDetailData->DevicePath) + 1; lpDevicePath = (TCHAR *) LocalAlloc (LPTR, nLength * sizeof(TCHAR)); StringCchCopy(lpDevicePath, nLength, pInterfaceDetailData->DevicePath); lpDevicePath[nLength-1] = 0; printf("Device path: %s\n", lpDevicePath); } if (!lpDevicePath) { //Error. printf("Error %d.", GetLastError()); goto done; } //Open the device *hDeviceHandle = CreateFile ( lpDevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (*hDeviceHandle == INVALID_HANDLE_VALUE) { //Error. printf("Error %d.", GetLastError()); goto done; } done: LocalFree(lpDevicePath); LocalFree(pInterfaceDetailData); bResult = SetupDiDestroyDeviceInfoList(hDeviceInfo); return bResult; } /**********************************************************************************/ /*以下示例代码使用上一步中创建的文件句柄初始化 WinUSB,并检索设备接口的 WinUSB 接口句柄的指针。*/ /**********************************************************************************/ BOOL GetWinUSBHandle(HANDLE hDeviceHandle, PWINUSB_INTERFACE_HANDLE phWinUSBHandle) { if (hDeviceHandle == INVALID_HANDLE_VALUE) { return FALSE; } BOOL bResult = WinUsb_Initialize(hDeviceHandle, phWinUSBHandle); if(!bResult) { //Error. printf("WinUsb_Initialize Error %d.", GetLastError()); return FALSE; } return bResult; }
求助这是咋回事啊
可能是我代码写得太长了,所以大家都不愿意看
我自己发现了问
PVOID p; PWINUSB_INTERFACE_HANDLE phWinUSBHandle = &p; BOOL getWinUSBHandle = GetWinUSBHandle(hDeviceHandle, phWinUSBHandle);
应改为
PVOID p; PWINUSB_INTERFACE_HANDLE phWinUSBHandle = &p; BOOL getWinUSBHandle = GetWinUSBHandle(hDeviceHandle, p);
就对了!不好意思,打扰大家了。
微软给的官方文档下面有如何调用的例子,是我没看仔细。
哈哈,好复杂的一个问题,不知道有人解决没?