*/
#include "hdaudbus.h"
+DRIVER_DISPATCH HDA_Pnp;
+DRIVER_ADD_DEVICE HDA_AddDevice;
+extern "C" DRIVER_INITIALIZE DriverEntry;
PVOID
AllocateItem(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes)
+ _In_ POOL_TYPE PoolType,
+ _In_ SIZE_T NumberOfBytes)
{
PVOID Item = ExAllocatePoolWithTag(PoolType, NumberOfBytes, TAG_HDA);
if (!Item)
VOID
FreeItem(
- IN PVOID Item)
+ __drv_freesMem(Mem) PVOID Item)
{
ExFreePool(Item);
}
NTSTATUS
-NTAPI
-HDA_SyncForwardIrpCompletionRoutine(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context)
+HDA_FdoPnp(
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _Inout_ PIRP Irp)
{
- if (Irp->PendingReturned)
+ NTSTATUS Status;
+ PIO_STACK_LOCATION IoStack;
+ PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
+
+ FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IoStack->MinorFunction)
{
- KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
+ case IRP_MN_START_DEVICE:
+ Status = HDA_FDOStartDevice(DeviceObject, Irp);
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ /* handle bus device relations */
+ if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
+ {
+ Status = HDA_FDOQueryBusRelations(DeviceObject, Irp);
+ Irp->IoStatus.Status = Status;
+ if (!NT_SUCCESS(Status))
+ {
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+ }
+ break;
}
- return STATUS_MORE_PROCESSING_REQUIRED;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+ return IoCallDriver(FDODeviceExtension->LowerDevice, Irp);
}
NTSTATUS
-NTAPI
-HDA_SyncForwardIrp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+HDA_PdoPnp(
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _Inout_ PIRP Irp)
{
- KEVENT Event;
NTSTATUS Status;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_RELATIONS DeviceRelation;
- /* Initialize event */
- KeInitializeEvent(&Event, NotificationEvent, FALSE);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
- /* Copy irp stack location */
- IoCopyCurrentIrpStackLocationToNext(Irp);
+ switch (IoStack->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ /* no op for pdo */
+ Status = STATUS_SUCCESS;
+ break;
+ case IRP_MN_QUERY_BUS_INFORMATION:
+ /* query bus information */
+ Status = HDA_PDOQueryBusInformation(Irp);
+ break;
+ case IRP_MN_QUERY_PNP_DEVICE_STATE:
+ /* query pnp state */
+ Status = HDA_PDOQueryBusDevicePnpState(Irp);
+ break;
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
+ {
+ /* handle target device relations */
+ ASSERT(IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation);
+ ASSERT(Irp->IoStatus.Information == 0);
- /* Set completion routine */
- IoSetCompletionRoutine(Irp,
- HDA_SyncForwardIrpCompletionRoutine,
- &Event,
- TRUE,
- TRUE,
- TRUE);
+ /* allocate device relation */
+ DeviceRelation = (PDEVICE_RELATIONS)AllocateItem(PagedPool, sizeof(DEVICE_RELATIONS));
+ if (DeviceRelation)
+ {
+ DeviceRelation->Count = 1;
+ DeviceRelation->Objects[0] = DeviceObject;
- /* Call driver */
- Status = IoCallDriver(DeviceObject, Irp);
+ /* reference self */
+ ObReferenceObject(DeviceObject);
- /* Check if pending */
- if (Status == STATUS_PENDING)
- {
- /* Wait for the request to finish */
- KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ /* store result */
+ Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
- /* Copy status code */
+ /* done */
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* no memory */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ }
+ break;
+ case IRP_MN_QUERY_CAPABILITIES:
+ /* query capabilities */
+ Status = HDA_PDOQueryBusDeviceCapabilities(Irp);
+ break;
+ case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+ /* no op */
+ Status = STATUS_SUCCESS;
+ break;
+ case IRP_MN_QUERY_RESOURCES:
+ /* no op */
+ Status = STATUS_SUCCESS;
+ break;
+ case IRP_MN_QUERY_ID:
+ Status = HDA_PDOQueryId(DeviceObject, Irp);
+ break;
+ case IRP_MN_QUERY_DEVICE_TEXT:
+ Status = HDA_PDOHandleQueryDeviceText(Irp);
+ break;
+ case IRP_MN_QUERY_INTERFACE:
+ Status = HDA_PDOHandleQueryInterface(DeviceObject, Irp);
+ break;
+ default:
+ /* get default status */
Status = Irp->IoStatus.Status;
+ break;
}
- /* Done */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
return Status;
}
NTSTATUS
NTAPI
HDA_Pnp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _Inout_ PIRP Irp)
{
- NTSTATUS Status = STATUS_NOT_SUPPORTED;
- PIO_STACK_LOCATION IoStack;
- PDEVICE_RELATIONS DeviceRelation;
PHDA_FDO_DEVICE_EXTENSION FDODeviceExtension;
- //PHDA_PDO_DEVICE_EXTENSION ChildDeviceExtension;
- FDODeviceExtension = (PHDA_FDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- //ChildDeviceExtension = (PHDA_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ FDODeviceExtension = static_cast<PHDA_FDO_DEVICE_EXTENSION>(DeviceObject->DeviceExtension);
- IoStack = IoGetCurrentIrpStackLocation(Irp);
if (FDODeviceExtension->IsFDO)
{
- if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
- {
- Status = HDA_FDOStartDevice(DeviceObject, Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
- {
- /* handle bus device relations */
- if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations)
- {
- Status = HDA_FDOQueryBusRelations(DeviceObject, Irp);
- }
- else
- {
- Status = Irp->IoStatus.Status;
- }
- }
- else
- {
- /* get default status */
- Status = Irp->IoStatus.Status;
- }
+ return HDA_FdoPnp(DeviceObject, Irp);
}
else
{
- if (IoStack->MinorFunction == IRP_MN_START_DEVICE)
- {
- /* no op for pdo */
- Status = STATUS_SUCCESS;
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_BUS_INFORMATION)
- {
- /* query bus information */
- Status = HDA_PDOQueryBusInformation(Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE)
- {
- /* query pnp state */
- Status = HDA_PDOQueryBusDevicePnpState(Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS)
- {
- if (IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation)
- {
- /* handle target device relations */
- ASSERT(IoStack->Parameters.QueryDeviceRelations.Type == TargetDeviceRelation);
- ASSERT(Irp->IoStatus.Information == 0);
-
- /* allocate device relation */
- DeviceRelation = (PDEVICE_RELATIONS)AllocateItem(PagedPool, sizeof(DEVICE_RELATIONS));
- if (DeviceRelation)
- {
- DeviceRelation->Count = 1;
- DeviceRelation->Objects[0] = DeviceObject;
-
- /* reference self */
- ObReferenceObject(DeviceObject);
-
- /* store result */
- Irp->IoStatus.Information = (ULONG_PTR)DeviceRelation;
-
- /* done */
- Status = STATUS_SUCCESS;
- }
- else
- {
- /* no memory */
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_CAPABILITIES)
- {
- /* query capabilities */
- Status = HDA_PDOQueryBusDeviceCapabilities(Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
- {
- /* no op */
- Status = STATUS_SUCCESS;
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES)
- {
- /* no op */
- Status = STATUS_SUCCESS;
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_ID)
- {
- Status = HDA_PDOQueryId(DeviceObject, Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_DEVICE_TEXT)
- {
- Status = HDA_PDOHandleQueryDeviceText(Irp);
- }
- else if (IoStack->MinorFunction == IRP_MN_QUERY_INTERFACE)
- {
- Status = HDA_PDOHandleQueryInterface(DeviceObject, Irp);
- }
- else
- {
- /* get default status */
- Status = Irp->IoStatus.Status;
- }
+ return HDA_PdoPnp(DeviceObject, Irp);
}
-
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-
- return Status;
}
-//PDRIVER_ADD_DEVICE HDA_AddDevice;
-
NTSTATUS
NTAPI
HDA_AddDevice(
-IN PDRIVER_OBJECT DriverObject,
-IN PDEVICE_OBJECT PhysicalDeviceObject)
+ _In_ PDRIVER_OBJECT DriverObject,
+ _In_ PDEVICE_OBJECT PhysicalDeviceObject)
{
PDEVICE_OBJECT DeviceObject;
PHDA_FDO_DEVICE_EXTENSION DeviceExtension;
NTSTATUS
NTAPI
DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPathName)
+ _In_ PDRIVER_OBJECT DriverObject,
+ _In_ PUNICODE_STRING RegistryPathName)
{
DriverObject->DriverExtension->AddDevice = HDA_AddDevice;
DriverObject->MajorFunction[IRP_MJ_PNP] = HDA_Pnp;
return STATUS_SUCCESS;
}
-}
\ No newline at end of file
+}