windows-nt/Source/XPSP1/NT/drivers/wdm/input/tabletpc/smblite/pnp.c
2020-09-26 16:20:57 +08:00

216 lines
6 KiB
C

/*++
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