⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uappcommontype.pas

📁 实现U盘或移动硬盘插入和退出时得到事件响应
💻 PAS
字号:
unit UAppCommonType;

interface

uses
  Windows;

const
  CfgMgr32ModuleName = 'cfgmgr32.dll';
  SetupApiModuleName = 'SetupApi.dll';

type
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;
  
  DEV_BROADCAST_HDR = packed record
    DBCH_Size: DWORD;
    DBCH_DeviceType: DWORD;
    dbch_reserved: DWORD;
  end;
  
  PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
  PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;

  PDevBroadcastVolume = ^DEV_BROADCAST_VOLUME;
  DEV_BROADCAST_VOLUME = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
  end;
  
  STORAGE_DEVICE_NUMBER = record
    DeviceType: Cardinal;
    DeviceNumber: Cardinal;
    PartitionNumber: Cardinal;
  end;
  
  TStorageDeviceNumber = STORAGE_DEVICE_NUMBER;
  PSTORAGE_DEVICE_NUMBER = ^STORAGE_DEVICE_NUMBER;
  PStorageDeviceNumber = ^TStorageDeviceNumber;

  STORAGE_BUS_TYPE = (BusTypeUnknown = 00, BusTypeScsi, BusTypeAtapi,
    BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID,
    BusTypeMaxReserved = 255);

  STORAGE_QUERY_TYPE = (
    PropertyStandardQuery = 0, // 读取描述
    PropertyExistsQuery, // 测试是否支持
    PropertyMaskQuery, // 读取指定的描述
    PropertyQueryMaxDefined // 验证数据
    );

  STORAGE_PROPERTY_ID = (
    StorageDeviceProperty = 0, // 查询设备属性
    StorageAdapterProperty, // 查询适配器属性
    StorageDeviceIdProperty);

  STORAGE_PROPERTY_QUERY = record
    PropertyId: Cardinal;
    QueryType: Cardinal;
    AdditionalParameters: UCHAR;
  end;
  
  STORAGE_DEVICE_DESCRIPTOR = record
    Version: ULONG;
    Size: ULONG;
    DeviceType: UCHAR;
    DeviceTypeModifier: UCHAR;
    RemovableMedia: Boolean;
    CommandQueueing: Boolean;
    VendorIdOffset: ULONG;
    ProductIdOffset: ULONG;
    ProductRevisionOffset: ULONG;
    SerialNumberOffset: ULONG;
    BusType: Cardinal;
    RawPropertiesLength: ULONG;
    RawDeviceProperties: UCHAR;
  end;
  
  PSTORAGE_DEVICE_DESCRIPTOR = ^STORAGE_DEVICE_DESCRIPTOR;

  TUSBNotifyEvent = procedure (Sender: TObject; AUSBDevice: TObject) of object;
  _PNP_VETO_TYPE = (
    PNP_VetoTypeUnknown,
    PNP_VetoLegacyDevice,
    PNP_VetoPendingClose,
    PNP_VetoWindowsApp,
    PNP_VetoWindowsService,
    PNP_VetoOutstandingOpen,
    PNP_VetoDevice,
    PNP_VetoDriver,
    PNP_VetoIllegalDeviceRequest,
    PNP_VetoInsufficientPower,
    PNP_VetoNonDisableable,
    PNP_VetoLegacyDriver
    );
  PNP_VETO_TYPE = _PNP_VETO_TYPE;
  PPNP_VETO_TYPE = ^_PNP_VETO_TYPE;
  TPNPVetoType = _PNP_VETO_TYPE;
  PPNPVetoType = PPNP_VETO_TYPE;

  _DISK_EXTENT = record
    DiskNumber: Cardinal;
    StartingOffset: LARGE_INTEGER;
    ExtentLength: LARGE_INTEGER;
  end;
  
  DISK_EXTENT = _DISK_EXTENT;
  TDiskExtent = _DISK_EXTENT;
  PDiskExtent = ^TDiskExtent;

  _VOLUME_DISK_EXTENTS = record
    NumberOfDiskExtents: Cardinal;
    Extents: array[0..0] of TDiskExtent;
  end;
  
  VOLUME_DISK_EXTENTS = _VOLUME_DISK_EXTENTS;
  TVolumeDiskExtents = _VOLUME_DISK_EXTENTS;
  PVolumeDiskExtents = ^TVolumeDiskExtents;

function CM_Get_Parent(var pdnDevInst: DWORD; dnDevInst: DWORD; ulFlags: ULong):
  DWord; stdcall;
external CfgMgr32ModuleName name 'CM_Get_Parent';

function CM_Get_Device_ID(dnDevInst: DWORD; Buffer: PChar; BufferLen: ULong;
  ulFlags: ULong): DWord; stdcall;
external CfgMgr32ModuleName name 'CM_Get_Device_IDA';

function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPCSTR;
  lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall;
external kernel32 name 'GetVolumeNameForVolumeMountPointA';

function CM_Get_DevNode_Status(pulStatus: PULong; pulProblemNumber: PULong;
  dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
external CfgMgr32ModuleName name 'CM_Get_DevNode_Status';

function CM_Request_Device_Eject(dnDevInst: DWord; out pVetoType: TPNPVetoType;
  pszVetoName: PChar; ulNameLength: ULong; ulFlags: ULong): DWord; stdcall;
external SetupApiModuleName name 'CM_Request_Device_EjectA';

function CM_Request_Device_Eject_NoUi(dnDevInst: DWord; pVetoType: PPNPVetoType;
  pszVetoName: PChar; ulNameLength: ULong; ulFlags: ULong): DWord; stdcall;
external SetupApiModuleName name 'CM_Request_Device_EjectA';

const
  GUID_DEVINTERFACE_VOLUME: TGUID = '{53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}';
  GUID_DEVINTERFACE_USB_DEVICE: TGUID =
  '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  GUID_DEVINTERFACE_DISK: TGUID = '{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}';

  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone

  DBT_DEVTYP_VOLUME = $00000002; // Logical volume
  DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

  STORAGE_DEVICE_DESCRIPTOR_OTHERSIZE = 512;
  INTERFACE_DETAIL_SIZE = 1024;
    // SetupDiGetInterfaceDeviceDetail所需要的输出长度

  METHOD_BUFFERED = 0;
  FILE_ANY_ACCESS = 0;
  FILE_DEVICE_MASS_STORAGE = $0000002D;
  IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
  IOCTL_STORAGE_QUERY_PROPERTY = ((IOCTL_STORAGE_BASE shl 16) or (FILE_ANY_ACCESS
    shl 14) or ($0500 shl 2) or METHOD_BUFFERED);
  IOCTL_STORAGE_GET_DEVICE_NUMBER = ((IOCTL_STORAGE_BASE shl 16) or
    (FILE_ANY_ACCESS
    shl 14) or ($0420 shl 2) or METHOD_BUFFERED);
  IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = $00560000;

  MAX_DRIVES = 26;

  CR_SUCCESS = $00000000;
  CR_REMOVE_VETOED = $00000017;

  DN_DISABLEABLE     = $00002000; // Can be rebalanced
  {$EXTERNALSYM DN_DISABLEABLE}
  DN_REMOVABLE       = $00004000; // Can be removed
  {$EXTERNALSYM DN_REMOVABLE}


   // matches cfmgr32.h CM_DEVCAP_* definitions
  DEVICE_CAPABILITIES_UNKNOWN = $00000000;
  DEVICE_CAPABILITIES_LOCKSUPPORTED = $00000001;
  DEVICE_CAPABILITIES_EJECTSUPPORTED = $00000002;
  DEVICE_CAPABILITIES_REMOVABLE = $00000004;
  DEVICE_CAPABILITIES_DOCKDEVICE = $00000008;
  DEVICE_CAPABILITIES_UNIQUEID = $00000010;
  DEVICE_CAPABILITIES_SILENTINSTALL = $00000020;
  DEVICE_CAPABILITIES_RAWDEVICEOK = $00000040;
  DEVICE_CAPABILITIES_SURPRISEREMOVALOK = $00000080;
  DEVICE_CAPABILITIES_HARDWAREDISABLED = $00000100;
  DEVICE_CAPABILITIES_NONDYNAMIC = $00000200;

  USBManagerGetDevicesSetupDiEnumDeviceInterfacesError =
    'USBManager GetDevices SetupDiEnumDeviceInterfaces Error';
  USBManagerGetDevicesSetupDiGetDeviceInterfaceDetailError =
    'USBManager GetDevices SetupDiGetDeviceInterfaceDetail Error';
  USBDiskEjectVetoFailInfo = 'USB设备弹出失败(Veto:  %s)!';
  USBDiskEjectFailInfo = 'USB设备弹出失败(%s)!';
  USBDiskArrivalInfo = 'USB设备插入,驱动器为%s!';
  USBDiskArrivalCopyConfirmInfo = '拷贝数据到USB设备吗?';

implementation

end.

⌨️ 快捷键说明

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