2011-05-03 00:15:23 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2005-12-01 21:37:19 +00:00
|
|
|
#include <ntddk.h>
|
2011-05-03 00:15:23 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
2005-12-01 21:37:19 +00:00
|
|
|
#include <usbdi.h>
|
2011-05-03 00:15:23 +00:00
|
|
|
#include <hubbusif.h>
|
|
|
|
#include <usbbusif.h>
|
|
|
|
#include <usbioctl.h>
|
2005-12-01 21:37:19 +00:00
|
|
|
#include <usbiodef.h>
|
2011-05-03 00:15:23 +00:00
|
|
|
#include <usb.h>
|
|
|
|
#include <usbdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <wdmguid.h>
|
|
|
|
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2009-08-24 17:38:50 +00:00
|
|
|
#define USB_STOR_TAG 'sbsu'
|
2005-08-14 22:27:15 +00:00
|
|
|
#define USB_MAXCHILDREN (16)
|
|
|
|
|
2008-11-30 11:16:55 +00:00
|
|
|
NTSTATUS NTAPI
|
2005-08-14 22:27:15 +00:00
|
|
|
IoAttachDeviceToDeviceStackSafe(
|
|
|
|
IN PDEVICE_OBJECT SourceDevice,
|
|
|
|
IN PDEVICE_OBJECT TargetDevice,
|
|
|
|
OUT PDEVICE_OBJECT *AttachedToDeviceObject);
|
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
typedef struct _COMMON_DEVICE_EXTENSION
|
2005-08-14 22:27:15 +00:00
|
|
|
{
|
2011-05-03 00:15:23 +00:00
|
|
|
BOOLEAN IsFDO;
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
}COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
COMMON_DEVICE_EXTENSION Common; // common device extension
|
|
|
|
|
|
|
|
PDEVICE_OBJECT FunctionalDeviceObject; // functional device object
|
|
|
|
PDEVICE_OBJECT PhysicalDeviceObject; // physical device object
|
|
|
|
PDEVICE_OBJECT LowerDeviceObject; // lower device object
|
|
|
|
USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
|
|
|
|
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
|
|
|
|
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
|
|
|
|
PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information
|
|
|
|
USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
|
|
|
|
UCHAR BulkInPipeIndex; // bulk in pipe index
|
|
|
|
UCHAR BulkOutPipeIndex; // bulk out pipe index
|
|
|
|
UCHAR MaxLUN; // max lun for device
|
|
|
|
PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices
|
|
|
|
}FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
COMMON_DEVICE_EXTENSION Common;
|
|
|
|
PDEVICE_OBJECT LowerDeviceObject; // points to FDO
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
}PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
2005-08-14 22:27:15 +00:00
|
|
|
|
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
//
|
|
|
|
// max lun command identifier
|
|
|
|
//
|
|
|
|
#define USB_BULK_GET_MAX_LUN 0xFE
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
//---------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// fdo.c routines
|
|
|
|
//
|
2005-08-14 22:27:15 +00:00
|
|
|
NTSTATUS
|
2011-05-03 00:15:23 +00:00
|
|
|
USBSTOR_FdoHandlePnp(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN OUT PIRP Irp);
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// pdo.c routines
|
|
|
|
//
|
|
|
|
NTSTATUS
|
|
|
|
USBSTOR_PdoHandlePnp(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN OUT PIRP Irp);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2011-05-03 00:15:23 +00:00
|
|
|
USBSTOR_CreatePDO(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
OUT PDEVICE_OBJECT *ChildDeviceObject);
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// misc.c routines
|
|
|
|
//
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
USBSTOR_SyncForwardIrp(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN OUT PIRP Irp);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
USBSTOR_GetBusInterface(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
|
|
|
|
|
|
|
|
PVOID
|
|
|
|
AllocateItem(
|
|
|
|
IN POOL_TYPE PoolType,
|
|
|
|
IN ULONG ItemSize);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
FreeItem(
|
|
|
|
IN PVOID Item);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2011-05-03 00:15:23 +00:00
|
|
|
USBSTOR_SyncUrbRequest(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
OUT PURB UrbRequest);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2011-05-03 00:15:23 +00:00
|
|
|
USBSTOR_GetMaxLUN(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PFDO_DEVICE_EXTENSION DeviceExtension);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
2011-05-03 00:15:23 +00:00
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// descriptor.c routines
|
|
|
|
//
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
USBSTOR_GetDescriptors(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
USBSTOR_SelectConfigurationAndInterface(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PFDO_DEVICE_EXTENSION DeviceExtension);
|
2005-08-14 22:27:15 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2011-05-03 00:15:23 +00:00
|
|
|
USBSTOR_GetPipeHandles(
|
|
|
|
IN PFDO_DEVICE_EXTENSION DeviceExtension);
|
2005-08-14 22:27:15 +00:00
|
|
|
|