1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// 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::{BTH_ADDR, BTH_DEVICE_INFO, MAX_UUIDS_IN_QUERY};
use shared::bthsdpdef::{SdpAttributeRange, SdpQueryUuid};
use shared::minwindef::{DWORD, UCHAR, ULONG, USHORT};
use shared::ntdef::{BOOLEAN, ULONGLONG};
use um::winioctl::{FILE_ANY_ACCESS, FILE_DEVICE_BLUETOOTH, METHOD_BUFFERED, METHOD_NEITHER};
pub const BTH_IOCTL_BASE: DWORD = 0;
pub const IOCTL_INTERNAL_BTH_SUBMIT_BRB: DWORD = BTH_KERNEL_CTL!(BTH_IOCTL_BASE + 0x00);
pub const IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO: DWORD = BTH_KERNEL_CTL!(BTH_IOCTL_BASE + 0x01);
pub const IOCTL_INTERNAL_BTHENUM_GET_DEVINFO: DWORD = BTH_KERNEL_CTL!(BTH_IOCTL_BASE + 0x02);
pub const IOCTL_BTH_GET_LOCAL_INFO: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x00);
pub const IOCTL_BTH_GET_RADIO_INFO: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x01);
pub const IOCTL_BTH_GET_DEVICE_INFO: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x02);
pub const IOCTL_BTH_DISCONNECT_DEVICE: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x03);
pub const IOCTL_BTH_HCI_VENDOR_COMMAND: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x14);
pub const IOCTL_BTH_SDP_CONNECT: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x80);
pub const IOCTL_BTH_SDP_DISCONNECT: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x81);
pub const IOCTL_BTH_SDP_SERVICE_SEARCH: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x82);
pub const IOCTL_BTH_SDP_ATTRIBUTE_SEARCH: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x83);
pub const IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x84);
pub const IOCTL_BTH_SDP_SUBMIT_RECORD: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x85);
pub const IOCTL_BTH_SDP_REMOVE_RECORD: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x86);
pub const IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x87);
pub const IOCTL_BTH_GET_HOST_SUPPORTED_FEATURES: DWORD = BTH_CTL!(BTH_IOCTL_BASE + 0x88);
STRUCT!{#[repr(packed)] struct BTH_DEVICE_INFO_LIST {
    numOfDevices: ULONG,
    deviceList: [BTH_DEVICE_INFO; 1],
}}
pub type PBTH_DEVICE_INFO_LIST = *mut BTH_DEVICE_INFO_LIST;
STRUCT!{#[repr(packed)] struct BTH_RADIO_INFO {
    lmpSupportedFeatures: ULONGLONG,
    mfg: USHORT,
    lmpSubversion: USHORT,
    lmpVersion: UCHAR,
}}
pub type PBTH_RADIO_INFO = *mut BTH_RADIO_INFO;
STRUCT!{#[repr(packed)] struct BTH_LOCAL_RADIO_INFO {
    localInfo: BTH_DEVICE_INFO,
    flags: ULONG,
    hciRevision: USHORT,
    hciVersion: UCHAR,
    radioInfo: BTH_RADIO_INFO,
}}
pub type PBTH_LOCAL_RADIO_INFO = *mut BTH_LOCAL_RADIO_INFO;
pub const SDP_CONNECT_CACHE: ULONG = 0x00000001;
pub const SDP_CONNECT_ALLOW_PIN: ULONG = 0x00000002;
pub const SDP_REQUEST_TO_DEFAULT: UCHAR = 0;
pub const SDP_REQUEST_TO_MIN: UCHAR = 10;
pub const SDP_REQUEST_TO_MAX: UCHAR = 45;
pub const SERVICE_OPTION_DO_NOT_PUBLISH: ULONG = 0x00000002;
pub const SERVICE_OPTION_NO_PUBLIC_BROWSE: ULONG = 0x00000004;
pub const SERVICE_OPTION_DO_NOT_PUBLISH_EIR: ULONG = 0x00000008;
pub const SERVICE_SECURITY_USE_DEFAULTS: ULONG = 0x00000000;
pub const SERVICE_SECURITY_NONE: ULONG = 0x00000001;
pub const SERVICE_SECURITY_AUTHORIZE: ULONG = 0x00000002;
pub const SERVICE_SECURITY_AUTHENTICATE: ULONG = 0x00000004;
pub const SERVICE_SECURITY_ENCRYPT_REQUIRED: ULONG = 0x00000010;
pub const SERVICE_SECURITY_ENCRYPT_OPTIONAL: ULONG = 0x00000020;
pub const SERVICE_SECURITY_DISABLED: ULONG = 0x10000000;
pub const SERVICE_SECURITY_NO_ASK: ULONG = 0x20000000;
pub const SDP_SEARCH_NO_PARSE_CHECK: ULONG = 0x00000001;
pub const SDP_SEARCH_NO_FORMAT_CHECK: ULONG = 0x00000002;
pub type HANDLE_SDP = ULONGLONG;
pub type PHANDLE_SDP = *mut ULONGLONG;
pub type HANDLE_SDP_TYPE = HANDLE_SDP;
pub const HANDLE_SDP_NULL: HANDLE_SDP = 0x0;
pub const HANDLE_SDP_LOCAL: HANDLE_SDP = -2i64 as u64;
STRUCT!{#[repr(packed)] struct BTH_SDP_CONNECT {
    bthAddress: BTH_ADDR,
    fSdpConnect: ULONG,
    hConnection: HANDLE_SDP_TYPE,
    requestTimeout: UCHAR,
}}
pub type PBTH_SDP_CONNECT = *mut BTH_SDP_CONNECT;
STRUCT!{#[repr(packed)] struct BTH_SDP_DISCONNECT {
    hConnection: HANDLE_SDP_TYPE,
}}
pub type PBTH_SDP_DISCONNECT = *mut BTH_SDP_DISCONNECT;
STRUCT!{#[repr(packed)] struct BTH_SDP_RECORD {
    fSecurity: ULONG,
    fOptions: ULONG,
    fCodService: ULONG,
    recordLength: ULONG,
    record: [UCHAR; 1],
}}
pub type PBTH_SDP_RECORD = *mut BTH_SDP_RECORD;
STRUCT!{#[repr(packed)] struct BTH_SDP_SERVICE_SEARCH_REQUEST {
    hConnection: HANDLE_SDP_TYPE,
    uuids: [SdpQueryUuid; MAX_UUIDS_IN_QUERY],
}}
pub type PBTH_SDP_SERVICE_SEARCH_REQUEST = *mut BTH_SDP_SERVICE_SEARCH_REQUEST;
STRUCT!{#[repr(packed)] struct BTH_SDP_ATTRIBUTE_SEARCH_REQUEST {
    hConnection: HANDLE_SDP_TYPE,
    searchFlags: ULONG,
    recordHandle: ULONG,
    range: [SdpAttributeRange; 1],
}}
pub type PBTH_SDP_ATTRIBUTE_SEARCH_REQUEST = *mut BTH_SDP_ATTRIBUTE_SEARCH_REQUEST;
STRUCT!{#[repr(packed)] struct BTH_SDP_SERVICE_ATTRIBUTE_SEARCH_REQUEST {
    hConnection: HANDLE_SDP_TYPE,
    searchFlags: ULONG,
    uuids: [SdpQueryUuid; MAX_UUIDS_IN_QUERY],
    range: [SdpAttributeRange; 1],
}}
pub type PBTH_SDP_SERVICE_ATTRIBUTE_SEARCH_REQUEST = *mut BTH_SDP_SERVICE_ATTRIBUTE_SEARCH_REQUEST;
STRUCT!{#[repr(packed)] struct BTH_SDP_STREAM_RESPONSE {
    requiredSize: ULONG,
    responseSize: ULONG,
    response: [UCHAR; 1],
}}
pub type PBTH_SDP_STREAM_RESPONSE = *mut BTH_SDP_STREAM_RESPONSE;
STRUCT!{#[repr(packed)] struct BTH_COMMAND_HEADER {
    OpCode: USHORT,
    TotalParameterLength: UCHAR,
}}
pub type PBTH_COMMAND_HEADER = *mut BTH_COMMAND_HEADER;
STRUCT!{#[repr(packed)] struct BTH_VENDOR_SPECIFIC_COMMAND {
    ManufacturerId: ULONG,
    LmpVersion: UCHAR,
    MatchAnySinglePattern: BOOLEAN,
    HciHeader: BTH_COMMAND_HEADER,
    Data: [UCHAR; 1],
}}
pub type PBTH_VENDOR_SPECIFIC_COMMAND = *mut BTH_VENDOR_SPECIFIC_COMMAND;
STRUCT!{#[repr(packed)] struct BTH_VENDOR_PATTERN {
    Offset: UCHAR,
    Size: UCHAR,
    Pattern: [UCHAR; 1],
}}
pub type PBTH_VENDOR_PATTERN = *mut BTH_VENDOR_PATTERN;
STRUCT!{#[repr(packed)] struct BTH_VENDOR_EVENT_INFO {
    BthAddress: BTH_ADDR,
    EventSize: ULONG,
    EventInfo: [UCHAR; 1],
}}
pub type PBTH_VENDOR_EVENT_INFO = *mut BTH_VENDOR_EVENT_INFO;
pub const BTH_HOST_FEATURE_ENHANCED_RETRANSMISSION_MODE: ULONGLONG = 0x0000000000000001;
pub const BTH_HOST_FEATURE_STREAMING_MODE: ULONGLONG = 0x0000000000000002;
pub const BTH_HOST_FEATURE_LOW_ENERGY: ULONGLONG = 0x0000000000000004;
pub const BTH_HOST_FEATURE_SCO_HCI: ULONGLONG = 0x0000000000000008;
pub const BTH_HOST_FEATURE_SCO_HCIBYPASS: ULONGLONG = 0x0000000000000010;
STRUCT!{#[repr(packed)] struct BTH_HOST_FEATURE_MASK {
    Mask: ULONGLONG,
    Reserved1: ULONGLONG,
    Reserved2: ULONGLONG,
}}
pub type PBTH_HOST_FEATURE_MASK = *mut BTH_HOST_FEATURE_MASK;