NTSTATUS Serenum_Power ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ --*/ { PIO_STACK_LOCATION irpStack; NTSTATUS status; PCOMMON_DEVICE_DATA commonData; status = STATUS_SUCCESS; irpStack = IoGetCurrentIrpStackLocation (Irp); ASSERT (IRP_MJ_POWER == irpStack->MajorFunction); commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension; if (commonData->IsFDO) { status = Serenum_FDO_Power ((PFDO_DEVICE_DATA) DeviceObject->DeviceExtension, Irp); } else { status = Serenum_PDO_Power ((PPDO_DEVICE_DATA) DeviceObject->DeviceExtension, Irp); } return status; }
NTSTATUS Serenum_Power ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ --*/ { #if DBG PIO_STACK_LOCATION irpStack; #endif NTSTATUS status; PCOMMON_DEVICE_DATA commonData; commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension; status=IoAcquireRemoveLock(&commonData->RemoveLock,Irp); if(!NT_SUCCESS(status)){ Irp->IoStatus.Information=0; Irp->IoStatus.Status=status; IoCompleteRequest(Irp,IO_NO_INCREMENT); // The Device Object has been removed //PoStartNextPowerIrp(Irp); return status; } #if DBG irpStack = IoGetCurrentIrpStackLocation (Irp); ASSERT (IRP_MJ_POWER == irpStack->MajorFunction); #endif if (commonData->IsFDO) { status = Serenum_FDO_Power ((PFDO_DEVICE_DATA) DeviceObject->DeviceExtension, Irp); } else { status = Serenum_PDO_Power ((PPDO_DEVICE_DATA) DeviceObject->DeviceExtension, Irp); } return status; }