/*++ Copyright (c) 2000 Microsoft Corporation Module Name: pnp.c Abstract: This module contains code to handle PnP and Power IRPs. Environment: Kernel mode Author: Michael Tsang (MikeTs) 20-Nov-2000 Revision History: --*/ #include "pch.h" #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, SmbLitePnp) #pragma alloc_text(PAGE, SmbLitePower) #endif /*++ @doc EXTERNAL @func NTSTATUS | SmbLitePnp | Plug and Play dispatch routine for this driver. @parm IN PDEVICE_OBJECT | DevObj | Pointer to the device object. @parm IN PIRP | Irp | Pointer to an I/O request packet. @rvalue SUCCESS | returns STATUS_SUCCESS @rvalue FAILURE | returns NT status code --*/ NTSTATUS EXTERNAL SmbLitePnp( IN PDEVICE_OBJECT DevObj, IN PIRP Irp ) { PROCNAME("SmbLitePnp") NTSTATUS status; PIO_STACK_LOCATION irpsp; PSMBLITE_DEVEXT devext; PAGED_CODE(); irpsp = IoGetCurrentIrpStackLocation(Irp); ENTER(1, ("(DevObj=%p,Irp=%p,IrpSp=%p,Minor=%s)\n", DevObj, Irp, irpsp, LookupName(irpsp->MinorFunction, PnPMinorFnNames))); devext = DevObj->DeviceExtension; status = IoAcquireRemoveLock(&devext->RemoveLock, Irp); if (NT_SUCCESS(status)) { status = STATUS_NOT_SUPPORTED; switch (irpsp->MinorFunction) { case IRP_MN_QUERY_CAPABILITIES: { PDEVICE_CAPABILITIES DevCap; DevCap = irpsp->Parameters.DeviceCapabilities.Capabilities; // // Set size and version. // DevCap->Size = sizeof(DEVICE_CAPABILITIES); DevCap->Version = 1; // // Set capability bits. // DevCap->LockSupported = FALSE; DevCap->EjectSupported = FALSE; DevCap->Removable = FALSE; DevCap->DockDevice = FALSE; DevCap->UniqueID = TRUE; DevCap->SilentInstall = TRUE; DevCap->RawDeviceOK = FALSE; DevCap->Address = 0xffffffff; DevCap->UINumber = 0xffffffff; DevCap->SystemWake = PowerSystemUnspecified; DevCap->DeviceWake = PowerSystemUnspecified; DevCap->D1Latency = 0; DevCap->D2Latency = 0; DevCap->D3Latency = 0; status = STATUS_SUCCESS; break; } case IRP_MN_START_DEVICE: ASSERT(!(devext->dwfSmbLite & SMBLITEF_DEVICE_STARTED)); devext->dwfSmbLite |= SMBLITEF_DEVICE_STARTED; status = STATUS_SUCCESS; break; case IRP_MN_STOP_DEVICE: if (devext->dwfSmbLite & SMBLITEF_DEVICE_STARTED) { devext->dwfSmbLite &= ~SMBLITEF_DEVICE_STARTED; } status = STATUS_SUCCESS; break; case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_CANCEL_REMOVE_DEVICE: status = STATUS_SUCCESS; break; case IRP_MN_SURPRISE_REMOVAL: // // This should never happen because the backlight is // non-removable. // ASSERT(FALSE); status = STATUS_SUCCESS; case IRP_MN_REMOVE_DEVICE: devext->dwfSmbLite &= ~SMBLITEF_DEVICE_STARTED; devext->dwfSmbLite |= SMBLITEF_DEVICE_REMOVED; IoReleaseRemoveLockAndWait(&devext->RemoveLock, Irp); RemoveDevice(devext); status = STATUS_SUCCESS; break; } if (irpsp->MinorFunction != IRP_MN_REMOVE_DEVICE) { IoReleaseRemoveLock(&devext->RemoveLock, Irp); } } if (status != STATUS_NOT_SUPPORTED) { // // Only set status if we have something to add. // Irp->IoStatus.Status = status; } if (NT_SUCCESS(status) || (status == STATUS_NOT_SUPPORTED)) { // // Forward the request to lower drivers. // IoSkipCurrentIrpStackLocation(Irp); ENTER(2, (".IoCallDriver(DevObj=%p,Irp=%p)\n", devext->LowerDevice, Irp)); status = IoCallDriver(devext->LowerDevice, Irp); EXIT(2, (".IoCallDriver=%x\n", status)); } else { IoCompleteRequest(Irp, IO_NO_INCREMENT); } EXIT(1, ("=%x\n", status)); return status; } //SmbLitePnp /*++ @doc EXTERNAL @func NTSTATUS | SmbLitePower | The power dispatch routine for this driver. @parm IN PDEVICE_OBJECT | DevObj | Points to the device object. @parm IN PIRP | Irp | Points to an I/O request packet. @rvalue SUCCESS | returns STATUS_SUCCESS @rvalue FAILURE | returns NT status code --*/ NTSTATUS EXTERNAL SmbLitePower( IN PDEVICE_OBJECT DevObj, IN PIRP Irp ) { PROCNAME("SmbLitePower") NTSTATUS status = STATUS_NOT_SUPPORTED; PSMBLITE_DEVEXT devext = DevObj->DeviceExtension; PAGED_CODE(); ENTER(1, ("(DevObj=%p,Irp=%p,Minor=%s)\n", DevObj, Irp, LookupName(IoGetCurrentIrpStackLocation(Irp)->MinorFunction, PowerMinorFnNames))); PoStartNextPowerIrp(Irp); if (NT_SUCCESS(status) || (status == STATUS_NOT_SUPPORTED)) { // // Forward the request to lower drivers. // IoSkipCurrentIrpStackLocation(Irp); ENTER(2, (".PoCallDriver(DevObj=%p,Irp=%p)\n", devext->LowerDevice, Irp)); status = PoCallDriver(devext->LowerDevice, Irp); EXIT(2, (".PoCallDriver=%x\n", status)); } else { IoCompleteRequest(Irp, IO_NO_INCREMENT); } EXIT(1, ("=%x\n", status)); return status; } //SmbLitePower