mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[ISAPNP] Code formatting
- Add SAL2 annotations.
- Use RTL_NUMBER_OF macro in kernel mode.
- Use better function/member names.
- Less hardcoded values.
- Add license information. See commit
d9face83c6
for details.
No functional changes.
This commit is contained in:
parent
ba77a09c04
commit
8f44930f91
6 changed files with 311 additions and 262 deletions
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* FILE: fdo.c
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: FDO-specific code
|
||||
* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
|
||||
* Hervé Poussineau
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#include <isapnp.h>
|
||||
#include "isapnp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
@ -14,9 +14,9 @@
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoStartDevice(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(Irp);
|
||||
UNREFERENCED_PARAMETER(IrpSp);
|
||||
|
@ -29,9 +29,9 @@ IsaFdoStartDevice(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoQueryDeviceRelations(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations)
|
||||
return Irp->IoStatus.Status;
|
||||
|
@ -42,9 +42,9 @@ IsaFdoQueryDeviceRelations(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoPnp(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
NTSTATUS Status = Irp->IoStatus.Status;
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* FILE: hardware.c
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Hardware support code
|
||||
* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
|
||||
* Hervé Poussineau
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#include <isapnp.h>
|
||||
#include "isapnp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
@ -15,7 +15,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
WriteAddress(
|
||||
IN USHORT Address)
|
||||
_In_ USHORT Address)
|
||||
{
|
||||
WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS, Address);
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
WriteData(
|
||||
IN USHORT Data)
|
||||
_In_ USHORT Data)
|
||||
{
|
||||
WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_DATA, Data);
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ static
|
|||
inline
|
||||
UCHAR
|
||||
ReadData(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
return READ_PORT_UCHAR(ReadDataPort);
|
||||
}
|
||||
|
@ -42,8 +42,8 @@ static
|
|||
inline
|
||||
VOID
|
||||
WriteByte(
|
||||
IN USHORT Address,
|
||||
IN USHORT Value)
|
||||
_In_ USHORT Address,
|
||||
_In_ USHORT Value)
|
||||
{
|
||||
WriteAddress(Address);
|
||||
WriteData(Value);
|
||||
|
@ -53,8 +53,8 @@ static
|
|||
inline
|
||||
UCHAR
|
||||
ReadByte(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Address)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Address)
|
||||
{
|
||||
WriteAddress(Address);
|
||||
return ReadData(ReadDataPort);
|
||||
|
@ -64,8 +64,8 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadWord(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Address)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Address)
|
||||
{
|
||||
return ((ReadByte(ReadDataPort, Address) << 8) |
|
||||
(ReadByte(ReadDataPort, Address + 1)));
|
||||
|
@ -75,7 +75,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
SetReadDataPort(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
WriteByte(ISAPNP_READPORT, ((ULONG_PTR)ReadDataPort >> 2));
|
||||
}
|
||||
|
@ -108,7 +108,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
Wake(
|
||||
IN USHORT Csn)
|
||||
_In_ USHORT Csn)
|
||||
{
|
||||
WriteByte(ISAPNP_WAKE, Csn);
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadResourceData(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
return ReadByte(ReadDataPort, ISAPNP_RESOURCEDATA);
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadStatus(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
return ReadByte(ReadDataPort, ISAPNP_STATUS);
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
WriteCsn(
|
||||
IN USHORT Csn)
|
||||
_In_ USHORT Csn)
|
||||
{
|
||||
WriteByte(ISAPNP_CARDSELECTNUMBER, Csn);
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
WriteLogicalDeviceNumber(
|
||||
IN USHORT LogDev)
|
||||
_In_ USHORT LogDev)
|
||||
{
|
||||
WriteByte(ISAPNP_LOGICALDEVICENUMBER, LogDev);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
ActivateDevice(
|
||||
IN USHORT LogDev)
|
||||
_In_ USHORT LogDev)
|
||||
{
|
||||
WriteLogicalDeviceNumber(LogDev);
|
||||
WriteByte(ISAPNP_ACTIVATE, 1);
|
||||
|
@ -163,7 +163,7 @@ static
|
|||
inline
|
||||
VOID
|
||||
DeactivateDevice(
|
||||
IN USHORT LogDev)
|
||||
_In_ USHORT LogDev)
|
||||
{
|
||||
WriteLogicalDeviceNumber(LogDev);
|
||||
WriteByte(ISAPNP_ACTIVATE, 0);
|
||||
|
@ -173,8 +173,8 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadIoBase(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Index)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Index)
|
||||
{
|
||||
return ReadWord(ReadDataPort, ISAPNP_IOBASE(Index));
|
||||
}
|
||||
|
@ -183,8 +183,8 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadIrqNo(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Index)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Index)
|
||||
{
|
||||
return ReadByte(ReadDataPort, ISAPNP_IRQNO(Index));
|
||||
}
|
||||
|
@ -193,8 +193,8 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadIrqType(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Index)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Index)
|
||||
{
|
||||
return ReadByte(ReadDataPort, ISAPNP_IRQTYPE(Index));
|
||||
}
|
||||
|
@ -203,8 +203,8 @@ static
|
|||
inline
|
||||
USHORT
|
||||
ReadDmaChannel(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT Index)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT Index)
|
||||
{
|
||||
return ReadByte(ReadDataPort, ISAPNP_DMACHANNEL(Index));
|
||||
}
|
||||
|
@ -221,8 +221,8 @@ static
|
|||
inline
|
||||
UCHAR
|
||||
NextLFSR(
|
||||
IN UCHAR Lfsr,
|
||||
IN UCHAR InputBit)
|
||||
_In_ UCHAR Lfsr,
|
||||
_In_ UCHAR InputBit)
|
||||
{
|
||||
UCHAR NextLfsr = Lfsr >> 1;
|
||||
|
||||
|
@ -252,7 +252,7 @@ SendKey(VOID)
|
|||
static
|
||||
USHORT
|
||||
PeekByte(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
USHORT i;
|
||||
|
||||
|
@ -270,9 +270,9 @@ PeekByte(
|
|||
static
|
||||
VOID
|
||||
Peek(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN OUT PVOID Buffer,
|
||||
IN ULONG Length)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_Out_writes_bytes_all_opt_(Length) PVOID Buffer,
|
||||
_In_ ULONG Length)
|
||||
{
|
||||
USHORT i, Byte;
|
||||
|
||||
|
@ -280,22 +280,23 @@ Peek(
|
|||
{
|
||||
Byte = PeekByte(ReadDataPort);
|
||||
if (Buffer)
|
||||
*((PUCHAR)Buffer + i) = Byte;
|
||||
((PUCHAR)Buffer)[i] = Byte;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
USHORT
|
||||
IsaPnpChecksum(
|
||||
IN PISAPNP_IDENTIFIER Identifier)
|
||||
_In_ PISAPNP_IDENTIFIER Identifier)
|
||||
{
|
||||
UCHAR i, j, Lfsr, Byte;
|
||||
UCHAR i, j, Lfsr;
|
||||
|
||||
Lfsr = ISAPNP_LFSR_SEED;
|
||||
for (i = 0; i < 8; i++)
|
||||
for (i = 0; i < FIELD_OFFSET(ISAPNP_IDENTIFIER, Checksum); i++)
|
||||
{
|
||||
Byte = *(((PUCHAR)Identifier) + i);
|
||||
for (j = 0; j < 8; j++)
|
||||
UCHAR Byte = ((PUCHAR)Identifier)[i];
|
||||
|
||||
for (j = 0; j < RTL_BITS_OF(Byte); j++)
|
||||
{
|
||||
Lfsr = NextLFSR(Lfsr, Byte);
|
||||
Byte >>= 1;
|
||||
|
@ -308,9 +309,9 @@ IsaPnpChecksum(
|
|||
static
|
||||
BOOLEAN
|
||||
ReadTags(
|
||||
IN PUCHAR ReadDataPort,
|
||||
IN USHORT LogDev,
|
||||
IN OUT PISAPNP_LOGICAL_DEVICE LogDevice)
|
||||
_In_ PUCHAR ReadDataPort,
|
||||
_In_ USHORT LogDev,
|
||||
_Inout_ PISAPNP_LOGICAL_DEVICE LogDevice)
|
||||
{
|
||||
BOOLEAN res = FALSE;
|
||||
PVOID Buffer;
|
||||
|
@ -392,7 +393,7 @@ ReadTags(
|
|||
static
|
||||
INT
|
||||
TryIsolate(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
ISAPNP_IDENTIFIER Identifier;
|
||||
USHORT i, j;
|
||||
|
@ -497,8 +498,8 @@ TryIsolate(
|
|||
|
||||
VOID
|
||||
DeviceActivation(
|
||||
IN PISAPNP_LOGICAL_DEVICE IsaDevice,
|
||||
IN BOOLEAN Activate)
|
||||
_In_ PISAPNP_LOGICAL_DEVICE IsaDevice,
|
||||
_In_ BOOLEAN Activate)
|
||||
{
|
||||
WaitForKey();
|
||||
SendKey();
|
||||
|
@ -516,7 +517,7 @@ DeviceActivation(
|
|||
|
||||
NTSTATUS
|
||||
ProbeIsaPnpBus(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt)
|
||||
{
|
||||
PISAPNP_LOGICAL_DEVICE LogDevice;
|
||||
ISAPNP_IDENTIFIER Identifier;
|
||||
|
@ -578,7 +579,7 @@ ProbeIsaPnpBus(
|
|||
|
||||
WaitForKey();
|
||||
|
||||
InsertTailList(&FdoExt->DeviceListHead, &LogDevice->ListEntry);
|
||||
InsertTailList(&FdoExt->DeviceListHead, &LogDevice->DeviceLink);
|
||||
FdoExt->DeviceCount++;
|
||||
}
|
||||
}
|
||||
|
@ -589,7 +590,7 @@ ProbeIsaPnpBus(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwTryReadDataPort(
|
||||
IN PUCHAR ReadDataPort)
|
||||
_In_ PUCHAR ReadDataPort)
|
||||
{
|
||||
return TryIsolate(ReadDataPort) > 0 ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
@ -597,7 +598,7 @@ IsaHwTryReadDataPort(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwActivateDevice(
|
||||
IN PISAPNP_LOGICAL_DEVICE LogicalDevice)
|
||||
_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
|
||||
{
|
||||
DeviceActivation(LogicalDevice,
|
||||
TRUE);
|
||||
|
@ -608,7 +609,7 @@ IsaHwActivateDevice(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwDeactivateDevice(
|
||||
IN PISAPNP_LOGICAL_DEVICE LogicalDevice)
|
||||
_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice)
|
||||
{
|
||||
DeviceActivation(LogicalDevice,
|
||||
FALSE);
|
||||
|
@ -619,7 +620,7 @@ IsaHwDeactivateDevice(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwFillDeviceList(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt)
|
||||
{
|
||||
return ProbeIsaPnpBus(FdoExt);
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* FILE: isapnp.c
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Driver entry
|
||||
* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
|
||||
* Hervé Poussineau
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#include <isapnp.h>
|
||||
#include "isapnp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
@ -140,14 +140,14 @@ IsaFdoCreateDeviceIDs(
|
|||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoCreateRequirements(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt)
|
||||
IsaPnpCreateLogicalDeviceRequirements(
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt)
|
||||
{
|
||||
PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
|
||||
RTL_BITMAP IrqBitmap[ARRAYSIZE(LogDev->Irq)];
|
||||
RTL_BITMAP DmaBitmap[ARRAYSIZE(LogDev->Dma)];
|
||||
ULONG IrqData[ARRAYSIZE(LogDev->Irq)];
|
||||
ULONG DmaData[ARRAYSIZE(LogDev->Dma)];
|
||||
RTL_BITMAP IrqBitmap[RTL_NUMBER_OF(LogDev->Irq)];
|
||||
RTL_BITMAP DmaBitmap[RTL_NUMBER_OF(LogDev->Dma)];
|
||||
ULONG IrqData[RTL_NUMBER_OF(LogDev->Irq)];
|
||||
ULONG DmaData[RTL_NUMBER_OF(LogDev->Dma)];
|
||||
ULONG ResourceCount = 0;
|
||||
ULONG ListSize, i, j;
|
||||
BOOLEAN FirstIrq = TRUE, FirstDma = TRUE;
|
||||
|
@ -155,19 +155,22 @@ IsaFdoCreateRequirements(
|
|||
PIO_RESOURCE_DESCRIPTOR Descriptor;
|
||||
|
||||
/* Count number of requirements */
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Io); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Io); i++)
|
||||
{
|
||||
if (!LogDev->Io[i].Description.Length)
|
||||
break;
|
||||
|
||||
ResourceCount++;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Irq); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Irq); i++)
|
||||
{
|
||||
if (!LogDev->Irq[i].Description.Mask)
|
||||
break;
|
||||
|
||||
IrqData[i] = LogDev->Irq[i].Description.Mask;
|
||||
RtlInitializeBitMap(&IrqBitmap[i], &IrqData[i], 16);
|
||||
ResourceCount += RtlNumberOfSetBits(&IrqBitmap[i]);
|
||||
|
||||
if (LogDev->Irq[i].Description.Information & 0x4)
|
||||
{
|
||||
/* Add room for level sensitive */
|
||||
|
@ -176,10 +179,11 @@ IsaFdoCreateRequirements(
|
|||
}
|
||||
if (ResourceCount == 0)
|
||||
return STATUS_SUCCESS;
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Irq); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Irq); i++)
|
||||
{
|
||||
if (!LogDev->Dma[i].Description.Mask)
|
||||
break;
|
||||
|
||||
DmaData[i] = LogDev->Dma[i].Description.Mask;
|
||||
RtlInitializeBitMap(&DmaBitmap[i], &DmaData[i], 8);
|
||||
ResourceCount += RtlNumberOfSetBits(&DmaBitmap[i]);
|
||||
|
@ -187,7 +191,7 @@ IsaFdoCreateRequirements(
|
|||
|
||||
/* Allocate memory to store requirements */
|
||||
ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST)
|
||||
+ ResourceCount * sizeof(IO_RESOURCE_DESCRIPTOR);
|
||||
+ ResourceCount * sizeof(IO_RESOURCE_DESCRIPTOR);
|
||||
RequirementsList = ExAllocatePool(PagedPool, ListSize);
|
||||
if (!RequirementsList)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
@ -203,15 +207,17 @@ IsaFdoCreateRequirements(
|
|||
|
||||
/* Store requirements */
|
||||
Descriptor = RequirementsList->List[0].Descriptors;
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Io); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Io); i++)
|
||||
{
|
||||
if (!LogDev->Io[i].Description.Length)
|
||||
break;
|
||||
|
||||
DPRINT("Device.Io[%d].Information = 0x%02x\n", i, LogDev->Io[i].Description.Information);
|
||||
DPRINT("Device.Io[%d].Minimum = 0x%02x\n", i, LogDev->Io[i].Description.Minimum);
|
||||
DPRINT("Device.Io[%d].Maximum = 0x%02x\n", i, LogDev->Io[i].Description.Maximum);
|
||||
DPRINT("Device.Io[%d].Alignment = 0x%02x\n", i, LogDev->Io[i].Description.Alignment);
|
||||
DPRINT("Device.Io[%d].Length = 0x%02x\n", i, LogDev->Io[i].Description.Length);
|
||||
|
||||
Descriptor->Type = CmResourceTypePort;
|
||||
Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
|
||||
if (LogDev->Io[i].Description.Information & 0x1)
|
||||
|
@ -221,19 +227,23 @@ IsaFdoCreateRequirements(
|
|||
Descriptor->u.Port.Length = LogDev->Io[i].Description.Length;
|
||||
Descriptor->u.Port.Alignment = LogDev->Io[i].Description.Alignment;
|
||||
Descriptor->u.Port.MinimumAddress.LowPart = LogDev->Io[i].Description.Minimum;
|
||||
Descriptor->u.Port.MaximumAddress.LowPart = LogDev->Io[i].Description.Maximum + LogDev->Io[i].Description.Length - 1;
|
||||
Descriptor->u.Port.MaximumAddress.LowPart =
|
||||
LogDev->Io[i].Description.Maximum + LogDev->Io[i].Description.Length - 1;
|
||||
Descriptor++;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Irq); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Irq); i++)
|
||||
{
|
||||
if (!LogDev->Irq[i].Description.Mask)
|
||||
break;
|
||||
|
||||
DPRINT("Device.Irq[%d].Mask = 0x%02x\n", i, LogDev->Irq[i].Description.Mask);
|
||||
DPRINT("Device.Irq[%d].Information = 0x%02x\n", i, LogDev->Irq[i].Description.Information);
|
||||
|
||||
for (j = 0; j < 15; j++)
|
||||
{
|
||||
if (!RtlCheckBit(&IrqBitmap[i], j))
|
||||
continue;
|
||||
|
||||
if (FirstIrq)
|
||||
FirstIrq = FALSE;
|
||||
else
|
||||
|
@ -242,6 +252,7 @@ IsaFdoCreateRequirements(
|
|||
Descriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED;
|
||||
Descriptor->u.Interrupt.MinimumVector = Descriptor->u.Interrupt.MaximumVector = j;
|
||||
Descriptor++;
|
||||
|
||||
if (LogDev->Irq[i].Description.Information & 0x4)
|
||||
{
|
||||
/* Level interrupt */
|
||||
|
@ -253,16 +264,19 @@ IsaFdoCreateRequirements(
|
|||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Dma); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Dma); i++)
|
||||
{
|
||||
if (!LogDev->Dma[i].Description.Mask)
|
||||
break;
|
||||
|
||||
DPRINT("Device.Dma[%d].Mask = 0x%02x\n", i, LogDev->Dma[i].Description.Mask);
|
||||
DPRINT("Device.Dma[%d].Information = 0x%02x\n", i, LogDev->Dma[i].Description.Information);
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
if (!RtlCheckBit(&DmaBitmap[i], j))
|
||||
continue;
|
||||
|
||||
if (FirstDma)
|
||||
FirstDma = FALSE;
|
||||
else
|
||||
|
@ -296,8 +310,8 @@ IsaFdoCreateRequirements(
|
|||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoCreateResources(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt)
|
||||
IsaPnpCreateLogicalDeviceResources(
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt)
|
||||
{
|
||||
PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
|
||||
ULONG ResourceCount = 0;
|
||||
|
@ -306,21 +320,21 @@ IsaFdoCreateResources(
|
|||
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
|
||||
|
||||
/* Count number of required resources */
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Io); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Io); i++)
|
||||
{
|
||||
if (LogDev->Io[i].CurrentBase)
|
||||
ResourceCount++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Irq); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Irq); i++)
|
||||
{
|
||||
if (LogDev->Irq[i].CurrentNo)
|
||||
ResourceCount++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Dma); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Dma); i++)
|
||||
{
|
||||
if (LogDev->Dma[i].CurrentChannel != 4)
|
||||
ResourceCount++;
|
||||
|
@ -332,7 +346,7 @@ IsaFdoCreateResources(
|
|||
|
||||
/* Allocate memory to store resources */
|
||||
ListSize = sizeof(CM_RESOURCE_LIST)
|
||||
+ (ResourceCount - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
|
||||
+ (ResourceCount - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
|
||||
ResourceList = ExAllocatePool(PagedPool, ListSize);
|
||||
if (!ResourceList)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
@ -346,10 +360,11 @@ IsaFdoCreateResources(
|
|||
|
||||
/* Store resources */
|
||||
ResourceCount = 0;
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Io); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Io); i++)
|
||||
{
|
||||
if (!LogDev->Io[i].CurrentBase)
|
||||
continue;
|
||||
|
||||
Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[ResourceCount++];
|
||||
Descriptor->Type = CmResourceTypePort;
|
||||
Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
|
||||
|
@ -360,10 +375,11 @@ IsaFdoCreateResources(
|
|||
Descriptor->u.Port.Length = LogDev->Io[i].Description.Length;
|
||||
Descriptor->u.Port.Start.LowPart = LogDev->Io[i].CurrentBase;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Irq); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Irq); i++)
|
||||
{
|
||||
if (!LogDev->Irq[i].CurrentNo)
|
||||
continue;
|
||||
|
||||
Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[ResourceCount++];
|
||||
Descriptor->Type = CmResourceTypeInterrupt;
|
||||
Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
|
||||
|
@ -375,10 +391,11 @@ IsaFdoCreateResources(
|
|||
Descriptor->u.Interrupt.Vector = LogDev->Irq[i].CurrentNo;
|
||||
Descriptor->u.Interrupt.Affinity = -1;
|
||||
}
|
||||
for (i = 0; i < ARRAYSIZE(LogDev->Dma); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(LogDev->Dma); i++)
|
||||
{
|
||||
if (LogDev->Dma[i].CurrentChannel == 4)
|
||||
continue;
|
||||
|
||||
Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[ResourceCount++];
|
||||
Descriptor->Type = CmResourceTypeDma;
|
||||
Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
|
||||
|
@ -409,9 +426,9 @@ IsaFdoCreateResources(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnpFillDeviceRelations(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN BOOLEAN IncludeDataPort)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ BOOLEAN IncludeDataPort)
|
||||
{
|
||||
PISAPNP_PDO_EXTENSION PdoExt;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
@ -429,63 +446,63 @@ IsaPnpFillDeviceRelations(
|
|||
|
||||
if (IncludeDataPort)
|
||||
{
|
||||
DeviceRelations->Objects[i++] = FdoExt->DataPortPdo;
|
||||
ObReferenceObject(FdoExt->DataPortPdo);
|
||||
DeviceRelations->Objects[i++] = FdoExt->ReadPortPdo;
|
||||
ObReferenceObject(FdoExt->ReadPortPdo);
|
||||
}
|
||||
|
||||
CurrentEntry = FdoExt->DeviceListHead.Flink;
|
||||
while (CurrentEntry != &FdoExt->DeviceListHead)
|
||||
{
|
||||
IsaDevice = CONTAINING_RECORD(CurrentEntry, ISAPNP_LOGICAL_DEVICE, ListEntry);
|
||||
IsaDevice = CONTAINING_RECORD(CurrentEntry, ISAPNP_LOGICAL_DEVICE, DeviceLink);
|
||||
|
||||
if (!IsaDevice->Pdo)
|
||||
{
|
||||
Status = IoCreateDevice(FdoExt->DriverObject,
|
||||
sizeof(ISAPNP_PDO_EXTENSION),
|
||||
NULL,
|
||||
FILE_DEVICE_CONTROLLER,
|
||||
FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
|
||||
FALSE,
|
||||
&IsaDevice->Pdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (!IsaDevice->Pdo)
|
||||
{
|
||||
Status = IoCreateDevice(FdoExt->DriverObject,
|
||||
sizeof(ISAPNP_PDO_EXTENSION),
|
||||
NULL,
|
||||
FILE_DEVICE_CONTROLLER,
|
||||
FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
|
||||
FALSE,
|
||||
&IsaDevice->Pdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
IsaDevice->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
IsaDevice->Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
|
||||
//Device->Pdo->Flags |= DO_POWER_PAGABLE;
|
||||
//Device->Pdo->Flags |= DO_POWER_PAGABLE;
|
||||
|
||||
PdoExt = (PISAPNP_PDO_EXTENSION)IsaDevice->Pdo->DeviceExtension;
|
||||
PdoExt = IsaDevice->Pdo->DeviceExtension;
|
||||
|
||||
RtlZeroMemory(PdoExt, sizeof(ISAPNP_PDO_EXTENSION));
|
||||
RtlZeroMemory(PdoExt, sizeof(ISAPNP_PDO_EXTENSION));
|
||||
|
||||
PdoExt->Common.IsFdo = FALSE;
|
||||
PdoExt->Common.Self = IsaDevice->Pdo;
|
||||
PdoExt->Common.State = dsStopped;
|
||||
PdoExt->IsaPnpDevice = IsaDevice;
|
||||
PdoExt->FdoExt = FdoExt;
|
||||
PdoExt->Common.IsFdo = FALSE;
|
||||
PdoExt->Common.Self = IsaDevice->Pdo;
|
||||
PdoExt->Common.State = dsStopped;
|
||||
PdoExt->IsaPnpDevice = IsaDevice;
|
||||
PdoExt->FdoExt = FdoExt;
|
||||
|
||||
Status = IsaFdoCreateDeviceIDs(PdoExt);
|
||||
Status = IsaFdoCreateDeviceIDs(PdoExt);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
Status = IsaFdoCreateRequirements(PdoExt);
|
||||
if (NT_SUCCESS(Status))
|
||||
Status = IsaPnpCreateLogicalDeviceRequirements(PdoExt);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
Status = IsaFdoCreateResources(PdoExt);
|
||||
if (NT_SUCCESS(Status))
|
||||
Status = IsaPnpCreateLogicalDeviceResources(PdoExt);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
IoDeleteDevice(IsaDevice->Pdo);
|
||||
IsaDevice->Pdo = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
DeviceRelations->Objects[i++] = IsaDevice->Pdo;
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
IoDeleteDevice(IsaDevice->Pdo);
|
||||
IsaDevice->Pdo = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
DeviceRelations->Objects[i++] = IsaDevice->Pdo;
|
||||
|
||||
ObReferenceObject(IsaDevice->Pdo);
|
||||
ObReferenceObject(IsaDevice->Pdo);
|
||||
|
||||
CurrentEntry = CurrentEntry->Flink;
|
||||
CurrentEntry = CurrentEntry->Flink;
|
||||
}
|
||||
|
||||
DeviceRelations->Count = i;
|
||||
|
@ -495,7 +512,6 @@ IsaPnpFillDeviceRelations(
|
|||
return Status;
|
||||
}
|
||||
|
||||
|
||||
static IO_COMPLETION_ROUTINE ForwardIrpCompletion;
|
||||
|
||||
static
|
||||
|
@ -539,14 +555,16 @@ IsaForwardIrpSynchronous(
|
|||
return Status;
|
||||
}
|
||||
|
||||
_Dispatch_type_(IRP_MJ_CREATE)
|
||||
_Dispatch_type_(IRP_MJ_CLOSE)
|
||||
static DRIVER_DISPATCH IsaCreateClose;
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaCreateClose(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = FILE_OPENED;
|
||||
|
@ -609,15 +627,16 @@ static
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnpCreateReadPortDORequirements(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt)
|
||||
{
|
||||
USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS, 0x274, 0x3e4, 0x204, 0x2e4, 0x354, 0x2f4 };
|
||||
ULONG ListSize, i;
|
||||
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
|
||||
PIO_RESOURCE_DESCRIPTOR Descriptor;
|
||||
const ULONG Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS,
|
||||
0x274, 0x3E4, 0x204, 0x2E4, 0x354, 0x2F4 };
|
||||
|
||||
ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST)
|
||||
+ 2 * ARRAYSIZE(Ports) * sizeof(IO_RESOURCE_DESCRIPTOR);
|
||||
+ 2 * RTL_NUMBER_OF(Ports) * sizeof(IO_RESOURCE_DESCRIPTOR);
|
||||
RequirementsList = ExAllocatePool(PagedPool, ListSize);
|
||||
if (!RequirementsList)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
@ -628,9 +647,9 @@ IsaPnpCreateReadPortDORequirements(
|
|||
|
||||
RequirementsList->List[0].Version = 1;
|
||||
RequirementsList->List[0].Revision = 1;
|
||||
RequirementsList->List[0].Count = 2 * ARRAYSIZE(Ports);
|
||||
RequirementsList->List[0].Count = 2 * RTL_NUMBER_OF(Ports);
|
||||
|
||||
for (i = 0; i < 2 * ARRAYSIZE(Ports); i += 2)
|
||||
for (i = 0; i < 2 * RTL_NUMBER_OF(Ports); i += 2)
|
||||
{
|
||||
Descriptor = &RequirementsList->List[0].Descriptors[i];
|
||||
|
||||
|
@ -659,15 +678,15 @@ static
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnpCreateReadPortDOResources(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt)
|
||||
{
|
||||
USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
|
||||
const USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
|
||||
ULONG ListSize, i;
|
||||
PCM_RESOURCE_LIST ResourceList;
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
|
||||
|
||||
ListSize = sizeof(CM_RESOURCE_LIST)
|
||||
+ (ARRAYSIZE(Ports) - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
|
||||
ListSize = sizeof(CM_RESOURCE_LIST) +
|
||||
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (RTL_NUMBER_OF(Ports) - 1);
|
||||
ResourceList = ExAllocatePool(PagedPool, ListSize);
|
||||
if (!ResourceList)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
@ -677,9 +696,9 @@ IsaPnpCreateReadPortDOResources(
|
|||
ResourceList->List[0].InterfaceType = Internal;
|
||||
ResourceList->List[0].PartialResourceList.Version = 1;
|
||||
ResourceList->List[0].PartialResourceList.Revision = 1;
|
||||
ResourceList->List[0].PartialResourceList.Count = 2;
|
||||
ResourceList->List[0].PartialResourceList.Count = RTL_NUMBER_OF(Ports);
|
||||
|
||||
for (i = 0; i < ARRAYSIZE(Ports); i++)
|
||||
for (i = 0; i < RTL_NUMBER_OF(Ports); i++)
|
||||
{
|
||||
Descriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
Descriptor->Type = CmResourceTypePort;
|
||||
|
@ -697,28 +716,30 @@ IsaPnpCreateReadPortDOResources(
|
|||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnpCreateReadPortDO(PISAPNP_FDO_EXTENSION FdoExt)
|
||||
IsaPnpCreateReadPortDO(
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt)
|
||||
{
|
||||
UNICODE_STRING DeviceID = RTL_CONSTANT_STRING(L"ISAPNP\\ReadDataPort\0");
|
||||
UNICODE_STRING HardwareIDs = RTL_CONSTANT_STRING(L"ISAPNP\\ReadDataPort\0\0");
|
||||
UNICODE_STRING CompatibleIDs = RTL_CONSTANT_STRING(L"\0\0");
|
||||
UNICODE_STRING InstanceID = RTL_CONSTANT_STRING(L"0\0");
|
||||
PISAPNP_PDO_EXTENSION PdoExt;
|
||||
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = IoCreateDevice(FdoExt->DriverObject,
|
||||
sizeof(ISAPNP_PDO_EXTENSION),
|
||||
NULL,
|
||||
FILE_DEVICE_CONTROLLER,
|
||||
FILE_DEVICE_SECURE_OPEN,
|
||||
FALSE,
|
||||
&FdoExt->DataPortPdo);
|
||||
&FdoExt->ReadPortPdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
return Status;
|
||||
PdoExt = (PISAPNP_PDO_EXTENSION)FdoExt->DataPortPdo->DeviceExtension;
|
||||
|
||||
PdoExt = FdoExt->ReadPortPdo->DeviceExtension;
|
||||
RtlZeroMemory(PdoExt, sizeof(ISAPNP_PDO_EXTENSION));
|
||||
PdoExt->Common.IsFdo = FALSE;
|
||||
PdoExt->Common.Self = FdoExt->DataPortPdo;
|
||||
PdoExt->Common.Self = FdoExt->ReadPortPdo;
|
||||
PdoExt->Common.State = dsStopped;
|
||||
PdoExt->FdoExt = FdoExt;
|
||||
|
||||
|
@ -761,8 +782,8 @@ static
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaAddDevice(
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PDEVICE_OBJECT PhysicalDeviceObject)
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PDEVICE_OBJECT PhysicalDeviceObject)
|
||||
{
|
||||
PDEVICE_OBJECT Fdo;
|
||||
PISAPNP_FDO_EXTENSION FdoExt;
|
||||
|
@ -779,7 +800,7 @@ IsaAddDevice(
|
|||
&Fdo);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("Failed to create FDO (0x%x)\n", Status);
|
||||
DPRINT1("Failed to create FDO (0x%08lx)\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -802,17 +823,19 @@ IsaAddDevice(
|
|||
return Status;
|
||||
|
||||
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
FdoExt->DataPortPdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
FdoExt->ReadPortPdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
_Dispatch_type_(IRP_MJ_POWER)
|
||||
DRIVER_DISPATCH IsaPower;
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPower(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
|
||||
NTSTATUS Status;
|
||||
|
@ -829,14 +852,15 @@ IsaPower(
|
|||
return PoCallDriver(((PISAPNP_FDO_EXTENSION)DevExt)->Ldo, Irp);
|
||||
}
|
||||
|
||||
_Dispatch_type_(IRP_MJ_PNP)
|
||||
static DRIVER_DISPATCH IsaPnp;
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnp(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
_In_ PDEVICE_OBJECT DeviceObject,
|
||||
_Inout_ PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||
PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension;
|
||||
|
@ -844,24 +868,16 @@ IsaPnp(
|
|||
DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp);
|
||||
|
||||
if (DevExt->IsFdo)
|
||||
{
|
||||
return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt,
|
||||
Irp,
|
||||
IrpSp);
|
||||
}
|
||||
return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt, Irp, IrpSp);
|
||||
else
|
||||
{
|
||||
return IsaPdoPnp((PISAPNP_PDO_EXTENSION)DevExt,
|
||||
Irp,
|
||||
IrpSp);
|
||||
}
|
||||
return IsaPdoPnp((PISAPNP_PDO_EXTENSION)DevExt, Irp, IrpSp);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PUNICODE_STRING RegistryPath)
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath)
|
||||
{
|
||||
DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath);
|
||||
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Common header file
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#ifndef _ISAPNP_PCH_
|
||||
#define _ISAPNP_PCH_
|
||||
|
||||
#include <wdm.h>
|
||||
#include <ntstrsafe.h>
|
||||
#include <isapnphw.h>
|
||||
#include "isapnphw.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -11,28 +19,33 @@ extern "C" {
|
|||
|
||||
#define TAG_ISAPNP 'PNPI'
|
||||
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
dsStopped,
|
||||
dsStarted
|
||||
} ISAPNP_DEVICE_STATE;
|
||||
|
||||
typedef struct _ISAPNP_IO {
|
||||
typedef struct _ISAPNP_IO
|
||||
{
|
||||
USHORT CurrentBase;
|
||||
ISAPNP_IO_DESCRIPTION Description;
|
||||
} ISAPNP_IO, PISAPNP_IO;
|
||||
} ISAPNP_IO, *PISAPNP_IO;
|
||||
|
||||
typedef struct _ISAPNP_IRQ {
|
||||
typedef struct _ISAPNP_IRQ
|
||||
{
|
||||
UCHAR CurrentNo;
|
||||
UCHAR CurrentType;
|
||||
ISAPNP_IRQ_DESCRIPTION Description;
|
||||
} ISAPNP_IRQ, *PISAPNP_IRQ;
|
||||
|
||||
typedef struct _ISAPNP_DMA {
|
||||
typedef struct _ISAPNP_DMA
|
||||
{
|
||||
UCHAR CurrentChannel;
|
||||
ISAPNP_DMA_DESCRIPTION Description;
|
||||
} ISAPNP_DMA, *PISAPNP_DMA;
|
||||
|
||||
typedef struct _ISAPNP_LOGICAL_DEVICE {
|
||||
typedef struct _ISAPNP_LOGICAL_DEVICE
|
||||
{
|
||||
PDEVICE_OBJECT Pdo;
|
||||
ISAPNP_LOGDEVID LogDevId;
|
||||
UCHAR VendorId[3];
|
||||
|
@ -43,20 +56,22 @@ typedef struct _ISAPNP_LOGICAL_DEVICE {
|
|||
ISAPNP_DMA Dma[2];
|
||||
UCHAR CSN;
|
||||
UCHAR LDN;
|
||||
LIST_ENTRY ListEntry;
|
||||
LIST_ENTRY DeviceLink;
|
||||
} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE;
|
||||
|
||||
typedef struct _ISAPNP_COMMON_EXTENSION {
|
||||
typedef struct _ISAPNP_COMMON_EXTENSION
|
||||
{
|
||||
PDEVICE_OBJECT Self;
|
||||
BOOLEAN IsFdo;
|
||||
ISAPNP_DEVICE_STATE State;
|
||||
} ISAPNP_COMMON_EXTENSION, *PISAPNP_COMMON_EXTENSION;
|
||||
|
||||
typedef struct _ISAPNP_FDO_EXTENSION {
|
||||
typedef struct _ISAPNP_FDO_EXTENSION
|
||||
{
|
||||
ISAPNP_COMMON_EXTENSION Common;
|
||||
PDEVICE_OBJECT Ldo;
|
||||
PDEVICE_OBJECT Pdo;
|
||||
PDEVICE_OBJECT DataPortPdo;
|
||||
PDEVICE_OBJECT ReadPortPdo;
|
||||
LIST_ENTRY DeviceListHead;
|
||||
ULONG DeviceCount;
|
||||
PDRIVER_OBJECT DriverObject;
|
||||
|
@ -64,7 +79,8 @@ typedef struct _ISAPNP_FDO_EXTENSION {
|
|||
KSPIN_LOCK Lock;
|
||||
} ISAPNP_FDO_EXTENSION, *PISAPNP_FDO_EXTENSION;
|
||||
|
||||
typedef struct _ISAPNP_PDO_EXTENSION {
|
||||
typedef struct _ISAPNP_PDO_EXTENSION
|
||||
{
|
||||
ISAPNP_COMMON_EXTENSION Common;
|
||||
PISAPNP_LOGICAL_DEVICE IsaPnpDevice;
|
||||
PISAPNP_FDO_EXTENSION FdoExt;
|
||||
|
@ -92,60 +108,54 @@ IsaPnpDuplicateUnicodeString(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPnpFillDeviceRelations(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN BOOLEAN IncludeDataPort);
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ BOOLEAN IncludeDataPort);
|
||||
|
||||
DRIVER_INITIALIZE DriverEntry;
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN PUNICODE_STRING RegistryPath);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaForwardIrpSynchronous(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp);
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp);
|
||||
|
||||
/* fdo.c */
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaFdoPnp(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp);
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp);
|
||||
|
||||
/* pdo.c */
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoPnp(
|
||||
IN PISAPNP_PDO_EXTENSION PdoDeviceExtension,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp);
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoDeviceExtension,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp);
|
||||
|
||||
/* hardware.c */
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwTryReadDataPort(
|
||||
IN PUCHAR ReadDataPort);
|
||||
_In_ PUCHAR ReadDataPort);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwFillDeviceList(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt);
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwDeactivateDevice(
|
||||
IN PISAPNP_LOGICAL_DEVICE LogicalDevice);
|
||||
_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaHwActivateDevice(
|
||||
IN PISAPNP_LOGICAL_DEVICE LogicalDevice);
|
||||
_In_ PISAPNP_LOGICAL_DEVICE LogicalDevice);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: Hardware definitions
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -83,20 +91,23 @@ extern "C" {
|
|||
#define ISAPNP_TAG_RSVDLONGF 0xFF
|
||||
#define ISAPNP_TAG_PSEUDO_NEWBOARD 0x100
|
||||
|
||||
typedef struct _ISAPNP_IDENTIFIER {
|
||||
typedef struct _ISAPNP_IDENTIFIER
|
||||
{
|
||||
USHORT VendorId;
|
||||
USHORT ProdId;
|
||||
ULONG Serial;
|
||||
UCHAR Checksum;
|
||||
} ISAPNP_IDENTIFIER, *PISAPNP_IDENTIFIER;
|
||||
|
||||
typedef struct _ISAPNP_LOGDEVID {
|
||||
typedef struct _ISAPNP_LOGDEVID
|
||||
{
|
||||
USHORT VendorId;
|
||||
USHORT ProdId;
|
||||
USHORT Flags;
|
||||
} ISAPNP_LOGDEVID, *PISAPNP_LOGDEVID;
|
||||
|
||||
typedef struct _ISAPNP_DEVICEID {
|
||||
typedef struct _ISAPNP_DEVICEID
|
||||
{
|
||||
CHAR* Name;
|
||||
USHORT VendorId;
|
||||
USHORT ProdId;
|
||||
|
@ -104,23 +115,26 @@ typedef struct _ISAPNP_DEVICEID {
|
|||
|
||||
#include <pshpack1.h>
|
||||
|
||||
typedef struct _ISAPNP_IO_DESCRIPTION {
|
||||
typedef struct _ISAPNP_IO_DESCRIPTION
|
||||
{
|
||||
UCHAR Information;
|
||||
USHORT Minimum;
|
||||
USHORT Maximum;
|
||||
UCHAR Alignment;
|
||||
UCHAR Length;
|
||||
} ISAPNP_IO_DESCRIPTION;
|
||||
} ISAPNP_IO_DESCRIPTION, *PISAPNP_IO_DESCRIPTION;
|
||||
|
||||
typedef struct _ISAPNP_IRQ_DESCRIPTION {
|
||||
typedef struct _ISAPNP_IRQ_DESCRIPTION
|
||||
{
|
||||
USHORT Mask;
|
||||
UCHAR Information;
|
||||
} ISAPNP_IRQ_DESCRIPTION;
|
||||
} ISAPNP_IRQ_DESCRIPTION, *PISAPNP_IRQ_DESCRIPTION;
|
||||
|
||||
typedef struct _ISAPNP_DMA_DESCRIPTION {
|
||||
typedef struct _ISAPNP_DMA_DESCRIPTION
|
||||
{
|
||||
UCHAR Mask;
|
||||
UCHAR Information;
|
||||
} ISAPNP_DMA_DESCRIPTION;
|
||||
} ISAPNP_DMA_DESCRIPTION, *PISAPNP_DMA_DESCRIPTION;
|
||||
|
||||
#include <poppack.h>
|
||||
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*
|
||||
* PROJECT: ReactOS ISA PnP Bus driver
|
||||
* FILE: pdo.c
|
||||
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
||||
* PURPOSE: PDO-specific code
|
||||
* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
|
||||
* Hervé Poussineau
|
||||
* COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
|
||||
* Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
|
||||
*/
|
||||
|
||||
#include <isapnp.h>
|
||||
#include "isapnp.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
@ -14,14 +14,14 @@
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryDeviceRelations(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
PDEVICE_RELATIONS DeviceRelations;
|
||||
|
||||
if (IrpSp->Parameters.QueryDeviceRelations.Type == RemovalRelations &&
|
||||
PdoExt->Common.Self == PdoExt->FdoExt->DataPortPdo)
|
||||
PdoExt->Common.Self == PdoExt->FdoExt->ReadPortPdo)
|
||||
{
|
||||
return IsaPnpFillDeviceRelations(PdoExt->FdoExt, Irp, FALSE);
|
||||
}
|
||||
|
@ -38,16 +38,15 @@ IsaPdoQueryDeviceRelations(
|
|||
ObReferenceObject(PdoExt->Common.Self);
|
||||
|
||||
Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryCapabilities(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
PDEVICE_CAPABILITIES DeviceCapabilities;
|
||||
PISAPNP_LOGICAL_DEVICE LogDev = PdoExt->IsaPnpDevice;
|
||||
|
@ -79,9 +78,9 @@ IsaPdoQueryCapabilities(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryPnpDeviceState(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
|
||||
return STATUS_SUCCESS;
|
||||
|
@ -90,9 +89,9 @@ IsaPdoQueryPnpDeviceState(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryId(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
PUNICODE_STRING Source;
|
||||
PWCHAR Buffer;
|
||||
|
@ -140,9 +139,9 @@ IsaPdoQueryId(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryResources(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
ULONG ListSize;
|
||||
PCM_RESOURCE_LIST ResourceList;
|
||||
|
@ -163,9 +162,9 @@ IsaPdoQueryResources(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoQueryResourceRequirements(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
ULONG ListSize;
|
||||
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
|
||||
|
@ -187,8 +186,8 @@ static
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoStartReadPort(
|
||||
IN PISAPNP_FDO_EXTENSION FdoExt,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_FDO_EXTENSION FdoExt,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
PCM_RESOURCE_LIST ResourceList = IrpSp->Parameters.StartDevice.AllocatedResources;
|
||||
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
@ -197,24 +196,32 @@ IsaPdoStartReadPort(
|
|||
|
||||
if (!ResourceList || ResourceList->Count != 1)
|
||||
{
|
||||
DPRINT1("No resource list (%p) or bad count (%d)\n", ResourceList, ResourceList ? ResourceList->Count : 0);
|
||||
DPRINT1("No resource list (%p) or bad count (%d)\n",
|
||||
ResourceList, ResourceList ? ResourceList->Count : 0);
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
if (ResourceList->List[0].PartialResourceList.Version != 1
|
||||
|| ResourceList->List[0].PartialResourceList.Revision != 1)
|
||||
|
||||
if (ResourceList->List[0].PartialResourceList.Version != 1 ||
|
||||
ResourceList->List[0].PartialResourceList.Revision != 1)
|
||||
{
|
||||
DPRINT1("Bad resource list version (%d.%d)\n", ResourceList->List[0].PartialResourceList.Version, ResourceList->List[0].PartialResourceList.Revision);
|
||||
DPRINT1("Bad resource list version (%u.%u)\n",
|
||||
ResourceList->List[0].PartialResourceList.Version,
|
||||
ResourceList->List[0].PartialResourceList.Revision);
|
||||
return STATUS_REVISION_MISMATCH;
|
||||
}
|
||||
|
||||
for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
|
||||
{
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
if (PartialDescriptor->Type == CmResourceTypePort && PartialDescriptor->u.Port.Length > 1 && !FdoExt->ReadDataPort)
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor =
|
||||
&ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
|
||||
if (PartialDescriptor->Type == CmResourceTypePort &&
|
||||
PartialDescriptor->u.Port.Length > 1 && !FdoExt->ReadDataPort)
|
||||
{
|
||||
PUCHAR ReadDataPort = ULongToPtr(PartialDescriptor->u.Port.Start.u.LowPart + 3);
|
||||
if (NT_SUCCESS(IsaHwTryReadDataPort(ReadDataPort)))
|
||||
{
|
||||
/* we detected some ISAPNP cards */
|
||||
/* We detected some ISAPNP cards */
|
||||
FdoExt->ReadDataPort = ReadDataPort;
|
||||
KeAcquireSpinLock(&FdoExt->Lock, &OldIrql);
|
||||
Status = IsaHwFillDeviceList(FdoExt);
|
||||
|
@ -222,16 +229,17 @@ IsaPdoStartReadPort(
|
|||
if (FdoExt->DeviceCount > 0)
|
||||
{
|
||||
IoInvalidateDeviceRelations(FdoExt->Pdo, BusRelations);
|
||||
IoInvalidateDeviceRelations(FdoExt->DataPortPdo, RemovalRelations);
|
||||
IoInvalidateDeviceRelations(FdoExt->ReadPortPdo, RemovalRelations);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* mark read data port as started, even if no card has been detected */
|
||||
/* Mark read data port as started, even if no card has been detected */
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -239,8 +247,8 @@ static
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoOnRepeaterComplete(
|
||||
IN PDEVICE_OBJECT Tdo,
|
||||
IN PIRP SubIrp,
|
||||
PDEVICE_OBJECT Tdo,
|
||||
PIRP SubIrp,
|
||||
PVOID NeedsVote)
|
||||
{
|
||||
PIO_STACK_LOCATION SubStack = IoGetCurrentIrpStackLocation(SubIrp);
|
||||
|
@ -267,13 +275,12 @@ IsaPdoOnRepeaterComplete(
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoRepeatRequest(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN BOOLEAN NeedsVote)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_In_ PIRP Irp,
|
||||
_In_ BOOLEAN NeedsVote)
|
||||
{
|
||||
PDEVICE_OBJECT Fdo = PdoExt->FdoExt->Common.Self;
|
||||
PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
PDEVICE_OBJECT Tdo = IoGetAttachedDeviceReference(Fdo);
|
||||
PIRP SubIrp = IoAllocateIrp(Tdo->StackSize + 1, FALSE);
|
||||
PIO_STACK_LOCATION SubStack = IoGetNextIrpStackLocation(SubIrp);
|
||||
|
@ -290,15 +297,16 @@ IsaPdoRepeatRequest(
|
|||
SubIrp->IoStatus.Status = STATUS_NOT_SUPPORTED;
|
||||
IoMarkIrpPending(Irp);
|
||||
IoCallDriver(Tdo, SubIrp);
|
||||
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IsaPdoPnp(
|
||||
IN PISAPNP_PDO_EXTENSION PdoExt,
|
||||
IN PIRP Irp,
|
||||
IN PIO_STACK_LOCATION IrpSp)
|
||||
_In_ PISAPNP_PDO_EXTENSION PdoExt,
|
||||
_Inout_ PIRP Irp,
|
||||
_In_ PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
NTSTATUS Status = Irp->IoStatus.Status;
|
||||
|
||||
|
@ -333,7 +341,7 @@ IsaPdoPnp(
|
|||
break;
|
||||
|
||||
case IRP_MN_QUERY_PNP_DEVICE_STATE:
|
||||
if (PdoExt->Common.Self == PdoExt->FdoExt->DataPortPdo)
|
||||
if (PdoExt->Common.Self == PdoExt->FdoExt->ReadPortPdo)
|
||||
Status = IsaPdoQueryPnpDeviceState(PdoExt, Irp, IrpSp);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in a new issue