📄 ezusbsys.c
字号:
//////////////////////////////////////////////////////////////////////
//
// File: ezusbsys.c
// $Archive: /USB/Drivers/ezusbdrv/ezusbsys.c $
//
// Purpose:
// General purpose USB device driver
//
// Environment:
// kernel mode
//
// $Author: Mdn $
//
// $History: ezusbsys.c $
//
// ***************** Version 6 *****************
// User: Mdn Date: 9/17/01 Time: 10:54a
// Updated in $/USB/Drivers/ezusbdrv
// Fixed memory leak bug in ISO streaming code. Was setting the
// PendingTransfers variable to the wrong value and not properly freeing
// after stopping the ISO stream.
//
// ***************** Version 5 *****************
// User: Mdn Date: 10/06/00 Time: 10:08a
// Updated in $/USB/Drivers/ezusbdrv
// Added IOCTL_EZUSB_SET_FEATURE
//
// ***************** Version 4 *****************
// User: Mdn Date: 8/17/00 Time: 9:46a
// Updated in $/USB/Drivers/ezusbdrv
// added a generic get descriptor function.
//
// ***************** Version 3 *****************
// User: Mdn Date: 8/04/00 Time: 11:41a
// Updated in $/USB/Drivers/ezmon
// added support for monitor download to FX2
//
// ***************** Version 2 *****************
// User: Mdn Date: 7/21/00 Time: 4:27p
// Updated in $/USB/Drivers/ezusbdrv
// Added a Started flag to the device extension. This flag gets set after
// the device has successfully Started. It is used to prevent a potential
// race condition where an application could get a handle (with
// CreateFile()) before the device is completely enumerated.
//
// ***************** Version 1 *****************
// User: Tpm Date: 6/09/00 Time: 6:32p
// Created in $/USB/Drivers/ezusbdrv
//
// ***************** Version 42 *****************
// User: Mdn Date: 5/05/00 Time: 10:24a
// Updated in $/EzUsb/Drivers/ezusbdrv
// comments
//
// ***************** Version 41 *****************
// User: Mdn Date: 4/18/00 Time: 2:45p
// Updated in $/EzUsb/Drivers/ezusbdrv
// fixed memory leak where I wasn't freeing an URB allocated for
// vendor/class requests.
//
// ***************** Version 40 *****************
// User: Mdn Date: 1/21/00 Time: 10:03a
// Updated in $/EzUsb/Drivers/ezusbdrv
// modified device removal code to send an abort message to all pipes
// before proceding with device removal. This solves the deadlock problem
// that can occur when a transfer is pending and the device receives a
// remove message. Before this change, the driver would block the removal
// indefinitely waiting for all pending transfers to complete.
//
// ***************** Version 39 *****************
// User: Markm Date: 12/17/99 Time: 11:17a
// Updated in $/EzUsb/Drivers/ezusbdrv
// Removed interface select workaround for an obscure OSR2.1 bug since the
// driver no longer supports Win95. Changed interface select so that it
// selects the first interface/alternate setting in the config descriptor.
// Before, it was hardcoded to select interface 0, AS 0. This should
// allow the driver to handle composite devices more easily, although I
// haven't tested it.
//
// ***************** Version 38 *****************
// User: Markm Date: 10/06/99 Time: 1:18p
// Updated in $/EzUsb/Drivers/ezusbdrv
// Made changes to Power IRP handling to fix the blue screen on shutdown
// that was occuring under Win2K. Specifically, started using PoXXX()
// calls for handling power IRPs. See code comments in
// Ezusb_DispatchPower(). The PoXXX() calls are not supported by Win95, so
// as of this revision, the driver will no longer work with Windows 95.
//
// ***************** Version 37 *****************
// User: Markm Date: 5/18/99 Time: 3:37p
// Updated in $/EzUsb/Drivers/ezusbdrv
//
// ***************** Version 36 *****************
// User: Markm Date: 4/29/99 Time: 9:48a
// Updated in $/EzUsb/Drivers/ezusbdrv
// Fixed IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST so that it correctly returns
// the number of bytes transferred.
//
// ***************** Version 35 *****************
// User: Markm Date: 4/16/99 Time: 3:39p
// Updated in $/EzUsb/Drivers/ezusbdrv
// more minor changes to get rid of compiler warnings.
//
// ***************** Version 34 *****************
// User: Markm Date: 4/12/99 Time: 10:26a
// Updated in $/EzUsb/Drivers/ezusbdrv
// minor changes to get rid of compiler warnings.
//
// ***************** Version 33 *****************
// User: Markm Date: 3/25/99 Time: 4:16p
// Updated in $/EzUsb/Drivers/ezusbdrv
// Fixed a bug in the surprise removal code I just added. I was returning
// from the PnP dispatch function without unlocking the device object.
//
// ***************** Version 32 *****************
// User: Markm Date: 3/25/99 Time: 2:03p
// Updated in $/EzUsb/Drivers/ezusbdrv
// Added code to allow unplugs (surprise removal) under NT5 without
// notifying the user.
//
// ***************** Version 31 *****************
// User: Markm Date: 2/23/99 Time: 9:50a
// Updated in $/EzUsb/Drivers/ezusbdrv
// Driver now supports ISO IN streaming with a path to user mode.
//
// ***************** Version 30 *****************
// User: Markm Date: 2/10/99 Time: 3:31p
// Updated in $/EzUsb/Drivers/ezusbdrv
// removed lots of unused code. Added ring buffer support functions.
//
// ***************** Version 29 *****************
// User: Markm Date: 2/01/99 Time: 11:57a
// Updated in $/EzUsb/Drivers/ezusbdrv
// Added preliminary support for ISO streaming.
//
// ***************** Version 28 *****************
// User: Markm Date: 6/12/98 Time: 4:23p
// Updated in $/EzUsb/Drivers/ezusbdrv
// modified pipe reset and abort code so that the driver will work
// correctly under Windows 95 OSR2.1. For Win98, MS changed the size of
// the URB_PIPE_REQUEST structure. They added an extra ulong to it. So,
// a driver compiled with the 98 DDk and run under 95 will send the wrong
// URB size. The solution is to check the USBDI version whenever I do a
// pipe reset or abort. If the USBDI version is pre-win98, I subtract 4
// from the size of the urb.
//
// ***************** Version 27 *****************
// User: Markm Date: 4/10/98 Time: 2:52p
// Updated in $/EZUSB/ezmon
// Modified Intel Hex download code to stop the 8051 before downloading to
// internal RAM.
//
// ***************** Version 26 *****************
// User: Markm Date: 4/09/98 Time: 4:39p
// Updated in $/EZUSB/ezusb driver
// Was not returning status information for ISO transfers. Now it does!
//
// ***************** Version 25 *****************
// User: Markm Date: 4/09/98 Time: 4:39p
// Updated in $/EZUSB/ezmon
// changes for monitor version of driver
//
// ***************** Version 24 *****************
// User: Markm Date: 4/09/98 Time: 3:09p
// Updated in $/EZUSB/ezusb driver
// nothing much
//
// ***************** Version 23 *****************
// User: Markm Date: 4/09/98 Time: 3:00p
// Updated in $/EZUSB/ezusb driver
// Added function to download Intel Hex File records to EZ-USB. For now,
// this function is only used by the conditional build of the driver that
// automatically downloads the Keil monitor.
//
// ***************** Version 22 *****************
// User: Markm Date: 4/07/98 Time: 1:52p
// Updated in $/EZUSB/ezusb driver
// Added IOCTL_EZUSB_GET_DRIVER_VERSION
//
// ***************** Version 21 *****************
// User: Markm Date: 4/06/98 Time: 4:26p
// Updated in $/EZUSB/ezusb driver
// Modified ISO transfer code.
// * Transfer descriptors for the ISO transfer are now sent up to the
// caller along with the actual data, so the caller can get the status of
// the transfer on a packet-by-packet basis.
// * Disabled default values. Caller must specify all fields in the ISO
// control structure.
// * Corrected bug where the Stream and Transfer objects weren't being
// freed.
//
// Added some code to measure the latency of a bulk transfer.
//
// ***************** Version 20 *****************
// User: Markm Date: 3/19/98 Time: 10:13a
// Updated in $/EZUSB/ezusb driver
// Added IOCTL_EZUSB_ANCHOR_DOWNLOAD to support A0 loads to a specific
// memory offset.
//
// ***************** Version 19 *****************
// User: Markm Date: 2/26/98 Time: 4:04p
// Updated in $/EZUSB/ezusb driver
// Added functions to perform anchor downloads and 8051 reset.
// Added conditionally compiled code to support a special version of the
// driver that will automatically download the Keil 8051 monitor after
// device attachment.
//
// ***************** Version 18 *****************
// User: Markm Date: 2/25/98 Time: 2:09p
// Updated in $/EZUSB/ezusb driver
// changes for adding version resource to the driver
//
// ***************** Version 17 *****************
// User: Markm Date: 2/11/98 Time: 9:51a
// Updated in $/EZUSB/ezusb driver
// 1. Added code to handle IRP_MN_CLOSE.
// 2. Now maintain a count of open file handles in the device extension.
// 3. Added workaround in Ezusb_SelectInterfaces() to avoid system hangs
// during device removal under OSR2.1. See comments there.
//
// ***************** Version 16 *****************
// User: Markm Date: 2/02/98 Time: 3:35p
// Updated in $/EZUSB/ezusb driver
//
// ***************** Version 15 *****************
// User: Markm Date: 1/27/98 Time: 11:36a
// Updated in $/EZUSB/ezusb driver
// Modified ISO transfer code so that the number of transfer buffers and
// the number of ISO frames per buffer can be specified by the caller.
//
// ***************** Version 14 *****************
// User: Markm Date: 1/26/98 Time: 10:11a
// Updated in $/EZUSB/ezusb driver
// 1) modified device removal code that was crashing OSR2.1. MS sample
// code says that during device removal, the remove IRP should be passed
// down the stack, and then the deviceobject should be deleted. This
// causes a bugcheck under OSR2.1. Reversing the order of these
// operations fixes the problem.
// 2) hardcoded the initial alternate setting to 2. It was set to 1, but
// this was also causing system crashes under OSR 2.1 during device
// removal. Still under investigation.
//
// ***************** Version 13 *****************
// User: Markm Date: 1/22/98 Time: 11:50a
// Updated in $/EZUSB/ezusb driver
// Fixed a bug in the device removal handler. It wasn't deleteting the
// symbolic link for the deviceobject after removal.
// Removed lots of unused code.
// Rewrote ISO loopback test code.
// Wrote new ISO read/write functions.
//
// ***************** Version 12 *****************
// User: Markm Date: 1/18/98 Time: 3:20p
// Updated in $/EZUSB/ezusb driver
// renamed variables. DeviceExtension becomes pdx and DeviceObject
// becomes fdo.
// rewrote handlers for device removal. Cleaned up power management
// dispatch. Added code to maintain a usage count for the device.
//
// ***************** Version 11 *****************
// User: Markm Date: 1/15/98 Time: 4:36p
// Updated in $/EZUSB/ezusb driver
// Added
// IOCTL_EZUSB_GET_CURRENT_FRAME_NUMBER
// IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST
// IOCTL_EZUSB_GET_LAST_ERROR
// preliminary code for handling device removal gracefully.
//
// ***************** Version 10 *****************
// User: Markm Date: 1/14/98 Time: 10:29a
// Updated in $/EZUSB/ezusb driver
// Cleanup.
// New functions for handling bulk transfers.
//
// ***************** Version 9 *****************
// User: Markm Date: 1/08/98 Time: 5:14p
// Updated in $/EZUSB/ezusb driver
// major changes to PnP IRP handling. lots of reformatting.
//
// ***************** Version 8 *****************
// User: Markm Date: 1/02/98 Time: 1:41p
// Updated in $/EZUSB/ezusb driver
// Added support for setting the interface, preliminary code for naming
// pipes, get string descriptor
//
// ***************** Version 7 *****************
// User: Markm Date: 11/18/97 Time: 4:40p
// Updated in $/EZUSB/ezusb driver
// Added abort pipe IOCTL
// Added function to dump a buffer to the debuger
// Added experimental file I/O code (from Brad Carpenter)
//
// ***************** Version 6 *****************
// User: Markm Date: 11/17/97 Time: 9:37a
// Updated in $/EZUSB/ezusb driver
// fixed bug where I set the pipesize
//
// ***************** Version 5 *****************
// User: Markm Date: 11/14/97 Time: 4:53p
// Updated in $/EZUSB/ezusb driver
// started using USBD_CreateConfigurationRequestEx
//
// ***************** Version 4 *****************
// User: Markm Date: 11/14/97 Time: 4:31p
// Updated in $/EZUSB/ezusb driver
// added code to experiment wth different methods of switiching
// interfaces.
//
// ***************** Version 3 *****************
// User: Markm Date: 11/07/97 Time: 1:23p
// Updated in $/EZUSB/ezusb driver
// added sourcesafe keywords
//
// Copyright (c) 1997 Anchor Chips, Inc. May not be reproduced without
// permission. See the license agreement for more details.
//
//////////////////////////////////////////////////////////////////////
// #define DRIVER
//
// Include files needed for WDM driver support
//
#include <wdm.h>
#include "stdarg.h"
#include "stdio.h"
//
// Include files needed for USB support
//
#include "usbdi.h"
#include "usbdlib.h"
//
// Include file for the Ezusb Device
//
#include "ezusbsys.h"
//
// incude file containing driver version
//
#include "version.h"
#ifdef DOWNLOAD_KEIL_MONITOR
extern INTEL_HEX_RECORD mon_ext_sio1_ezusb[];
extern INTEL_HEX_RECORD mon_ext_sio1_fx2[];
extern INTEL_HEX_RECORD loader[];
#endif // ifdef DOWNLOAD_KEIL_MONITOR
void
DumpBuffer(PVOID pvBuffer, ULONG length);
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
/*++
Routine Description:
Installable driver initialization entry point.
This is where the driver is called when the driver is being loaded
by the I/O system. This entry point is called directly by the I/O system.
Arguments:
DriverObject - pointer to the driver object
RegistryPath - pointer to a unicode string representing the path
to driver-specific key in the registry
Return Value:
STATUS_SUCCESS if successful,
STATUS_UNSUCCESSFUL otherwise
--*/
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_OBJECT deviceObject = NULL;
Ezusb_KdPrint (("entering (Ezusb) DriverEntry (Build: %s/%s\n",__DATE__,__TIME__));
//
// Create dispatch points for the various events handled by this
// driver. For example, device I/O control calls (e.g., when a Win32
// application calls the DeviceIoControl function) will be dispatched to
// routine specified below in the IRP_MJ_DEVICE_CONTROL case.
//
DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close;
DriverObject->DriverUnload = Ezusb_Unload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Ezusb_ProcessIOCTL;
DriverObject->MajorFunction[IRP_MJ_PNP] = Ezusb_DispatchPnp;
DriverObject->MajorFunction[IRP_MJ_POWER] = Ezusb_DispatchPower;
DriverObject->DriverExtension->AddDevice = Ezusb_PnPAddDevice;
Ezusb_KdPrint (("exiting (Ezusb) DriverEntry (%x)\n", ntStatus));
return ntStatus;
}
NTSTATUS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -