58 ERR(
"out of memory\n");
66 path.Buffer[
i] =
'\\';
69 for (
j = 0;
j < 16;
j++) {
75 if (
j == 3 ||
j == 5 ||
j == 7 ||
j == 9) {
96 ERR(
"out of memory\n");
137 ERR(
"%.*S had a sector size of 0, and IOCTL_DISK_GET_DRIVE_GEOMETRY returned %08lx\n",
143 ERR(
"%.*S: IOCTL_DISK_GET_DRIVE_GEOMETRY returned %Iu bytes, expected %Iu\n",
158 ERR(
"out of memory\n");
168 TRACE(
"volume found\n");
175 ERR(
"out of memory\n");
211 TRACE(
"removing drive letter\n");
217 ERR(
"out of memory\n");
230 ERR(
"IOCTL_MOUNTMGR_DELETE_POINTS 1 returned %08lx\n",
Status);
242 ERR(
"out of memory\n");
250 ERR(
"IOCTL_MOUNTMGR_DELETE_POINTS 2 returned %08lx\n",
Status);
264 DRIVE_LAYOUT_INFORMATION_EX* dli =
NULL;
275 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
289 ERR(
"out of memory\n");
294 dli, dlisize,
true, &
iosb);
306 &gli,
sizeof(gli),
true,
NULL);
309 ERR(
"error reading length information: %08lx\n",
Status);
316 TRACE(
"IOCTL_STORAGE_GET_DEVICE_NUMBER returned %08lx\n",
Status);
336 if (vc->notification_entry) {
343 if (vde->mounted_device && (!
Vcb || !
Vcb->options.allow_degraded)) {
346 ERR(
"pnp_surprise_removal returned %08lx\n",
Status);
349 if (!
Vcb || !
Vcb->options.allow_degraded) {
352 WARN(
"IoSetDeviceInterfaceState returned %08lx\n",
Status);
361 if (!
Vcb || !
Vcb->options.allow_degraded) {
365 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
377 ERR(
"IOCTL_MOUNTDEV_QUERY_DEVICE_NAME returned %08lx\n",
Status);
384 ERR(
"out of memory\n");
388 ERR(
"IOCTL_MOUNTDEV_QUERY_DEVICE_NAME returned %08lx\n",
Status);
397 WARN(
"mountmgr_add_drive_letter returned %08lx\n",
Status);
410 }
else if (!skip_dev) {
413 le =
Vcb->devices.Flink;
414 while (le != &
Vcb->devices) {
417 if (
dev->devobj == vc->devobj) {
457 vde->removing =
true;
461 WARN(
"IoSetDeviceInterfaceState returned %08lx\n",
Status);
463 if (vde->pdo->AttachedDevice)
466 if (vde->open_count == 0)
478 if (vde->name.Buffer)
506 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
517 TRACE(
"IOCTL_VOLUME_ONLINE returned %08lx\n",
Status);
521 ERR(
"IOCTL_DISK_GET_LENGTH_INFO returned %08lx\n",
Status);
528 TRACE(
"IOCTL_STORAGE_GET_DEVICE_NUMBER returned %08lx\n",
Status);
544 bool changed =
false;
555 TRACE(
"removing device\n");
597 devpath->
Buffer[2] ==
'?' && devpath->
Buffer[3] ==
'\\') {
609 bool changed =
false;
620 TRACE(
"removing device\n");
674 ERR(
"out of memory\n");
681 ERR(
"out of memory\n");
688 if (
name->Length > 0) {
691 ERR(
"out of memory\n");
705 context->work_item = work_item;
739 bool need_remove =
false;
761 ERR(
"IOCTL_MOUNTDEV_QUERY_DEVICE_NAME returned %08lx\n",
Status);
768 ERR(
"out of memory\n");
772 ERR(
"IOCTL_MOUNTDEV_QUERY_DEVICE_NAME returned %08lx\n",
Status);
802 ERR(
"remove_drive_letter returned %08lx\n",
Status);
811 static const WCHAR pref[] =
L"\\DosDevices\\";
832 if (symlink.
Length >
sizeof(pref) -
sizeof(
WCHAR) &&
851 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
869 ERR(
"out of memory\n");
884 ERR(
"IOCTL_MOUNTMGR_CHANGE_NOTIFY returned %08lx\n",
Status);
888 TRACE(
"mountmgr changed\n");
896 ERR(
"IOCTL_MOUNTMGR_QUERY_POINTS 1 returned %08lx\n",
Status);
897 else if (mmps.
Size > 0) {
902 ERR(
"out of memory\n");
909 ERR(
"IOCTL_MOUNTMGR_QUERY_POINTS returned %08lx\n",
Status);
void add_volume_device(superblock *sb, PUNICODE_STRING devpath, uint64_t length, ULONG disk_num, ULONG part_num)
_In_ PVOID NotificationStructure
static PIO_STATUS_BLOCK iosb
const GUID GUID_DEVICE_INTERFACE_ARRIVAL
#define STATUS_INSUFFICIENT_RESOURCES
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
_Function_class_(IO_WORKITEM_ROUTINE)
PDRIVER_OBJECT DriverObject
#define OBJ_CASE_INSENSITIVE
GLsizei const GLchar ** path
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
struct _MOUNTMGR_MOUNT_POINT MOUNTMGR_MOUNT_POINT
void(* pnp_callback)(PDRIVER_OBJECT DriverObject, PUNICODE_STRING devpath)
static const WCHAR device_name[]
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
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 MOUNTMGR_DEVICE_NAME
#define _Requires_exclusive_lock_held_(a)
NTSTATUS mountmgr_add_drive_letter(PDEVICE_OBJECT mountmgr, PUNICODE_STRING devpath)
static void mountmgr_updated(PDEVICE_OBJECT mountmgr, MOUNTMGR_MOUNT_POINTS *mmps)
#define STATUS_BUFFER_TOO_SMALL
GLfloat GLfloat GLfloat GLfloat h
bool check_superblock_checksum(superblock *sb)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
_In_ PDEVICE_OBJECT DeviceObject
#define IOCTL_MOUNTMGR_QUERY_POINTS
NTSTATUS pnp_surprise_removal(PDEVICE_OBJECT DeviceObject, PIRP Irp)
KEVENT mountmgr_thread_event
#define FILE_REMOVABLE_MEDIA
GLenum GLuint GLenum GLsizei length
#define offsetof(TYPE, MEMBER)
void disk_arrival(PDRIVER_OBJECT DriverObject, PUNICODE_STRING devpath)
#define IOCTL_VOLUME_ONLINE
PDEVICE_OBJECT master_devobj
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
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
#define IOCTL_DISK_GET_LENGTH_INFO
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
#define IOCTL_MOUNTMGR_CHANGE_NOTIFY
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 GLint GLint j
#define REG_OPTION_NON_VOLATILE
void remove_volume_child(_Inout_ _Requires_exclusive_lock_held_(_Curr_->child_lock) _Releases_exclusive_lock_(_Curr_->child_lock) _In_ volume_device_extension *vde, _In_ volume_child *vc, _In_ bool skip_dev)
struct _LIST_ENTRY * Flink
HANDLE mountmgr_thread_handle
#define NT_SUCCESS(StatCode)
NTSTATUS remove_drive_letter(PDEVICE_OBJECT mountmgr, PUNICODE_STRING devpath)
NTSTATUS dev_ioctl(_In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG ControlCode, _In_reads_bytes_opt_(InputBufferSize) PVOID InputBuffer, _In_ ULONG InputBufferSize, _Out_writes_bytes_opt_(OutputBufferSize) PVOID OutputBuffer, _In_ ULONG OutputBufferSize, _In_ bool Override, _Out_opt_ IO_STATUS_BLOCK *iosb)
#define ObDereferenceObject
static bool fs_ignored(BTRFS_UUID *uuid)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
tIoUnregisterPlugPlayNotificationEx fIoUnregisterPlugPlayNotificationEx
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
ULONG NumberOfMountPoints
#define FILE_READ_ATTRIBUTES
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS NTAPI IoUnregisterPlugPlayNotification(_In_ PVOID NotificationEntry)
void volume_removal(PDRIVER_OBJECT DriverObject, PUNICODE_STRING devpath)
#define _Releases_exclusive_lock_(a)
static void mountmgr_process_drive(PDEVICE_OBJECT mountmgr, PUNICODE_STRING device_name)
NTSTATUS sync_read_phys(_In_ PDEVICE_OBJECT DeviceObject, _In_ PFILE_OBJECT FileObject, _In_ uint64_t StartingOffset, _In_ ULONG Length, _Out_writes_bytes_(Length) PUCHAR Buffer, _In_ bool override)
MOUNTMGR_MOUNT_POINT MountPoints[1]
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS(__stdcall * tIoUnregisterPlugPlayNotificationEx)(PVOID NotificationEntry)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
#define STATUS_BUFFER_OVERFLOW
#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX
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
const GUID GUID_DEVICE_INTERFACE_REMOVAL
static void enqueue_pnp_callback(PDRIVER_OBJECT DriverObject, PUNICODE_STRING name, pnp_callback func)
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
UNICODE_STRING registry_path
static void test_vol(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject, PUNICODE_STRING devpath, DWORD disk_num, DWORD part_num, uint64_t length)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
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)
volume_device_extension * vde
static ACCESS_MASK const OBJECT_ATTRIBUTES ULONG const UNICODE_STRING ULONG PULONG dispos
static const uint64_t superblock_addrs[]
ULONG SymbolicLinkNameOffset
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
struct _DRIVER_OBJECT * PDRIVER_OBJECT
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
#define RtlCompareMemory(s1, s2, l)
#define IOCTL_MOUNTMGR_DELETE_POINTS
void volume_arrival(PDRIVER_OBJECT DriverObject, PUNICODE_STRING devpath)
GLuint const GLchar * name
PUNICODE_STRING SymbolicLinkName