//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: ideport.h // //-------------------------------------------------------------------------- #if !defined (___IDEPORT_H___) #define ___IDEPORT_H___ #include "stddef.h" #include "stdarg.h" #include "stdio.h" #include "string.h" #include "ntddk.h" #include "scsi.h" #include #include #include #include "stdio.h" #include "safeboot.h" #include "portlib.h" #ifdef ACPI_CONTROL_METHOD_SUPPORT // // for ACPI // #include "acpiioct.h" #endif // ACPI_CONTROL_METHOD_SUPPORT #include "idep.h" // // predefine structure pointer type to prevent // constant re-ordering of include files // typedef struct _FDO_EXTENSION * PFDO_EXTENSION; typedef struct _PDO_EXTENSION * PPDO_EXTENSION; typedef struct _DEVICE_SETTINGS * PDEVICE_SETTINGS; typedef struct _IDENTIFY_DATA * PIDENTIFY_DATA; typedef struct _IDE_DEVICE_TYPE IDE_DEVICE_TYPE; #include "acpiutil.h" #include "hack.h" #include "port.h" #include "init.h" #include "chanfdo.h" #include "detect.h" #include "atapi.h" #include "devpdo.h" #include "regutils.h" #include "atapinit.h" #include "luext.h" #include "fdopower.h" #include "pdopower.h" #include "crashdmp.h" #include "idedata.h" #include "wmi.h" #include "passthru.h" // // Location Identifiers used to log allocation failures // #define IDEPORT_TAG_DISPATCH_FLUSH 0x10 #define IDEPORT_TAG_DISPATCH_RESET 0x20 #define IDEPORT_TAG_STARTIO_MDL 0x30 #define IDEPORT_TAG_MPIOCTL_IRP 0x40 #define IDEPORT_TAG_PASSTHRU_SENSE 0x50 #define IDEPORT_TAG_PASSTHRU_IRP 0x60 #define IDEPORT_TAG_DUMP_POINTER 0x70 #define IDEPORT_TAG_READCAP_CONTEXT 0x80 #define IDEPORT_TAG_READCAP_MDL 0x90 #define IDEPORT_TAG_SYNCATAPI_IRP 0x100 //+0xff - IDE commands #define IDEPORT_TAG_SYNCATAPI_SENSE 0x110 #define IDEPORT_TAG_ATAPASS_IRP 0x200 #define IDEPORT_TAG_ATAPASS_MDL 0x300 #define IDEPORT_TAG_ATAPASS_SRB 0x400 #define IDEPORT_TAG_ATAPASS_SENSE 0x500 #define IDEPORT_TAG_ATAPASS_CONTEXT 0x600 #define IDEPORT_TAG_ATAPI_MODE_SENSE 0x700 #define IDEPORT_TAG_SEND_IRP 0x800 #ifdef POOL_TAGGING #ifdef ExAllocatePool #undef ExAllocatePool #endif #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'PedI') #endif #define INLINE __inline #if DBG void _DebugPrintTickCount (LARGE_INTEGER * lastTickCount, ULONG limit, PUCHAR filename, ULONG lineNumber); void _DebugPrintResetTickCount(LARGE_INTEGER * lastTickCount); static LARGE_INTEGER FindDeviceTimer = {0, 0}; #define DebugPrintTickCount(lastTickCount, limit) _DebugPrintTickCount (&lastTickCount, limit, __FILE__, __LINE__) #define DebugPrintResetTickCount(lastTickCount) { lastTickCount.QuadPart = 0; _DebugPrintResetTickCount(&lastTickCount); } #else #define DebugPrintTickCount(lastTickCount, limit) #define DebugPrintResetTickCount(lastTickCount) #endif #if 0 extern PVOID GlobalPdoPtr; #if DBG #ifdef IoCompleteRequest #undef IoCompleteRequest #endif #define IoCompleteRequest(irp, boost) {\ ULONG i; \ PPDO_EXTENSION globalPdoExtension=(PPDO_EXTENSION)GlobalPdoPtr;\ if (globalPdoExtension) {\ for (i=0;iNumTagUsed;i++) {\ if (globalPdoExtension->TagTable[i]==irp) {\ DebugPrint((0, "Irp %x failed\n", irp));\ ASSERT(FALSE);\ }\ }\ }\ IofCompleteRequest(irp, boost);} #endif #endif extern PDRIVER_DISPATCH FdoPowerDispatchTable[NUM_POWER_MINOR_FUNCTION]; extern PDRIVER_DISPATCH PdoPowerDispatchTable[NUM_POWER_MINOR_FUNCTION]; typedef struct _IDEDRIVER_EXTENSION { UNICODE_STRING RegistryPath; } IDEDRIVER_EXTENSION, *PIDEDRIVER_EXTENSION; typedef struct _CUSTOM_DEVICE_PARAMETER { ULONG CommandRegisterBase; ULONG IrqLevel; }CUSTOM_DEVICE_PARAMETER, *PCUSTOM_DEVICE_PARAMETER; #define FULL_RESOURCE_LIST_SIZE(n) (sizeof (CM_FULL_RESOURCE_DESCRIPTOR) + (sizeof (CM_PARTIAL_RESOURCE_DESCRIPTOR) * (n - 1))) #define IDE_PSUEDO_INITIATOR_ID (0xff) ULONG DriverEntry( IN OUT PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS IdePortDispatchDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortDispatchPower( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortDispatchPnp( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortDispatchSystemControl( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortNoSupportIrp ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortNoSupportPnpIrp ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortAlwaysStatusSuccessIrp ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortPassDownToNextDriver ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); NTSTATUS IdePortStatusSuccessAndPassDownToNextDriver ( IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp ); VOID IdePortParseDeviceParameters( IN HANDLE SubServiceKey, IN OUT PCUSTOM_DEVICE_PARAMETER CustomDeviceParameter ); PCSTR IdePortGetDeviceTypeString ( IN ULONG DeviceType ); PCSTR IdePortGetCompatibleIdString ( IN ULONG DeviceType ); PCSTR IdePortGetPeripheralIdString ( IN ULONG DeviceType ); BOOLEAN IdePortChannelEmpty ( PIDE_REGISTERS_1 CmdRegBase, PIDE_REGISTERS_2 CtrlRegBase, ULONG MaxIdeDevice ); VOID IdePortUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS IdePortQueryInterface ( PFDO_EXTENSION FdoExtension, PIO_STACK_LOCATION IrpSp ); NTSTATUS IdePortQueryInterfaceCompletionRoutine ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); BOOLEAN IdePortOkToDetectLegacy ( IN PDRIVER_OBJECT DriverObject ); BOOLEAN IdePortSearchDeviceInRegMultiSzList ( IN PFDO_EXTENSION FdoExtension, IN PIDENTIFY_DATA IdentifyData, IN PWSTR RegKeyValue ); NTSTATUS IdePortSyncSendIrp ( IN PDEVICE_OBJECT TargetDeviceObject, IN PIO_STACK_LOCATION IrpSp, IN OUT OPTIONAL PIO_STATUS_BLOCK IoStatus ); NTSTATUS IdePortGenericCompletionRoutine ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); ULONG IdePortSimpleCheckSum ( IN ULONG PartialSum, IN PVOID SourceVa, IN ULONG Length ); VOID FASTCALL IdeFreeIrpAndMdl( IN PIRP Irp ); NTSTATUS FASTCALL IdeBuildAndSendIrp ( IN PPDO_EXTENSION PdoExtension, IN PSCSI_REQUEST_BLOCK Srb, IN PIO_COMPLETION_ROUTINE CompletionRoutine, IN PVOID CompletionContext ); BOOLEAN IdePortInSetup( IN PFDO_EXTENSION FdoExtension ); typedef struct _IDE_DEVICE_TYPE { PCSTR DeviceTypeString; PCSTR CompatibleIdString; PCSTR PeripheralIdString; } IDE_DEVICE_TYPE, * PIDE_DEVICE_TYPE; #define DRIVER_OBJECT_EXTENSION_ID DriverEntry typedef struct _COMPLETION_ROUTINE_CONTEXT { KEVENT Event; IO_STATUS_BLOCK IoStatus; } COMPLETION_ROUTINE_CONTEXT, *PCOMPLETION_ROUTINE_CONTEXT; typedef struct _ENUMERATION_STRUCT { PIRP Irp1; PSCSI_REQUEST_BLOCK Srb; PSENSE_DATA SenseInfoBuffer; PMDL MdlAddress; // // DataBuffer to hold the input/output // buffers // PULONG DataBuffer; ULONG DataBufferSize; PPDO_STOP_QUEUE_CONTEXT StopQContext; // // Pre-Alloced Enum work item // PVOID EnumWorkItemContext; PATA_PASSTHROUGH_CONTEXT Context; }ENUMERATION_STRUCT, *PENUMERATION_STRUCT; #define PREALLOC_STACK_LOCATIONS 1 BOOLEAN IdePreAllocEnumStructs ( IN PFDO_EXTENSION FdoExtension ); VOID IdeFreeEnumStructs( PENUMERATION_STRUCT enumStruct ); // // FDO list structure and support functions. // typedef struct _IDE_FDO_LIST { ULONG Count; LIST_ENTRY List; KSPIN_LOCK SpinLock; } IDE_FDO_LIST, *PIDE_FDO_LIST; extern IDE_FDO_LIST IdeGlobalFdoList; VOID IdeInitializeFdoList( IN PIDE_FDO_LIST FdoList ); VOID IdeAddToFdoList ( PIDE_FDO_LIST FdoList, PFDO_EXTENSION FdoExtension ); VOID IdeRemoveFromFdoList ( PIDE_FDO_LIST FdoList, PFDO_EXTENSION FdoExtension ); // // test code on/off switch // // always comment this define out before check in //#define PRIVATE_BUILD #ifdef PRIVATE_BUILD #define HUNG_CONTROLLER_CHECK 1 #else #undef HUNG_CONTROLLER_CHECK #endif // PRIVATE_BUILD //#if DBG //#define PoStartNextPowerIrp(x) {\ // PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation (x);\ // DebugPrint ((0, "PoStartNextPowerIrp(0x%x) for devobj 0x%x\n", x, irpStack->DeviceObject));\ // PoStartNextPowerIrp(x);\ // } //#endif //DBG // // define this if we want NT4 scsiport DriverParameter support in the registry // default is "not defined" //#define DRIVER_PARAMETER_REGISTRY_SUPPORT #endif // ___IDEPORT_H___