214 LONG requiredLength = 0;
221 *ResendImmediately =
FALSE;
239 if (
info->Gesn.HackEventMask)
245 UCHAR thisEventBit = (1 <<
Header->NotificationClass);
254 lowestSetBit =
info->Gesn.EventMask;
255 lowestSetBit &= (
info->Gesn.EventMask - 1);
256 lowestSetBit ^= (
info->Gesn.EventMask);
258 if (thisEventBit != lowestSetBit)
266 "GESN::NONE: Compliant drive found, " 267 "removing GESN hack (%x, %x)\n",
268 thisEventBit,
info->Gesn.EventMask));
272 else if (thisEvent == 0)
285 if (
info->Gesn.EventMask == 0)
287 info->Gesn.EventMask =
info->Gesn.NoChangeEventMask;
288 info->Gesn.NoChangeEventMask = 0;
292 *ResendImmediately =
TRUE;
300 (
Header->EventDataLength[1] & 0xff);
307 "error - GESN returned only %x bytes data for fdo %p\n",
316 "error - GESN returned too many (%x) bytes data for fdo %p\n",
320 if ((
Header->ClassEventData[0] & 0xf) == 0)
328 *ResendImmediately =
TRUE;
330 switch (
Header->NotificationClass)
344 event = (opChangeInfo->
Operation[0] << 8) |
352 if (
info->MediaChangeRetryCount >= 4)
366 static UCHAR const OpChangeMask = 0x02;
373 "GESN OpChange events are broken. Working around this problem in software (for WDFDEVICE %p)\n",
374 DeviceExtension->Device));
387 if (
info->Gesn.EventMask == 0)
389 info->Gesn.EventMask =
info->Gesn.NoChangeEventMask;
390 info->Gesn.NoChangeEventMask = 0;
391 *ResendImmediately =
FALSE;
395 *ResendImmediately =
TRUE;
406 "GESN says features added/changed for WDFDEVICE %p\n",
407 DeviceExtension->Device));
441 if (DeviceExtension->DeviceAdditionalData.ErrorHandler)
443 DeviceExtension->DeviceAdditionalData.ErrorHandler(DeviceExtension,
469 "GESN::EXTERNAL: Event: %x Status %x Req %x\n",
478 (externalInfo->
Request[1] & 0xff);
483 &GUID_IO_DEVICE_EXTERNAL_REQUEST,
499 "GESN::MEDIA ARRIVAL, Status %x\n",
512 if ((DeviceExtension->ZeroPowerODDInfo !=
NULL) &&
514 (DeviceExtension->ZeroPowerODDInfo->Load == 0))
517 "GesnDataInterpret: MediaArrival event detected, device marked as active\n"));
519 DeviceMarkActive(DeviceExtension,
TRUE,
FALSE);
525 "GESN::MEDIA REMOVAL, Status %x\n",
534 if ((DeviceExtension->ZeroPowerODDInfo !=
NULL) &&
536 (DeviceExtension->ZeroPowerODDInfo->Load == 0))
539 "GesnDataInterpret: MediaRemoval event detected, device marked as idle\n"));
541 DeviceMarkActive(DeviceExtension,
FALSE,
FALSE);
547 "GESN::MEDIA EJECTION, Status %x\n",
551 &GUID_IO_MEDIA_EJECT_REQUEST,
569 (busyInfo->
Time[1] & 0xff);
572 "GESN::BUSY: Event: %x Status %x Time %x\n",
581 "GesnDataInterpret: media BECOMING_READY\n"));
584 &GUID_IO_DEVICE_BECOMING_READY,
591 if ((DeviceExtension->ZeroPowerODDInfo !=
NULL) &&
593 (DeviceExtension->ZeroPowerODDInfo->Load == 0) &&
597 inHomePosition = DeviceZPODDIsInHomePosition(DeviceExtension);
599 if (inHomePosition ==
FALSE)
602 "GesnDataInterpret: LoChange event detected, device marked as active\n"));
604 DeviceMarkActive(DeviceExtension,
TRUE,
FALSE);
609 "GesnDataInterpret: LoChange event detected, device marked as idle\n"));
611 DeviceMarkActive(DeviceExtension,
FALSE,
FALSE);
#define KeQuerySystemTime(t)
#define NOTIFICATION_NO_CLASS_EVENTS
struct _NOTIFICATION_OPERATIONAL_STATUS * PNOTIFICATION_OPERATIONAL_STATUS
#define LOADING_MECHANISM_CADDY
#define SRB_STATUS_AUTOSENSE_VALID
#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN
#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA
ULONG NTAPI KeQueryTimeIncrement(VOID)
ULONG Estimated100msToReady
#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE
#define TRACE_LEVEL_INFORMATION
#define STATUS_DEVICE_PROTOCOL_ERROR
#define STATUS_MEDIA_CHANGED
#define LOADING_MECHANISM_TRAY
#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS
VOID DeviceSendNotification(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ const GUID *Guid, _In_ ULONG ExtraDataSize, _In_opt_ PVOID ExtraData)
struct _SENSE_DATA SENSE_DATA
struct _NOTIFICATION_MEDIA_STATUS * PNOTIFICATION_MEDIA_STATUS
#define CLEAR_FLAG(Flags, Bit)
#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST
#define GESN_DEVICE_BUSY_LOWER_THRESHOLD_100_MS
#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL
#define TEST_FLAG(Flags, Bit)
#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED
FORCEINLINE ULONG CountOfSetBitsUChar(UCHAR _X)
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE
#define RTL_SIZEOF_THROUGH_FIELD(type, field)
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
struct _NOTIFICATION_EXTERNAL_STATUS * PNOTIFICATION_EXTERNAL_STATUS
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED
_IRQL_requires_max_(_IRQL_requires_max_() BOOLEANDeviceIsMediaChangeDisabledForClass(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension) PASSIVE_LEVEL)
#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
#define NOTIFICATION_BUSY_EVENT_LO_CHANGE
UCHAR SenseInfoBufferLength
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS
#define NOTIFICATION_BUSY_STATUS_NO_EVENT
FORCEINLINE BOOLEAN IsVolumeMounted(_In_ PDEVICE_OBJECT DeviceObject)
VOID DeviceSetMediaChangeStateEx(_In_ PCDROM_DEVICE_EXTENSION DeviceExtension, _In_ MEDIA_CHANGE_DETECTION_STATE NewState, _Inout_opt_ PMEDIA_CHANGE_DETECTION_STATE OldState)
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS
UCHAR AdditionalSenseLength
struct _NOTIFICATION_BUSY_STATUS * PNOTIFICATION_BUSY_STATUS
UCHAR AdditionalSenseCode
static SERVICE_STATUS status
#define SET_FLAG(Flags, Bit)
#define SCSI_SENSE_UNIT_ATTENTION
#define SCSI_ADSENSE_MEDIUM_CHANGED