28 #define GESN_TIMEOUT_VALUE (0x4) 29 #define GESN_BUFFER_SIZE (0x8) 30 #define MAXIMUM_IMMEDIATE_MCN_RETRIES (0x20) 31 #define MCN_REG_SUBKEY_NAME (L"MediaChangeNotification") 32 #define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME (L"AlwaysDisableMCN") 33 #define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME (L"AlwaysEnableMCN") 54 #define ClasspCanSendPollingIrp(fdoExtension) \ 55 ((fdoExtension->DevicePowerState == PowerDeviceD0) && \ 56 (! fdoExtension->PowerDownInProgress) ) 119 #pragma alloc_text(PAGE, ClassInitializeMediaChangeDetection) 120 #pragma alloc_text(PAGE, ClassEnableMediaChangeDetection) 121 #pragma alloc_text(PAGE, ClassDisableMediaChangeDetection) 122 #pragma alloc_text(PAGE, ClassCleanupMediaChangeDetection) 123 #pragma alloc_text(PAGE, ClasspMediaChangeRegistryCallBack) 124 #pragma alloc_text(PAGE, ClasspInitializePolling) 126 #pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledDueToHardwareLimitation) 127 #pragma alloc_text(PAGE, ClasspMediaChangeDeviceInstanceOverride) 128 #pragma alloc_text(PAGE, ClasspIsMediaChangeDisabledForClass) 130 #pragma alloc_text(PAGE, ClassSetFailurePredictionPoll) 131 #pragma alloc_text(PAGE, ClasspDisableTimer) 132 #pragma alloc_text(PAGE, ClasspEnableTimer) 165 &GUID_IO_MEDIA_EJECT_REQUEST,
187 if (requiredSize > 0x0000ffff) {
190 "Error sending event: size too large! (%x)\n",
303 *ResendImmediately =
FALSE;
322 if (
info->Gesn.HackEventMask) {
331 UCHAR thisEventBit = (1 <<
Header->NotificationClass);
340 lowestSetBit =
info->Gesn.EventMask;
341 lowestSetBit &= (
info->Gesn.EventMask - 1);
342 lowestSetBit ^= (
info->Gesn.EventMask);
344 if (thisEventBit != lowestSetBit) {
355 "Classpnp => GESN::NONE: Compliant drive found, " 356 "removing GESN hack (%x, %x)\n",
357 thisEventBit,
info->Gesn.EventMask));
361 }
else if (thisEvent == 0) {
380 if (
info->Gesn.EventMask == 0) {
381 info->Gesn.EventMask =
info->Gesn.NoChangeEventMask;
382 info->Gesn.NoChangeEventMask = 0;
384 *ResendImmediately =
TRUE;
392 (
Header->EventDataLength[0] << 8) |
393 (
Header->EventDataLength[1] & 0xff);
397 if (dataLength < requiredLength) {
399 "Classpnp => GESN returned only %x bytes data for fdo %p\n",
403 if (dataLength != requiredLength) {
405 "Classpnp => GESN returned too many (%x) bytes data for fdo %p\n",
417 switch (
Header->NotificationClass) {
436 *ResendImmediately =
TRUE;
438 "Classpnp => GESN::EXTERNAL: Event: %x Status %x Req %x\n",
448 (externalInfo->
Request[0] << 8) |
449 (externalInfo->
Request[1] & 0xff);
455 &GUID_IO_DEVICE_EXTERNAL_REQUEST,
470 *ResendImmediately =
TRUE;
472 "Classpnp => GESN::MEDIA: Event: %x Status %x\n",
504 "Classpnp => GESN Ejection request received!\n"));
536 (busyInfo->
Time[1] & 0xff);
539 "Classpnp => GESN::BUSY: Event: %x Status %x Time %x\n",
546 &GUID_IO_DEVICE_BECOMING_READY,
598 PCSTR states[] = {
"Unknown",
"Present",
"Not Present"};
612 (
PLONG)(&
info->MediaChangeDetectionState),
615 if((oldMediaState ==
MediaUnknown) && (!KnownStateChange)) {
623 "ClassSetMediaChangeState: State was unknown - this may " 624 "not be a change\n"));
627 }
else if(oldMediaState == NewState) {
636 if(
info->MediaChangeDetectionDisableCount != 0) {
639 (
"ClassSetMediaChangeState: MCN not enabled, state " 640 "changed from %s to %s\n",
641 states[oldMediaState], states[NewState]));
647 (
"ClassSetMediaChangeState: State change from %s to %s\n",
648 states[oldMediaState], states[NewState]));
659 &GUID_IO_MEDIA_ARRIVAL,
668 &GUID_IO_MEDIA_REMOVAL,
761 DBGWARN((
"ClasspSetMediaChangeStateEx - timed out waiting for mutex"));
836 fdoData = fdoExtension->PrivateFdoData;
890 if (!
info->Gesn.Supported) {
892 DBGTRACE(
ClassDebugMCN, (
"ClasspMediaChangeDetectionCompletion - succeeded and GESN NOT supported, setting MediaPresent."));
906 if (
info->Gesn.Supported) {
922 if (
Irp->IoStatus.Information == 8 ) {
957 if (retryImmediately) {
959 info->MediaChangeRetryCount++;
961 ASSERT(!
"Recursing too often in MCN?");
962 info->MediaChangeRetryCount = 0;
963 retryImmediately =
FALSE;
968 info->MediaChangeRetryCount = 0;
987 volatile LONG irpWasInUse;
989 #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. 998 if (retryImmediately) {
1054 irp =
Info->MediaChangeIrp;
1080 irp->IoStatus.Information = 0;
1082 irp->UserBuffer =
NULL;
1129 "ClassSendTestUnitIrp: FdoExtension->TimeOutValue " 1130 "is set to zero?! -- resetting to 10\n"));
1136 "ClassSendTestUnitIrp: Someone set " 1137 "srb->TimeOutValue to zero?! -- resetting to %x\n",
1150 nextIrpStack->
Parameters.DeviceIoControl.IoControlCode =
1154 irp->MdlAddress =
NULL;
1167 nextIrpStack->
Parameters.DeviceIoControl.IoControlCode =
1171 irp->MdlAddress =
Info->Gesn.Mdl;
1180 (
UCHAR)((
Info->Gesn.BufferSize) & 0xff);
1182 Info->Gesn.EventMask;
1231 (!
Info->MediaChangeIrpLost)) {
1240 Info->MediaChangeIrpTimeInUse = 0;
1256 "%x seconds when synchronizing for MCD\n", timeInUse));
1258 if (
Info->MediaChangeIrpLost ==
FALSE) {
1268 "CdRom%d: Media Change Notification has lost " 1269 "it's irp and doesn't know where to find it. " 1270 "Leave it alone and it'll come home dragging " 1271 "it's stack behind it.\n",
1284 if (
Info->MediaChangeDetectionDisableCount != 0) {
1286 " detection disabled \n",
FdoExtension->DeviceObject));
1294 "ClassCheckMediaState: device %p is powered " 1295 "down and flags are set to let it sleep\n",
1309 "ClassCheckMediaState: device %p needs to powerup " 1310 "to handle this io (may take a few extra seconds).\n",
1315 Info->MediaChangeIrpTimeInUse = 0;
1318 if (CountDown == 0) {
1323 "ClassCheckMediaState: timer expired\n"));
1325 if (
Info->MediaChangeDetectionDisableCount != 0) {
1327 "ClassCheckMediaState: detection disabled\n"));
1337 Info->Gesn.Supported);
1344 "ClasspSendMediaStateIrp: Device %p getting TUR " 1361 requestPending =
TRUE;
1369 if(requestPending ==
FALSE) {
1371 #if _MSC_FULL_VER != 13009111 // This compiler always takes the wrong path here. 1413 "ClassCheckMediaState: detection not enabled\n"));
1515 FdoExtension->KernelModeMcnContext.McnDisableCount = 0;
1538 srb = &(
info->MediaChangeSrb);
1539 info->MediaChangeIrp = irp;
1561 info->MediaChangeIrp = irp;
1583 info->MediaChangeDetectionDisableCount = 0;
1592 info->MediaChangeIrpTimeInUse = 0;
1627 "ClasspInitializePolling: Testing for GESN\n"));
1631 "ClasspInitializePolling: GESN available " 1641 "ClasspInitializePolling: GESN *NOT* available " 1649 info->Gesn.Supported = 0;
1694 (
PULONG)&detectionState);
1744 Info->Gesn.EventMask = 0;
1759 retryImmediately =
TRUE;
1760 for (
i = 0; (
i < 16) && (retryImmediately !=
FALSE);
i++) {
1794 &(
Info->MediaChangeSrb),
1817 if (atapiResets >= 4) {
1843 "Classpnp => GESN test failed %x for fdo %p\n",
1858 "Classpnp => GESN test failed %x for fdo %p\n",
1873 "Classpnp => Fdo %p supports event mask %x\n",
1880 "Classpnp => GESN supports MCN\n"));
1885 "Classpnp => GESN supports DeviceBusy\n"));
1887 Info->Gesn.EventMask =
header->SupportedEventClasses;
1898 Info->Gesn.EventMask &=
1920 "Classpnp => GESN hack %s for FDO %p\n",
1924 "Classpnp => GESN hack %s for FDO %p\n",
1926 Info->Gesn.HackEventMask = 1;
1961 "Classpnp => Enabling GESN support for fdo %p\n",
1975 "Classpnp => GESN available but not enabled for fdo %p\n",
1982 if (
Info->Gesn.Mdl) {
1986 if (
Info->Gesn.Buffer) {
1990 Info->Gesn.Supported = 0;
1991 Info->Gesn.EventMask = 0;
1992 Info->Gesn.BufferSize = 0;
2069 BOOLEAN disabledForBadHardware;
2087 if (disabledForBadHardware) {
2089 "ClassInitializeMCN: Disabled due to hardware" 2090 "limitations for this device"));
2104 "ClassInitializeMCN: Class MCN is %s\n",
2105 (disabled ?
"disabled" :
"enabled")));
2113 "ClassInitializeMCN: Instance using default\n"));
2116 "ClassInitializeMCN: Instance override: %s MCN\n",
2117 (instanceOverride ?
"Enabling" :
"Disabling")));
2118 disabled = !instanceOverride;
2122 "ClassInitializeMCN: Instance MCN is %s\n",
2123 (disabled ?
"disabled" :
"enabled")));
2170 HANDLE deviceParameterHandle;
2171 HANDLE driverParameterHandle;
2177 ULONG alwaysDisable;
2183 deviceParameterHandle =
NULL;
2184 driverParameterHandle =
NULL;
2186 alwaysEnable =
FALSE;
2187 alwaysDisable =
FALSE;
2194 &deviceParameterHandle
2203 "ClassMediaChangeDeviceInstanceDisabled: " 2204 "Could not open device registry key [%lx]\n",
status));
2212 deviceParameterHandle,
2215 status = ZwCreateKey(&driverParameterHandle,
2225 "ClassMediaChangeDeviceInstanceDisabled: " 2226 "subkey could not be created. %lx\n",
status));
2258 (
PWSTR)driverParameterHandle,
2266 if (driverParameterHandle)
ZwClose(driverParameterHandle);
2267 if (deviceParameterHandle)
ZwClose(deviceParameterHandle);
2271 if (alwaysEnable && alwaysDisable) {
2274 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2275 "Both Enable and Disable set -- DISABLE"));
2280 }
else if (alwaysDisable) {
2283 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2289 }
else if (alwaysEnable) {
2292 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2301 "ClassMediaChangeDeviceInstanceDisabled: %s selected\n",
2349 ULONG mediaChangeNotificationDisabled =
FALSE;
2366 status = ZwOpenKey(&serviceKey,
2407 if ((deviceDescriptor->VendorIdOffset == 0) &&
2408 (deviceDescriptor->ProductIdOffset == 0)) {
2414 if (deviceDescriptor->VendorIdOffset == 0) {
2417 vendorId = (
PCSTR) deviceDescriptor + deviceDescriptor->VendorIdOffset;
2421 if ( deviceDescriptor->ProductIdOffset == 0 ) {
2424 productId = (
PCSTR) deviceDescriptor + deviceDescriptor->ProductIdOffset;
2428 if ( deviceDescriptor->ProductRevisionOffset == 0 ) {
2431 revisionId = (
PCSTR) deviceDescriptor + deviceDescriptor->ProductRevisionOffset;
2447 "ClassMediaChangeDisabledForHardware: Unable to alloc " 2448 "string buffer\n" ));
2457 if (vendorId !=
NULL) {
2464 if ( productId !=
NULL ) {
2470 if ( revisionId !=
NULL ) {
2491 "ClassMediaChangeDisabledForHardware: cannot convert " 2492 "to unicode %lx\n",
status));
2502 nullMultiSz =
L"\0";
2505 parameters[0].
Name =
L"AutoRunAlwaysDisable";
2506 parameters[0].
EntryContext = &mediaChangeNotificationDisabled;
2514 &deviceUnicodeString,
2533 if (mediaChangeNotificationDisabled) {
2535 "Device is on disable list\n"));
2589 ULONG mcnRegistryValue = 1;
2606 status = ZwOpenKey(&serviceKey,
2621 (mcnRegistryValue ?
"Enabled" :
"Disabled")));
2622 return (
BOOLEAN)(!mcnRegistryValue);
2640 status = ZwOpenKey(¶metersKey,
2645 parametersKey =
NULL;
2655 parameters[0].
Name =
L"Autorun";
2668 "<Service>/Autorun flag = %d\n", mcnRegistryValue));
2670 if(parametersKey !=
NULL) {
2678 "<Service>/Parameters/Autorun flag = %d\n",
2686 "Autoplay for device %p is %s\n",
2688 (mcnRegistryValue ?
"on" :
"off")
2696 return (
BOOLEAN)(!mcnRegistryValue);
2729 "ClassEnableMediaChangeDetection: not initialized\n"));
2739 oldCount = --
info->MediaChangeDetectionDisableCount;
2745 info->MediaChangeDetectionDisableCount));
2821 info->MediaChangeDetectionDisableCount++;
2824 "disable count is %d\n",
2825 info->MediaChangeDetectionDisableCount));
2863 if (
info->Gesn.Buffer) {
2916 if(fileObject !=
NULL) {
2922 if (fsContext ==
NULL) {
2933 if(
request->PreventMediaRemoval) {
3020 if ((*valueFound) != 0) {
3027 "never be passed to registry call-back!\n"));
3062 (*valueFound) =
TRUE;
3145 if (countDown == 0) {
3147 DebugPrint((4,
"ClasspTimerTick: Send FP irp for %p\n",
3152 info->WorkQueueItem =
3163 DebugPrint((1,
"ClassTimerTick: Couldn't allocate " 3164 "item - try again in one minute\n"));
3175 info->WorkQueueItem);
3186 "Prediction work item is " 3187 "already active for device %p\n",
3196 DebugPrint((4,
"ClassTimerTick, SHHHH!!! device is %p is sleeping\n",
3255 DebugPrint((1,
"ClasspEnableTimer: Once a second timer enabled " 3260 DebugPrint((1,
"ClasspEnableTimer: Device %p, Status %lx " 3309 DebugPrint((3,
"ClasspDisableTimer: Once a second timer disabled " 3314 DebugPrint((1,
"ClasspDisableTimer: Timer never enabled\n"));
3356 DebugPrint((1,
"ClasspFailurePredict: Polling for failure\n"));
3436 sizeof(checkFailure),
3481 DebugPrint((1,
"ClasspFailurePredictPollCompletion: Failure predicted for device %p\n",
FdoExtension->DeviceObject));
3502 if (logEntry !=
NULL)
3626 DebugPrint((3,
"ClassEnableFailurePredictPoll: Enabled for " 3633 DebugPrint((3,
"ClassEnableFailurePredictPoll: Disabled for "
#define KeQuerySystemTime(t)
_In_ ULONG _In_ BOOLEAN _In_ ULONG UniqueErrorValue
NTSTATUS NTAPI ClasspInitializePolling(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN BOOLEAN AllowDriveToSleep)
PVPB NTAPI ClassGetVpb(IN PDEVICE_OBJECT DeviceObject)
#define NOTIFICATION_NO_CLASS_EVENTS
PFILE_OBJECT_EXTENSION NTAPI ClasspGetFsContext(IN PCOMMON_DEVICE_EXTENSION CommonExtension, IN PFILE_OBJECT FileObject)
#define SRB_STATUS_BUS_RESET
VOID NTAPI ClassDisableMediaChangeDetection(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
NTSTATUS NTAPI ClasspEnableTimer(PDEVICE_OBJECT DeviceObject)
enum _MEDIA_CHANGE_DETECTION_STATE MEDIA_CHANGE_DETECTION_STATE
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
ULONG ScanForSpecialFlags
* PSTORAGE_ADAPTER_DESCRIPTOR
#define STATUS_INSUFFICIENT_RESOURCES
#define IOCTL_SCSI_GET_ADDRESS
#define ClassAcquireRemoveLock(devobj, tag)
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR _In_ UCHAR Lun
#define SCSIOP_GET_EVENT_STATUS
NTSTATUS NTAPI ClasspMcnControl(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PIRP Irp, IN PSCSI_REQUEST_BLOCK Srb)
struct _TARGET_DEVICE_CUSTOM_NOTIFICATION TARGET_DEVICE_CUSTOM_NOTIFICATION
#define GESN_TIMEOUT_VALUE
#define KeWaitForMutexObject
#define STATUS_DATA_OVERRUN
PMEDIA_CHANGE_DETECTION_INFO MediaChangeDetectionInfo
_In_ ULONG _In_ BOOLEAN LogError
VOID NTAPI IoStartTimer(IN PDEVICE_OBJECT DeviceObject)
#define STATUS_MORE_PROCESSING_REQUIRED
VOID NTAPI ClassNotifyFailurePredicted(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, PUCHAR Buffer, ULONG BufferSize, BOOLEAN LogError, ULONG UniqueErrorValue, UCHAR PathId, UCHAR TargetId, UCHAR Lun)
ACPI_SIZE strlen(const char *String)
#define TEST_FLAG(Flags, Bit)
_In_ const GUID _In_ ULONG ExtraDataSize
#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK
#define MEDIA_CHANGE_TIMEOUT_TIME
_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)
_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
_In_ PCWSTR _In_z_ PCWSTR _In_ ULONG ValueType
#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
IO_COMPLETION_ROUTINE ClassSignalCompletion
#define SCSIOP_TEST_UNIT_READY
ULONG NTAPI KeQueryTimeIncrement(VOID)
BOOLEAN LoggedTURFailureSinceLastIO
BOOLEAN NTAPI ClasspIsMediaChangeDisabledDueToHardwareLimitation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
#define STATUS_INVALID_DEVICE_REQUEST
#define InterlockedCompareExchange
VOID NTAPI ClassSendEjectionNotification(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
VOID NTAPI ClassSetMediaChangeState(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN Wait)
#define DBGGETSENSECODESTR(_pSrb)
NTSTATUS NTAPI ClasspMediaChangeDeviceInstanceOverride(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, OUT PBOOLEAN Enabled)
#define SCSI_ADSENSE_LUN_NOT_READY
VOID NTAPI ObDereferenceObject(IN PVOID Object)
#define CLASS_TAG_FAILURE_PREDICT
ULONG Estimated100msToReady
#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE
GUID StoragePredictFailureEventGuid
#define MAXIMUM_IMMEDIATE_MCN_RETRIES
#define SRB_FLAGS_DATA_IN
UNICODE_STRING RegistryPath
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)
#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)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
#define SRB_STATUS(Status)
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
#define SENSE_BUFFER_SIZE
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_IO_DEVICE_ERROR
#define FILE_DEVICE_CD_ROM
NTSTATUS NTAPI ClasspInitializeGesn(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info)
_In_ PUNICODE_STRING ValueName
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
VOID NTAPI ClassCheckMediaState(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
* PSTORAGE_DEVICE_DESCRIPTOR
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define SRB_CLASS_FLAGS_LOW_PRIORITY
NTSTATUS NTAPI ClassSetDeviceParameter(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PWSTR SubkeyName OPTIONAL, IN PWSTR ParameterName, IN ULONG ParameterValue)
VOID NTAPI ClasspSendNotification(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN const GUID *Guid, IN ULONG ExtraDataSize, IN PVOID ExtraData)
VOID NTAPI ClasspSetMediaChangeStateEx(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN Wait, IN BOOLEAN KnownStateChange)
VOID NTAPI ClasspTimerTick(PDEVICE_OBJECT DeviceObject, PVOID Context)
VOID NTAPI IoStopTimer(PDEVICE_OBJECT DeviceObject)
#define FILE_REMOVABLE_MEDIA
#define CLEAR_FLAG(Flags, Bit)
#define DBGGETADSENSEQUALIFIERSTR(_pSrb)
BOOLEAN NTAPI ClassInterpretSenseInfo(IN PDEVICE_OBJECT Fdo, IN PSCSI_REQUEST_BLOCK Srb, IN UCHAR MajorFunctionCode, IN ULONG IoDeviceCode, IN ULONG RetryCount, OUT NTSTATUS *Status, OUT OPTIONAL ULONG *RetryInterval)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
static __inline BOOLEAN PORT_ALLOCATED_SENSE(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSCSI_REQUEST_BLOCK Srb)
struct _NOTIFICATION_MEDIA_STATUS * PNOTIFICATION_MEDIA_STATUS
VOID NTAPI ClassResetMediaChangeTimer(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define MCN_REG_AUTORUN_ENABLE_INSTANCE_NAME
PCLASS_DRIVER_EXTENSION NTAPI ClassGetDriverExtension(IN PDRIVER_OBJECT DriverObject)
#define SL_OVERRIDE_VERIFY_VOLUME
#define RTL_REGISTRY_OPTIONAL
#define MCN_REG_AUTORUN_DISABLE_INSTANCE_NAME
VOID NTAPI ClassGetDeviceParameter(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PWSTR SubkeyName OPTIONAL, IN PWSTR ParameterName, IN OUT PULONG ParameterValue)
PIRP NTAPI ClasspPrepareMcnIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN BOOLEAN UseGesn)
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST
#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
#define REG_OPTION_NON_VOLATILE
#define InterlockedExchangePointer(Target, Value)
enum _CLASS_DETECTION_STATE CLASS_DETECTION_STATE
#define NT_SUCCESS(StatCode)
GLenum GLuint GLenum GLsizei length
VOID NTAPI ClassEnableMediaChangeDetection(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
NTSTATUS NTAPI IoInitializeTimer(IN PDEVICE_OBJECT DeviceObject, IN PIO_TIMER_ROUTINE TimerRoutine, IN PVOID Context)
static __inline VOID FREE_PORT_ALLOCATED_SENSE_BUFFER(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ PSCSI_REQUEST_BLOCK Srb)
#define IRP_MN_START_DEVICE
struct _COMMON_DEVICE_EXTENSION * PCOMMON_DEVICE_EXTENSION
_In_ GUID _In_ PVOID ValueData
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
VOID NTAPI ClassCleanupMediaChangeDetection(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#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
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
struct _NOTIFICATION_EXTERNAL_STATUS * PNOTIFICATION_EXTERNAL_STATUS
VOID NTAPI IoFreeMdl(PMDL Mdl)
PDEVICE_OBJECT DeviceObject
#define OBJ_CASE_INSENSITIVE
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define CLASS_TAG_AUTORUN_DISABLE
#define CLASSP_REG_SUBKEY_NAME
#define SRB_FLAGS_NO_DATA_TRANSFER
VOID NTAPI ClasspInternalSetMediaChangeState(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN MEDIA_CHANGE_DETECTION_STATE NewState, IN BOOLEAN KnownStateChange)
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
#define SRB_STATUS_QUEUE_FROZEN
#define InterlockedDecrement
#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS
_In_ GUID _In_ PVOID _In_ ULONG ValueLength
PCLASS_DRIVER_EXTENSION DriverExtension
#define RTL_REGISTRY_HANDLE
NTSTATUS NTAPI ClassSetFailurePredictionPoll(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, FAILURE_PREDICTION_METHOD FailurePredictionMethod, ULONG PollingPeriod)
#define DBGTRACE(dbgTraceLevel, args_in_parens)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IOCTL_SCSI_EXECUTE_IN
#define InterlockedExchange
#define SET_FLAG(Flags, Bit)
ULONG NTAPI DebugPrint(IN PSTRING DebugString, IN ULONG ComponentId, IN ULONG Level)
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
#define FDO_HACK_GESN_IS_BAD
VOID NTAPI ClasspInterpretGesnData(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PNOTIFICATION_EVENT_STATUS_HEADER Header, IN PBOOLEAN ResendImmediately)
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
#define DBGGETADSENSECODESTR(_pSrb)
IN PDEVICE_OBJECT DeviceObject
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
UCHAR SenseInfoBufferLength
#define IOCTL_STORAGE_PREDICT_FAILURE
#define WMI_STORAGE_PREDICT_FAILURE_EVENT_GUID
#define CLASSP_REG_MMC_DETECTION_VALUE_NAME
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS
#define CLASS_TAG_MEDIA_CHANGE_DETECTION
#define KeInitializeEvent(pEvt, foo, foo2)
#define NOTIFICATION_MEDIA_EVENT_NO_CHANGE
#define InterlockedIncrement
IO_WORKITEM_ROUTINE ClasspFailurePredict
struct _FAILURE_PREDICTION_INFO * FailurePredictionInfo
#define DBGWARN(args_in_parens)
#define DPFLTR_ERROR_LEVEL
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
#define MEDIA_CHANGE_DEFAULT_TIME
struct _CDB::_CDB6GENERIC CDB6GENERIC
struct _NOTIFICATION_EVENT_STATUS_HEADER * PNOTIFICATION_EVENT_STATUS_HEADER
VOID NTAPI ClassCompleteRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN CCHAR PriorityBoost)
#define SRB_SIMPLE_TAG_REQUEST
#define DBGGETSRBSTATUSSTR(_pSrb)
#define NOTIFICATION_BUSY_STATUS_NO_EVENT
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)
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)
NTSTATUS NTAPI ClasspDisableTimer(PDEVICE_OBJECT DeviceObject)
VOID NTAPI ClassInitializeMediaChangeDetection(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUCHAR EventPrefix)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define SRB_FUNCTION_EXECUTE_SCSI
struct tagContext Context
#define STATUS_NOT_SUPPORTED
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
VOID NTAPI ClasspSendMediaStateIrp(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMEDIA_CHANGE_DETECTION_INFO Info, IN ULONG CountDown)
#define SRB_STATUS_SUCCESS
#define InitializeObjectAttributes(p, n, a, r, s)
_In_ PUNICODE_STRING RegistryPath
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
NTSTATUS NTAPI ClassInitializeTestUnitPolling(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN BOOLEAN AllowDriveToSleep)
struct _NOTIFICATION_BUSY_STATUS * PNOTIFICATION_BUSY_STATUS
IN PSCSI_REQUEST_BLOCK Srb
UCHAR AdditionalSenseCode
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS NTAPI ClasspMediaChangeDetectionCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
_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)
BOOLEAN NTAPI ClasspIsMediaChangeDisabledForClass(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PUNICODE_STRING RegistryPath)
static SERVICE_STATUS status
#define OBJ_KERNEL_HANDLE
#define MCN_REG_SUBKEY_NAME
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
#define RTL_QUERY_REGISTRY_DIRECT
#define RtlCompareMemory(s1, s2, l)
#define ClasspCanSendPollingIrp(fdoExtension)
NTSTATUS NTAPI ClassWmiFireEvent(IN PDEVICE_OBJECT DeviceObject, IN LPGUID Guid, IN ULONG InstanceIndex, IN ULONG EventDataSize, IN PVOID EventData)
#define IRP_MJ_DEVICE_CONTROL
VOID NTAPI ClassReleaseRemoveLock(IN PDEVICE_OBJECT DeviceObject, IN OPTIONAL PIRP Tag)
NTSTATUS NTAPI ClasspMediaChangeRegistryCallBack(IN PWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength, IN PVOID Context, IN PVOID EntryContext)