mirror of https://github.com/lianthony/NT4.0
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.
499 lines
9.8 KiB
499 lines
9.8 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
busp.h
|
|
|
|
Abstract:
|
|
|
|
Hardware independent header file for pnp bios bus extender.
|
|
|
|
Author:
|
|
|
|
Shie-Lin Tzong (shielint) Apr-21-1995
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pbapi.h"
|
|
#include "stdio.h"
|
|
#include "stdarg.h"
|
|
|
|
//
|
|
// Structures
|
|
//
|
|
|
|
//
|
|
// When queued, the following HAL_DEVICE_CONTROL_CONTEXT values are defined
|
|
//
|
|
|
|
#define ContextWorkQueue BusExtenderReserved[0]
|
|
#define ContextControlHandler BusExtenderReserved[2]
|
|
|
|
//
|
|
// When in progress, the following HAL_DEVICE_CONTROL_CONTEXT values are defined
|
|
//
|
|
|
|
#define ContextArgument1 BusExtenderReserved[0]
|
|
#define ContextArgument2 BusExtenderReserved[1]
|
|
#define ContextBusyFlag BusExtenderReserved[2]
|
|
|
|
//
|
|
// Define virtual slot number for docking station. (We need to return docking
|
|
// station slot number before knowing the real slot number. )
|
|
//
|
|
|
|
#define DOCK_VIRTUAL_SLOT_NUMBER 0xFFFF
|
|
|
|
//
|
|
// DEVICE_DATA Flags masks
|
|
//
|
|
|
|
#define DEVICE_FLAGS_DOCKING_STATION 0x10000000
|
|
#define DEVICE_FLAGS_VALID 0x00000001
|
|
#define DEVICE_FLAGS_WARM_DOCKING 0x00000002
|
|
#define DEVICE_FLAGS_COLD_DOCKING 0x00000004
|
|
#define DEVICE_FLAGS_EJECT_SUPPORTED 0x00000008
|
|
|
|
typedef struct _DEVICE_DATA_ {
|
|
SINGLE_LIST_ENTRY Next;
|
|
ULONG Flags;
|
|
|
|
//
|
|
// DeviceControl in progress flags
|
|
//
|
|
|
|
BOOLEAN SyncBusy;
|
|
|
|
//
|
|
// Pointer to bus specific data
|
|
//
|
|
|
|
PVOID BusData;
|
|
|
|
//
|
|
// Length of the bus data
|
|
//
|
|
|
|
ULONG BusDataLength;
|
|
|
|
} DEVICE_DATA, *PDEVICE_DATA;
|
|
|
|
//
|
|
// Extension data for Bus extender
|
|
//
|
|
|
|
typedef struct _MB_BUS_EXTENSION {
|
|
|
|
//
|
|
// BusHandler points back to the BUS_HANDLER structure for this extension
|
|
//
|
|
|
|
PBUS_HANDLER BusHandler;
|
|
|
|
//
|
|
// Bus Check request list
|
|
//
|
|
|
|
LIST_ENTRY CheckBus;
|
|
|
|
//
|
|
// Device control request list
|
|
//
|
|
|
|
LIST_ENTRY DeviceControl;
|
|
|
|
//
|
|
// Slot Data link list
|
|
//
|
|
|
|
SINGLE_LIST_ENTRY ValidSlots;
|
|
ULONG NoValidSlots;
|
|
|
|
//
|
|
// Pointer to docking station device data.
|
|
// This is mainly for convenience.
|
|
//
|
|
|
|
PDEVICE_DATA DockingStationDevice;
|
|
ULONG DockingStationId;
|
|
ULONG DockingStationSerialNumber;
|
|
} MB_BUS_EXTENSION, *PMB_BUS_EXTENSION;
|
|
|
|
typedef struct {
|
|
BOOLEAN Control;
|
|
} *PBCTL_SET_CONTROL;
|
|
|
|
//
|
|
// Pnp Bios bus extender device object extension
|
|
//
|
|
|
|
typedef struct _MB_DEVICE_EXTENSION {
|
|
PBUS_HANDLER BusHandler;
|
|
} MB_DEVICE_EXTENSION, *PMB_DEVICE_EXTENSION;
|
|
|
|
//
|
|
// Only support 2 buses: main bus and docking station bus.
|
|
//
|
|
|
|
#define MAXIMUM_BUS_NUMBER 2
|
|
|
|
//
|
|
// SlotControl related internal definitions
|
|
//
|
|
|
|
typedef BOOLEAN (FASTCALL * BEGIN_FUNCTION)(PDEVICE_DATA, PHAL_DEVICE_CONTROL_CONTEXT);
|
|
typedef VOID (* CONTROL_FUNCTION)(PDEVICE_DATA, PHAL_DEVICE_CONTROL_CONTEXT);
|
|
|
|
typedef struct _DEVICE_CONTROL_HANDLER {
|
|
ULONG ControlCode;
|
|
ULONG MinBuffer;
|
|
BEGIN_FUNCTION BeginDeviceControl;
|
|
CONTROL_FUNCTION ControlHandler;
|
|
} DEVICE_CONTROL_HANDLER, *PDEVICE_CONTROL_HANDLER;
|
|
|
|
#define NUMBER_DEVICE_CONTROL_FUNCTIONS 11
|
|
|
|
//
|
|
// misc. definitions
|
|
//
|
|
|
|
#define BUS_0_SIGNATURE 0xabababab
|
|
#define MIN_DETECT_SIGNATURE_SIZE (FIELD_OFFSET(CM_RESOURCE_LIST, List) + \
|
|
FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList))
|
|
|
|
//
|
|
// Globals
|
|
//
|
|
|
|
extern FAST_MUTEX MbpMutex;
|
|
extern KSPIN_LOCK MbpSpinlock;
|
|
extern LIST_ENTRY MbpControlWorkerList;
|
|
extern LIST_ENTRY MbpCheckBusList;
|
|
extern ULONG MbpWorkerQueued;
|
|
extern WORK_QUEUE_ITEM MbpWorkItem;
|
|
extern ULONG MbpNextHandle;
|
|
extern DEVICE_CONTROL_HANDLER MbpDeviceControl[];
|
|
extern PDRIVER_OBJECT MbpDriverObject;
|
|
extern HAL_CALLBACKS MbpHalCallbacks;
|
|
extern PCALLBACK_OBJECT MbpEjectCallbackObject;
|
|
extern BOOLEAN MbpNoBusyFlag;
|
|
extern ULONG MbpMaxDeviceData;
|
|
extern PMB_BUS_EXTENSION MbpBusExtension[];
|
|
extern WCHAR rgzBIOSDeviceName[];
|
|
extern ULONG MbpNextBusId;
|
|
extern ULONG MbpBusNumber[];
|
|
|
|
extern POBJECT_TYPE *IoDeviceHandlerObjectType;
|
|
extern PULONG IoDeviceHandlerObjectSize;
|
|
extern ULONG MbpDeviceHandlerObjectSize;
|
|
|
|
#define DeviceHandler2DeviceData(a) ((PDEVICE_DATA) (((PUCHAR) a) + MbpDeviceHandlerObjectSize))
|
|
#define DeviceData2DeviceHandler(a) ((PDEVICE_HANDLER_OBJECT) (((PUCHAR) a) - MbpDeviceHandlerObjectSize))
|
|
#define DeviceDataSlot(a) (DeviceData2DeviceHandler(a)->SlotNumber)
|
|
|
|
//
|
|
// Prototypes
|
|
//
|
|
|
|
NTSTATUS
|
|
DriverEntry(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath
|
|
);
|
|
|
|
NTSTATUS
|
|
MbAddBusDevices(
|
|
IN PUNICODE_STRING ServiceKeyName,
|
|
IN OUT PULONG InstanceNumber
|
|
);
|
|
|
|
NTSTATUS
|
|
MbCreateClose (
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN OUT PIRP Irp
|
|
);
|
|
|
|
ULONG
|
|
MbGetBusData (
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootHandler,
|
|
IN ULONG SlotNumber,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
MbSetBusData (
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootHandler,
|
|
IN ULONG SlotNumber,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
MbGetDeviceData (
|
|
IN struct _BUS_HANDLER *BusHandler,
|
|
IN struct _BUS_HANDLER *RootHandler,
|
|
IN PDEVICE_HANDLER_OBJECT DeviceHandler,
|
|
IN ULONG DataType,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
ULONG
|
|
MbSetDeviceData (
|
|
IN struct _BUS_HANDLER *BusHandler,
|
|
IN struct _BUS_HANDLER *RootHandler,
|
|
IN PDEVICE_HANDLER_OBJECT DeviceHandler,
|
|
IN ULONG DataType,
|
|
IN PUCHAR Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
MbQueryBusSlots (
|
|
IN PBUS_HANDLER BusHandler,
|
|
IN PBUS_HANDLER RootHandler,
|
|
IN ULONG BufferSize,
|
|
OUT PULONG SlotNumbers,
|
|
OUT PULONG ReturnedLength
|
|
);
|
|
|
|
NTSTATUS
|
|
MbDeviceControl (
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbpCheckBus (
|
|
IN PBUS_HANDLER BusHandler
|
|
);
|
|
|
|
PDEVICE_DATA
|
|
MbpFindDeviceData (
|
|
IN PMB_BUS_EXTENSION BusExtension,
|
|
IN ULONG SlotNumber
|
|
);
|
|
|
|
VOID
|
|
MbpStartWorker (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
MbpControlWorker (
|
|
IN PVOID WorkerContext
|
|
);
|
|
|
|
VOID
|
|
MbpQueueCheckBus (
|
|
IN PBUS_HANDLER BusHandler
|
|
);
|
|
|
|
VOID
|
|
MbpDispatchControl (
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbpCompleteDeviceControl (
|
|
IN NTSTATUS Status,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context,
|
|
IN PDEVICE_DATA DeviceData
|
|
);
|
|
|
|
BOOLEAN
|
|
FASTCALL
|
|
MbBCtlNone (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
BOOLEAN
|
|
FASTCALL
|
|
MbBCtlSync (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
BOOLEAN
|
|
FASTCALL
|
|
MbBCtlEject (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
BOOLEAN
|
|
FASTCALL
|
|
MbBCtlLock (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryDeviceId (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryDeviceResources (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryDeviceResourceRequirements (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlSetDeviceResources (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryDeviceUniqueId (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryDeviceCapabilities (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlQueryEject (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlEject (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
MbCtlLock (
|
|
IN PDEVICE_DATA DeviceData,
|
|
IN PHAL_DEVICE_CONTROL_CONTEXT Context
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpGetBusData (
|
|
IN ULONG BusNumber,
|
|
IN PULONG SlotNumber,
|
|
IN OUT PVOID *BusData,
|
|
OUT PULONG Length,
|
|
OUT PBOOLEAN DockConnector
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpGetCompatibleDeviceId (
|
|
IN PVOID BusData,
|
|
IN ULONG IdIndex,
|
|
IN PWCHAR CompatibleId
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpGetSlotResources (
|
|
IN ULONG BusNumber,
|
|
IN PVOID BusData,
|
|
OUT PCM_RESOURCE_LIST *CmResources,
|
|
OUT PULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpGetSlotResourceRequirements (
|
|
IN ULONG BusNumber,
|
|
IN PVOID BusData,
|
|
OUT PIO_RESOURCE_REQUIREMENTS_LIST *IoResources,
|
|
OUT PULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpSetSlotResources (
|
|
OUT PVOID *BusData,
|
|
IN PCM_RESOURCE_LIST CmResources,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpReplyEjectEvent (
|
|
IN ULONG SlotNumber,
|
|
IN BOOLEAN Eject
|
|
);
|
|
|
|
NTSTATUS
|
|
MbpGetDockInformation (
|
|
OUT PHAL_SYSTEM_DOCK_INFORMATION *DockInfo,
|
|
PULONG Length
|
|
);
|
|
|
|
PDEVICE_HANDLER_OBJECT
|
|
MbpReferenceDeviceHandler (
|
|
IN struct _BUS_HANDLER *BusHandler,
|
|
IN struct _BUS_HANDLER *RootHandler,
|
|
IN ULONG SlotNumber
|
|
);
|
|
|
|
#if 0
|
|
|
|
//
|
|
// BUGBUG - should be removed...
|
|
//
|
|
|
|
NTSTATUS
|
|
IoRegisterDetectedDevice(
|
|
IN PUNICODE_STRING ServiceKeyName,
|
|
IN PCM_RESOURCE_LIST DetectSignature,
|
|
OUT PULONG InstanceNumber
|
|
);
|
|
|
|
typedef enum _DEVICE_STATUS {
|
|
DeviceStatusOK,
|
|
DeviceStatusMalfunction,
|
|
DeviceStatusDisabled,
|
|
DeviceStatusRemoved,
|
|
MaximumDeviceStatus
|
|
} DEVICE_STATUS, *PDEVICE_STATUS;
|
|
|
|
NTSTATUS
|
|
IoRegisterDevicePath(
|
|
IN PDEVICE_HANDLER_OBJECT DeviceHandler,
|
|
IN PUNICODE_STRING NtDeviceObjectPath,
|
|
IN BOOLEAN PhysicalDevicePath,
|
|
IN PCM_RESOURCE_LIST Configuration,
|
|
IN DEVICE_STATUS DeviceStatus
|
|
);
|
|
|
|
NTSTATUS
|
|
IoGetDeviceHandler(
|
|
IN PUNICODE_STRING ServicekeyName,
|
|
IN ULONG InstanceOrdinal,
|
|
OUT PDEVICE_HANDLER_OBJECT DeviceHandler
|
|
);
|
|
|
|
VOID
|
|
IoReleaseDevicehandler (
|
|
IN PDEVICE_HANDLER_OBJECT DeviceHandler
|
|
);
|
|
#endif
|