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,
191ClassSendNotification(
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"));
1015ClassSetMediaChangeState(
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
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
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,
2421ClassInitializeTestUnitPolling(
2457ClassInitializeMediaChangeDetection(
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)
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);
3102ClassEnableMediaChangeDetection(
3113 "ClassEnableMediaChangeDetection: not initialized\n"));
3123 oldCount = --
info->MediaChangeDetectionDisableCount;
3129 info->MediaChangeDetectionDisableCount));
3188ClassDisableMediaChangeDetection(
3206 info->MediaChangeDetectionDisableCount++;
3209 "disable count is %d\n",
3210 info->MediaChangeDetectionDisableCount));
3235ClassCleanupMediaChangeDetection(
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)
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)
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),
4174ClassNotifyFailurePredicted(
4209 if (logEntry !=
NULL)
4243#pragma warning(suppress:4054)
4247 if ((driverExtension !=
NULL) && (driverExtension->
EtwHandle != 0)) {
4293ClassSetFailurePredictionPoll(
4427 timeDifference.
QuadPart /= (10LL * 1000LL * 1000LL);
4430 missedPeriod =
TRUE;
4433 return missedPeriod;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
ACPI_SIZE strlen(const char *String)
#define InterlockedIncrement
#define InterlockedExchange
#define InterlockedDecrement
#define MCN_REG_SUBKEY_NAME
#define GESN_TIMEOUT_VALUE
#define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME
#define MAXIMUM_IMMEDIATE_MCN_RETRIES
#define GESN_DEVICE_BUSY_LOWER_THRESHOLD_100_MS
#define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME
_In_ PSCSI_REQUEST_BLOCK Srb
#define FREE_POOL(_PoolPtr)
#define SRB_CLASS_FLAGS_LOW_PRIORITY
#define TEST_FLAG(Flags, Bit)
#define CLEAR_FLAG(Flags, Bit)
FORCEINLINE ULONG CountOfSetBitsUChar(UCHAR _X)
#define SET_FLAG(Flags, Bit)
#define MEDIA_CHANGE_TIMEOUT_TIME
#define CLASSP_REG_MMC_DETECTION_VALUE_NAME
#define FDO_HACK_GESN_IGNORE_OPCHANGE
enum _MEDIA_CHANGE_DETECTION_STATE MEDIA_CHANGE_DETECTION_STATE
#define FDO_HACK_GESN_IS_BAD
#define CLASSP_REG_SUBKEY_NAME
#define IOCTL_SCSI_EXECUTE_IN
#define SCSI_ADSENSE_LUN_NOT_READY
#define SCSIOP_GET_EVENT_STATUS
#define SCSIOP_TEST_UNIT_READY
struct _SENSE_DATA SENSE_DATA
#define IOCTL_SCSI_EXECUTE_NONE
#define SCSI_SENSE_UNIT_ATTENTION
#define SCSI_ADSENSE_MEDIUM_CHANGED
#define SCSI_SENSE_NOT_READY
NTSTATUS InitializeStorageRequestBlock(_Inout_bytecount_(ByteSize) PSTORAGE_REQUEST_BLOCK Srb, _In_ USHORT AddressType, _In_ ULONG ByteSize, _In_ ULONG NumSrbExData,...)
struct _FAILURE_PREDICTION_INFO * PFAILURE_PREDICTION_INFO
enum _CLASS_DETECTION_STATE CLASS_DETECTION_STATE
FORCEINLINE BOOLEAN PORT_ALLOCATED_SENSE_EX(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSTORAGE_REQUEST_BLOCK_HEADER Srb)
@ ClassDetectionUnsupported
@ ClassDetectionSupported
IO_WORKITEM_ROUTINE ClasspUpdateDiskProperties
FORCEINLINE VOID FREE_PORT_ALLOCATED_SENSE_BUFFER_EX(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSTORAGE_REQUEST_BLOCK_HEADER Srb)
POWER_SETTING_CALLBACK ClasspPowerSettingCallback
BOOLEAN ClasspIsMediaChangeDisabledForClass(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
BOOLEAN ClasspUpdateTimerNoWakeTolerance(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
VOID NTAPI ClassResetMediaChangeTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
RTL_QUERY_REGISTRY_ROUTINE ClasspMediaChangeRegistryCallBack
const GUID StoragePredictFailureEventGuid
NTSTATUS ClasspInitializeTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
KDEFERRED_ROUTINE ClasspTimerTick
#define TICK_TIMER_DELAY_IN_MSEC
NTSTATUS ClasspMcnControl(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PIRP Irp, IN PSCSI_REQUEST_BLOCK Srb)
NTSTATUS ClasspInitializePolling(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN BOOLEAN AllowDriveToSleep)
IO_WORKITEM_ROUTINE ClasspDisableGesn
static BOOLEAN ClasspCanSendPollingIrp(_In_ PFUNCTIONAL_DEVICE_EXTENSION fdoExtension)
VOID ClasspSetMediaChangeStateEx(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN Wait, IN BOOLEAN KnownStateChange)
VOID ClasspInternalSetMediaChangeState(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN KnownStateChange)
NTSTATUS ClasspInitializeGesn(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info)
PIRP ClasspPrepareMcnIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN BOOLEAN UseGesn)
VOID ClasspSendMediaStateIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN ULONG CountDown)
VOID ClasspEnableTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
BOOLEAN ClasspIsMediaChangeDisabledDueToHardwareLimitation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
VOID ClassSendEjectionNotification(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
VOID ClasspDeleteTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
EXT_CALLBACK ClasspTimerTickEx
NTSTATUS ClasspMediaChangeDeviceInstanceOverride(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, OUT PBOOLEAN Enabled)
#define TICK_TIMER_PERIOD_IN_MSEC
IO_COMPLETION_ROUTINE ClasspMediaChangeDetectionCompletion
NTSTATUS ClasspInterpretGesnData(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PNOTIFICATION_EVENT_STATUS_HEADER Header, OUT PBOOLEAN ResendImmediately)
VOID ClasspDisableTimer(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
BOOLEAN ClasspFailurePredictionPeriodMissed(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
IO_WORKITEM_ROUTINE ClasspFailurePredict
VOID NTAPI ClassCheckMediaState(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
IO_COMPLETION_ROUTINE ClassSignalCompletion
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR PathId
#define CLASS_TAG_AUTORUN_DISABLE
#define CLASS_TAG_FAILURE_PREDICT
#define MEDIA_CHANGE_DEFAULT_TIME
#define ClassAcquireRemoveLock(devobj, tag)
_In_ FAILURE_PREDICTION_METHOD FailurePredictionMethod
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR TargetId
_In_ ULONG _In_ BOOLEAN LogError
_In_ ULONG _In_ BOOLEAN _In_ ULONG UniqueErrorValue
#define DEFAULT_FAILURE_PREDICTION_PERIOD
#define CLASS_TAG_MEDIA_CHANGE_DETECTION
#define CLASS_SRB_STORAGE_REQUEST_BLOCK
_In_ FAILURE_PREDICTION_METHOD _In_ ULONG PollingPeriod
_In_ BOOLEAN AllowDriveToSleep
_In_ const GUID _In_ ULONG ExtraDataSize
FAILURE_PREDICTION_METHOD
#define CLASS_DRIVER_EXTENSION_KEY
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
struct _COMMON_DEVICE_EXTENSION * PCOMMON_DEVICE_EXTENSION
PVPB NTAPI ClassGetVpb(_In_ PDEVICE_OBJECT DeviceObject)
PVOID ScreenStateNotificationHandle
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)
#define DBGGETADSENSECODESTR(_pSrb)
#define DBGGETADSENSEQUALIFIERSTR(_pSrb)
#define DBGGETSRBSTATUSSTR(_pSrb)
#define DBGGETSENSECODESTR(_pSrb)
VOID NTAPI ClassCompleteRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost)
VOID NTAPI ClassReleaseRemoveLock(_In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Tag)
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define SRB_STATUS_BUS_RESET
#define SRB_FUNCTION_EXECUTE_SCSI
#define SRB_FLAGS_NO_DATA_TRANSFER
#define SRB_SIMPLE_TAG_REQUEST
#define SRB_STATUS_AUTOSENSE_VALID
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
#define SRB_FLAGS_DATA_IN
#define SRB_FLAGS_NO_KEEP_AWAKE
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SRB_STATUS(Status)
#define SRB_STATUS_QUEUE_FROZEN
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define SRB_STATUS_SUCCESS
#define _IRQL_requires_same_
#define _IRQL_requires_min_(irql)
#define _IRQL_requires_max_(irql)
#define _IRQL_requires_(irql)
#define InterlockedExchangePointer(Target, Value)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define RtlCompareMemory(s1, s2, l)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define KeQuerySystemTime(t)
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)
GLuint GLsizei GLsizei * length
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
_In_ GUID _In_ PVOID ValueData
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define InterlockedCompareExchange
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define KeLeaveCriticalRegion()
#define KeEnterCriticalRegion()
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
#define _In_reads_bytes_(s)
#define _Function_class_(n)
#define _Analysis_assume_
#define _In_reads_bytes_opt_(s)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define REG_OPTION_NON_VOLATILE
#define RTL_QUERY_REGISTRY_REQUIRED
#define RTL_QUERY_REGISTRY_DIRECT
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define RTL_REGISTRY_OPTIONAL
#define RTL_REGISTRY_HANDLE
#define FILE_REMOVABLE_MEDIA
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
#define UNREFERENCED_PARAMETER(P)
* PSTORAGE_DEVICE_DESCRIPTOR
#define IOCTL_STORAGE_PREDICT_FAILURE
#define IO_WRN_FAILURE_PREDICTED
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
VOID NTAPI IoReuseIrp(IN OUT PIRP Irp, IN NTSTATUS Status)
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)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
ULONG NTAPI KeQueryTimeIncrement(VOID)
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
#define STATUS_DEVICE_PROTOCOL_ERROR
#define STATUS_MEDIA_CHANGED
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PVOID NotificationStructure, IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, IN PVOID Context OPTIONAL)
NTKRNLVISTAAPI NTSTATUS NTAPI PoRegisterPowerSettingCallback(_In_opt_ PDEVICE_OBJECT DeviceObject, _In_ LPCGUID SettingGuid, _In_ PPOWER_SETTING_CALLBACK Callback, _In_opt_ PVOID Context, _Outptr_opt_ PVOID *Handle)
#define FILE_DEVICE_CD_ROM
#define IRP_MJ_DEVICE_CONTROL
#define IOCTL_SCSI_GET_ADDRESS
#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK
#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS
#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE
UCHAR additionalSenseCode
struct _NOTIFICATION_OPERATIONAL_STATUS * PNOTIFICATION_OPERATIONAL_STATUS
#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK
struct _NOTIFICATION_EXTERNAL_STATUS * PNOTIFICATION_EXTERNAL_STATUS
#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK
#define NOTIFICATION_NO_CLASS_EVENTS
#define SCSI_SENSE_ERRORCODE_FIXED_CURRENT
#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED
#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK
struct _NOTIFICATION_EVENT_STATUS_HEADER * PNOTIFICATION_EVENT_STATUS_HEADER
struct _NOTIFICATION_MEDIA_STATUS * PNOTIFICATION_MEDIA_STATUS
#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST
#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS
#define NOTIFICATION_DEVICE_BUSY_CLASS_MASK
struct _NOTIFICATION_BUSY_STATUS * PNOTIFICATION_BUSY_STATUS
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS
#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED
#define SENSE_BUFFER_SIZE_EX
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS
#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
#define SRB_FUNCTION_STORAGE_REQUEST_BLOCK
#define STORAGE_ADDRESS_TYPE_BTL8
struct SRB_ALIGN _STORAGE_REQUEST_BLOCK_HEADER * PSTORAGE_REQUEST_BLOCK_HEADER
#define STATUS_MORE_PROCESSING_REQUIRED
FORCEINLINE VOID SrbSetScsiStatus(_In_ PVOID Srb, _In_ UCHAR ScsiStatus)
FORCEINLINE VOID SrbSetSenseInfoBufferLength(_In_ PVOID Srb, _In_ UCHAR SenseInfoBufferLength)
FORCEINLINE VOID SrbSetSenseInfoBuffer(_In_ PVOID Srb, _In_opt_ PVOID SenseInfoBuffer)
FORCEINLINE VOID SrbSetCdbLength(_In_ PVOID Srb, _In_ UCHAR CdbLength)
FORCEINLINE PVOID SrbGetSenseInfoBuffer(_In_ PVOID Srb)
FORCEINLINE UCHAR SrbGetSenseInfoBufferLength(_In_ PVOID Srb)
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_VERBOSE
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_INFORMATION
UNICODE_STRING RegistryPath
LONGLONG CurrentNoWakeTolerance
BOOLEAN LoggedTURFailureSinceLastIO
PCLASS_DRIVER_EXTENSION DriverExtension
ULONG Estimated100msToReady
PDEVICE_OBJECT DeviceObject
ULONG ScanForSpecialFlags
struct _FAILURE_PREDICTION_INFO * FailurePredictionInfo
COMMON_DEVICE_EXTENSION CommonExtension
PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo