private bool Callback(IntPtr pvParam, ref BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)
        {
            switch (pAuthCallbackParams.authenticationMethod)
            {
            case BluetoothAuthenticationMethod.Passkey:
            case BluetoothAuthenticationMethod.NumericComparison:
                BLUETOOTH_AUTHENTICATE_RESPONSE__NUMERIC_COMPARISON_PASSKEY_INFO nresponse = new BLUETOOTH_AUTHENTICATE_RESPONSE__NUMERIC_COMPARISON_PASSKEY_INFO();
                nresponse.authMethod          = pAuthCallbackParams.authenticationMethod;
                nresponse.bthAddressRemote    = pAuthCallbackParams.deviceInfo.Address;
                nresponse.numericComp_passkey = pAuthCallbackParams.Numeric_Value_Passkey;
                return(NativeMethods.BluetoothSendAuthenticationResponseEx(IntPtr.Zero, ref nresponse) == 0);

            case BluetoothAuthenticationMethod.Legacy:
                BLUETOOTH_AUTHENTICATE_RESPONSE__PIN_INFO response = new BLUETOOTH_AUTHENTICATE_RESPONSE__PIN_INFO();
                response.authMethod       = pAuthCallbackParams.authenticationMethod;
                response.bthAddressRemote = pAuthCallbackParams.deviceInfo.Address;
                response.pinInfo.pin      = new byte[16];
                System.Text.Encoding.ASCII.GetBytes(_pin).CopyTo(response.pinInfo.pin, 0);
                response.pinInfo.pinLength = _pin.Length;

                return(NativeMethods.BluetoothSendAuthenticationResponseEx(IntPtr.Zero, ref response) == 0);
            }

            return(false);
        }
        private bool Callback(IntPtr pvParam, ref BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)
        {
            try
            {
                switch (pAuthCallbackParams.authenticationMethod)
                {
                case BluetoothAuthenticationMethod.Passkey:
                case BluetoothAuthenticationMethod.NumericComparison:
                    BLUETOOTH_AUTHENTICATE_RESPONSE__NUMERIC_COMPARISON_PASSKEY_INFO nresponse = new BLUETOOTH_AUTHENTICATE_RESPONSE__NUMERIC_COMPARISON_PASSKEY_INFO
                    {
                        authMethod          = pAuthCallbackParams.authenticationMethod,
                        bthAddressRemote    = pAuthCallbackParams.deviceInfo.Address,
                        numericComp_passkey = pAuthCallbackParams.Numeric_Value_Passkey
                    };

                    int result = NativeMethods.BluetoothSendAuthenticationResponseEx(IntPtr.Zero, ref nresponse);
                    System.Diagnostics.Debug.WriteLine($"{result} {nresponse.negativeResponse}");
                    return(result == 0);

                case BluetoothAuthenticationMethod.Legacy:
                    BLUETOOTH_AUTHENTICATE_RESPONSE__PIN_INFO response = new BLUETOOTH_AUTHENTICATE_RESPONSE__PIN_INFO
                    {
                        authMethod       = pAuthCallbackParams.authenticationMethod,
                        bthAddressRemote = pAuthCallbackParams.deviceInfo.Address
                    };
                    response.pinInfo.pin = new byte[16];
                    System.Text.Encoding.ASCII.GetBytes(_pin).CopyTo(response.pinInfo.pin, 0);
                    response.pinInfo.pinLength = _pin.Length;

                    int authResult = NativeMethods.BluetoothSendAuthenticationResponseEx(IntPtr.Zero, ref response);
                    System.Diagnostics.Debug.WriteLine($"BluetoothSendAuthenticationResponseEx: {authResult}");
                    return(authResult == 0);
                }

                return(false);
            }
            finally
            {
                _waitHandle.Set();
                // after one call remove the registration
                BluetoothSecurity.RemoveRedundantAuthHandler(Address);
            }
        }