105 DeviceExtension =
WorkItem->DeviceExtension;
112 if (--DeviceExtension->OnlineNotificationCount == 0)
118 if (!
IsListEmpty(&(DeviceExtension->OnlineNotificationListHead)))
121 Head =
RemoveHeadList(&(DeviceExtension->OnlineNotificationListHead));
131 DeviceExtension->OnlineNotificationWorkerActive = 0;
159 WorkItem->DeviceExtension = DeviceExtension;
173 DeviceExtension->OnlineNotificationCount++;
176 if (DeviceExtension->OnlineNotificationWorkerActive == 0)
179 DeviceExtension->OnlineNotificationWorkerActive = 1;
206 if (DeviceExtension->OnlineNotificationCount != 1)
208 DeviceExtension->OnlineNotificationCount--;
218 DeviceExtension->OnlineNotificationCount++;
293 DeviceExtension->DriverObject,
296 &(DeviceInformation->TargetDeviceNotificationEntry));
299 DeviceInformation->TargetDeviceNotificationEntry =
NULL;
319 DeviceExtension->EpicNumber++;
325 while (!
IsListEmpty(&(DeviceExtension->IrpListHead)))
340 *((
PULONG)
Irp->AssociatedIrp.SystemBuffer) = DeviceExtension->EpicNumber;
341 Irp->IoStatus.Information =
sizeof(DeviceExtension->EpicNumber);
371 for (NextEntry = DeviceExtension->DeviceListHead.
Flink;
372 NextEntry != &DeviceExtension->DeviceListHead;
373 NextEntry = NextEntry->
Flink)
383 if (NextEntry == &(DeviceExtension->DeviceListHead) ||
424 Irp->IoStatus.Information = 0;
450 if (DeviceRelations->
Count < 1)
460 DeviceNotification.
Version = 1;
462 DeviceNotification.
Event = GUID_IO_VOLUME_NAME_CHANGE;
525 UniqueIdChange =
WorkItem->Irp->AssociatedIrp.SystemBuffer;
625 Irp->AssociatedIrp.SystemBuffer =
WorkItem->IrpBuffer;
631 Stack->Parameters.DeviceIoControl.InputBufferLength = UniqueId->UniqueIdLength +
sizeof(
USHORT);
632 Stack->Parameters.DeviceIoControl.OutputBufferLength =
WorkItem->IrpBufferLength;
633 Stack->Parameters.DeviceIoControl.Type3InputBuffer = 0;
701 WorkItem->DeviceExtension = DeviceExtension;
_In_ PVOID NotificationStructure
return STATUS_NOT_SUPPORTED
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
#define IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY
struct _TARGET_DEVICE_CUSTOM_NOTIFICATION TARGET_DEVICE_CUSTOM_NOTIFICATION
#define PsGetCurrentThread()
#define STATUS_MORE_PROCESSING_REQUIRED
#define UNREFERENCED_PARAMETER(P)
NTSTATUS NTAPI UniqueIdChangeNotifyCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
struct _LIST_ENTRY * Blink
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
PDEVICE_OBJECT Objects[1]
VOID SendOnlineNotification(IN PUNICODE_STRING SymbolicName)
_In_ PNDIS_STRING _In_ PNDIS_STRING SymbolicName
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
#define InterlockedCompareExchange
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
#define InsertTailList(ListHead, Entry)
IoSetCancelRoutine(Irp, CancelRoutine)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
VOID NTAPI IoInitializeIrp(IN PIRP Irp, IN USHORT PacketSize, IN CCHAR StackSize)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
_In_ PVOID _In_ ULONG Event
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
VOID RegisterForTargetDeviceNotification(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_INFORMATION DeviceInformation)
#define IOCTL_VOLUME_ONLINE
#define IoCompleteRequest
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
VOID WaitForOnlinesToComplete(IN PDEVICE_EXTENSION DeviceExtension)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
VOID NTAPI SendOnlineNotificationWorker(IN PVOID Parameter)
struct _MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT
struct _LIST_ENTRY * Flink
VOID RemoveWorkItem(IN PUNIQUE_ID_WORK_ITEM WorkItem)
#define ExInitializeWorkItem(Item, Routine, Context)
#define NT_SUCCESS(StatCode)
VOID MountMgrNotifyNameChange(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING DeviceName, IN BOOLEAN ValidateVolume)
#define ObDereferenceObject
VOID IssueUniqueIdChangeNotifyWorker(IN PUNIQUE_ID_WORK_ITEM WorkItem, IN PMOUNTDEV_UNIQUE_ID UniqueId)
NTSTATUS NTAPI IoSetCompletionRoutineEx(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_COMPLETION_ROUTINE CompletionRoutine, IN PVOID Context, IN BOOLEAN InvokeOnSuccess, IN BOOLEAN InvokeOnError, IN BOOLEAN InvokeOnCancel)
VOID NTAPI UniqueIdChangeNotifyWorker(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
#define FILE_READ_ATTRIBUTES
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
VOID PostOnlineNotification(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING SymbolicName)
static const WCHAR Cleanup[]
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
#define AllocatePool(Size)
#define InterlockedExchange
VOID ReconcileThisDatabaseWithMaster(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_INFORMATION DeviceInformation)
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
struct _ONLINE_NOTIFICATION_WORK_ITEM * PONLINE_NOTIFICATION_WORK_ITEM
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
#define KeInitializeEvent(pEvt, foo, foo2)
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
#define IoSizeOfIrp(_StackSize)
#define InitializeListHead(ListHead)
static OUT PIO_STATUS_BLOCK IoStatusBlock
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define KeReleaseSpinLock(sl, irql)
#define IRP_MN_QUERY_DEVICE_RELATIONS
NTSTATUS NTAPI MountMgrTargetDeviceNotification(IN PVOID NotificationStructure, IN PVOID Context)
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)
struct tagContext Context
VOID NTAPI IoFreeIrp(IN PIRP Irp)
VOID IssueUniqueIdChangeNotify(IN PDEVICE_EXTENSION DeviceExtension, IN PUNICODE_STRING DeviceName, IN PMOUNTDEV_UNIQUE_ID UniqueId)
NTSTATUS NTAPI IoRegisterPlugPlayNotification(_In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, _In_ ULONG EventCategoryFlags, _In_opt_ PVOID EventCategoryData, _In_ PDRIVER_OBJECT DriverObject, _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, _Inout_opt_ PVOID Context, _Out_ PVOID *NotificationEntry)
struct _FILE_OBJECT * FileObject
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
VOID MountMgrNotify(IN PDEVICE_EXTENSION DeviceExtension)
VOID MountMgrUniqueIdChangeRoutine(IN PDEVICE_EXTENSION DeviceExtension, IN PMOUNTDEV_UNIQUE_ID OldUniqueId, IN PMOUNTDEV_UNIQUE_ID NewUniqueId)
NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PVOID NotificationStructure, IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, IN PVOID Context OPTIONAL)
#define IRP_MJ_DEVICE_CONTROL