📄 deviceop.cpp
字号:
//Do not modify this file.
/*++
Copyright (c) 1997-1998 Microsoft Corporation
Module Name:
RWBulk.c
Abstract:
Console test app for BulkUsb.sys driver
Environment:
user mode only
Notes:
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Copyright (c) 1997-1998 Microsoft Corporation. All Rights Reserved.
Revision History:
11/17/97: created
--*/
#include "stdafx.h"
#include "devioctl.h"
#include <setupapi.h>
#include "BulkUsb.h"
#include "GUID829.h"
#include "usbdi.h"
#include "DeviceOp.h"
char completeDeviceName[256] = ""; //generated from the GUID registered by the driver itself
// functions
HANDLE
OpenOneDevice (
IN HDEVINFO HardwareDeviceInfo,
IN PSP_INTERFACE_DEVICE_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)) {
free( functionClassDeviceData );
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_INTERFACE_DEVICE_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_INTERFACE_DEVICE_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);
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);
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_CLASS_I82930_BULK,
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;
}
BOOL device_ctl(PDEVICE_CONTROL pDeviceControl,BOOL bRead)
{
BOOL bSuccess = false;
ULONG iBytes = 0;
HANDLE hDEV = open_dev();
if ( hDEV != INVALID_HANDLE_VALUE)
{
//if control transfer failed(control endpoint stall), DeviceIoControl will return 0
//if control transfer failed(control endpoint always NAK), DeviceIoControl will pending
//if control transfer is successful,DeviceIoControl will return 1
if (!bRead) //if false,io control write
{
bSuccess = DeviceIoControl(hDEV,
IOCTL_BULKUSB_DEVICE_WRITE,
pDeviceControl, //input buffer address,namely,data send to driver
sizeof(DEVICE_CONTROL),
NULL,
0,
&iBytes, //this must have
NULL);
}
else
{
bSuccess = DeviceIoControl(hDEV,
IOCTL_BULKUSB_DEVICE_READ,
pDeviceControl, //input buffer address,namely,data send to driver
sizeof(DEVICE_CONTROL),
pDeviceControl->pBuffer,
pDeviceControl->wLength,
&iBytes, //this must have
NULL);
}
CloseHandle(hDEV);
}
return bSuccess;
}
void reset_pipe(HANDLE hHandle)
{
// when read or write from or to a bulk pipe and return non-success,
//it shows an error has happened and pipe will be in stall status,
//so we should send a ClearFeature request to this pipe.
//For interrupt pipe,in our demo,it only implement very simple function,
//no stall status would happened.
ULONG nBytes = 0;
DeviceIoControl(hHandle,
IOCTL_BULKUSB_RESET_PIPE,
NULL,
0,
NULL,
0,
&nBytes,
NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -