private bool IsDesiredDevice(IntPtr lParam)
        {
            var hdr = (Native.DEV_BROADCAST_HDR)Marshal.PtrToStructure(lParam, typeof(Native.DEV_BROADCAST_HDR));

            if (hdr.dbcc_devicetype == (uint)_deviceType)
            {
                if (_deviceType == Native.DeviceType.DBT_DEVTYP_DEVICEINTERFACE)
                {
                    Native.DEV_BROADCAST_DEVICEINTERFACE deviceInterface =
                        (Native.DEV_BROADCAST_DEVICEINTERFACE)Marshal.PtrToStructure(lParam, typeof(Native.DEV_BROADCAST_DEVICEINTERFACE));

                    var str  = Encoding.Default.GetString(deviceInterface.dbcc_classguid);
                    var guid = new Guid(deviceInterface.dbcc_classguid);
                    if (guid.ToString() == DEVICE_INTERFACE_GUID)
                    {
                        return(true);
                    }
                }
                else
                {
                    //TODO: other device type
                }
            }
            return(false);
        }
        public void RegisterNotificationFor(IntPtr recipientHandle, Native.DeviceType deviceType)
        {
            _deviceType = deviceType;

            IntPtr notificationFilter = IntPtr.Zero;

            switch (_deviceType)
            {
            case Native.DeviceType.DBT_DEVTYP_DEVICEINTERFACE:
            {
                Native.DEV_BROADCAST_DEVICEINTERFACE di =
                    new Native.DEV_BROADCAST_DEVICEINTERFACE();

                var size = Marshal.SizeOf(di);

                di.dbcc_size       = (uint)size;
                di.dbcc_devicetype = (int)Native.DeviceType.DBT_DEVTYP_DEVICEINTERFACE;
                di.dbcc_reserved   = 0;
                di.dbcc_classguid  = new Guid(DEVICE_INTERFACE_GUID).ToByteArray();

                notificationFilter = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(di, notificationFilter, true);
                break;
            }

            case Native.DeviceType.DBT_DEVTYP_HANDLE:
            {
                Native.DEV_BROADCAST_HANDLE di =
                    new Native.DEV_BROADCAST_HANDLE();

                var size = Marshal.SizeOf(di);

                di.dbch_size       = (uint)size;
                di.dbch_devicetype = (int)Native.DeviceType.DBT_DEVTYP_HANDLE;
                di.dbch_reserved   = 0;

                //https://msdn.microsoft.com/en-us/library/windows/desktop/aa363217(v=vs.85).aspx
                di.dbch_handle     = IntPtr.Zero;      //Be sure to set the dbch_handle member to the device handle obtained from the CreateFile function.
                di.dbch_hdevnotify = IntPtr.Zero;

                //TODO
                //di.dbch_eventguid =
                //di.dbch_nameoffset =
                //di.dbch_data =

                break;
            }

            case Native.DeviceType.DBT_DEVTYP_OEM:
            {
                //TODO

                break;
            }

            case Native.DeviceType.DBT_DEVTYP_PORT:
            {
                //TODO
                break;
            }

            case Native.DeviceType.DBT_DEVTYP_VOLUME:
            {
                //TODO
                break;
            }

            default:
                break;
            }

            if (notificationFilter != IntPtr.Zero)
            {
                _hdNotify = Native.RegisterDeviceNotification(recipientHandle, notificationFilter, (uint)Native.DEVICE_NOTIFY.DEVICE_NOTIFY_WINDOW_HANDLE);
            }
        }