36 #include "pnppower.tmh" 63 #pragma alloc_text(PAGE, DevicePowerSettingCallback) 68 #pragma warning(disable:4152) // nonstandard extension, function/data pointer conversion in expression 70 #pragma warning(disable:28118) // Dispatch routines for IRP_MJ_SHUTDOWN, IRP_MJ_FLUSH_BUFFERS occur at PASSIVE_LEVEL. 191 IrpMarkedPending =
TRUE;
198 #pragma warning(push) 199 #pragma warning(disable: 28193) // OACR will complain that the status variable is not examined. 207 if (IrpMarkedPending)
240 ULONG transferSize = 0;
281 ULONG transferSize = 0;
293 status = ScratchBuffer_ExecuteCdb(DeviceExtension,
NULL, transferSize,
FALSE, &cdb, 6);
326 ULONG transferSize = 0;
328 ULONG timesAlreadyRetried = 0;
339 ScratchBuffer_SetupSrb(DeviceExtension,
NULL, transferSize,
FALSE);
366 status = WdfRequestGetStatus(DeviceExtension->ScratchContext.ScratchRequest);
393 PowerContextEndUse(deviceExtension);
430 if (
Irp->PendingReturned)
447 (
VOID)DeviceSendPowerDownProcessRequest(deviceExtension,
458 PowerContextEndUse(deviceExtension);
467 PowerContextReuseRequest(
490 RtlZeroMemory(&(DeviceExtension->PowerContext.SenseData),
sizeof(DeviceExtension->PowerContext.SenseData));
491 RtlZeroMemory(&(DeviceExtension->PowerContext.Srb),
sizeof(DeviceExtension->PowerContext.Srb));
493 irp = WdfRequestWdmGetIrp(DeviceExtension->PowerContext.PowerRequest);
497 status = WdfRequestReuse(DeviceExtension->PowerContext.PowerRequest, &reuseParams);
501 status = WdfIoTargetFormatRequestForInternalIoctlOthers(DeviceExtension->IoTarget,
502 DeviceExtension->PowerContext.PowerRequest,
511 "PowerContextReuseRequest: WdfIoTargetFormatRequestForInternalIoctlOthers failed, %!STATUS!\n",
525 nextStack->
Parameters.Scsi.Srb = &(DeviceExtension->PowerContext.Srb);
528 DeviceExtension->PowerContext.Srb.OriginalRequest =
irp;
530 DeviceExtension->PowerContext.Srb.SenseInfoBuffer = &(DeviceExtension->PowerContext.SenseData);
539 PowerContextBeginUse(
560 NT_ASSERT(!DeviceExtension->PowerContext.InUse);
562 DeviceExtension->PowerContext.InUse =
TRUE;
564 DeviceExtension->PowerContext.RetryIntervalIn100ns = 0;
568 RtlZeroMemory(&(DeviceExtension->PowerContext.Options),
sizeof(DeviceExtension->PowerContext.Options));
569 RtlZeroMemory(&(DeviceExtension->PowerContext.PowerChangeState),
sizeof(DeviceExtension->PowerContext.PowerChangeState));
571 status = PowerContextReuseRequest(DeviceExtension);
599 NT_ASSERT(DeviceExtension->PowerContext.InUse);
601 DeviceExtension->PowerContext.InUse =
FALSE;
673 DeviceMarkActive(DeviceExtension,
FALSE,
TRUE);
679 DeviceMarkActive(DeviceExtension,
TRUE,
TRUE);
688 #pragma warning(pop) // un-sets any local warning changes
return STATUS_NOT_SUPPORTED
#define SCSIOP_SYNCHRONIZE_CACHE
FORCEINLINE VOID ScratchBuffer_EndUse(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension)
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
struct _CDB::_MEDIA_REMOVAL MEDIA_REMOVAL
#define STATUS_MORE_PROCESSING_REQUIRED
#define UNREFERENCED_PARAMETER(P)
struct _CDB::_SYNCHRONIZE_CACHE10 SYNCHRONIZE_CACHE10
NTSTATUS NTAPI RequestProcessShutdownFlush(WDFDEVICE Device, PIRP Irp)
#define STATUS_CONTINUE_COMPLETION
#define _In_reads_opt_(size)
#define SENSE_BUFFER_SIZE
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
_Function_class_(POWER_SETTING_CALLBACK)
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
_In_ PDEVICE_OBJECT DeviceObject
#define _Analysis_assume_(expr)
#define ScratchBuffer_BeginUse(context)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS DeviceScratchSyncCache(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension)
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
VOID RequestClearSendTime(_In_ WDFREQUEST Request)
#define IoCompleteRequest
#define _IRQL_requires_same_
#define CLEAR_FLAG(Flags, Bit)
VOID NTAPI KeQueryTickCount(IN PLARGE_INTEGER TickCount)
_IRQL_requires_max_(DISPATCH_LEVEL)
#define SRB_FUNCTION_FLUSH
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
NTSTATUS NTAPI RequestProcessSetPower(WDFDEVICE Device, PIRP Irp)
#define NT_SUCCESS(StatCode)
#define SRB_FLAGS_NO_KEEP_AWAKE
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
FORCEINLINE ULONG TimeOutValueGetCapValue(_In_ ULONG TimeOutValue, _In_ ULONG Times)
BOOLEAN RequestSenseInfoInterpretForScratchBuffer(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ ULONG RetriedCount, _Out_ NTSTATUS *Status, _Out_ _Deref_out_range_(0, MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) LONGLONG *RetryIntervalIn100ns)
#define SCSIOP_MEDIUM_REMOVAL
enum _MONITOR_DISPLAY_STATE MONITOR_DISPLAY_STATE
_Must_inspect_result_ _In_ WDFDEVICE Device
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IOCTL_SCSI_EXECUTE_IN
#define TRACE_LEVEL_ERROR
NTSTATUS DeviceScratchPreventMediaRemoval(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN Prevent)
WDFWAITLOCK ShutdownFlushWaitLock
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define SRB_FUNCTION_SHUTDOWN
IO_COMPLETION_ROUTINE RequestProcessPowerIrpCompletion
union _CDROM_POWER_CONTEXT::@1003 PowerChangeState
CDROM_POWER_DOWN_STATE PowerDown
#define SRB_SIMPLE_TAG_REQUEST
POWER_SETTING_CALLBACK DevicePowerSettingCallback
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
#define IoSkipCurrentIrpStackLocation(Irp)
EVT_WDF_REQUEST_COMPLETION_ROUTINE RequestUnlockQueueCompletion
CDROM_POWER_OPTIONS Options
struct tagContext Context
#define RtlZeroMemory(Destination, Length)
PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
static SERVICE_STATUS status
NTSTATUS ScratchBuffer_SendSrb(_Inout_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ BOOLEAN SynchronousSrb, _When_(SynchronousSrb, _Pre_null_) _When_(!SynchronousSrb, _In_opt_) PSRB_HISTORY_ITEM *SrbHistoryItem)
#define SET_FLAG(Flags, Bit)
NTSTATUS RequestIssueShutdownFlush(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ PIRP Irp)
CDROM_POWER_CONTEXT PowerContext
_Must_inspect_result_ FORCEINLINE NTSTATUS WdfWaitLockAcquire(_In_ _Requires_lock_not_held_(_Curr_) WDFWAITLOCK Lock, _In_opt_ PLONGLONG Timeout)
#define _In_reads_bytes_(size)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength