blob: 8b75c873920a40a44275c6e0c6270cdc5ae82ac4 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
use shared::bthdef::{AUTHENTICATION_REQUIREMENTS, BTH_ADDR, BTH_MAX_PIN_SIZE};
use shared::bthsdpdef::{SDP_LARGE_INTEGER_16, SDP_SPECIFICTYPE, SDP_TYPE, SDP_ULARGE_INTEGER_16};
use shared::guiddef::GUID;
use shared::minwindef::{BOOL, DWORD, LPBYTE, LPVOID, PULONG, UCHAR, ULONG, USHORT};
use shared::windef::HWND;
use um::minwinbase::SYSTEMTIME;
use um::winnt::{
CHAR, HANDLE, LONG, LONGLONG, LPCWSTR, LPWSTR, PVOID, PWSTR, SHORT, ULONGLONG, WCHAR,
};
pub const BLUETOOTH_MAX_NAME_SIZE: usize = 248;
pub const BLUETOOTH_MAX_PASSKEY_SIZE: usize = 16;
pub const BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE: usize = BLUETOOTH_MAX_PASSKEY_SIZE + 1;
pub const BLUETOOTH_MAX_SERVICE_NAME_SIZE: usize = 256;
pub const BLUETOOTH_DEVICE_NAME_SIZE: usize = 256;
pub type BLUETOOTH_ADDRESS = BTH_ADDR;
pub const BLUETOOTH_NULL_ADDRESS: BLUETOOTH_ADDRESS = 0x0;
STRUCT!{struct BLUETOOTH_LOCAL_SERVICE_INFO {
Enabled: BOOL,
btAddr: BLUETOOTH_ADDRESS,
szName: [WCHAR; BLUETOOTH_MAX_SERVICE_NAME_SIZE],
szDeviceString: [WCHAR; BLUETOOTH_DEVICE_NAME_SIZE],
}}
pub type PBLUETOOTH_LOCAL_SERVICE_INFO = *mut BLUETOOTH_LOCAL_SERVICE_INFO;
STRUCT!{struct BLUETOOTH_FIND_RADIO_PARAMS {
dwSize: DWORD,
}}
pub type HBLUETOOTH_RADIO_FIND = HANDLE;
extern "system" {
pub fn BluetoothFindFirstRadio(
pbtfrp: *const BLUETOOTH_FIND_RADIO_PARAMS,
phRadio: *mut HANDLE,
) -> HBLUETOOTH_RADIO_FIND;
pub fn BluetoothFindNextRadio(
hFind: HBLUETOOTH_RADIO_FIND,
phRadio: *mut HANDLE,
) -> BOOL;
pub fn BluetoothFindRadioClose(
hFind: HBLUETOOTH_RADIO_FIND,
) -> BOOL;
}
STRUCT!{struct BLUETOOTH_RADIO_INFO {
dwSize: DWORD,
address: BLUETOOTH_ADDRESS,
szName: [WCHAR; BLUETOOTH_MAX_NAME_SIZE],
ulClassofDevice: ULONG,
lmpSubversion: USHORT,
manufacturer: USHORT,
}}
pub type PBLUETOOTH_RADIO_INFO = *mut BLUETOOTH_RADIO_INFO;
extern "system" {
pub fn BluetoothGetRadioInfo(
hRadio: HANDLE,
pRadioInfo: PBLUETOOTH_RADIO_INFO,
) -> DWORD;
}
STRUCT!{struct BLUETOOTH_DEVICE_INFO {
dwSize: DWORD,
Address: BLUETOOTH_ADDRESS,
ulClassofDevice: ULONG,
fConnected: BOOL,
fRemembered: BOOL,
fAuthenticated: BOOL,
stLastSeen: SYSTEMTIME,
stLastUsed: SYSTEMTIME,
szName: [WCHAR; BLUETOOTH_MAX_NAME_SIZE],
}}
pub type PBLUETOOTH_DEVICE_INFO = *mut BLUETOOTH_DEVICE_INFO;
ENUM!{enum BLUETOOTH_AUTHENTICATION_METHOD {
BLUETOOTH_AUTHENTICATION_METHOD_LEGACY = 0x1,
BLUETOOTH_AUTHENTICATION_METHOD_OOB,
BLUETOOTH_AUTHENTICATION_METHOD_NUMERIC_COMPARISON,
BLUETOOTH_AUTHENTICATION_METHOD_PASSKEY_NOTIFICATION,
BLUETOOTH_AUTHENTICATION_METHOD_PASSKEY,
}}
pub type PBLUETOOTH_AUTHENTICATION_METHOD = *mut BLUETOOTH_AUTHENTICATION_METHOD;
ENUM!{enum BLUETOOTH_IO_CAPABILITY {
BLUETOOTH_IO_CAPABILITY_DISPLAYONLY = 0x00,
BLUETOOTH_IO_CAPABILITY_DISPLAYYESNO = 0x01,
BLUETOOTH_IO_CAPABILITY_KEYBOARDONLY = 0x02,
BLUETOOTH_IO_CAPABILITY_NOINPUTNOOUTPUT = 0x03,
BLUETOOTH_IO_CAPABILITY_UNDEFINED = 0xff,
}}
ENUM!{enum BLUETOOTH_AUTHENTICATION_REQUIREMENTS {
BLUETOOTH_MITM_ProtectionNotRequired = 0,
BLUETOOTH_MITM_ProtectionRequired = 0x1,
BLUETOOTH_MITM_ProtectionNotRequiredBonding = 0x2,
BLUETOOTH_MITM_ProtectionRequiredBonding = 0x3,
BLUETOOTH_MITM_ProtectionNotRequiredGeneralBonding = 0x4,
BLUETOOTH_MITM_ProtectionRequiredGeneralBonding = 0x5,
BLUETOOTH_MITM_ProtectionNotDefined = 0xff,
}}
UNION!{union BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS_u {
[u32; 1],
Numeric_Value Numeric_Value_mut: ULONG,
Passkey Passkey_mut: ULONG,
}}
STRUCT!{struct BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS {
deviceInfo: BLUETOOTH_DEVICE_INFO,
authenticationMethod: BLUETOOTH_AUTHENTICATION_METHOD,
ioCapability: BLUETOOTH_IO_CAPABILITY,
authenticationRequirements: BLUETOOTH_AUTHENTICATION_REQUIREMENTS,
u: BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS_u,
}}
pub type PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS = *mut BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS;
STRUCT!{struct BLUETOOTH_DEVICE_SEARCH_PARAMS {
dwSize: DWORD,
fReturnAuthenticated: BOOL,
fReturnRemembered: BOOL,
fReturnUnknown: BOOL,
fReturnConnected: BOOL,
fIssueInquiry: BOOL,
cTimeoutMultiplier: UCHAR,
hRadio: HANDLE,
}}
pub type HBLUETOOTH_DEVICE_FIND = HANDLE;
extern "system" {
pub fn BluetoothFindFirstDevice(
pbtsp: *const BLUETOOTH_DEVICE_SEARCH_PARAMS,
pbtdi: *mut BLUETOOTH_DEVICE_INFO,
) -> HBLUETOOTH_DEVICE_FIND;
pub fn BluetoothFindNextDevice(
hFind: HBLUETOOTH_DEVICE_FIND,
pbtdi: *mut BLUETOOTH_DEVICE_INFO,
) -> BOOL;
pub fn BluetoothFindDeviceClose(
hFind: HBLUETOOTH_DEVICE_FIND,
) -> BOOL;
pub fn BluetoothGetDeviceInfo(
hRadio: HANDLE,
pbtdi: *mut BLUETOOTH_DEVICE_INFO,
) -> DWORD;
pub fn BluetoothUpdateDeviceRecord(
pbtdi: *const BLUETOOTH_DEVICE_INFO,
) -> DWORD;
pub fn BluetoothRemoveDevice(
pAddress: *const BLUETOOTH_ADDRESS,
) -> DWORD;
}
STRUCT!{struct BLUETOOTH_COD_PAIRS {
ulCODMask: ULONG,
pcszDescription: LPCWSTR,
}}
FN!{stdcall PFN_DEVICE_CALLBACK(
pvParam: LPVOID,
pDevice: *const BLUETOOTH_DEVICE_INFO,
) -> BOOL}
STRUCT!{struct BLUETOOTH_SELECT_DEVICE_PARAMS {
dwSize: DWORD,
cNumOfClasses: ULONG,
prgClassOfDevices: *mut BLUETOOTH_COD_PAIRS,
pszInfo: LPWSTR,
hwndParent: HWND,
fForceAuthentication: BOOL,
fShowAuthenticated: BOOL,
fShowRemembered: BOOL,
fShowUnknown: BOOL,
fAddNewDeviceWizard: BOOL,
fSkipServicesPage: BOOL,
pfnDeviceCallback: PFN_DEVICE_CALLBACK,
pvParam: LPVOID,
cNumDevices: DWORD,
pDevices: PBLUETOOTH_DEVICE_INFO,
}}
extern "system" {
pub fn BluetoothSelectDevices(
pbtsdp: *mut BLUETOOTH_SELECT_DEVICE_PARAMS,
) -> BOOL;
pub fn BluetoothSelectDevicesFree(
pbtsdp: *mut BLUETOOTH_SELECT_DEVICE_PARAMS,
) -> BOOL;
pub fn BluetoothDisplayDeviceProperties(
hwndParent: HWND,
pbtdi: *mut BLUETOOTH_DEVICE_INFO,
) -> BOOL;
// #[deprecated]
pub fn BluetoothAuthenticateDevice(
hwndParent: HWND,
hRadio: HANDLE,
pbtbi: *mut BLUETOOTH_DEVICE_INFO,
pszPasskey: PWSTR,
ulPasskeyLength: ULONG,
) -> DWORD;
}
STRUCT!{struct BLUETOOTH_PIN_INFO {
pin: [UCHAR; BTH_MAX_PIN_SIZE],
pinLength: UCHAR,
}}
pub type PBLUETOOTH_PIN_INFO = *mut BLUETOOTH_PIN_INFO;
STRUCT!{struct BLUETOOTH_OOB_DATA_INFO {
C: [UCHAR; 16],
R: [UCHAR; 16],
}}
pub type PBLUETOOTH_OOB_DATA_INFO = *mut BLUETOOTH_OOB_DATA_INFO;
STRUCT!{struct BLUETOOTH_NUMERIC_COMPARISON_INFO {
NumericValue: ULONG,
}}
pub type PBLUETOOTH_NUMERIC_COMPARISON_INFO = *mut BLUETOOTH_NUMERIC_COMPARISON_INFO;
STRUCT!{struct BLUETOOTH_PASSKEY_INFO {
passkey: ULONG,
}}
pub type PBLUETOOTH_PASSKEY_INFO = *mut BLUETOOTH_PASSKEY_INFO;
extern "system" {
pub fn BluetoothAuthenticateDeviceEx(
hwndParentIn: HWND,
hRadioIn: HANDLE,
pbtdiInout: *mut BLUETOOTH_DEVICE_INFO,
pbtOobData: PBLUETOOTH_OOB_DATA_INFO,
authenticationRequirement: AUTHENTICATION_REQUIREMENTS,
) -> DWORD;
// #[deprecated]
pub fn BluetoothAuthenticateMultipleDevices(
hwndParent: HWND,
hRadio: HANDLE,
cDevices: DWORD,
rgbtdi: *mut BLUETOOTH_DEVICE_INFO,
) -> DWORD;
}
pub const BLUETOOTH_SERVICE_DISABLE: DWORD = 0x00;
pub const BLUETOOTH_SERVICE_ENABLE: DWORD = 0x01;
pub const BLUETOOTH_SERVICE_MASK: DWORD = BLUETOOTH_SERVICE_DISABLE | BLUETOOTH_SERVICE_ENABLE;
extern "system" {
pub fn BluetoothSetServiceState(
hRadio: HANDLE,
pbtdi: *const BLUETOOTH_DEVICE_INFO,
pGuidService: *const GUID,
dwServiceFlags: DWORD,
) -> DWORD;
pub fn BluetoothEnumerateInstalledServices(
hRadio: HANDLE,
pbtdi: *const BLUETOOTH_DEVICE_INFO,
pcServiceInout: *mut DWORD,
pGuidServices: *mut GUID,
) -> DWORD;
pub fn BluetoothEnableDiscovery(
hRadio: HANDLE,
fEnabled: BOOL,
) -> BOOL;
pub fn BluetoothIsDiscoverable(
hRadio: HANDLE,
) -> BOOL;
pub fn BluetoothEnableIncomingConnections(
hRadio: HANDLE,
fEnabled: BOOL,
) -> BOOL;
pub fn BluetoothIsConnectable(
hRadio: HANDLE,
) -> BOOL;
}
pub type HBLUETOOTH_AUTHENTICATION_REGISTRATION = HANDLE;
FN!{stdcall PFN_AUTHENTICATION_CALLBACK(
pvParam: LPVOID,
pDevice: PBLUETOOTH_DEVICE_INFO,
) -> BOOL}
extern "system" {
// #[deprecated]
pub fn BluetoothRegisterForAuthentication(
pbtdi: *const BLUETOOTH_DEVICE_INFO,
phRegHandle: *mut HBLUETOOTH_AUTHENTICATION_REGISTRATION,
pfnCallback: PFN_AUTHENTICATION_CALLBACK,
pvParam: PVOID,
) -> DWORD;
}
FN!{stdcall PFN_AUTHENTICATION_CALLBACK_EX(
pvParam: LPVOID,
pAuthCallbackParams: PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS,
) -> BOOL}
extern "system" {
pub fn BluetoothRegisterForAuthenticationEx(
pbtdiIn: *const BLUETOOTH_DEVICE_INFO,
phRegHandleOut: *mut HBLUETOOTH_AUTHENTICATION_REGISTRATION,
pfnCallbackIn: PFN_AUTHENTICATION_CALLBACK_EX,
pvParam: PVOID,
) -> DWORD;
pub fn BluetoothUnregisterAuthentication(
hRegHandle: HBLUETOOTH_AUTHENTICATION_REGISTRATION,
) -> BOOL;
// #[deprecated]
pub fn BluetoothSendAuthenticationResponse(
hRadio: HANDLE,
pbtdi: *const BLUETOOTH_DEVICE_INFO,
pszPasskey: LPCWSTR,
) -> DWORD;
}
UNION!{union BLUETOOTH_AUTHENTICATE_RESPONSE_u {
[u32; 8],
pinInfo pinInfo_mut: BLUETOOTH_PIN_INFO,
oobInfo oobInfo_mut: BLUETOOTH_OOB_DATA_INFO,
numericCompInfo numericCompInfo_mut: BLUETOOTH_NUMERIC_COMPARISON_INFO,
passkeyInfo passkeyInfo_mut: BLUETOOTH_PASSKEY_INFO,
}}
STRUCT!{struct BLUETOOTH_AUTHENTICATE_RESPONSE {
bthAddressRemote: BLUETOOTH_ADDRESS,
authMethod: BLUETOOTH_AUTHENTICATION_METHOD,
u: BLUETOOTH_AUTHENTICATE_RESPONSE_u,
negativeResponse: UCHAR,
}}
pub type PBLUETOOTH_AUTHENTICATE_RESPONSE = *mut BLUETOOTH_AUTHENTICATE_RESPONSE;
extern "system" {
pub fn BluetoothSendAuthenticationResponseEx(
hRadioIn: HANDLE,
pauthResponse: PBLUETOOTH_AUTHENTICATE_RESPONSE,
) -> DWORD;
}
STRUCT!{struct SDP_ELEMENT_DATA_data_string {
value: LPBYTE,
length: ULONG,
}}
STRUCT!{struct SDP_ELEMENT_DATA_data_url {
value: LPBYTE,
length: ULONG,
}}
STRUCT!{struct SDP_ELEMENT_DATA_data_sequence {
value: LPBYTE,
length: ULONG,
}}
STRUCT!{struct SDP_ELEMENT_DATA_data_alternative {
value: LPBYTE,
length: ULONG,
}}
UNION!{union SDP_ELEMENT_DATA_data {
[u64; 2],
int128 int128_mut: SDP_LARGE_INTEGER_16,
int64 int64_mut: LONGLONG,
int32 int32_mut: LONG,
int16 int16_mut: SHORT,
int8 int8_mut: CHAR,
uint128 uint128_mut: SDP_ULARGE_INTEGER_16,
uint64 uint64_mut: ULONGLONG,
uint32 uint32_mut: ULONG,
uint16 uint16_mut: USHORT,
uint8 uint8_mut: UCHAR,
booleanVal booleanVal_mut: UCHAR,
uuid128 uuid128_mut: GUID,
uuid32 uuid32_mut: ULONG,
uuid16 uuid16_mut: USHORT,
string string_mut: SDP_ELEMENT_DATA_data_string,
url url_mut: SDP_ELEMENT_DATA_data_url,
sequence sequence_mut: SDP_ELEMENT_DATA_data_sequence,
alternative alternative_mut: SDP_ELEMENT_DATA_data_alternative,
}}
STRUCT!{struct SDP_ELEMENT_DATA {
type_: SDP_TYPE,
specificType: SDP_SPECIFICTYPE,
data: SDP_ELEMENT_DATA_data,
}}
pub type PSDP_ELEMENT_DATA = *mut SDP_ELEMENT_DATA;
extern "system" {
pub fn BluetoothSdpGetElementData(
pSdpStream: LPBYTE,
cbSdpStreamLength: ULONG,
pData: PSDP_ELEMENT_DATA,
) -> DWORD;
}
pub type HBLUETOOTH_CONTAINER_ELEMENT = HANDLE;
extern "system" {
pub fn BluetoothSdpGetContainerElementData(
pContainerStream: LPBYTE,
cbContainerLength: ULONG,
pElement: *mut HBLUETOOTH_CONTAINER_ELEMENT,
pData: PSDP_ELEMENT_DATA,
) -> DWORD;
pub fn BluetoothSdpGetAttributeValue(
pRecordStream: LPBYTE,
cbRecordLength: ULONG,
usAttributeId: USHORT,
pAttributeData: PSDP_ELEMENT_DATA,
) -> DWORD;
}
STRUCT!{struct SDP_STRING_TYPE_DATA {
encoding: USHORT,
mibeNum: USHORT,
attributeId: USHORT,
}}
pub type PSDP_STRING_TYPE_DATA = *mut SDP_STRING_TYPE_DATA;
extern "system" {
pub fn BluetoothSdpGetString(
pRecordStream: LPBYTE,
cbRecordLength: ULONG,
pStringData: PSDP_STRING_TYPE_DATA,
usStringOffset: USHORT,
pszString: PWSTR,
pcchStringLength: PULONG,
) -> DWORD;
}
FN!{stdcall PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK(
uAttribId: ULONG,
pValueStream: LPBYTE,
cbStreamSize: ULONG,
pvParam: LPVOID,
) -> BOOL}
pub use self::BluetoothSdpEnumAttributes as BluetoothEnumAttributes;
extern "system" {
pub fn BluetoothSdpEnumAttributes(
pSDPStream: LPBYTE,
cbStreamSize: ULONG,
pfnCallback: PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK,
pvParam: LPVOID,
) -> BOOL;
pub fn BluetoothSetLocalServiceInfo(
hRadioIn: HANDLE,
pClassGuid: *const GUID,
ulInstance: ULONG,
pServiceInfoIn: *const BLUETOOTH_LOCAL_SERVICE_INFO,
) -> DWORD;
pub fn BluetoothIsVersionAvailable(
MajorVersion: UCHAR,
MinorVersion: UCHAR,
) -> BOOL;
}