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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// 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, MAX_L2CAP_INFO_DATA_LENGTH, MAX_L2CAP_PING_DATA_LENGTH, MAX_UUIDS_IN_QUERY,
};
use shared::bthsdpdef::{SdpAttributeRange, SdpQueryUuid};
use shared::guiddef::GUID;
use shared::minwindef::{DWORD, PULONG, UCHAR, ULONG, USHORT};
use shared::ws2def::IOC_VENDOR;
use um::winnt::HANDLE;
pub const BT_PORT_ANY: ULONG = -1i32 as ULONG;
pub const BT_PORT_MIN: ULONG = 0x1;
pub const BT_PORT_MAX: ULONG = 0xffff;
pub const BT_PORT_DYN_FIRST: ULONG = 0x1001;
pub const AF_BTH: USHORT = 32;
pub const PH_BTH: USHORT = AF_BTH;
pub const NS_BTH: USHORT = 16;
STRUCT!{#[repr(packed)] struct SOCKADDR_BTH {
    addressFamily: USHORT,
    btAddr: BTH_ADDR,
    serviceClassId: GUID,
    port: ULONG,
}}
pub type PSOCKADDR_BTH = *mut SOCKADDR_BTH;
DEFINE_GUID!{SVCID_BTH_PROVIDER,
    0x6aa63e0, 0x7d60, 0x41ff, 0xaf, 0xb2, 0x3e, 0xe6, 0xd2, 0xd9, 0x39, 0x2d}
pub const BTH_ADDR_STRING_SIZE: DWORD = 12;
pub const BTHPROTO_RFCOMM: USHORT = 0x0003;
pub const BTHPROTO_L2CAP: USHORT = 0x0100;
pub const SOL_RFCOMM: USHORT = BTHPROTO_RFCOMM;
pub const SOL_L2CAP: USHORT = BTHPROTO_L2CAP;
pub const SOL_SDP: USHORT = 0x0101;
pub const SO_BTH_AUTHENTICATE: ULONG = 0x80000001;
pub const SO_BTH_ENCRYPT: ULONG = 0x00000002;
pub const SO_BTH_MTU: ULONG = 0x80000007;
pub const SO_BTH_MTU_MAX: ULONG = 0x80000008;
pub const SO_BTH_MTU_MIN: ULONG = 0x8000000a;
pub const RFCOMM_MAX_MTU: ULONG = 0x000003F3;
pub const RFCOMM_MIN_MTU: ULONG = 0x00000017;
pub const BTH_SDP_VERSION: ULONG = 1;
STRUCT!{#[repr(packed)] struct BTH_SET_SERVICE {
    pSdpVersion: PULONG,
    pRecordHandle: HANDLE,
    fCodService: ULONG,
    Reserved: [ULONG; 5],
    ulRecordLength: ULONG,
    pRecord: [UCHAR; 1],
}}
pub type PBTH_SET_SERVICE = *mut BTH_SET_SERVICE;
pub const SDP_DEFAULT_INQUIRY_SECONDS: UCHAR = 6;
pub const SDP_MAX_INQUIRY_SECONDS: UCHAR = 60;
pub const SDP_DEFAULT_INQUIRY_MAX_RESPONSES: UCHAR = 255;
pub const SDP_SERVICE_SEARCH_REQUEST: ULONG = 1;
pub const SDP_SERVICE_ATTRIBUTE_REQUEST: ULONG = 2;
pub const SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST: ULONG = 3;
STRUCT!{#[repr(packed)] struct BTH_QUERY_DEVICE {
    LAP: ULONG,
    length: UCHAR,
}}
pub type PBTH_QUERY_DEVICE = *mut BTH_QUERY_DEVICE;
STRUCT!{#[repr(packed)] struct BTH_QUERY_SERVICE {
    type_: ULONG,
    serviceHandle: ULONG,
    uuids: [SdpQueryUuid; MAX_UUIDS_IN_QUERY],
    numRange: ULONG,
    pRange: [SdpAttributeRange; 1],
}}
pub type PBTH_QUERY_SERVICE = *mut BTH_QUERY_SERVICE;
pub const BTHNS_RESULT_DEVICE_CONNECTED: DWORD = 0x00010000;
pub const BTHNS_RESULT_DEVICE_REMEMBERED: DWORD = 0x00020000;
pub const BTHNS_RESULT_DEVICE_AUTHENTICATED: DWORD = 0x00040000;
pub const SIO_RFCOMM_SEND_COMMAND: DWORD = _WSAIORW!(IOC_VENDOR, 101);
pub const SIO_RFCOMM_WAIT_COMMAND: DWORD = _WSAIORW!(IOC_VENDOR, 102);
pub const SIO_BTH_PING: DWORD = _WSAIORW!(IOC_VENDOR, 8);
pub const SIO_BTH_INFO: DWORD = _WSAIORW!(IOC_VENDOR, 9);
pub const SIO_RFCOMM_SESSION_FLOW_OFF: DWORD = _WSAIORW!(IOC_VENDOR, 103);
pub const SIO_RFCOMM_TEST: DWORD = _WSAIORW!(IOC_VENDOR, 104);
pub const SIO_RFCOMM_USECFC: DWORD = _WSAIORW!(IOC_VENDOR, 105);
macro_rules! BIT {
    ($b:expr) => {
        1 << $b
    };
}
STRUCT!{#[repr(packed)] struct RFCOMM_MSC_DATA {
    Signals: UCHAR,
    Break: UCHAR,
}}
pub type PRFCOMM_MSC_DATA = *mut RFCOMM_MSC_DATA;
pub const MSC_EA_BIT: UCHAR = BIT!(0);
pub const MSC_FC_BIT: UCHAR = BIT!(1);
pub const MSC_RTC_BIT: UCHAR = BIT!(2);
pub const MSC_RTR_BIT: UCHAR = BIT!(3);
pub const MSC_RESERVED: UCHAR = BIT!(4) | BIT!(5);
pub const MSC_IC_BIT: UCHAR = BIT!(6);
pub const MSC_DV_BIT: UCHAR = BIT!(7);
pub const MSC_BREAK_BIT: UCHAR = BIT!(1);
macro_rules! MSC_SET_BREAK_LENGTH {
    ($b: expr, $l: expr) => {
        ($b & 0x3) | (($l & 0xf) << 4)
    };
}
STRUCT!{#[repr(packed)] struct RFCOMM_RLS_DATA {
    LineStatus: UCHAR,
}}
pub type PRFCOMM_RLS_DATA = *mut RFCOMM_RLS_DATA;
pub const RLS_ERROR: UCHAR = 0x01;
pub const RLS_OVERRUN: UCHAR = 0x02;
pub const RLS_PARITY: UCHAR = 0x04;
pub const RLS_FRAMING: UCHAR = 0x08;
STRUCT!{#[repr(packed)] struct RFCOMM_RPN_DATA {
    Baud: UCHAR,
    Data: UCHAR,
    FlowControl: UCHAR,
    XonChar: UCHAR,
    XoffChar: UCHAR,
    ParameterMask1: UCHAR,
    ParameterMask2: UCHAR,
}}
pub type PRFCOMM_RPN_DATA = *mut RFCOMM_RPN_DATA;
pub const RPN_BAUD_2400: UCHAR = 0;
pub const RPN_BAUD_4800: UCHAR = 1;
pub const RPN_BAUD_7200: UCHAR = 2;
pub const RPN_BAUD_9600: UCHAR = 3;
pub const RPN_BAUD_19200: UCHAR = 4;
pub const RPN_BAUD_38400: UCHAR = 5;
pub const RPN_BAUD_57600: UCHAR = 6;
pub const RPN_BAUD_115200: UCHAR = 7;
pub const RPN_BAUD_230400: UCHAR = 8;
pub const RPN_DATA_5: UCHAR = 0x0;
pub const RPN_DATA_6: UCHAR = 0x1;
pub const RPN_DATA_7: UCHAR = 0x2;
pub const RPN_DATA_8: UCHAR = 0x3;
pub const RPN_STOP_1: UCHAR = 0x0;
pub const RPN_STOP_1_5: UCHAR = 0x4;
pub const RPN_PARITY_NONE: UCHAR = 0x00;
pub const RPN_PARITY_ODD: UCHAR = 0x08;
pub const RPN_PARITY_EVEN: UCHAR = 0x18;
pub const RPN_PARITY_MARK: UCHAR = 0x28;
pub const RPN_PARITY_SPACE: UCHAR = 0x38;
pub const RPN_FLOW_X_IN: UCHAR = 0x01;
pub const RPN_FLOW_X_OUT: UCHAR = 0x02;
pub const RPN_FLOW_RTR_IN: UCHAR = 0x04;
pub const RPN_FLOW_RTR_OUT: UCHAR = 0x08;
pub const RPN_FLOW_RTC_IN: UCHAR = 0x10;
pub const RPN_FLOW_RTC_OUT: UCHAR = 0x20;
pub const RPN_PARAM_BAUD: UCHAR = 0x01;
pub const RPN_PARAM_DATA: UCHAR = 0x02;
pub const RPN_PARAM_STOP: UCHAR = 0x04;
pub const RPN_PARAM_PARITY: UCHAR = 0x08;
pub const RPN_PARAM_P_TYPE: UCHAR = 0x10;
pub const RPN_PARAM_XON: UCHAR = 0x20;
pub const RPN_PARAM_XOFF: UCHAR = 0x40;
pub const RPN_PARAM_X_IN: UCHAR = 0x01;
pub const RPN_PARAM_X_OUT: UCHAR = 0x02;
pub const RPN_PARAM_RTR_IN: UCHAR = 0x04;
pub const RPN_PARAM_RTR_OUT: UCHAR = 0x08;
pub const RPN_PARAM_RTC_IN: UCHAR = 0x10;
pub const RPN_PARAM_RTC_OUT: UCHAR = 0x20;
pub const RFCOMM_CMD_NONE: UCHAR = 0;
pub const RFCOMM_CMD_MSC: UCHAR = 1;
pub const RFCOMM_CMD_RLS: UCHAR = 2;
pub const RFCOMM_CMD_RPN: UCHAR = 3;
pub const RFCOMM_CMD_RPN_REQUEST: UCHAR = 4;
pub const RFCOMM_CMD_RPN_RESPONSE: UCHAR = 5;
UNION!{#[repr(packed)] union RFCOMM_COMMAND_Data {
    [u8; 7],
    MSC MSC_mut: RFCOMM_MSC_DATA,
    RLS RLS_mut: RFCOMM_RLS_DATA,
    RPN RPN_mut: RFCOMM_RPN_DATA,
}}
STRUCT!{#[repr(packed)] struct RFCOMM_COMMAND {
    CmdType: ULONG,
    Data: RFCOMM_COMMAND_Data,
}}
pub type PRFCOMM_COMMAND = *mut RFCOMM_COMMAND;
STRUCT!{#[repr(packed)] struct BTH_PING_REQ {
    btAddr: BTH_ADDR,
    dataLen: UCHAR,
    data: [UCHAR; MAX_L2CAP_PING_DATA_LENGTH],
}}
pub type PBTH_PING_REQ = *mut BTH_PING_REQ;
STRUCT!{#[repr(packed)] struct BTH_PING_RSP {
    dataLen: UCHAR,
    data: [UCHAR; MAX_L2CAP_PING_DATA_LENGTH],
}}
pub type PBTH_PING_RSP = *mut BTH_PING_RSP;
STRUCT!{#[repr(packed)] struct BTH_INFO_REQ {
    btAddr: BTH_ADDR,
    infoType: USHORT,
}}
pub type PBTH_INFO_REQ = *mut BTH_INFO_REQ;
UNION!{#[repr(packed)] union BTH_INFO_RSP_u {
    [u8; MAX_L2CAP_INFO_DATA_LENGTH],
    connectionlessMTU connectionlessMTU_mut: USHORT,
    data data_mut: [UCHAR; MAX_L2CAP_INFO_DATA_LENGTH],
}}
STRUCT!{#[repr(packed)] struct BTH_INFO_RSP {
    result: USHORT,
    dataLen: UCHAR,
    u: BTH_INFO_RSP_u,
}}
pub type PBTH_INFO_RSP = *mut BTH_INFO_RSP;
pub type BTHNS_SETBLOB = BTH_SET_SERVICE;
pub type PBTHNS_SETBLOB = PBTH_SET_SERVICE;
pub type BTHNS_INQUIRYBLOB = BTH_QUERY_DEVICE;
pub type PBTHNS_INQUIRYBLOB = PBTH_QUERY_DEVICE;
pub type BTHNS_RESTRICTIONBLOB = BTH_QUERY_SERVICE;
pub type PBTHNS_RESTRICTIONBLOB = PBTH_QUERY_SERVICE;