2 * PROJECT: ReactOS Storport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Storport helper functions
5 * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
8 /* INCLUDES *******************************************************************/
16 /* FUNCTIONS ******************************************************************/
21 ForwardIrpAndWaitCompletion(
22 _In_ PDEVICE_OBJECT DeviceObject
,
26 if (Irp
->PendingReturned
)
27 KeSetEvent((PKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
28 return STATUS_MORE_PROCESSING_REQUIRED
;
34 _In_ PDEVICE_OBJECT LowerDevice
,
42 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
43 IoCopyCurrentIrpStackLocationToNext(Irp
);
45 IoSetCompletionRoutine(Irp
, ForwardIrpAndWaitCompletion
, &Event
, TRUE
, TRUE
, TRUE
);
47 Status
= IoCallDriver(LowerDevice
, Irp
);
48 if (Status
== STATUS_PENDING
)
50 Status
= KeWaitForSingleObject(&Event
, Suspended
, KernelMode
, FALSE
, NULL
);
51 if (NT_SUCCESS(Status
))
52 Status
= Irp
->IoStatus
.Status
;
62 _In_ PDEVICE_OBJECT LowerDevice
,
67 IoSkipCurrentIrpStackLocation(Irp
);
68 return IoCallDriver(LowerDevice
, Irp
);
74 PDEVICE_OBJECT DeviceObject
)
80 Status
= IoGetDeviceProperty(DeviceObject
,
81 DevicePropertyBusTypeGuid
,
85 if (!NT_SUCCESS(Status
))
86 return InterfaceTypeUndefined
;
88 if (RtlCompareMemory(&Guid
, &GUID_BUS_TYPE_PCMCIA
, sizeof(GUID
)) == sizeof(GUID
))
90 else if (RtlCompareMemory(&Guid
, &GUID_BUS_TYPE_PCI
, sizeof(GUID
)) == sizeof(GUID
))
92 else if (RtlCompareMemory(&Guid
, &GUID_BUS_TYPE_ISAPNP
, sizeof(GUID
)) == sizeof(GUID
))
95 return InterfaceTypeUndefined
;
102 PCM_RESOURCE_LIST ResourceList
)
104 PCM_FULL_RESOURCE_DESCRIPTOR Descriptor
;
108 DPRINT1("GetResourceListSize(%p)\n", ResourceList
);
110 Size
= sizeof(CM_RESOURCE_LIST
);
111 if (ResourceList
->Count
== 0)
113 DPRINT1("Size: 0x%lx (%u)\n", Size
, Size
);
117 DPRINT1("ResourceList->Count: %lu\n", ResourceList
->Count
);
119 Descriptor
= &ResourceList
->List
[0];
120 for (i
= 0; i
< ResourceList
->Count
; i
++)
122 /* Process resources in CM_FULL_RESOURCE_DESCRIPTOR block number ix. */
124 DPRINT1("PartialResourceList->Count: %lu\n", Descriptor
->PartialResourceList
.Count
);
126 /* Add the size of the current full descriptor */
127 Size
+= sizeof(CM_FULL_RESOURCE_DESCRIPTOR
) +
128 (Descriptor
->PartialResourceList
.Count
- 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR
);
130 /* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */
131 Descriptor
= (PCM_FULL_RESOURCE_DESCRIPTOR
)(Descriptor
->PartialResourceList
.PartialDescriptors
+
132 Descriptor
->PartialResourceList
.Count
);
135 DPRINT1("Size: 0x%lx (%u)\n", Size
, Size
);
143 PCM_RESOURCE_LIST Source
)
145 PCM_RESOURCE_LIST Destination
;
148 DPRINT1("CopyResourceList(%lu %p)\n",
151 /* Get the size of the resource list */
152 Size
= GetResourceListSize(Source
);
154 /* Allocate a new buffer */
155 Destination
= ExAllocatePoolWithTag(PoolType
,
158 if (Destination
== NULL
)
161 /* Copy the resource list */
162 RtlCopyMemory(Destination
,
172 PDEVICE_OBJECT DeviceObject
,
176 PBUS_INTERFACE_STANDARD Interface
,
177 PVOID InterfaceSpecificData
)
182 IO_STATUS_BLOCK IoStatus
;
183 PIO_STACK_LOCATION Stack
;
185 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
187 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_PNP
,
195 return STATUS_INSUFFICIENT_RESOURCES
;
197 Stack
= IoGetNextIrpStackLocation(Irp
);
199 Stack
->MajorFunction
= IRP_MJ_PNP
;
200 Stack
->MinorFunction
= IRP_MN_QUERY_INTERFACE
;
201 Stack
->Parameters
.QueryInterface
.InterfaceType
= Guid
;
202 Stack
->Parameters
.QueryInterface
.Size
= Size
;
203 Stack
->Parameters
.QueryInterface
.Version
= Version
;
204 Stack
->Parameters
.QueryInterface
.Interface
= (PINTERFACE
)Interface
;
205 Stack
->Parameters
.QueryInterface
.InterfaceSpecificData
= InterfaceSpecificData
;
207 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
209 Status
= IoCallDriver(DeviceObject
, Irp
);
210 if (Status
== STATUS_PENDING
)
212 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
214 Status
=IoStatus
.Status
;