/*++ Copyright (c) 1999-2000 Microsoft Corporation Module Name: dispatch.c Abstract: This module contains the PNP, IOCTL, and Power dispatch routines for softpci.sys Author: Nicholas Owens (nichow) 11-Mar-1999 Revision History: --*/ #include "pch.h" #ifdef ALLOC_PRAGMA #pragma alloc_text (PAGE, SoftPCIDispatchPnP) #pragma alloc_text (PAGE, SoftPCIDispatchPower) #pragma alloc_text (PAGE, SoftPCIDispatchDeviceControl) #endif #define MAX_PNP_IRP_SUPPORTED 0x18 PDRIVER_DISPATCH SoftPciFilterPnPDispatchTable[] = { SoftPCIFilterStartDevice, // IRP_MN_START_DEVICE 0x00 SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_REMOVE_DEVICE 0x01 SoftPCIIrpRemoveDevice, // IRP_MN_REMOVE_DEVICE 0x02 SoftPCIPassIrpDownSuccess, // IRP_MN_CANCEL_REMOVE_DEVICE 0x03 SoftPCIPassIrpDownSuccess, // IRP_MN_STOP_DEVICE 0x04 SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_STOP_DEVICE 0x05 SoftPCIPassIrpDownSuccess, // IRP_MN_CANCEL_STOP_DEVICE 0x06 SoftPCIPassIrpDown, // IRP_MN_QUERY_DEVICE_RELATIONS 0x07 SoftPCIFilterQueryInterface, // IRP_MN_QUERY_INTERFACE 0x08 SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_CAPABILITIES 0x09 SoftPCIPassIrpDown, // IRP_MN_QUERY_RESOURCES 0x0A SoftPCIPassIrpDown, // IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B SoftPCIPassIrpDown, // IRP_MN_QUERY_DEVICE_TEXT 0x0C SoftPCIPassIrpDown, // IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D SoftPCIPassIrpDown, // IRP_MN_IRP_UNKNOWN 0x0E SoftPCIPassIrpDown, // IRP_MN_READ_CONFIG 0x0F SoftPCIPassIrpDown, // IRP_MN_WRITE_CONFIG 0x10 SoftPCIPassIrpDown, // IRP_MN_EJECT 0x11 SoftPCIPassIrpDown, // IRP_MN_SET_LOCK 0x12 SoftPCIPassIrpDown, // IRP_MN_QUERY_ID 0x13 SoftPCIPassIrpDown, // IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 SoftPCIPassIrpDown, // IRP_MN_QUERY_BUS_INFORMATION 0x15 SoftPCIPassIrpDown, // IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 SoftPCIPassIrpDownSuccess, // IRP_MN_SURPRISE_REMOVAL 0x17 SoftPCIPassIrpDown, // IRP_MN_QUERY_LEGACY_BUS_REQUIREMENTS0x18 }; PDRIVER_DISPATCH SoftPciFdoPnPDispatchTable[] = { #ifdef SIMULATE_MSI SoftPCI_FdoStartDevice, // IRP_MN_START_DEVICE 0x00 #else SoftPCIPassIrpDownSuccess, // IRP_MN_START_DEVICE 0x00 #endif SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_REMOVE_DEVICE 0x01 SoftPCIIrpRemoveDevice, // IRP_MN_REMOVE_DEVICE 0x02 SoftPCIPassIrpDownSuccess, // IRP_MN_CANCEL_REMOVE_DEVICE 0x03 SoftPCIPassIrpDownSuccess, // IRP_MN_STOP_DEVICE 0x04 SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_STOP_DEVICE 0x05 SoftPCIPassIrpDownSuccess, // IRP_MN_CANCEL_STOP_DEVICE 0x06 SoftPCIPassIrpDown, // IRP_MN_QUERY_DEVICE_RELATIONS 0x07 SoftPCIPassIrpDown, // IRP_MN_QUERY_INTERFACE 0x08 SoftPCIPassIrpDownSuccess, // IRP_MN_QUERY_CAPABILITIES 0x09 SoftPCIPassIrpDown, // IRP_MN_QUERY_RESOURCES 0x0A SoftPCIPassIrpDown, // IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B SoftPCIPassIrpDown, // IRP_MN_QUERY_DEVICE_TEXT 0x0C SoftPCI_FdoFilterRequirements, // IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D SoftPCIPassIrpDown, // IRP_MN_IRP_UNKNOWN 0x0E SoftPCIPassIrpDown, // IRP_MN_READ_CONFIG 0x0F SoftPCIPassIrpDown, // IRP_MN_WRITE_CONFIG 0x10 SoftPCIPassIrpDown, // IRP_MN_EJECT 0x11 SoftPCIPassIrpDown, // IRP_MN_SET_LOCK 0x12 SoftPCIPassIrpDown, // IRP_MN_QUERY_ID 0x13 SoftPCIPassIrpDown, // IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 SoftPCIPassIrpDown, // IRP_MN_QUERY_BUS_INFORMATION 0x15 SoftPCIPassIrpDown, // IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 SoftPCIPassIrpDownSuccess, // IRP_MN_SURPRISE_REMOVAL 0x17 SoftPCIPassIrpDown, // IRP_MN_QUERY_LEGACY_BUS_REQUIREMENTS0x18 }; PDRIVER_DISPATCH SoftPciIOCTLDispatchTable[] = { SoftPCIIoctlAddDevice, // SOFTPCI_IOCTL_CREATE_DEVICE SoftPCIIoctlRemoveDevice, // SOFTPCI_IOCTL_WRITE_DELETE_DEVICE SoftPCIIoctlGetDevice, // SOFTPCI_IOCTL_GET_DEVICE SoftPCIIocltReadWriteConfig, // SOFTPCI_IOCTL_RW_CONFIG SoftPCIIoctlGetDeviceCount // SOFTPCI_IOCTL_GET_DEVICE_COUNT }; NTSTATUS SoftPCIDispatchPnP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ Routine Description: Dispatches PnP Irps for FDO and FilterDOs Arguments: DeviceObject - pointer to the device object. Irp - PnP Irp to be dispatched. Return Value: NTSTATUS. --*/ { NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION irpSp; PSOFTPCI_DEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension; irpSp = IoGetCurrentIrpStackLocation(Irp); // // Call the appropriate minor Irp Code handler. // if (irpSp->MinorFunction <= MAX_PNP_IRP_SUPPORTED) { if (deviceExtension->FilterDevObj) { status = SoftPciFilterPnPDispatchTable[irpSp->MinorFunction](DeviceObject, Irp ); } else { status = SoftPciFdoPnPDispatchTable[irpSp->MinorFunction](DeviceObject, Irp ); } } else { status = SoftPCIPassIrpDown(DeviceObject, Irp); } return status; } NTSTATUS SoftPCIDispatchPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ Routine Description: Dispatches Power IRPs Arguments: DeviceObject - pointer to the device object. Irp - PnP Irp to be dispatched. Return Value: NTSTATUS. --*/ { PSOFTPCI_DEVICE_EXTENSION devExt = (PSOFTPCI_DEVICE_EXTENSION) DeviceObject->DeviceExtension; if (devExt->FilterDevObj) { // // If this is our FilterDO just pass the IRP on down // return SoftPCIDefaultPowerHandler(DeviceObject, Irp); }else{ // // Otherwise lets pretend to power manage our device // return SoftPCIFDOPowerHandler(DeviceObject, Irp); } } NTSTATUS SoftPCIDispatchDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ Routine Description: Dispatches IOCTLS for FilterDOs. Arguments: DeviceObject - pointer to the device object. Irp - PnP Irp to be dispatched. Return Value: NTSTATUS. --*/ { NTSTATUS status = STATUS_SUCCESS; ULONG ioControlCode = IoGetCurrentIrpStackLocation(Irp)-> Parameters.DeviceIoControl.IoControlCode; // // Make sure it is our IOCTL Type // if ((DEVICE_TYPE_FROM_CTL_CODE(ioControlCode)) == SOFTPCI_IOCTL_TYPE) { // // Make sure it is an IOCTL function we support // if (SOFTPCI_IOCTL(ioControlCode) <= MAX_IOCTL_CODE_SUPPORTED) { // // Dispatch Device Control IOCTL // status = SoftPciIOCTLDispatchTable[SOFTPCI_IOCTL(ioControlCode)](DeviceObject, Irp ); // // Set Status of Irp and complete it // Irp->IoStatus.Status = status; // // Complete the Irp. // IoCompleteRequest(Irp, IO_NO_INCREMENT); }else{ // // We dont support this IOCTL function so fail and complete. // status = STATUS_NOT_SUPPORTED; Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } } else { status = SoftPCIPassIrpDown(DeviceObject, Irp); } return status; }