vdkdebug.c

来自「Virtual Disk Driver」· C语言 代码 · 共 1,311 行 · 第 1/5 页

C
1,311
字号
/*	vdkdebug.c	Virtual Disk kernel-mode driver for Windows NT platform	Debug functions	Copyright (C) 2003 Ken Kato*/#include "vdkbase.h"#include "vdkutil.h"#include "vdkioctl.h"#include "vdkaccess.h"#include "imports.h"#include "vdkdrv.h"#if DBGextern ULONG 		TraceFlags = 0;extern const char 	*TraceFile = 0;extern ULONG 		TraceLine = 0;//// Output IO Control code and result status strings//VOIDPrintIoCtrlStatus(	PWSTR		dev_name,	ULONG		ctrl_code,	NTSTATUS	status){	PCSTR 	ioctl;	PCSTR 	stat;	CHAR 	severity;	ioctl 	= IoControlCodeToStr(ctrl_code);	stat 	= VdkStatusStr(status);	switch (status & 0xf0000000) {	case 0x00000000:	severity = 'S';	break;	case 0x40000000:	severity = 'I';	break;	case 0x80000000:	severity = 'W';	break;	case 0xC0000000:	severity = 'E';	break;	default:			severity = '?';	}	if (ioctl) {		if (stat) {			KdPrint(("[VDK] %S %s - (%c)%s\n", dev_name, ioctl, severity, stat));		}		else {			KdPrint(("[VDK] %S %s - 0x%x\n", dev_name, ioctl, status));		}	}	else {		if (stat) {			KdPrint((				"[VDK] %S Unknown IoControlCode %#x - (%c)%s\n",				dev_name, ctrl_code, severity, stat));		}		else {			KdPrint((				"[VDK] %S Unknown IoControlCode 0x%x - 0x%x\n",				dev_name, ctrl_code, status));		}	}}#include <ntdddisk.h>#include <ntddft.h>#include <ntddstor.h>#if (VER_PRODUCTID < 2195)//// imports from Win2K DDK//// mountmgr.h#define MOUNTMGRCONTROLTYPE  ((ULONG) 'm')#define MOUNTDEVCONTROLTYPE  ((ULONG) 'M')#define IOCTL_MOUNTMGR_CREATE_POINT 				CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_DELETE_POINTS				CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_QUERY_POINTS 				CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY 		CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER			CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS			CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED	CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED	CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_CHANGE_NOTIFY				CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE		CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES	CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION	CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)// mountdev.h#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID				CTL_CODE(MOUNTDEVCONTROLTYPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY		CTL_CODE(MOUNTDEVCONTROLTYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME			CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME	CTL_CODE(MOUNTDEVCONTROLTYPE, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTDEV_LINK_CREATED 				CTL_CODE(MOUNTDEVCONTROLTYPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTDEV_LINK_DELETED 				CTL_CODE(MOUNTDEVCONTROLTYPE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)// ntdddisk.h#define IOCTL_DISK_UPDATE_DRIVE_SIZE				CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_GROW_PARTITION					CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_GET_CACHE_INFORMATION			CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_DISK_SET_CACHE_INFORMATION			CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_DELETE_DRIVE_LAYOUT				CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_FORMAT_DRIVE 					CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_SENSE_DEVICE 					CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_DISK_INTERNAL_SET_NOTIFY				CTL_CODE(IOCTL_DISK_BASE, 0x0102, METHOD_BUFFERED, FILE_ANY_ACCESS)// ntddft.h#define FT_SECONDARY_READ_ALT						CTL_CODE(FTTYPE, 4, METHOD_OUT_DIRECT, FILE_READ_ACCESS)#define FT_PRIMARY_READ_ALT 						CTL_CODE(FTTYPE, 5, METHOD_OUT_DIRECT, FILE_READ_ACCESS)#define FT_CLUSTER_SET_MEMBER_STATE 				CTL_CODE(FTTYPE,11, METHOD_BUFFERED, FILE_ANY_ACCESS)#define FT_CLUSTER_GET_MEMBER_STATE 				CTL_CODE(FTTYPE,12, METHOD_BUFFERED, FILE_ANY_ACCESS)// ntddft2.h#define FTCONTROLTYPE	((ULONG) 'g')#define FT_CREATE_LOGICAL_DISK						CTL_CODE(FTCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_BREAK_LOGICAL_DISK						CTL_CODE(FTCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_ENUMERATE_LOGICAL_DISKS					CTL_CODE(FTCONTROLTYPE, 2, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_QUERY_LOGICAL_DISK_INFORMATION			CTL_CODE(FTCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_ORPHAN_LOGICAL_DISK_MEMBER				CTL_CODE(FTCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_REPLACE_LOGICAL_DISK_MEMBER				CTL_CODE(FTCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_QUERY_NT_DEVICE_NAME_FOR_LOGICAL_DISK	CTL_CODE(FTCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_INITIALIZE_LOGICAL_DISK					CTL_CODE(FTCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_QUERY_DRIVE_LETTER_FOR_LOGICAL_DISK		CTL_CODE(FTCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_CHECK_IO 								CTL_CODE(FTCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_SET_DRIVE_LETTER_FOR_LOGICAL_DISK		CTL_CODE(FTCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_QUERY_NT_DEVICE_NAME_FOR_PARTITION		CTL_CODE(FTCONTROLTYPE, 12, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_CHANGE_NOTIFY							CTL_CODE(FTCONTROLTYPE, 13, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_STOP_SYNC_OPERATIONS 					CTL_CODE(FTCONTROLTYPE, 14, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define FT_QUERY_LOGICAL_DISK_ID					CTL_CODE(FTCONTROLTYPE, 100, METHOD_BUFFERED, FILE_READ_ACCESS)#define FT_CREATE_PARTITION_LOGICAL_DISK			CTL_CODE(FTCONTROLTYPE, 101, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)// ntddstor.h#define IOCTL_STORAGE_LOAD_MEDIA2					CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_EJECTION_CONTROL				CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_MCN_CONTROL					CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX			CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_RESET_BUS 					CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_STORAGE_RESET_DEVICE					CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_STORAGE_GET_DEVICE_NUMBER 			CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_PREDICT_FAILURE				CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_QUERY_PROPERTY				CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)#define OBSOLETE_IOCTL_STORAGE_RESET_BUS			CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE 		CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)// ntddvol.h#define IOCTL_VOLUME_BASE	((ULONG) 'V')#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS		CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE		CTL_CODE(IOCTL_VOLUME_BASE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_ONLINE 						CTL_CODE(IOCTL_VOLUME_BASE, 2, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_VOLUME_OFFLINE						CTL_CODE(IOCTL_VOLUME_BASE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_VOLUME_IS_OFFLINE 					CTL_CODE(IOCTL_VOLUME_BASE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_IS_IO_CAPABLE					CTL_CODE(IOCTL_VOLUME_BASE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_QUERY_FAILOVER_SET 			CTL_CODE(IOCTL_VOLUME_BASE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_QUERY_VOLUME_NUMBER			CTL_CODE(IOCTL_VOLUME_BASE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL			CTL_CODE(IOCTL_VOLUME_BASE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL			CTL_CODE(IOCTL_VOLUME_BASE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)#else 	// (VER_PRODUCTID < 2195)#include <mountmgr.h>#include <mountdev.h>#include <ntddft2.h>#include <ntddvol.h>#define FT_SECONDARY_READ_ALT						 CTL_CODE(FTTYPE, 4, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)#define FT_PRIMARY_READ_ALT 						 CTL_CODE(FTTYPE, 5, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)#endif	// (VER_PRODUCTID < 2195)#if (VER_PRODUCT_ID < 2600)//// imports from WinXP DDK//// mountmgr.h#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH		CTL_CODE(MOUNTMGRCONTROLTYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS		CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)// mountdev.h#define IOCTL_MOUNTDEV_QUERY_STABLE_GUID			CTL_CODE(MOUNTDEVCONTROLTYPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)// ntdddisk.h#define IOCTL_DISK_PERFORMANCE_OFF					CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)/*#define IOCTL_DISK_GET_PARTITION_INFO_EX			CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)*/#define IOCTL_DISK_SET_PARTITION_INFO_EX			CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX				CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX				CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_DISK_CREATE_DISK						CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)/*#define IOCTL_DISK_GET_LENGTH_INFO					CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)*/#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX			CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_DISK_GET_WRITE_CACHE_STATE			CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS)#define IOCTL_DISK_UPDATE_PROPERTIES				CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS)// ntddstor.h#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER		CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_GET_HOTPLUG_INFO				CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_STORAGE_SET_HOTPLUG_INFO				CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define IOCTL_STORAGE_BREAK_RESERVATION 			CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)// ntddvol.h#define IOCTL_VOLUME_IS_PARTITION					CTL_CODE(IOCTL_VOLUME_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_READ_PLEX						CTL_CODE(IOCTL_VOLUME_BASE, 11, METHOD_OUT_DIRECT, FILE_READ_ACCESS)#define IOCTL_VOLUME_IS_CLUSTERED					CTL_CODE(IOCTL_VOLUME_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_SET_GPT_ATTRIBUTES 			CTL_CODE(IOCTL_VOLUME_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_VOLUME_GET_GPT_ATTRIBUTES 			CTL_CODE(IOCTL_VOLUME_BASE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)#endif	// (VER_PRODUCTID < 2600)#define CASE_RETURN_STR(s)	case s: return #sPCSTRIoControlCodeToStr(	ULONG ctrl_code){	switch (ctrl_code) {	//	// VDK control codes	//	CASE_RETURN_STR( IOCTL_VDK_GET_VERSION );	CASE_RETURN_STR( IOCTL_VDK_OPEN_FILE );	CASE_RETURN_STR( IOCTL_VDK_UPDATE_DEVICE );	CASE_RETURN_STR( IOCTL_VDK_CLOSE_FILE );	CASE_RETURN_STR( IOCTL_VDK_QUERY_FILE_SIZE );	CASE_RETURN_STR( IOCTL_VDK_QUERY_FILE );	CASE_RETURN_STR( IOCTL_VDK_NUMBER_OF_PARTS );	CASE_RETURN_STR( IOCTL_VDK_CREATE_DISK );	CASE_RETURN_STR( IOCTL_VDK_DELETE_DISK );	CASE_RETURN_STR( IOCTL_VDK_NOTIFY_DISMOUNT );	CASE_RETURN_STR( IOCTL_VDK_DRIVER_INFO );	CASE_RETURN_STR( IOCTL_VDK_DEVICE_INFO );	CASE_RETURN_STR( IOCTL_VDK_DEBUG_TRACE );	//	// Standard control codes	//	// mountmgr.h	CASE_RETURN_STR( IOCTL_MOUNTMGR_CREATE_POINT );	CASE_RETURN_STR( IOCTL_MOUNTMGR_DELETE_POINTS );	CASE_RETURN_STR( IOCTL_MOUNTMGR_QUERY_POINTS );	CASE_RETURN_STR( IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY );	CASE_RETURN_STR( IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER );	CASE_RETURN_STR( IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS );	CASE_RETURN_STR( IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED );	CASE_RETURN_STR( IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED );	CASE_RETURN_STR( IOCTL_MOUNTMGR_CHANGE_NOTIFY );	CASE_RETURN_STR( IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE );	CASE_RETURN_STR( IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES );	CASE_RETURN_STR( IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION );	CASE_RETURN_STR( IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH );	CASE_RETURN_STR( IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS );	CASE_RETURN_STR( IOCTL_MOUNTDEV_QUERY_DEVICE_NAME );	// mountdev.h	CASE_RETURN_STR( IOCTL_MOUNTDEV_QUERY_UNIQUE_ID );	CASE_RETURN_STR( IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY );	CASE_RETURN_STR( IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?