全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4603
推到 Plurk!
推到 Facebook!

USB 無法取得device path

答題得分者是:taishyang
tunkai
一般會員


發表:3
回覆:6
積分:6
註冊:2008-11-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-15 16:07:41 IP:140.115.xxx.xxx 訂閱
我從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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-15 17:34:39 IP:118.169.xxx.xxx 訂閱
能知道是哪一段code才發生問題嗎^^?
tunkai
一般會員


發表:3
回覆:6
積分:6
註冊:2008-11-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-15 19:30:36 IP:140.115.xxx.xxx 訂閱
到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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-15 19:52:29 IP:118.169.xxx.xxx 訂閱
猜的
[Project]->[options]->[Advanced Compiler]->[Data Alignment]改為BYTE試試
tunkai
一般會員


發表:3
回覆:6
積分:6
註冊:2008-11-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-15 20:35:30 IP:140.115.xxx.xxx 訂閱
之前有在論壇上,看到類似的設定,但是之前是另外一個程式沒有成功,
這次設定完就取到正確的device path,

可以請問這定這一個選項的用意是什麼呢?
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-15 22:12:17 IP:118.169.xxx.xxx 訂閱
搜尋Data Alignment,站上有相關討論文章
主要是改變struct資料對齊的方式,造成sizeof的以及存取速度的不同

系統時間:2017-10-19 20:43:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!