From d0ca2edbfe64a18e19c58d05eb607b4e4427d71a Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Wed, 4 Nov 2015 11:23:02 +0000 Subject: [PATCH] Bug fixes --- Trigger/Classes/Device/StorageDisk.cs | 46 +++++++++++++--------- Trigger/Classes/System/BroadcastStructs.cs | 10 ++--- Trigger/Events/Plugins/DeviceEvents.cs | 12 +++--- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/Trigger/Classes/Device/StorageDisk.cs b/Trigger/Classes/Device/StorageDisk.cs index 138eee8..5b964dc 100644 --- a/Trigger/Classes/Device/StorageDisk.cs +++ b/Trigger/Classes/Device/StorageDisk.cs @@ -58,7 +58,7 @@ namespace Trigger.Classes.Device /// Create a new from the letter /// /// - public StorageDisk(int UnitMask) : base("") + public StorageDisk(uint UnitMask) : base("") { char letter = FirstDriveFromMask(UnitMask); this.Id = ""; @@ -165,9 +165,9 @@ namespace Trigger.Classes.Device /// /// The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C, and so on. A valid drive letter is defined when the corresponding bit is set to 1. /// Returns the first drive letter that was found. - internal static char FirstDriveFromMask(int unitmask) + internal static char FirstDriveFromMask(uint unitmask) { - int i; + ushort i; for (i = (char)0; i < 26; ++i) { @@ -184,7 +184,7 @@ namespace Trigger.Classes.Device /// /// /// - internal static StorageDisk FromUnitMask(int UnitMask) + internal static StorageDisk FromUnitMask(uint UnitMask) { if (UnitMask == 0) return new StorageDisk(null, null, null); @@ -192,16 +192,21 @@ namespace Trigger.Classes.Device char Letter = FirstDriveFromMask(UnitMask); StorageDisk sd = null; + // TODO: What if the disk is being removed? ManagementObjectCollection partitions = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_LogicalDisk.DeviceID='{0}:'}} WHERE AssocClass = Win32_LogicalDiskToPartition", Letter)).Get(); - foreach (ManagementObject partition in partitions) - { - ManagementObjectCollection disks = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition", partition["DeviceID"])).Get(); - foreach (ManagementObject disk in disks) - { - sd = CreateStorageDiskFromDrive(disk); - break; - } - } + if (partitions != null) + { + foreach (ManagementObject partition in partitions) + { + ManagementObjectCollection disks = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition", partition["DeviceID"])).Get(); + foreach (ManagementObject disk in disks) + { + sd = CreateStorageDiskFromDrive(disk); + break; + } + } + } + if (sd == null) { ManagementObjectCollection cdroms = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_CdRomDrive WHERE Drive = '{0}:\'", Letter)).Get(); @@ -212,12 +217,15 @@ namespace Trigger.Classes.Device } } - ManagementObjectCollection volumes = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '{0}:'", Letter)).Get(); - foreach (ManagementObject volume in volumes) - { - sd.AddPartition(new Partition(volume)); - break; - } + if (sd != null) + { + ManagementObjectCollection volumes = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '{0}:'", Letter)).Get(); + foreach (ManagementObject volume in volumes) + { + sd.AddPartition(new Partition(volume)); + break; + } + } return sd; } diff --git a/Trigger/Classes/System/BroadcastStructs.cs b/Trigger/Classes/System/BroadcastStructs.cs index d371e0e..265fa88 100644 --- a/Trigger/Classes/System/BroadcastStructs.cs +++ b/Trigger/Classes/System/BroadcastStructs.cs @@ -202,7 +202,7 @@ namespace Trigger.Classes.System /// The size of this structure, in bytes. /// If this is a user-defined event, this member must be the size of this header, plus the size of the variable-length data in the DEV_BROADCAST_USERDEFINED structure. /// - public int dbcv_size; + public uint dbcv_size; /// /// The device type, which determines the event-specific information that follows the first three members. /// @@ -213,13 +213,13 @@ namespace Trigger.Classes.System /// DBT_DEVTYP_PORT (0x3): Port device (serial or parallel). This structure is a DEV_BROADCAST_PORT structure. /// DBT_DEVTYP_VOLUME (0x2): Logical dbcv. This structure is a DEV_BROADCAST_VOLUME structure. /// - public int dbcv_devicetype; + public uint dbcv_devicetype; /// Reserved; do not use. - public int dbcv_reserved; + public uint dbcv_reserved; /// Bit 0=A, bit 1=B, and so on (bitmask) - public int dbcv_unitmask; + public uint dbcv_unitmask; /// DBTF_MEDIA=0x01, DBTF_NET=0x02 (bitmask) - public short dbcv_flags; + public ushort dbcv_flags; } /// diff --git a/Trigger/Events/Plugins/DeviceEvents.cs b/Trigger/Events/Plugins/DeviceEvents.cs index 950b8dc..4b921c7 100644 --- a/Trigger/Events/Plugins/DeviceEvents.cs +++ b/Trigger/Events/Plugins/DeviceEvents.cs @@ -254,14 +254,14 @@ namespace Trigger.Events { #region case DBT.DEVICEARRIVLE: case DBT.DEVICEARRIVAL: - StorageDisk device = StorageDisk.FromUnitMask(dbcv.dbcv_unitmask); + StorageDisk device = StorageDisk.FromUnitMask(dbcv.dbcv_unitmask); // Bug: unitmask = 0 when media inserted, flags passen auch nicht ((List)oldStaticValues[EventType.DeviceRemoved]).Add(device); - if (dbcv.dbcv_flags == 1 /*DBFT_MEDIA*/) + if ((dbcv.dbcv_flags & 1 /*DBFT_MEDIA*/) == 1) { if (OnMediaInserted != null) OnMediaInserted(null, new EventArgsValue(device)); } - else if (dbcv.dbcv_flags == 2 /*DBFT_NET*/) + else if ((dbcv.dbcv_flags & 2 /*DBFT_NET*/) == 2) { if (OnNetworkVolumeArrived != null) OnNetworkVolumeArrived(null, new EventArgsValue(device)); @@ -293,9 +293,11 @@ namespace Trigger.Events { OnDeviceRemoved(null, new EventArgsValue(oldDisk)); oldDisks.Remove(oldDisk); - break; + return; } - } + StorageDisk unknownDisk = StorageDisk.FromUnitMask(dbcv.dbcv_unitmask); + OnDeviceRemoved(null, new EventArgsValue(unknownDisk)); + } break; #endregion }