USB 無法取得device path |
答題得分者是:taishyang
|
tunkai
一般會員 發表:3 回覆:6 積分:6 註冊:2008-11-27 發送簡訊給我 |
我從DDK的bulkusb的範例編譯了他的驅動,安裝後,使用RwBulk.exe可以抓出設備的資料
C:\WinDDK\6001.18002\src\usb\bulkusb\exe\objfre_wxp_x86\i386>RwBulk -u Attempting to open \\?\usb#vid_1309&pid_0120#6&3adb3a12&0&4#{00873fdf-61a8-11d1-aa5e-00c04fb1728b} DeviceName = (\\?\usb#vid_1309&pid_0120#6&3adb3a12&0&4#{00873fdf-61a8-11d1-aa5e-00c04fb1728b}) request complete, success = 1 nBytes = 32 但是一樣的程式copy到BCB後,就抓不到DevicePath,不知道是不是環境設定有問題? 下面是我的程式碼 [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include #include #include #include #include #include #include "devioctl.h" #include #include <basetyps.h><br />#include ".\bulkusb\sys\BulkUsr.h" #include "usbdi.h" #define NOISY(_x_) printf _x_ ; char inPipe[32] = "PIPE00"; // pipe name for bulk input pipe on our test board char outPipe[32] = "PIPE01"; // pipe name for bulk output pipe on our test board char completeDeviceName[256] = ""; //generated from the GUID registered by the driver itself BOOL fDumpUsbConfig = FALSE; // flags set in response to console command line switches BOOL fDumpReadData = FALSE; BOOL fRead = FALSE; BOOL fWrite = FALSE; int gDebugLevel = 1; // higher == more verbose, default is 1, 0 turns off all ULONG IterationCount = 1; //count of iterations of the test we are to perform int WriteLen = 0; // #bytes to write int ReadLen = 0; // #bytes to read // functions HANDLE OpenOneDevice ( IN HDEVINFO HardwareDeviceInfo, IN PSP_DEVICE_INTERFACE_DATA DeviceInfoData, IN char *devName ) /* Routine Description: Given the HardwareDeviceInfo, representing a handle to the plug and play information, and deviceInfoData, representing a specific usb device, open that device and fill in all the relevant information in the given USB_DEVICE_DESCRIPTOR structure. Arguments: HardwareDeviceInfo: handle to info obtained from Pnp mgr via SetupDiGetClassDevs() DeviceInfoData: ptr to info obtained via SetupDiEnumDeviceInterfaces() Return Value: return HANDLE if the open and initialization was successfull, else INVLAID_HANDLE_VALUE. --*/ { PSP_DEVICE_INTERFACE_DETAIL_DATA functionClassDeviceData = NULL; ULONG predictedLength = 0; ULONG requiredLength = 0; HANDLE hOut = INVALID_HANDLE_VALUE; // // allocate a function class device data structure to receive the // goods about this particular device. // if (SetupDiGetDeviceInterfaceDetail(HardwareDeviceInfo, DeviceInfoData, NULL, // probing so no output buffer yet 0, // probing so output buffer length of zero &requiredLength, NULL)) // not interested in the specific dev-node { return INVALID_HANDLE_VALUE; } if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) { return INVALID_HANDLE_VALUE; } predictedLength = requiredLength; // sizeof (SP_FNCLASS_DEVICE_DATA) 512; functionClassDeviceData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(predictedLength); if (NULL == functionClassDeviceData) { return INVALID_HANDLE_VALUE; } functionClassDeviceData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // // Retrieve the information from Plug and Play. // if (!SetupDiGetDeviceInterfaceDetail(HardwareDeviceInfo, DeviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL)) { free(functionClassDeviceData); return INVALID_HANDLE_VALUE; } strcpy(devName,functionClassDeviceData->DevicePath); printf("Attempting to open %s\n", devName); hOut = CreateFile(functionClassDeviceData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, // No SECURITY_ATTRIBUTES structure OPEN_EXISTING,// No special create flags 0, // No special attributes NULL); // No template file if (INVALID_HANDLE_VALUE == hOut) { printf("FAILED to open %s\n", devName); } free(functionClassDeviceData); return hOut; } HANDLE OpenUsbDevice ( LPGUID pGuid, char *outNameBuf ) /* Routine Description: Do the required PnP things in order to find the next available proper device in the system at this time. Arguments: pGuid: ptr to GUID registered by the driver itself outNameBuf: the generated name for this device Return Value: return HANDLE if the open and initialization was successful, else INVLAID_HANDLE_VALUE. --*/ { ULONG NumberDevices; HANDLE hOut = INVALID_HANDLE_VALUE; HDEVINFO hardwareDeviceInfo; SP_DEVICE_INTERFACE_DATA deviceInfoData; ULONG i; BOOLEAN done; PUSB_DEVICE_DESCRIPTOR usbDeviceInst; PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst; PUSB_DEVICE_DESCRIPTOR tempDevDesc; *UsbDevices = NULL; tempDevDesc = NULL; NumberDevices = 0; // // Open a handle to the plug and play dev node. // SetupDiGetClassDevs() returns a device information set that contains info on all // installed devices of a specified class. // hardwareDeviceInfo = SetupDiGetClassDevs(pGuid, NULL, // Define no enumerator (global) NULL, // Define no (DIGCF_PRESENT | // Only Devices present DIGCF_DEVICEINTERFACE)); // Function class devices. if (hardwareDeviceInfo == INVALID_HANDLE_VALUE) { return INVALID_HANDLE_VALUE; } // // Take a wild guess at the number of devices we have; // Be prepared to realloc and retry if there are more than we guessed // NumberDevices = 4; done = FALSE; deviceInfoData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA); i=0; while (!done) { NumberDevices *= 2; if (*UsbDevices) { tempDevDesc = (PUSB_DEVICE_DESCRIPTOR)realloc(*UsbDevices, (NumberDevices * sizeof (USB_DEVICE_DESCRIPTOR))); if(tempDevDesc) { *UsbDevices = tempDevDesc; tempDevDesc = NULL; } else { free(*UsbDevices); *UsbDevices = NULL; } } else { *UsbDevices = (PUSB_DEVICE_DESCRIPTOR)calloc(NumberDevices, sizeof(USB_DEVICE_DESCRIPTOR)); } if (NULL == *UsbDevices) { // SetupDiDestroyDeviceInfoList destroys a device information set // and frees all associated memory. SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); return INVALID_HANDLE_VALUE; } usbDeviceInst = *UsbDevices i; for (; i < NumberDevices; i ) { // SetupDiEnumDeviceInterfaces() returns information about device interfaces // exposed by one or more devices. Each call returns information about one interface; // the routine can be called repeatedly to get information about several interfaces // exposed by one or more devices. if (SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, 0, // We don't care about specific PDOs pGuid, i, &deviceInfoData)) { hOut = OpenOneDevice(hardwareDeviceInfo, &deviceInfoData, outNameBuf); if (hOut != INVALID_HANDLE_VALUE) { done = TRUE; break; } } else { if (ERROR_NO_MORE_ITEMS == GetLastError()) { done = TRUE; break; } } } } NumberDevices = i; // SetupDiDestroyDeviceInfoList() destroys a device information set // and frees all associated memory. SetupDiDestroyDeviceInfoList(hardwareDeviceInfo); free(*UsbDevices); return hOut; } BOOL GetUsbDeviceFileName ( LPGUID pGuid, char *outNameBuf ) /* Routine Description: Given a ptr to a driver-registered GUID, give us a string with the device name that can be used in a CreateFile() call. Actually briefly opens and closes the device and sets outBuf if successfull; returns FALSE if not Arguments: pGuid: ptr to GUID registered by the driver itself outNameBuf: the generated zero-terminated name for this device Return Value: TRUE on success else FALSE --*/ { HANDLE hDev = OpenUsbDevice(pGuid, outNameBuf); if (hDev != INVALID_HANDLE_VALUE) { CloseHandle(hDev); return TRUE; } return FALSE; } HANDLE open_dev() /* Routine Description: Called by dumpUsbConfig() to open an instance of our device Arguments: None Return Value: Device handle on success else NULL --*/ { HANDLE hDEV = OpenUsbDevice((LPGUID)&GUID_CLASS_I82930_BULK, completeDeviceName); if (hDEV == INVALID_HANDLE_VALUE) { printf("Failed to open (%s) = %d", completeDeviceName, GetLastError()); } else { printf("DeviceName = (%s)\n", completeDeviceName); } return hDEV; } HANDLE open_file ( PCHAR filename ) /* Routine Description: Called by main() to open an instance of our device after obtaining its name Arguments: None Return Value: Device handle on success else NULL --*/ { int success = 1; HANDLE h; if (!GetUsbDeviceFileName((LPGUID) &GUID_CLASS_I82930_BULK, completeDeviceName)) { NOISY(("Failed to GetUsbDeviceFileName err - %d\n", GetLastError())); return INVALID_HANDLE_VALUE; } strcat(completeDeviceName, "\\"); if ((strlen(completeDeviceName) strlen(filename)) > 255) { NOISY(("Failed to open handle - possibly long filename\n")); return INVALID_HANDLE_VALUE; } strcat(completeDeviceName, filename); printf("completeDeviceName = (%s)\n", completeDeviceName); h = CreateFile(completeDeviceName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (h == INVALID_HANDLE_VALUE) { NOISY(("Failed to open (%s) = %d", completeDeviceName, GetLastError())); success = 0; } else { NOISY(("Opened successfully.\n")); } return h; } int main(int argc, char* argv[]) { /**/ HANDLE hDEV = open_dev(); system("pause"); return 0; } //--------------------------------------------------------------------------- [/code] |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
tunkai
一般會員 發表:3 回覆:6 積分:6 註冊:2008-11-27 發送簡訊給我 |
到113行,SetupDiGetDeviceInterfaceDetail( ),程式就跳出了,沒有取得functionClassDeviceData的資料,
get_lasterror()傳回0; [code cpp] if (!SetupDiGetDeviceInterfaceDetail(HardwareDeviceInfo, DeviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL)) { free(functionClassDeviceData); return INVALID_HANDLE_VALUE; } [/code] |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
tunkai
一般會員 發表:3 回覆:6 積分:6 註冊:2008-11-27 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |