diff --git a/drivers/bus/isapnp/isapnp.c b/drivers/bus/isapnp/isapnp.c index 514322c69c0..0d939a300ea 100644 --- a/drivers/bus/isapnp/isapnp.c +++ b/drivers/bus/isapnp/isapnp.c @@ -981,62 +981,6 @@ InvalidBiosResources: return STATUS_SUCCESS; } -_Dispatch_type_(IRP_MJ_CREATE) -_Dispatch_type_(IRP_MJ_CLOSE) -static CODE_SEG("PAGE") DRIVER_DISPATCH_PAGED IsaCreateClose; - -static -CODE_SEG("PAGE") -NTSTATUS -NTAPI -IsaCreateClose( - _In_ PDEVICE_OBJECT DeviceObject, - _Inout_ PIRP Irp) -{ - PAGED_CODE(); - - Irp->IoStatus.Status = STATUS_SUCCESS; - - DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - -_Dispatch_type_(IRP_MJ_DEVICE_CONTROL) -_Dispatch_type_(IRP_MJ_SYSTEM_CONTROL) -static CODE_SEG("PAGE") DRIVER_DISPATCH_PAGED IsaForwardOrIgnore; - -static -CODE_SEG("PAGE") -NTSTATUS -NTAPI -IsaForwardOrIgnore( - _In_ PDEVICE_OBJECT DeviceObject, - _Inout_ PIRP Irp) -{ - PISAPNP_COMMON_EXTENSION CommonExt = DeviceObject->DeviceExtension; - - PAGED_CODE(); - - DPRINT("%s(%p, %p) Minor - %X\n", __FUNCTION__, DeviceObject, Irp, - IoGetCurrentIrpStackLocation(Irp)->MinorFunction); - - if (CommonExt->Signature == IsaPnpBus) - { - IoSkipCurrentIrpStackLocation(Irp); - return IoCallDriver(((PISAPNP_FDO_EXTENSION)CommonExt)->Ldo, Irp); - } - else - { - NTSTATUS Status = Irp->IoStatus.Status; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; - } -} - CODE_SEG("PAGE") PIO_RESOURCE_REQUIREMENTS_LIST IsaPnpCreateReadPortDORequirements( @@ -1571,6 +1515,62 @@ IsaPnp( return IsaPdoPnp((PISAPNP_PDO_EXTENSION)DevExt, Irp, IrpSp); } +_Dispatch_type_(IRP_MJ_CREATE) +_Dispatch_type_(IRP_MJ_CLOSE) +static CODE_SEG("PAGE") DRIVER_DISPATCH_PAGED IsaCreateClose; + +static +CODE_SEG("PAGE") +NTSTATUS +NTAPI +IsaCreateClose( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PAGED_CODE(); + + Irp->IoStatus.Status = STATUS_SUCCESS; + + DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +_Dispatch_type_(IRP_MJ_DEVICE_CONTROL) +_Dispatch_type_(IRP_MJ_SYSTEM_CONTROL) +static CODE_SEG("PAGE") DRIVER_DISPATCH_PAGED IsaForwardOrIgnore; + +static +CODE_SEG("PAGE") +NTSTATUS +NTAPI +IsaForwardOrIgnore( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PISAPNP_COMMON_EXTENSION CommonExt = DeviceObject->DeviceExtension; + + PAGED_CODE(); + + DPRINT("%s(%p, %p) Minor - %X\n", __FUNCTION__, DeviceObject, Irp, + IoGetCurrentIrpStackLocation(Irp)->MinorFunction); + + if (CommonExt->Signature == IsaPnpBus) + { + IoSkipCurrentIrpStackLocation(Irp); + return IoCallDriver(((PISAPNP_FDO_EXTENSION)CommonExt)->Ldo, Irp); + } + else + { + NTSTATUS Status = Irp->IoStatus.Status; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } +} + CODE_SEG("INIT") NTSTATUS NTAPI diff --git a/drivers/bus/isapnp/isapnp.h b/drivers/bus/isapnp/isapnp.h index ea84d2d5148..17945dbe06a 100644 --- a/drivers/bus/isapnp/isapnp.h +++ b/drivers/bus/isapnp/isapnp.h @@ -12,7 +12,9 @@ #include #include #include + #include "isapnphw.h" +#include "isapnpres.h" #include #include @@ -23,121 +25,12 @@ extern "C" { #define TAG_ISAPNP 'pasI' -/** @brief Maximum size of resource data structure supported by the driver. */ -#define ISAPNP_MAX_RESOURCEDATA 0x1000 - -/** @brief Maximum number of Start DF tags supported by the driver. */ -#define ISAPNP_MAX_ALTERNATIVES 8 - typedef enum { dsStopped, dsStarted } ISAPNP_DEVICE_STATE; -typedef struct _ISAPNP_IO -{ - USHORT CurrentBase; - ISAPNP_IO_DESCRIPTION Description; - UCHAR Index; -} ISAPNP_IO, *PISAPNP_IO; - -typedef struct _ISAPNP_IRQ -{ - UCHAR CurrentNo; - UCHAR CurrentType; - ISAPNP_IRQ_DESCRIPTION Description; - UCHAR Index; -} ISAPNP_IRQ, *PISAPNP_IRQ; - -typedef struct _ISAPNP_DMA -{ - UCHAR CurrentChannel; - ISAPNP_DMA_DESCRIPTION Description; - UCHAR Index; -} ISAPNP_DMA, *PISAPNP_DMA; - -typedef struct _ISAPNP_MEMRANGE -{ - ULONG CurrentBase; - ULONG CurrentLength; - ISAPNP_MEMRANGE_DESCRIPTION Description; - UCHAR Index; -} ISAPNP_MEMRANGE, *PISAPNP_MEMRANGE; - -typedef struct _ISAPNP_MEMRANGE32 -{ - ULONG CurrentBase; - ULONG CurrentLength; - ISAPNP_MEMRANGE32_DESCRIPTION Description; - UCHAR Index; -} ISAPNP_MEMRANGE32, *PISAPNP_MEMRANGE32; - -typedef struct _ISAPNP_COMPATIBLE_ID_ENTRY -{ - UCHAR VendorId[3]; - USHORT ProdId; - LIST_ENTRY IdLink; -} ISAPNP_COMPATIBLE_ID_ENTRY, *PISAPNP_COMPATIBLE_ID_ENTRY; - -typedef struct _ISAPNP_ALTERNATIVES -{ - ISAPNP_IO_DESCRIPTION Io[ISAPNP_MAX_ALTERNATIVES]; - ISAPNP_IRQ_DESCRIPTION Irq[ISAPNP_MAX_ALTERNATIVES]; - ISAPNP_DMA_DESCRIPTION Dma[ISAPNP_MAX_ALTERNATIVES]; - ISAPNP_MEMRANGE_DESCRIPTION MemRange[ISAPNP_MAX_ALTERNATIVES]; - ISAPNP_MEMRANGE32_DESCRIPTION MemRange32[ISAPNP_MAX_ALTERNATIVES]; - UCHAR Priority[ISAPNP_MAX_ALTERNATIVES]; - UCHAR IoIndex; - UCHAR IrqIndex; - UCHAR DmaIndex; - UCHAR MemRangeIndex; - UCHAR MemRange32Index; - - _Field_range_(0, ISAPNP_MAX_ALTERNATIVES) - UCHAR Count; -} ISAPNP_ALTERNATIVES, *PISAPNP_ALTERNATIVES; - -typedef struct _ISAPNP_LOGICAL_DEVICE -{ - PDEVICE_OBJECT Pdo; - - /** - * @name The card data. - * @{ - */ - UCHAR CSN; - UCHAR VendorId[3]; - USHORT ProdId; - ULONG SerialNumber; - /**@}*/ - - /** - * @name The logical device data. - * @{ - */ - UCHAR LDN; - UCHAR LogVendorId[3]; - USHORT LogProdId; - LIST_ENTRY CompatibleIdList; - PSTR FriendlyName; - PISAPNP_ALTERNATIVES Alternatives; - - ISAPNP_IO Io[8]; - ISAPNP_IRQ Irq[2]; - ISAPNP_DMA Dma[2]; - ISAPNP_MEMRANGE MemRange[4]; - ISAPNP_MEMRANGE32 MemRange32[4]; - /**@}*/ - - ULONG Flags; -#define ISAPNP_PRESENT 0x00000001 /**< @brief Cleared when the device is physically removed. */ -#define ISAPNP_HAS_MULTIPLE_LOGDEVS 0x00000002 /**< @brief Indicates if the parent card has multiple logical devices. */ -#define ISAPNP_HAS_RESOURCES 0x00000004 /**< @brief Cleared when the device has no boot resources. */ - - LIST_ENTRY DeviceLink; -} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; - typedef enum _ISAPNP_SIGNATURE { IsaPnpBus = 'odFI', @@ -248,46 +141,6 @@ IsaPnpReleaseDeviceDataLock( KeSetEvent(&FdoExt->DeviceSyncEvent, IO_NO_INCREMENT, FALSE); } -FORCEINLINE -BOOLEAN -HasIoAlternatives( - _In_ PISAPNP_ALTERNATIVES Alternatives) -{ - return (Alternatives->Io[0].Length != 0); -} - -FORCEINLINE -BOOLEAN -HasIrqAlternatives( - _In_ PISAPNP_ALTERNATIVES Alternatives) -{ - return (Alternatives->Irq[0].Mask != 0); -} - -FORCEINLINE -BOOLEAN -HasDmaAlternatives( - _In_ PISAPNP_ALTERNATIVES Alternatives) -{ - return (Alternatives->Dma[0].Mask != 0); -} - -FORCEINLINE -BOOLEAN -HasMemoryAlternatives( - _In_ PISAPNP_ALTERNATIVES Alternatives) -{ - return (Alternatives->MemRange[0].Length != 0); -} - -FORCEINLINE -BOOLEAN -HasMemory32Alternatives( - _In_ PISAPNP_ALTERNATIVES Alternatives) -{ - return (Alternatives->MemRange32[0].Length != 0); -} - /* isapnp.c */ CODE_SEG("PAGE") diff --git a/drivers/bus/isapnp/isapnpres.h b/drivers/bus/isapnp/isapnpres.h new file mode 100644 index 00000000000..16c21646a0f --- /dev/null +++ b/drivers/bus/isapnp/isapnpres.h @@ -0,0 +1,162 @@ +/* + * PROJECT: ReactOS ISA PnP Bus driver + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Resource management header file + * COPYRIGHT: Copyright 2010 Cameron Gutman + * Copyright 2020 Hervé Poussineau + */ + +#pragma once + +/** @brief Maximum size of resource data structure supported by the driver. */ +#define ISAPNP_MAX_RESOURCEDATA 0x1000 + +/** @brief Maximum number of Start DF tags supported by the driver. */ +#define ISAPNP_MAX_ALTERNATIVES 8 + +typedef struct _ISAPNP_IO +{ + USHORT CurrentBase; + ISAPNP_IO_DESCRIPTION Description; + UCHAR Index; +} ISAPNP_IO, *PISAPNP_IO; + +typedef struct _ISAPNP_IRQ +{ + UCHAR CurrentNo; + UCHAR CurrentType; + ISAPNP_IRQ_DESCRIPTION Description; + UCHAR Index; +} ISAPNP_IRQ, *PISAPNP_IRQ; + +typedef struct _ISAPNP_DMA +{ + UCHAR CurrentChannel; + ISAPNP_DMA_DESCRIPTION Description; + UCHAR Index; +} ISAPNP_DMA, *PISAPNP_DMA; + +typedef struct _ISAPNP_MEMRANGE +{ + ULONG CurrentBase; + ULONG CurrentLength; + ISAPNP_MEMRANGE_DESCRIPTION Description; + UCHAR Index; +} ISAPNP_MEMRANGE, *PISAPNP_MEMRANGE; + +typedef struct _ISAPNP_MEMRANGE32 +{ + ULONG CurrentBase; + ULONG CurrentLength; + ISAPNP_MEMRANGE32_DESCRIPTION Description; + UCHAR Index; +} ISAPNP_MEMRANGE32, *PISAPNP_MEMRANGE32; + +typedef struct _ISAPNP_COMPATIBLE_ID_ENTRY +{ + UCHAR VendorId[3]; + USHORT ProdId; + LIST_ENTRY IdLink; +} ISAPNP_COMPATIBLE_ID_ENTRY, *PISAPNP_COMPATIBLE_ID_ENTRY; + +typedef struct _ISAPNP_ALTERNATIVES +{ + ISAPNP_IO_DESCRIPTION Io[ISAPNP_MAX_ALTERNATIVES]; + ISAPNP_IRQ_DESCRIPTION Irq[ISAPNP_MAX_ALTERNATIVES]; + ISAPNP_DMA_DESCRIPTION Dma[ISAPNP_MAX_ALTERNATIVES]; + ISAPNP_MEMRANGE_DESCRIPTION MemRange[ISAPNP_MAX_ALTERNATIVES]; + ISAPNP_MEMRANGE32_DESCRIPTION MemRange32[ISAPNP_MAX_ALTERNATIVES]; + UCHAR Priority[ISAPNP_MAX_ALTERNATIVES]; + UCHAR IoIndex; + UCHAR IrqIndex; + UCHAR DmaIndex; + UCHAR MemRangeIndex; + UCHAR MemRange32Index; + + _Field_range_(0, ISAPNP_MAX_ALTERNATIVES) + UCHAR Count; +} ISAPNP_ALTERNATIVES, *PISAPNP_ALTERNATIVES; + +typedef struct _ISAPNP_LOGICAL_DEVICE +{ + LIST_ENTRY DeviceLink; + PDEVICE_OBJECT Pdo; + + ULONG Flags; +/** Cleared when the device is physically removed */ +#define ISAPNP_PRESENT 0x00000001 + +/** Indicates if the parent card has multiple logical devices */ +#define ISAPNP_HAS_MULTIPLE_LOGDEVS 0x00000002 + +/** Cleared when the device has no boot resources */ +#define ISAPNP_HAS_RESOURCES 0x00000004 + + /** + * @name The card data. + * @{ + */ + UCHAR CSN; + UCHAR VendorId[3]; + USHORT ProdId; + ULONG SerialNumber; + /**@}*/ + + /** + * @name The logical device data. + * @{ + */ + UCHAR LDN; + UCHAR LogVendorId[3]; + USHORT LogProdId; + PISAPNP_ALTERNATIVES Alternatives; + PSTR FriendlyName; + LIST_ENTRY CompatibleIdList; + + ISAPNP_IO Io[8]; + ISAPNP_IRQ Irq[2]; + ISAPNP_DMA Dma[2]; + ISAPNP_MEMRANGE MemRange[4]; + ISAPNP_MEMRANGE32 MemRange32[4]; + /**@}*/ +} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; + +FORCEINLINE +BOOLEAN +HasIoAlternatives( + _In_ PISAPNP_ALTERNATIVES Alternatives) +{ + return (Alternatives->Io[0].Length != 0); +} + +FORCEINLINE +BOOLEAN +HasIrqAlternatives( + _In_ PISAPNP_ALTERNATIVES Alternatives) +{ + return (Alternatives->Irq[0].Mask != 0); +} + +FORCEINLINE +BOOLEAN +HasDmaAlternatives( + _In_ PISAPNP_ALTERNATIVES Alternatives) +{ + return (Alternatives->Dma[0].Mask != 0); +} + +FORCEINLINE +BOOLEAN +HasMemoryAlternatives( + _In_ PISAPNP_ALTERNATIVES Alternatives) +{ + return (Alternatives->MemRange[0].Length != 0); +} + +FORCEINLINE +BOOLEAN +HasMemory32Alternatives( + _In_ PISAPNP_ALTERNATIVES Alternatives) +{ + return (Alternatives->MemRange32[0].Length != 0); +}