Imports System.Runtime.InteropServices
Public Class Form1
Private Const WM_DEVICECHANGE As Integer = &H219
Private Const DBT_DEVICEARRIVAL As Integer = &H8000
Private Const DBT_DEVTYP_VOLUME As Integer = &H2
'Device information structure
Public Structure DEV_BROADCAST_HDR
Public dbch_size As Int32
Public dbch_devicetype As Int32
Public dbch_reserved As Int32
End Structure
'Volume information Structure
Private Structure DEV_BROADCAST_VOLUME
Public dbcv_size As Int32
Public dbcv_devicetype As Int32
Public dbcv_reserved As Int32
Public dbcv_unitmask As Int32
Public dbcv_flags As Int16
End Structure
'<<<< Function that gets the drive letter from the unit mask >>>>
Private Function GetDriveLetterFromMask(ByRef Unit As Int32)
Dim i As Integer
For i = 0 To 25
If Unit And i Then Exit For
Unit = Unit >> 1
Next
Return Chr(i + 1 + Asc("A"))
End Function
'Override message processing to check for the DEVICECHANGE message
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_DEVICECHANGE Then
If m.WParam = DBT_DEVICEARRIVAL Then
Dim DeviceInfo As DEV_BROADCAST_HDR
DeviceInfo = Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR))
If DeviceInfo.dbch_devicetype = DBT_DEVTYP_VOLUME Then
Dim Volume As DEV_BROADCAST_VOLUME
Volume = Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME))
Dim DriveLetter As String = (GetDriveLetterFromMask(Volume.dbcv_unitmask) & ":\")
Dim FileList() As String = IO.Directory.GetFiles(DriveLetter, "test.txt")
If FileList.Count > 0 Then
MessageBox.Show("Found Config File")
'<<<< The test file has been found >>>>
Else
MessageBox.Show("Could not find config file")
'<<<< Test file has not been found >>>>
End If
End If
End If
End If
MyBase.WndProc(m)
End Sub
End Class