Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

687 lines
14 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
DBCLASS.H
Abstract:
This module contains the PRIVATE definitions for the
code that implements the DeviceBay Filter Driver
Environment:
Kernel & user mode
Revision History:
--*/
//
// Instance specific Data for the controller
//
#define DBCLASS_EJECT_TIMEOUT 10000 //timeout in ms
//use a 10 second timeout
#define DBC_CONTEXT_SIG 0x4c434244 //'DBCL'
#define DBC_WORKITEM_SIG 0x4b574244 //'DBWK'
// HW branch registry Keys
#define IS_DEVICE_BAY_KEY L"IsDeviceBay"
#define DBC_GUID_KEY L"DBCGuid"
#define INSTALLED_KEY L"installed"
#define ACPI_HUB_KEY L"acpiHubParentPort"
// SW branch registry keys
#define RELEASE_ON_SHUTDOWN L"releaseshutdown"
// class global registry keys
// these are found in HKLM\CCS\Services\Class\dbc
#define DEBUG_LEVEL_KEY L"debuglevel"
#define DEBUG_WIN9X_KEY L"debugWin9x"
#define DEBUG_BREAK_ON L"breakon"
#ifdef DEBUG3
#define MAX_DEBUG
#endif /* DEBUG3 */
#ifndef ANY_SIZE_ARRAY
#define ANY_SIZE_ARRAY 1
#endif
typedef struct _DBC_BAY_INFORMATION {
ULONG Sig;
DBC_BAY_DESCRIPTOR BayDescriptor;
BAY_STATUS LastBayStatus;
PDEVICE_OBJECT DeviceFilterObject;
PDEVICE_OBJECT UsbHubPdo;
ULONG UsbHubPort;
} DBC_BAY_INFORMATION, *PDBC_BAY_INFORMATION;
#define MAX_DBC_1394_PORTS 16
//
// values for Flags in BUS1394_PORT_INFO
//
#define DBCLASS_PORTFLAG_DEVICE_CONNECTED 0x0000001
typedef struct _BUS1394_PORT_INFO {
USHORT NodeId; // 1394 nodeID for device on this port
USHORT BayNumber; // Bay number tied to this port
ULONG Flags;
} BUS1394_PORT_INFO , *PBUS1394_PORT_INFO;
typedef struct _DBC_CONTEXT {
ULONG Sig;
ULONG Flags;
ULONG ControllerSig;
// Top of the DB controller stack
// this is who we call when talking to
// the db controller.
// This will be the controller FDO or
// an OEM filter FDO
PDEVICE_OBJECT TopOfStack;
// the controllers FDO
PDEVICE_OBJECT ControllerFdo;
// Physical Device Object passed
// to controllers AddDevice
PDEVICE_OBJECT ControllerPdo;
// Top of PDO stack ie top of stack
// returned when controller attaches
// to the PDO passed to AddDevice
PDEVICE_OBJECT TopOfPdoStack;
struct _DBC_CONTEXT *Next;
PIRP ChangeIrp;
ULONG PendingIoCount;
DEVICE_POWER_STATE CurrentDevicePowerState;
// device object that sits on the PDO for the bus
// extender
PDEVICE_OBJECT BusFilterMdo1394;
PDEVICE_OBJECT BusFilterMdoUSB;
PDRIVER_OBJECT BusFilterDriverObject;
PDEVICE_OBJECT LinkDeviceObject;
KSEMAPHORE DrbSemaphore;
KEVENT RemoveEvent;
KEVENT PowerEvent;
NTSTATUS LastSetDXntStatus;
DBC_SUBSYSTEM_DESCRIPTOR SubsystemDescriptor;
DBC_BAY_INFORMATION BayInformation[MAX_BAY_NUMBER+1];
ULONG NumberOf1394Ports;
PBUS1394_PORT_INFO Bus1394PortInfo;
PIRP PowerIrp;
struct _DRB_CHANGE_REQUEST ChangeDrb;
// guid for the 1394c bus this controller is on
UCHAR Guid1394Bus[8];
KSPIN_LOCK FlagsSpin;
BOOLEAN Stopped;
BOOLEAN EjectRequested;
} DBC_CONTEXT, *PDBC_CONTEXT;
typedef struct _EJECT_CONTEXT {
PDBC_CONTEXT DbcContext;
USHORT Bay;
} EJECT_CONTEXT, *PEJECT_CONTEXT;
typedef struct _DBCLASS_WORKITEM {
ULONG Sig;
WORK_QUEUE_ITEM WorkQueueItem;
PDBC_CONTEXT DbcContext;
NTSTATUS IrpStatus;
struct _DBC_EJECT_TIMEOUT_CONTEXT *TimeoutContext;
} DBCLASS_WORKITEM, *PDBCLASS_WORKITEM;
typedef struct _DBCLASS_PDO_LIST {
LIST_ENTRY ListEntry;
PDEVICE_OBJECT PdoDeviceObject;
PDEVICE_OBJECT FilterDeviceObject;
} DBCLASS_PDO_LIST, *PDBCLASS_PDO_LIST;
// DBC_CONTEXT Flags values
#define DBCLASS_FLAG_STOPPING 0x00000001
#define DBCLASS_FLAG_REQ_PENDING 0x00000002
#define DBCLASS_FLAG_RELEASE_ON_SHUTDOWN 0x00000004
#define INITIALIZE_DRB_SERIALIZATION(dc) KeInitializeSemaphore(&(dc)->DrbSemaphore, 1, 1);
#define DBCLASS_BEGIN_SERIALIZED_DRB(dc) { DBCLASS_KdPrint((3, "'***WAIT DRB SEM%x\n", &(dc)->DrbSemaphore)); \
KeWaitForSingleObject(&(dc)->DrbSemaphore, \
Executive,\
KernelMode, \
FALSE, \
NULL); \
}
#define DBCLASS_END_SERIALIZED_DRB(dc) { DBCLASS_KdPrint((3, "'***RELEASE DRB SEM %x\n", &(dc)->DrbSemaphore));\
KeReleaseSemaphore(&(dc)->DrbSemaphore,\
LOW_REALTIME_PRIORITY,\
1,\
FALSE);\
}
#define NUMBER_OF_BAYS(dbc) ((dbc)->SubsystemDescriptor.bmAttributes.BayCount)
#define DBC_TAG ' cbD'
/*
Debug Macros
*/
#if DBG
#ifndef DEBUG_LOG
#define DEBUG_LOG
#endif
VOID
DBCLASS_Assert(
IN PVOID FailedAssertion,
IN PVOID FileName,
IN ULONG LineNumber,
IN PCHAR Message
);
#define DBCLASS_ASSERT(exp) \
if (!(exp)) { \
DBCLASS_Assert( #exp, __FILE__, __LINE__, NULL );\
}
#define LOGENTRY(mask, sig, info1, info2, info3)
// DBCLASS_Debug_LogEntry(mask, sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
ULONG
_cdecl
DBCLASS_KdPrintX(
ULONG l,
PCH Format,
...
);
VOID
DBCLASS_LogInit(
);
VOID
DBCLASS_Debug_LogEntry(
IN ULONG Mask,
IN ULONG Sig,
IN ULONG Info1,
IN ULONG Info2,
IN ULONG Info3
);
#define LOG_MISC 0x00000001 //debug log entries
#define DBCLASS_KdPrint(_x_) DBCLASS_KdPrintX _x_
#define TEST_TRAP() { DbgPrint( "DBCLASS: Code coverage trap %s line: %d\n", __FILE__, __LINE__);\
TRAP();}
extern ULONG DBCLASS_BreakOn;
#define BRK_ON_TRAP() \
{\
if (DBCLASS_BreakOn) {\
DbgPrint( "DBCLASS: DEBUG TEST BREAK %s line: %d\n", __FILE__, __LINE__ );\
DbgBreakPoint();\
}\
}
#define TRAP() DbgBreakPoint()
#define DEBUG_HEAP
extern ULONG DBCLASS_TotalHeapSace;
#define DBCLASS_HEAP_SIG 0x12344321
#define DBCLASS_FREE_TAG 0x11111111
#define DbcExAllocatePool(p, l) DBCLASS_GetHeap((p), (l), DBCLASS_HEAP_SIG, \
&DBCLASS_TotalHeapSace)
#define DbcExFreePool(l) DBCLASS_RetHeap((l), DBCLASS_HEAP_SIG, \
&DBCLASS_TotalHeapSace)
VOID
DBCLASS_Warning(
PVOID Context,
PUCHAR Message,
BOOLEAN DebugBreak
);
#else
// NOT DEBUG
#define LOGENTRY(mask, sig, info1, info2, info3)
#define DBCLASS_ASSERT(exp)
#define DBCLASS_KdPrint(_x_)
#define DBCLASS_KdPrintGuid(_x_, _y_)
#define TRAP()
#define TEST_TRAP()
#define BRK_ON_TRAP()
#define DbcExAllocatePool(p, l) ExAllocatePoolWithTag((p), (l), DBC_TAG)
#define DbcExFreePool(l) ExFreePool((l))
#define DBCLASS_Warning(x, y, z)
#endif
VOID
DBCLASS_Unload(
IN PDRIVER_OBJECT DriverObject
);
PDBC_CONTEXT
DBCLASS_GetDbcContext(
IN PDEVICE_OBJECT ControllerFdo
);
NTSTATUS
DBCLASS_StopController(
IN PDBC_CONTEXT DbcContext,
IN PIRP Irp,
IN PBOOLEAN HandledByClass
);
NTSTATUS
DBCLASS_StartController(
IN PDBC_CONTEXT DbcContext,
IN PIRP Irp,
IN PBOOLEAN HandledByClass
);
NTSTATUS
DBCLASS_UsbhubBusFilterDispatch(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PBOOLEAN Handled
);
NTSTATUS
DBCLASS_SyncSubmitDrb(
IN PDBC_CONTEXT DbcContext,
IN PDEVICE_OBJECT DeviceObject,
IN PDRB Drb
);
NTSTATUS
DBCLASS_CleanupController(
IN PDBC_CONTEXT DbcContext
);
NTSTATUS
DBCLASS_SyncGetSubsystemDescriptor(
IN PDBC_CONTEXT DbcContext
);
NTSTATUS
DBCLASS_CreateDeviceFilterObject(
IN PDRIVER_OBJECT DriverObject,
IN OUT PDEVICE_OBJECT *DeviceObject,
IN PDEVICE_OBJECT DevicePdo,
IN PDBC_CONTEXT DbcContext,
IN ULONG BusTypeSig
);
NTSTATUS
DBCLASS_SyncGetBayDescriptor(
IN PDBC_CONTEXT DbcContext,
IN USHORT BayNumber,
IN PDBC_BAY_DESCRIPTOR BayDescriptor
);
NTSTATUS
DBCLASS_SyncGetAllBayDescriptors(
IN PDBC_CONTEXT DbcContext
);
VOID
DBCLASS_ChangeIndicationWorker(
IN PVOID Context
);
NTSTATUS
DBCLASS_SyncGetBayStatus(
IN PDBC_CONTEXT DbcContext,
IN USHORT BayNumber,
IN PBAY_STATUS BayStatus
);
NTSTATUS
DBCLASS_SyncBayFeatureRequest(
IN PDBC_CONTEXT DbcContext,
IN USHORT Op,
IN USHORT BayNumber,
IN USHORT FeatureSelector
);
NTSTATUS
DBCLASS_ChangeIndication(
IN PDEVICE_OBJECT PNull,
IN PIRP Irp,
IN PVOID Context
);
VOID
DBCLASS_PostChangeRequest(
IN PDBC_CONTEXT DbcContext
);
NTSTATUS
DBCLASS_ProcessCurrentBayState(
IN PDBC_CONTEXT DbcContext,
IN BAY_STATUS BayStatus,
IN USHORT Bay,
IN PBOOLEAN PostChgangeRequest
);
NTSTATUS
DBCLASS_1394BusFilterDispatch(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PBOOLEAN Handled
);
NTSTATUS
DBCLASS_PdoFilterDispatch(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PBOOLEAN Handled
);
NTSTATUS
DBCLASS_EjectPdo(
IN PDEVICE_OBJECT DeviceFilterObject
);
NTSTATUS
DBCLASS_EnableDevice(
IN PDEVICE_OBJECT DeviceFilterObject
);
USHORT
DBCLASS_GetBayNumber(
IN PDEVICE_OBJECT DeviceFilterObject
);
NTSTATUS
DBCLASS_DeferIrpCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
USHORT
DBCLASS_GetBayFor1394Pdo(
PDEVICE_OBJECT BusFilterMdo,
PDBC_CONTEXT DbcContext,
PDEVICE_OBJECT Pdo1394
);
NTSTATUS
DBCLASS_DevicePdoQCapsComplete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
PDEVICE_OBJECT
DBCLASS_FindDevicePdo(
PDEVICE_OBJECT PdoDeviceObject
);
NTSTATUS
DBCLASS_BusFilterDispatch(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PBOOLEAN Handled
);
NTSTATUS
DBCLASS_GetRegistryKeyValueForPdo(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN BOOLEAN SoftwareBranch,
IN PWCHAR KeyNameString,
IN ULONG KeyNameStringLength,
IN PVOID Data,
IN ULONG DataLength
);
PDBC_CONTEXT
DBCLASS_FindController1394DevicePdo(
PDRIVER_OBJECT FilterDriverObject,
PDEVICE_OBJECT FilterMdo,
PDEVICE_OBJECT DevicePdo1394,
PUCHAR BusGuid
);
NTSTATUS
DBCLASS_Check1394DevicePDO(
PDEVICE_OBJECT FilterDeviceObject,
PDBC_CONTEXT DbcContext,
PDEVICE_OBJECT DevicePDO
);
BOOLEAN
DBCLASS_IsHubPartOfACPI_DBC(
PDEVICE_OBJECT DeviceObject
);
USHORT
DBCLASS_GetBayForUSBPdo(
PDBC_CONTEXT DbcContext,
PDEVICE_OBJECT PdoUSB
);
#if DBG
VOID
DBCLASS_AssertBaysEmpty(
PDBC_CONTEXT DbcContext
);
#else
#define DBCLASS_AssertBaysEmpty(d)
#endif
PVOID
DBCLASS_GetHeap(
IN POOL_TYPE PoolType,
IN ULONG NumberOfBytes,
IN ULONG Signature,
IN PLONG TotalAllocatedHeapSpace
);
VOID
DBCLASS_RetHeap(
IN PVOID P,
IN ULONG Signature,
IN PLONG TotalAllocatedHeapSpace
);
#if DBG
VOID
DBCLASS_KdPrintGuid(
ULONG Level,
PUCHAR P
);
#endif
NTSTATUS
DBCLASS_1394GetBusGuid(
PDEVICE_OBJECT DeviceObject,
PUCHAR BusGuid
);
NTSTATUS
DBCLASS_Find1394DbcLinks(
PDEVICE_OBJECT DevicePdo1394
);
NTSTATUS
DBCLASS_EjectBay(
IN PDBC_CONTEXT DbcContext,
IN USHORT Bay
);
NTSTATUS
DBCLASS_SetEjectTimeout(
PDEVICE_OBJECT DeviceFilterMDO
);
NTSTATUS
DBCLASS_CancelEjectTimeout(
PDEVICE_OBJECT DeviceFilterMDO
);
NTSTATUS
DBCLASS_SetRegistryKeyValueForPdo(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN BOOLEAN SoftwareBranch,
IN ULONG Type,
IN PWCHAR KeyNameString,
IN ULONG KeyNameStringLength,
IN PVOID Data,
IN ULONG DataLength
);
NTSTATUS
DBCLASS_SetupUSB_DBC(
PDBC_CONTEXT DbcContext
);
NTSTATUS
DBCLASS_GetHubDBCGuid(
PDEVICE_OBJECT DeviceObject,
PUCHAR DbcGuid
);
PDBC_CONTEXT
DBCLASS_FindControllerUSB(
PDRIVER_OBJECT FilterDriverObject,
PDEVICE_OBJECT FilterMdo,
PDEVICE_OBJECT UsbHubPdo
);
BOOLEAN
DBCLASS_IsHubPartOfUSB_DBC(
PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCLASS_CheckPhyLink(
PDEVICE_OBJECT DevicePdo1394
);
BOOLEAN
DBCLASS_IsLinkDeviceObject(
PDBC_CONTEXT DbcContext,
PDEVICE_OBJECT Pdo1394
);
NTSTATUS
DBCLASS_AddDevicePDOToList(
IN PDEVICE_OBJECT FilterDeviceObject,
IN PDEVICE_OBJECT PdoDeviceObject
);
VOID
DBCLASS_RemoveDevicePDOFromList(
IN PDEVICE_OBJECT PdoDeviceObject
);
VOID
DBCLASS_Refresh1394(
VOID
);
NTSTATUS
DBCLASS_AddBusFilterMDOToList(
PDEVICE_OBJECT BusFilterMdo
);
VOID
DBCLASS_RemoveBusFilterMDOFromList(
PDEVICE_OBJECT BusFilterMdo
);
NTSTATUS
DBCLASS_ClassPower(
IN PDEVICE_OBJECT ControllerFdo,
IN PIRP Irp,
IN PBOOLEAN HandledByClass
);
NTSTATUS
DBCLASS_CheckForAcpiDeviceBayHubs(
PDEVICE_OBJECT HubPdo,
ULONG AcpiDBCHubParentPort
);
NTSTATUS
DBCLASS_GetClassGlobalDebugRegistryParameters(
);
NTSTATUS
DBCLASS_GetConfigValue(
IN PWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength,
IN PVOID Context,
IN PVOID EntryContext
);
NTSTATUS
DBCLASS_GetClassGlobalRegistryParameters(
);
NTSTATUS
DBCLASS_EjectBayComplete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
VOID
DBCLASS_RemoveControllerFromMdo(PDBC_CONTEXT DbcContext);