Windows NT 4.0 source code leak
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

/*++
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