cctvbuilder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-08
  • 最后登录2002-11-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2184回复:6

新手上路:请教usb开发的入门级问题

楼主#
更多 发布于:2002-11-10 16:13
 请教各位侠哥侠姐,应用程序如何读写USB设备的数据?
 是Createfile(...),Readfile(...),WriteFile(...)吗?
 

最新喜欢:

BeshyBeshy
cquwyb
驱动牛犊
驱动牛犊
  • 注册日期2002-05-10
  • 最后登录2010-10-23
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望16点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-10 16:51
然也 :cool:
HonestTreee
cctvbuilder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-08
  • 最后登录2002-11-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-10 18:12
honesttree兄,多谢你不吝赐教,那么createfile的第一个参数对于特定的设备该如何填写?
zoro
驱动牛犊
驱动牛犊
  • 注册日期2002-03-03
  • 最后登录2015-05-10
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望30点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-10 20:54
看看《USB大全》,很详细啊
pinealone
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2003-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-13 15:58
也可察看帮助嘛。
pinealone
驱动牛犊
驱动牛犊
  • 注册日期2002-10-08
  • 最后登录2003-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-13 16:00
也可查看帮助嘛,MSDN
fog_qin
驱动牛犊
驱动牛犊
  • 注册日期2002-03-28
  • 最后登录2004-02-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-13 17:00

#include \"stdafx.h\"

#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
#include <basetyps.h>
#include <usbdi.h>

// Microsoft released two setupapi.h files: one in Win98 DDK and
// the other one in VC/C++. We shall use the one in Win98 DDK.
// In oder to resolve this conflict, we have copied setupapi.h
// and setupapi.lib from Win98 DDK to current working directory.
#include \"setupapi.h\"

#include \"ioctl.h\"
#include \"GUIDUDK.h\"

// Generated from the GUID registered by the driver itself
char completeDeviceName[256] = \"\";


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 SetupDiEnumInterfaceDevice()

Return Value:

    return HANDLE if the open and initialization was successfull,
else INVLAID_HANDLE_VALUE.

--*/
{
    PSP_INTERFACE_DEVICE_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.
    //
    SetupDiGetInterfaceDeviceDetail
(
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
);

    predictedLength = requiredLength;

    functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc (predictedLength);
    functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);

    //
    // Retrieve the information from Plug and Play.
    //
    if (!SetupDiGetInterfaceDeviceDetail (
               HardwareDeviceInfo,
               DeviceInfoData,
               functionClassDeviceData,
               predictedLength,
               &requiredLength,
               NULL))
{
        return INVALID_HANDLE_VALUE;
    }

strcpy(devName,functionClassDeviceData->DevicePath);

    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)
{
    }

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;

*UsbDevices = 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_INTERFACEDEVICE)); // Function class devices.

//
// 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)
{
*UsbDevices = (PUSB_DEVICE_DESCRIPTOR)realloc(*UsbDevices, (NumberDevices * sizeof(USB_DEVICE_DESCRIPTOR)));
}
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);

if (*UsbDevices)
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_NETAC_UDK2000, completeDeviceName);

return hDEV;
}

HANDLE
open_file(char *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

--*/
{
HANDLE h;

if (!GetUsbDeviceFileName(
(LPGUID) &GUID_NETAC_UDK2000,
completeDeviceName))
{
return  INVALID_HANDLE_VALUE;
}

    strcat(completeDeviceName, \"\\\\\");

    strcat(completeDeviceName, filename);

h = CreateFile(completeDeviceName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);

return h;
}
游客

返回顶部