28 #include "autorun.tmh" 31 #define GESN_TIMEOUT_VALUE (0x4) 32 #define GESN_BUFFER_SIZE (0x8) 33 #define GESN_DEVICE_BUSY_LOWER_THRESHOLD_100_MS (2) 35 #define MAXIMUM_IMMEDIATE_MCN_RETRIES (0x20) 36 #define MCN_REG_SUBKEY_NAME (L"MediaChangeNotification") 37 #define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME (L"AlwaysDisableMCN") 38 #define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME (L"AlwaysEnableMCN") 66 (fdoExtension->PowerDownInProgress ==
FALSE) &&
120 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 129 #define TICK_TIMER_PERIOD_IN_MSEC 1000 130 #define TICK_TIMER_DELAY_IN_MSEC 1000 134 #pragma alloc_text(PAGE, ClassInitializeMediaChangeDetection) 135 #pragma alloc_text(PAGE, ClassEnableMediaChangeDetection) 136 #pragma alloc_text(PAGE, ClassDisableMediaChangeDetection) 137 #pragma alloc_text(PAGE, ClassCleanupMediaChangeDetection) 138 #pragma alloc_text(PAGE, ClasspMediaChangeRegistryCallBack) 139 #pragma alloc_text(PAGE, ClasspInitializePolling) 140 #pragma alloc_text(PAGE, ClasspDisableGesn) 142 #pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledDueToHardwareLimitation) 143 #pragma alloc_text(PAGE, ClasspMediaChangeDeviceInstanceOverride) 144 #pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledForClass) 146 #pragma alloc_text(PAGE, ClassSetFailurePredictionPoll) 148 #pragma alloc_text(PAGE, ClasspInitializeGesn) 149 #pragma alloc_text(PAGE, ClasspMcnControl) 181 &GUID_IO_MEDIA_EJECT_REQUEST,
191 ClassSendNotification(
209 "Error sending event: size too large! (%x)\n",
325 *ResendImmediately =
FALSE;
343 if (
info->Gesn.HackEventMask) {
352 UCHAR thisEventBit = (1 <<
Header->NotificationClass);
367 lowestSetBit =
info->Gesn.EventMask;
368 lowestSetBit &= (
info->Gesn.EventMask - 1);
369 lowestSetBit ^= (
info->Gesn.EventMask);
371 if (thisEventBit != lowestSetBit) {
382 "Classpnp => GESN::NONE: Compliant drive found, " 383 "removing GESN hack (%x, %x)\n",
384 thisEventBit,
info->Gesn.EventMask));
388 }
else if (thisEvent == 0) {
407 if (
info->Gesn.EventMask == 0) {
408 info->Gesn.EventMask =
info->Gesn.NoChangeEventMask;
409 info->Gesn.NoChangeEventMask = 0;
411 *ResendImmediately =
TRUE;
419 (
Header->EventDataLength[0] << 8) |
420 (
Header->EventDataLength[1] & 0xff);
426 "Classpnp => GESN returned only %x bytes data for fdo %p\n",
433 "Classpnp => GESN returned too many (%x) bytes data for fdo %p\n",
440 if ((
Header->ClassEventData[0] & 0xf) == 0)
448 *ResendImmediately =
TRUE;
460 switch (
Header->NotificationClass) {
472 event = (opChangeInfo->
Operation[0] << 8) |
480 if (
info->MediaChangeRetryCount >= 4) {
494 static UCHAR const OpChangeMask = 0x02;
501 "Classpnp => GESN OpChange events are broken. Working around this " 502 "problem in software (for fdo %p)\n",
522 if (
info->Gesn.EventMask == 0) {
523 info->Gesn.EventMask =
info->Gesn.NoChangeEventMask;
524 info->Gesn.NoChangeEventMask = 0;
525 *ResendImmediately =
FALSE;
527 *ResendImmediately =
TRUE;
538 "Classpnp => GESN says features added/changedfor fdo %p\n",
584 if ((
FdoExtension->CommonExtension.DriverExtension->SrbSupport &
587 #pragma prefast(suppress:26015, "InitializeStorageRequestBlock ensures buffer access is bounded") 647 "Classpnp => GESN::EXTERNAL: Event: %x Status %x Req %x\n",
656 (externalInfo->
Request[0] << 8) |
657 (externalInfo->
Request[1] & 0xff);
661 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_MCN,
"ClasspInterpretGesnData: media DEVICE_EXTERNAL_REQUEST"));
663 &GUID_IO_DEVICE_EXTERNAL_REQUEST,
675 "Classpnp => GESN::MEDIA: Event: %x Status %x\n",
707 "Classpnp => GESN Ejection request received!\n"));
727 *ResendImmediately =
FALSE;
736 (busyInfo->
Time[1] & 0xff);
739 "Classpnp => GESN::BUSY: Event: %x Status %x Time %x\n",
754 &GUID_IO_DEVICE_BECOMING_READY,
805 PCSZ states[] = {
"Unknown",
"Present",
"Not Present",
"Unavailable"};
821 (
PLONG)(&
info->MediaChangeDetectionState),
824 if((oldMediaState ==
MediaUnknown) && (!KnownStateChange)) {
832 "ClassSetMediaChangeState: State was unknown - this may " 833 "not be a change\n"));
836 }
else if(oldMediaState == NewState) {
864 if(
info->MediaChangeDetectionDisableCount != 0) {
867 "ClassSetMediaChangeState: MCN not enabled, state " 868 "changed from %s to %s\n",
869 states[oldMediaState], states[NewState]));
876 "ClassSetMediaChangeState: State change from %s to %s\n",
877 states[oldMediaState], states[NewState]));
890 &GUID_IO_MEDIA_ARRIVAL,
899 &GUID_IO_MEDIA_REMOVAL,
948 #pragma prefast(suppress:26165, "The mutex won't be acquired in the case of a timeout.") 995 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_MCN,
"ClasspSetMediaChangeStateEx - timed out waiting for mutex"));
1015 ClassSetMediaChangeState(
1072 fdoData = fdoExtension->PrivateFdoData;
1104 validSense = ScsiGetSenseKeyAndCodes(senseData,
1105 senseInfoBufferLength,
1126 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_MCN,
"ClasspMediaChangeDetectionCompletion - failed - srb status=%s, sense=%s/%s/%s.",
1142 if (!
info->Gesn.Supported) {
1144 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_MCN,
"ClasspMediaChangeDetectionCompletion - succeeded and GESN NOT supported, setting MediaPresent."));
1154 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_MCN,
"ClasspMediaChangeDetectionCompletion - succeeded (GESN supported)."));
1158 if (
info->Gesn.Supported) {
1174 if (
Irp->IoStatus.Information == 8 ) {
1209 if (retryImmediately) {
1211 info->MediaChangeRetryCount++;
1230 info->Gesn.Supported = 0;
1231 info->Gesn.EventMask = 0;
1232 info->Gesn.BufferSize = 0;
1233 info->MediaChangeRetryCount = 0;
1234 retryImmediately =
FALSE;
1239 info->MediaChangeRetryCount = 0;
1249 UCHAR uniqueValue = 0;
1259 volatile LONG irpWasInUse;
1261 #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. 1273 if (retryImmediately) {
1277 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_MCN,
"ClasspMediaChangeDetectionCompletion - not retrying immediately"));
1287 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_MCN,
"< ClasspMediaChangeDetectionCompletion"));
1329 ULONG dataTransferLength;
1403 if (timeOutValue == 0) {
1408 "ClassSendTestUnitIrp: FdoExtension->TimeOutValue " 1409 "is set to zero?! -- resetting to 10\n"));
1410 timeOutValue = 10 * 2;
1415 "ClassSendTestUnitIrp: Someone set " 1416 "srb->TimeOutValue to zero?! -- resetting to %x\n",
1441 dataTransferLength = 0;
1447 irp->MdlAddress =
Info->Gesn.Mdl;
1452 dataTransferLength =
Info->Gesn.BufferSize;
1478 srbEx->SrbStatus = 0;
1479 srbEx->OriginalRequest =
irp;
1480 srbEx->SrbFlags = srbFlags;
1481 srbEx->TimeOutValue = timeOutValue;
1483 srbEx->DataTransferLength = dataTransferLength;
1525 (
UCHAR)((
Info->Gesn.BufferSize) & 0xff);
1527 Info->Gesn.EventMask;
1573 (!
Info->MediaChangeIrpLost)) {
1582 Info->MediaChangeIrpTimeInUse = 0;
1597 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_MCN,
"ClasspSendMediaStateIrp: irp in use for " 1598 "%x seconds when synchronizing for MCD\n", timeInUse));
1600 if (
Info->MediaChangeIrpLost ==
FALSE) {
1610 "CdRom%d: Media Change Notification has lost " 1611 "it's irp and doesn't know where to find it. " 1612 "Leave it alone and it'll come home dragging " 1613 "it's stack behind it.\n",
1619 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_MCN,
"< ClasspSendMediaStateIrp - irpInUse"));
1626 if (
Info->MediaChangeDetectionDisableCount != 0) {
1628 " detection disabled \n",
FdoExtension->DeviceObject));
1654 "ClassCheckMediaState: device %p needs to powerup " 1655 "to handle this io (may take a few extra seconds).\n",
1659 Info->MediaChangeIrpTimeInUse = 0;
1662 if (CountDown == 0) {
1667 "ClassCheckMediaState: timer expired\n"));
1669 if (
Info->MediaChangeDetectionDisableCount != 0) {
1671 "ClassCheckMediaState: detection disabled\n"));
1681 Info->Gesn.Supported);
1688 "ClasspSendMediaStateIrp: Device %p getting TUR " 1705 requestPending =
TRUE;
1707 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_MCN,
" ClasspSendMediaStateIrp - calling IoCallDriver."));
1713 if(requestPending ==
FALSE) {
1716 #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. 1761 "ClassCheckMediaState: detection not enabled\n"));
1860 FdoExtension->KernelModeMcnContext.McnDisableCount = 0;
1875 NonPagedPoolNxCacheAligned,
1891 info->MediaChangeDetectionDisableCount = 0;
1900 info->MediaChangeIrpTimeInUse = 0;
1935 "ClasspInitializePolling: Testing for GESN\n"));
1939 "ClasspInitializePolling: GESN available " 1945 GesnSupported =
TRUE;
1948 "ClasspInitializePolling: GESN *NOT* available " 1953 if (GesnSupported ==
FALSE) {
1958 info->Gesn.Supported = 0;
1967 &GUID_CONSOLE_DISPLAY_STATE,
2016 (
PULONG)&detectionState);
2065 Info->Gesn.EventMask = 0;
2080 retryImmediately =
TRUE;
2081 for (
i = 0;
i < 16 && retryImmediately ==
TRUE;
i++) {
2090 srbFlags =
Info->MediaChangeSrb.SrbEx.SrbFlags;
2092 srbFlags =
Info->MediaChangeSrb.Srb.SrbFlags;
2122 &(
Info->MediaChangeSrb.Srb),
2145 if (atapiResets >= 4) {
2171 "Classpnp => GESN test failed %x for fdo %p\n",
2186 "Classpnp => GESN test failed %x for fdo %p\n",
2201 "Classpnp => Fdo %p supports event mask %x\n",
2208 "Classpnp => GESN supports MCN\n"));
2213 "Classpnp => GESN supports DeviceBusy\n"));
2221 "Classpnp => GESN supports OpChange, but " 2222 "must ignore these events for compatibility\n"));
2227 "Classpnp => GESN supports OpChange\n"));
2230 Info->Gesn.EventMask =
header->SupportedEventClasses;
2241 Info->Gesn.EventMask &=
2261 if (
Info->Gesn.EventMask == 0) {
2264 "Classpnp => GESN supported, but not mask we care " 2265 "about (%x) for FDO %p\n",
2266 header->SupportedEventClasses,
2273 "Classpnp => GESN hack not required for FDO %p\n",
2279 "Classpnp => GESN hack enabled for FDO %p\n",
2281 Info->Gesn.HackEventMask = 1;
2327 "Classpnp => Enabling GESN support for fdo %p\n",
2341 "Classpnp => GESN available but not enabled for fdo %p\n",
2349 "Classpnp => GESN support detection failed for fdo %p with status %08x\n",
2353 if (
Info->Gesn.Mdl) {
2358 Info->Gesn.Supported = 0;
2359 Info->Gesn.EventMask = 0;
2360 Info->Gesn.BufferSize = 0;
2386 ClassSetDeviceParameter(fdoExtension,
2421 ClassInitializeTestUnitPolling(
2457 ClassInitializeMediaChangeDetection(
2468 BOOLEAN disabledForBadHardware;
2488 if (disabledForBadHardware) {
2490 "ClassInitializeMCN: Disabled due to hardware" 2491 "limitations for this device"));
2505 "ClassInitializeMCN: Class MCN is %s\n",
2506 (disabled ?
"disabled" :
"enabled")));
2514 "ClassInitializeMCN: Instance using default\n"));
2517 "ClassInitializeMCN: Instance override: %s MCN\n",
2518 (instanceOverride ?
"Enabling" :
"Disabling")));
2519 disabled = !instanceOverride;
2523 "ClassInitializeMCN: Instance MCN is %s\n",
2524 (disabled ?
"disabled" :
"enabled")));
2585 &deviceParameterHandle
2594 "ClassMediaChangeDeviceInstanceDisabled: " 2595 "Could not open device registry key [%lx]\n",
status));
2603 deviceParameterHandle,
2606 status = ZwCreateKey(&driverParameterHandle,
2616 "ClassMediaChangeDeviceInstanceDisabled: " 2617 "subkey could not be created. %lx\n",
status));
2649 (
PWSTR)driverParameterHandle,
2657 if (driverParameterHandle)
ZwClose(driverParameterHandle);
2658 if (deviceParameterHandle)
ZwClose(deviceParameterHandle);
2662 if (alwaysEnable && alwaysDisable) {
2665 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2666 "Both Enable and Disable set -- DISABLE"));
2671 }
else if (alwaysDisable) {
2674 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2680 }
else if (alwaysEnable) {
2683 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2692 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2739 ULONG mediaChangeNotificationDisabled =
FALSE;
2756 status = ZwOpenKey(&serviceKey,
2797 if ((deviceDescriptor->VendorIdOffset == 0) &&
2798 (deviceDescriptor->ProductIdOffset == 0)) {
2804 if (deviceDescriptor->VendorIdOffset == 0) {
2807 vendorId = (
PUCHAR) deviceDescriptor + deviceDescriptor->VendorIdOffset;
2811 if ( deviceDescriptor->ProductIdOffset == 0 ) {
2814 productId = (
PUCHAR)deviceDescriptor + deviceDescriptor->ProductIdOffset;
2818 if ( deviceDescriptor->ProductRevisionOffset == 0 ) {
2821 revisionId = (
PUCHAR) deviceDescriptor + deviceDescriptor->ProductRevisionOffset;
2837 "ClassMediaChangeDisabledForHardware: Unable to alloc " 2838 "string buffer\n" ));
2847 if (vendorId !=
NULL) {
2854 if ( productId !=
NULL ) {
2860 if ( revisionId !=
NULL ) {
2870 #pragma warning(suppress:6386) // Not an issue as deviceString.Buffer is of size deviceString.MaximumLength, which is equal to (deviceString.Length + 1) 2884 "ClassMediaChangeDisabledForHardware: cannot convert " 2885 "to unicode %lx\n",
status));
2892 nullMultiSz =
L"\0";
2895 parameters[0].
Name =
L"AutoRunAlwaysDisable";
2896 parameters[0].
EntryContext = &mediaChangeNotificationDisabled;
2904 &deviceUnicodeString,
2921 if (mediaChangeNotificationDisabled) {
2923 "Device is on disable list\n"));
2972 ULONG mcnRegistryValue = 1;
2989 status = ZwOpenKey(&serviceKey,
3004 (mcnRegistryValue ?
"Enabled" :
"Disabled")));
3005 return (
BOOLEAN)(!mcnRegistryValue);
3021 status = ZwOpenKey(¶metersKey,
3026 parametersKey =
NULL;
3036 parameters[0].
Name =
L"Autorun";
3050 "<Service>/Autorun flag = %d\n", mcnRegistryValue));
3052 if(parametersKey !=
NULL) {
3061 "<Service>/Parameters/Autorun flag = %d\n",
3069 "Autoplay for device %p is %s\n",
3071 (mcnRegistryValue ?
"on" :
"off")
3079 return (
BOOLEAN)(!mcnRegistryValue);
3102 ClassEnableMediaChangeDetection(
3113 "ClassEnableMediaChangeDetection: not initialized\n"));
3123 oldCount = --
info->MediaChangeDetectionDisableCount;
3129 info->MediaChangeDetectionDisableCount));
3188 ClassDisableMediaChangeDetection(
3206 info->MediaChangeDetectionDisableCount++;
3209 "disable count is %d\n",
3210 info->MediaChangeDetectionDisableCount));
3235 ClassCleanupMediaChangeDetection(
3249 if (
info->Gesn.Mdl) {
3302 if(fileObject !=
NULL) {
3303 fsContext = ClassGetFsContext(commonExtension, fileObject);
3308 if (fsContext ==
NULL) {
3319 if(
request->PreventMediaRemoval) {
3412 if ((*valueFound) != 0) {
3419 "never be passed to registry call-back!\n"));
3454 (*valueFound) =
TRUE;
3460 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3467 KDPC dummyDpc = { 0 };
3530 #pragma warning(suppress:4054) // okay to type cast function pointer to PIRP for this use case 3555 (fdoExtension->FunctionSupportInfo->AsynchronousNotificationSupported ==
FALSE)) {
3577 if (countDown == 0) {
3584 info->WorkQueueItem =
3596 "item - try again in one minute\n"));
3607 info->WorkQueueItem);
3618 "Prediction work item is " 3619 "already active for device %p\n",
3646 #pragma warning(suppress:4054) // okay to type cast function pointer to PIRP for this use case 3651 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3687 if (fdoData !=
NULL &&
3705 FdoExtension->CommonExtension.DriverExtension->InitData.ClassTick ==
NULL &&
3771 if (fdoData ==
NULL) {
3776 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3822 if (fdoData !=
NULL) {
3823 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3826 ExInitializeDeleteTimerParameters(¶meters);
3867 if (fdoData !=
NULL) {
3882 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3901 FdoExtension->CommonExtension.DriverExtension->InitData.ClassTick ==
NULL &&
3926 KeSetCoalescableTimer(&fdoData->
TickTimer,
3928 &fdoData->TickTimerDpc);
3978 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 3990 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_MCN,
"ClasspDisableTimer: Timer never initialized\n"));
4059 if (fdoExtension->FunctionSupportInfo->IdlePower.IdlePowerEnabled) {
4060 activateStatus = ClasspPowerActivateDevice(
DeviceObject);
4128 ClassNotifyFailurePredicted(fdoExtension,
4130 sizeof(checkFailure),
4174 ClassNotifyFailurePredicted(
4209 if (logEntry !=
NULL)
4243 #pragma warning(suppress:4054) // okay to type cast function pointer as data pointer for this use case 4247 if ((driverExtension !=
NULL) && (driverExtension->
EtwHandle != 0)) {
4293 ClassSetFailurePredictionPoll(
4430 missedPeriod =
TRUE;
4433 return missedPeriod;
#define KeQuerySystemTime(t)
_In_ ULONG _In_ BOOLEAN _In_ ULONG UniqueErrorValue
#define NOTIFICATION_NO_CLASS_EVENTS
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
#define CLASS_DRIVER_EXTENSION_KEY
#define SRB_STATUS_BUS_RESET
#define TICK_TIMER_DELAY_IN_MSEC
return STATUS_NOT_SUPPORTED
struct _NOTIFICATION_OPERATIONAL_STATUS * PNOTIFICATION_OPERATIONAL_STATUS
FORCEINLINE UCHAR SrbGetSenseInfoBufferLength(_In_ PVOID Srb)
#define FDO_HACK_GESN_IGNORE_OPCHANGE
ULONG ScanForSpecialFlags
#define STATUS_INSUFFICIENT_RESOURCES
#define IOCTL_SCSI_GET_ADDRESS
#define ClassAcquireRemoveLock(devobj, tag)
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
#define SCSIOP_GET_EVENT_STATUS
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define _In_reads_bytes_(s)
VOID ClasspSetMediaChangeStateEx(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN Wait, IN BOOLEAN KnownStateChange)
#define KeWaitForMutexObject
#define OBJ_CASE_INSENSITIVE
VOID NTAPI IoReuseIrp(IN OUT PIRP Irp, IN NTSTATUS Status)
#define STATUS_DATA_OVERRUN
PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo
_In_ ULONG _In_ BOOLEAN LogError
#define STATUS_MORE_PROCESSING_REQUIRED
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
IO_COMPLETION_ROUTINE ClasspMediaChangeDetectionCompletion
ACPI_SIZE strlen(const char *String)
BOOLEAN InterpretSenseInfoWithoutHistory(_In_ PDEVICE_OBJECT Fdo, _In_opt_ PIRP OriginalRequest, _In_ PSCSI_REQUEST_BLOCK Srb, UCHAR MajorFunctionCode, ULONG IoDeviceCode, ULONG PreviousRetryCount, _Out_ NTSTATUS *Status, _Out_opt_ _Deref_out_range_(0, MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) LONGLONG *RetryIn100nsUnits)
_In_ const GUID _In_ ULONG ExtraDataSize
#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK
#define SRB_STATUS_AUTOSENSE_VALID
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR PathId
#define PLUGPLAY_REGKEY_DEVICE
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define UNREFERENCED_PARAMETER(P)
#define STATUS_INVALID_PARAMETER
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSTATUS InitializeStorageRequestBlock(_Inout_bytecount_(ByteSize) PSTORAGE_REQUEST_BLOCK Srb, _In_ USHORT AddressType, _In_ ULONG ByteSize, _In_ ULONG NumSrbExData,...)
_In_ WDFDPC _In_ BOOLEAN Wait
EXT_CALLBACK ClasspTimerTickEx
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR TargetId
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK
#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN
#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA
KDEFERRED_ROUTINE ClasspTimerTick
#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
IO_COMPLETION_ROUTINE ClassSignalCompletion
COMMON_DEVICE_EXTENSION CommonExtension
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
#define SCSIOP_TEST_UNIT_READY
ULONG NTAPI KeQueryTimeIncrement(VOID)
BOOLEAN LoggedTURFailureSinceLastIO
#define STATUS_INVALID_DEVICE_REQUEST
#define InterlockedCompareExchange
#define FDO_HACK_GESN_IS_BAD
static BOOLEAN ClasspCanSendPollingIrp(_In_ PFUNCTIONAL_DEVICE_EXTENSION fdoExtension)
#define DBGGETSENSECODESTR(_pSrb)
_In_opt_ PVOID _In_ ULONG bufferLength
#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED
#define SCSI_ADSENSE_LUN_NOT_READY
#define CLASS_TAG_FAILURE_PREDICT
ULONG Estimated100msToReady
FORCEINLINE PCDB SrbGetCdb(_In_ PVOID Srb)
#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE
VOID NTAPI ClassCheckMediaState(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
FORCEINLINE VOID SrbSetSenseInfoBufferLength(_In_ PVOID Srb, _In_ UCHAR SenseInfoBufferLength)
NTSTATUS ClasspInitializeGesn(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info)
#define SRB_FLAGS_DATA_IN
UNICODE_STRING RegistryPath
#define TRACE_LEVEL_INFORMATION
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
#define NOTIFICATION_DEVICE_BUSY_CLASS_MASK
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
#define SCSI_SENSE_NOT_READY
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define OBJ_KERNEL_HANDLE
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
#define SRB_STATUS(Status)
#define SRB_CLASS_FLAGS_LOW_PRIORITY
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
GLbitfield GLuint64 timeout
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
const GUID StoragePredictFailureEventGuid
#define STATUS_INVALID_DEVICE_STATE
FORCEINLINE VOID FREE_PORT_ALLOCATED_SENSE_BUFFER_EX(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSTORAGE_REQUEST_BLOCK_HEADER Srb)
#define STATUS_IO_DEVICE_ERROR
struct SRB_ALIGN _STORAGE_REQUEST_BLOCK_HEADER * PSTORAGE_REQUEST_BLOCK_HEADER
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
#define FILE_DEVICE_CD_ROM
#define STATUS_DEVICE_PROTOCOL_ERROR
_In_ PDEVICE_OBJECT DeviceObject
#define STATUS_MEDIA_CHANGED
VOID ClassSendEjectionNotification(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS
#define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
* PSTORAGE_DEVICE_DESCRIPTOR
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define CLASSP_REG_SUBKEY_NAME
FORCEINLINE VOID SrbSetScsiStatus(_In_ PVOID Srb, _In_ UCHAR ScsiStatus)
NTSTATUS ClasspInitializePolling(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN BOOLEAN AllowDriveToSleep)
#define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME
#define EX_TIMER_UNLIMITED_TOLERANCE
#define TRACE_LEVEL_VERBOSE
#define TICK_TIMER_PERIOD_IN_MSEC
#define FREE_POOL(_PoolPtr)
_IRQL_requires_max_(_IRQL_requires_max_() BOOLEANDeviceIsMediaChangeDisabledForClass(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension) PASSIVE_LEVEL)
IO_WORKITEM_ROUTINE ClasspDisableGesn
struct _EX_TIMER * PEX_TIMER
FORCEINLINE VOID ExInitializeSetTimerParameters(_Out_ PEXT_SET_PARAMETERS Parameters)
#define _IRQL_requires_min_(irql)
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK
#define FILE_REMOVABLE_MEDIA
BOOLEAN ClasspUpdateTimerNoWakeTolerance(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
NTSTATUS ClasspMediaChangeDeviceInstanceOverride(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, OUT PBOOLEAN Enabled)
GLenum GLuint GLenum GLsizei length
struct _SENSE_DATA SENSE_DATA
#define DBGGETADSENSEQUALIFIERSTR(_pSrb)
VOID NTAPI ClassReleaseRemoveLock(_In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Tag)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
struct _NOTIFICATION_MEDIA_STATUS * PNOTIFICATION_MEDIA_STATUS
FORCEINLINE BOOLEAN PORT_ALLOCATED_SENSE_EX(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSTORAGE_REQUEST_BLOCK_HEADER Srb)
VOID ClasspSendMediaStateIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN ULONG CountDown)
NTKERNELAPI PEX_TIMER NTAPI ExAllocateTimer(_In_opt_ PEXT_CALLBACK Callback, _In_opt_ PVOID CallbackContext, _In_ ULONG Attributes)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
#define SL_OVERRIDE_VERIFY_VOLUME
#define _IRQL_requires_same_
#define CLEAR_FLAG(Flags, Bit)
#define RTL_QUERY_REGISTRY_TYPECHECK
#define RTL_REGISTRY_OPTIONAL
#define MCN_REG_SUBKEY_NAME
enum _MEDIA_CHANGE_DETECTION_STATE MEDIA_CHANGE_DETECTION_STATE
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST
#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL
#define TEST_FLAG(Flags, Bit)
UCHAR additionalSenseCode
FORCEINLINE VOID SrbSetCdbLength(_In_ PVOID Srb, _In_ UCHAR CdbLength)
#define _IRQL_requires_(irql)
IO_WORKITEM_ROUTINE ClasspUpdateDiskProperties
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
BOOLEAN ClasspIsMediaChangeDisabledForClass(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
#define REG_OPTION_NON_VOLATILE
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
#define InterlockedExchangePointer(Target, Value)
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
#define MEDIA_CHANGE_TIMEOUT_TIME
#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED
enum _CLASS_DETECTION_STATE CLASS_DETECTION_STATE
#define NT_SUCCESS(StatCode)
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
NTKERNELAPI BOOLEAN NTAPI ExDeleteTimer(_In_ PEX_TIMER Timer, _In_ BOOLEAN Cancel, _In_ BOOLEAN Wait, _In_opt_ PEXT_DELETE_PARAMETERS Parameters)
_Function_class_(RTL_QUERY_REGISTRY_ROUTINE)
#define IRP_MN_START_DEVICE
#define ObDereferenceObject
struct _COMMON_DEVICE_EXTENSION * PCOMMON_DEVICE_EXTENSION
_In_ GUID _In_ PVOID ValueData
#define SENSE_BUFFER_SIZE_EX
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
FORCEINLINE ULONG CountOfSetBitsUChar(UCHAR _X)
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE
#define SRB_FLAGS_NO_KEEP_AWAKE
PDEVICE_OBJECT DeviceObject
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
PIRP ClasspPrepareMcnIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN BOOLEAN UseGesn)
PVPB NTAPI ClassGetVpb(_In_ PDEVICE_OBJECT DeviceObject)
#define STORAGE_ADDRESS_TYPE_BTL8
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
POWER_SETTING_CALLBACK ClasspPowerSettingCallback
struct _NOTIFICATION_EXTERNAL_STATUS * PNOTIFICATION_EXTERNAL_STATUS
VOID NTAPI IoFreeMdl(PMDL Mdl)
PDEVICE_OBJECT DeviceObject
NTKERNELAPI BOOLEAN NTAPI ExSetTimer(_In_ PEX_TIMER Timer, _In_ LONGLONG DueTime, _In_ LONGLONG Period, _In_opt_ PEXT_SET_PARAMETERS Parameters)
#define STATUS_UNSUCCESSFUL
VOID NTAPI ClassResetMediaChangeTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define ExAllocatePoolWithTag(hernya, size, tag)
_Must_inspect_result_ _In_ WDFDEVICE Fdo
#define CLASS_TAG_AUTORUN_DISABLE
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
NTSTATUS ClasspInterpretGesnData(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PNOTIFICATION_EVENT_STATUS_HEADER Header, OUT PBOOLEAN ResendImmediately)
#define SRB_FUNCTION_STORAGE_REQUEST_BLOCK
#define SRB_FLAGS_NO_DATA_TRANSFER
LONGLONG CurrentNoWakeTolerance
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED
#define SRB_STATUS_QUEUE_FROZEN
#define InterlockedDecrement
#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS
PCLASS_DRIVER_EXTENSION DriverExtension
NTKERNELAPI BOOLEAN NTAPI ExCancelTimer(_Inout_ PEX_TIMER Timer, _In_opt_ PEXT_CANCEL_PARAMETERS Parameters)
#define RTL_REGISTRY_HANDLE
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
VOID ClasspEnableTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define KeEnterCriticalRegion()
BOOLEAN ClasspFailurePredictionPeriodMissed(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IOCTL_SCSI_EXECUTE_IN
#define InterlockedExchange
#define GESN_DEVICE_BUSY_LOWER_THRESHOLD_100_MS
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
#define IOCTL_SCSI_EXECUTE_NONE
_In_ FAILURE_PREDICTION_METHOD _In_ ULONG PollingPeriod
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
#define DBGGETADSENSECODESTR(_pSrb)
VOID ClasspDisableTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
UCHAR SenseInfoBufferLength
#define CLASSP_REG_MMC_DETECTION_VALUE_NAME
#define IOCTL_STORAGE_PREDICT_FAILURE
#define WMI_STORAGE_PREDICT_FAILURE_EVENT_GUID
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS
#define CLASS_TAG_MEDIA_CHANGE_DETECTION
#define KeLeaveCriticalRegion()
#define KeInitializeEvent(pEvt, foo, foo2)
#define InterlockedIncrement
struct _FAILURE_PREDICTION_INFO * FailurePredictionInfo
#define GESN_TIMEOUT_VALUE
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSTATUS ClasspMcnControl(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PIRP Irp, IN PSCSI_REQUEST_BLOCK Srb)
FORCEINLINE PVOID SrbGetSenseInfoBuffer(_In_ PVOID Srb)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
#define MEDIA_CHANGE_DEFAULT_TIME
#define RTL_QUERY_REGISTRY_TYPECHECK_SHIFT
struct _CDB::_CDB6GENERIC CDB6GENERIC
struct _NOTIFICATION_EVENT_STATUS_HEADER * PNOTIFICATION_EVENT_STATUS_HEADER
FORCEINLINE VOID EventDescCreate(_Out_ PEVENT_DESCRIPTOR EventDescriptor, _In_ USHORT Id, _In_ UCHAR Version, _In_ UCHAR Channel, _In_ UCHAR Level, _In_ USHORT Task, _In_ UCHAR Opcode, _In_ ULONGLONG Keyword)
#define _Analysis_assume_
#define SRB_SIMPLE_TAG_REQUEST
#define DBGGETSRBSTATUSSTR(_pSrb)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
FAILURE_PREDICTION_METHOD
#define DEFAULT_FAILURE_PREDICTION_PERIOD
_In_ BOOLEAN AllowDriveToSleep
#define STATUS_IO_TIMEOUT
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
PVOID ScreenStateNotificationHandle
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
RTL_QUERY_REGISTRY_ROUTINE ClasspMediaChangeRegistryCallBack
#define _In_reads_bytes_opt_(s)
struct tagContext Context
VOID ClasspDeleteTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS
VOID ClasspInternalSetMediaChangeState(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN KnownStateChange)
#define SRB_FUNCTION_EXECUTE_SCSI
FORCEINLINE VOID SrbSetSenseInfoBuffer(_In_ PVOID Srb, _In_opt_ PVOID SenseInfoBuffer)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
UCHAR AdditionalSenseLength
#define SRB_STATUS_SUCCESS
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
struct _NOTIFICATION_BUSY_STATUS * PNOTIFICATION_BUSY_STATUS
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
IN PSCSI_REQUEST_BLOCK Srb
IO_WORKITEM_ROUTINE ClasspFailurePredict
BOOLEAN ClasspIsMediaChangeDisabledDueToHardwareLimitation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
UCHAR AdditionalSenseCode
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
NTSTATUS ClasspInitializeTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
_In_ FAILURE_PREDICTION_METHOD FailurePredictionMethod
struct _CDB::_GET_EVENT_STATUS_NOTIFICATION GET_EVENT_STATUS_NOTIFICATION
#define IO_WRN_FAILURE_PREDICTED
#define RTL_QUERY_REGISTRY_REQUIRED
NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PVOID NotificationStructure, IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, IN PVOID Context OPTIONAL)
struct _FAILURE_PREDICTION_INFO * PFAILURE_PREDICTION_INFO
VOID NTAPI ClassCompleteRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost)
static SERVICE_STATUS status
#define CLASS_SRB_STORAGE_REQUEST_BLOCK
#define MAXIMUM_IMMEDIATE_MCN_RETRIES
struct _IO_WORKITEM * PIO_WORKITEM
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
#define SET_FLAG(Flags, Bit)
#define SCSI_SENSE_UNIT_ATTENTION
#define RTL_QUERY_REGISTRY_DIRECT
#define RtlCompareMemory(s1, s2, l)
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize