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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
// 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::basetsd::ULONG64;
use shared::guiddef::{GUID, IsEqualGUID};
use shared::minwindef::{UCHAR, ULONG, USHORT};
use um::winnt::{BOOLEAN, HANDLE, PVOID};
DEFINE_GUID!{GUID_BLUETOOTHLE_DEVICE_INTERFACE,
    0x781aee18, 0x7733, 0x4ce4, 0xad, 0xd0, 0x91, 0xf4, 0x1c, 0x67, 0xb5, 0x92}
DEFINE_GUID!{GUID_BLUETOOTH_GATT_SERVICE_DEVICE_INTERFACE,
    0x6e3bb679, 0x4372, 0x40c8, 0x9e, 0xaa, 0x45, 0x09, 0xdf, 0x26, 0x0c, 0xd8}
DEFINE_GUID!{BTH_LE_ATT_BLUETOOTH_BASE_GUID,
    0x00000000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}
pub const BTH_LE_SERVICE_GAP: USHORT = 0x1800;
pub const BTH_LE_SERVICE_GATT: USHORT = 0x1801;
pub const BTH_LE_GATT_ATTRIBUTE_TYPE_PRIMARY_SERVICE: USHORT = 0x2800;
pub const BTH_LE_GATT_ATTRIBUTE_TYPE_SECONDARY_SERVICE: USHORT = 0x2801;
pub const BTH_LE_GATT_ATTRIBUTE_TYPE_INCLUDE: USHORT = 0x2802;
pub const BTH_LE_GATT_ATTRIBUTE_TYPE_CHARACTERISTIC: USHORT = 0x2803;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_EXTENDED_PROPERTIES: USHORT = 0x2900;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_USER_DESCRIPTION: USHORT = 0x2901;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_CLIENT_CONFIGURATION: USHORT = 0x2902;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_SERVER_CONFIGURATION: USHORT = 0x2903;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_FORMAT: USHORT = 0x2904;
pub const BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_AGGREGATE_FORMAT: USHORT = 0x2905;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_DEVICE_NAME: USHORT = 0x2A00;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_APPEARANCE: USHORT = 0x2A01;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PRIVACY_FLAG: USHORT = 0x2A02;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_RECONNECTION_ADDRESS: USHORT = 0x2A03;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PREFERED_CONNECTION_PARAMETER: USHORT
    = 0x2A04;
pub const BTH_LE_GATT_CHARACTERISTIC_TYPE_SERVICE_CHANGED: USHORT = 0x2A05;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET: u8 = 0x6;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_MASK: USHORT = 0x3ff;
#[inline]
pub fn BTH_LE_GAP_APPEARANCE_GET_CATEGORY(a: USHORT) -> USHORT {
    (a >> BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET) & BTH_LE_GAP_APPEARANCE_CATEGORY_MASK
}
#[inline]
pub fn BTH_LE_GAP_APPEARANCE_SET_CATEGORY(a: &mut USHORT, c: USHORT) {
    *a = (*a & !BTH_LE_GAP_APPEARANCE_CATEGORY_MASK)
        | (c << BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET);
}
pub const BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK: USHORT = 0x3f;
#[inline]
pub fn BTH_LE_GAP_APPEARANCE_GET_SUB_CATEGORY(a: USHORT) -> UCHAR {
    (a & BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK) as u8
}
#[inline]
pub fn BTH_LE_GAP_APPEARANCE_SET_SUB_CATEGORY(a: &mut USHORT, s: UCHAR) {
    *a = (*a & !BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK) | (s as u16);
}
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_UNCATEGORIZED: USHORT = 0x0000;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_PHONE: USHORT = 0x0001;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_COMPUTER: USHORT = 0x0002;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_WATCH: USHORT = 0x0003;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_CLOCK: USHORT = 0x0004;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY: USHORT = 0x0005;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_REMOTE_CONTROL: USHORT = 0x0006;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_EYE_GLASSES: USHORT = 0x0007;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_TAG: USHORT = 0x0008;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_KEYRING: USHORT = 0x0009;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_MEDIA_PLAYER: USHORT = 0x000a;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_BARCODE_SCANNER: USHORT = 0x000b;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_THERMOMETER: USHORT = 0x000c;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_HEART_RATE: USHORT = 0x000d;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_BLOOD_PRESSURE: USHORT = 0x000e;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_HID: USHORT = 0x000f;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_GLUCOSE_METER: USHORT = 0x0010;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_RUNNING_WALKING_SENSOR: USHORT = 0x0011;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_CYCLING: USHORT = 0x0012;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_PLUSE_OXIMETER: USHORT = 0x0031;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_WEIGHT_SCALE: USHORT = 0x0032;
pub const BTH_LE_GAP_APPEARANCE_CATEGORY_OUTDOOR_SPORTS_ACTIVITY: USHORT = 0x0051;
pub const BTH_LE_GAP_APPEARANCE_SUBCATEGORY_GENERIC: UCHAR = 0x00;
pub const BTH_LE_GAP_APPEARANCE_WATCH_SUBCATEGORY_SPORTS_WATCH: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_THERMOMETER_SUBCATEGORY_EAR: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_HEART_RATE_SUBCATEGORY_HEART_RATE_BELT: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_ARM: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_WRIST: UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_KEYBOARD: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_MOUSE: UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_JOYSTICK: UCHAR = 0x03;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_GAMEPAD: UCHAR = 0x04;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITIZER_TABLET: UCHAR = 0x05;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_CARD_READER: UCHAR = 0x06;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITAL_PEN: UCHAR = 0x07;
pub const BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_BARCODE_SCANNER: UCHAR = 0x08;
pub const BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_IN_SHOE: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_SHOE: UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_HIP: UCHAR = 0x03;
pub const BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CYCLING_COMPUTER: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_SENSOR: UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CADENCE_SENSOR: UCHAR = 0x03;
pub const BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_POWER_SENSOR: UCHAR = 0x04;
pub const BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_AND_CADENCE_SENSOR: UCHAR = 0x05;
pub const BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_FINGERTIP: UCHAR = 0x01;
pub const BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_WRIST_WORN: UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_DISPLAY_DEVICE: UCHAR
    = 0x01;
pub const
    BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_DISPLAY_DEVICE:
        UCHAR = 0x02;
pub const BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_POD: UCHAR = 0x03;
pub const BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_POD: UCHAR
    = 0x04;
pub const BTH_LE_GATT_DEFAULT_MAX_INCLUDED_SERVICES_DEPTH: USHORT = 3;
pub const BTH_LE_ATT_TRANSACTION_TIMEOUT: USHORT = 30;
pub const BTH_LE_ATT_MAX_VALUE_SIZE: USHORT = 512;
pub const BTH_LE_ATT_CID: USHORT = 0x0004;
pub const BTHLEENUM_ATT_MTU_MIN: USHORT = 23;
// #define BTHLEENUM_ATT_MTU_MAX (MAX_USHORT)
pub const BTHLEENUM_ATT_MTU_DEFAULT: USHORT = BTHLEENUM_ATT_MTU_MIN;
pub const BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION: USHORT = 525;
pub const BTH_LE_ERROR_INVALID_HANDLE: USHORT = 0x01;
pub const BTH_LE_ERROR_READ_NOT_PERMITTED: USHORT = 0x02;
pub const BTH_LE_ERROR_WRITE_NOT_PERMITTED: USHORT = 0x03;
pub const BTH_LE_ERROR_INVALID_PDU: USHORT = 0x04;
pub const BTH_LE_ERROR_INSUFFICIENT_AUTHENTICATION: USHORT = 0x05;
pub const BTH_LE_ERROR_REQUEST_NOT_SUPPORTED: USHORT = 0x06;
pub const BTH_LE_ERROR_INVALID_OFFSET: USHORT = 0x07;
pub const BTH_LE_ERROR_INSUFFICIENT_AUTHORIZATION: USHORT = 0x08;
pub const BTH_LE_ERROR_PREPARE_QUEUE_FULL: USHORT = 0x09;
pub const BTH_LE_ERROR_ATTRIBUTE_NOT_FOUND: USHORT = 0x0A;
pub const BTH_LE_ERROR_ATTRIBUTE_NOT_LONG: USHORT = 0x0B;
pub const BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE: USHORT = 0x0C;
pub const BTH_LE_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH: USHORT = 0x0D;
pub const BTH_LE_ERROR_UNLIKELY: USHORT = 0x0E;
pub const BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION: USHORT = 0x0F;
pub const BTH_LE_ERROR_UNSUPPORTED_GROUP_TYPE: USHORT = 0x10;
pub const BTH_LE_ERROR_INSUFFICIENT_RESOURCES: USHORT = 0x11;
pub const BTH_LE_ERROR_UNKNOWN: USHORT = 0x1000;
pub const BLUETOOTH_GATT_FLAG_NONE: ULONG = 0x00000000;
pub const BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED: ULONG = 0x00000001;
pub const BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED: ULONG = 0x00000002;
pub const BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE: ULONG = 0x00000004;
pub const BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE: ULONG = 0x00000008;
pub const BLUETOOTH_GATT_FLAG_SIGNED_WRITE: ULONG = 0x00000010;
pub const BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE: ULONG = 0x00000020;
pub const BLUETOOTH_GATT_FLAG_RETURN_ALL: ULONG = 0x00000040;
pub const BLUETOOTH_GATT_FLAG_VALID_MASK: ULONG = BLUETOOTH_GATT_FLAG_NONE
    | BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED | BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED
    | BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE | BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE
    | BLUETOOTH_GATT_FLAG_SIGNED_WRITE | BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE
    | BLUETOOTH_GATT_FLAG_RETURN_ALL;
#[inline]
pub fn IS_BLUETOOTH_GATT_FLAG_VALID(f: ULONG) -> bool {
    (f & !BLUETOOTH_GATT_FLAG_VALID_MASK) == 0
}
pub type BLUETOOTH_GATT_EVENT_HANDLE = HANDLE;
UNION!{union BTH_LE_UUID_value {
    [u32; 4],
    ShortUuid ShortUuid_mut: USHORT,
    LongUuid LongUuid_mut: GUID,
}}
STRUCT!{struct BTH_LE_UUID {
    IsShortUuid: BOOLEAN,
    Value: BTH_LE_UUID_value,
}}
pub type PBTH_LE_UUID = *mut BTH_LE_UUID;
STRUCT!{struct BTH_LE_GATT_SERVICE {
    ServiceUuid: BTH_LE_UUID,
    AttributeHandle: USHORT,
}}
pub type PBTH_LE_GATT_SERVICE = *mut BTH_LE_GATT_SERVICE;
ENUM!{enum BTH_LE_GATT_DESCRIPTOR_TYPE {
    CharacteristicExtendedProperties,
    CharacteristicUserDescription,
    ClientCharacteristicConfiguration,
    ServerCharacteristicConfiguration,
    CharacteristicFormat,
    CharacteristicAggregateFormat,
    CustomDescriptor,
}}
pub type PBTH_LE_GATT_DESCRIPTOR_TYPE = *mut BTH_LE_GATT_DESCRIPTOR_TYPE;
STRUCT!{struct BTH_LE_GATT_CHARACTERISTIC {
    ServiceHandle: USHORT,
    CharacteristicUuid: BTH_LE_UUID,
    AttributeHandle: USHORT,
    CharacteristicValueHandle: USHORT,
    IsBroadcastable: BOOLEAN,
    IsReadable: BOOLEAN,
    IsWritable: BOOLEAN,
    IsWritableWithoutResponse: BOOLEAN,
    IsSignedWritable: BOOLEAN,
    IsNotifiable: BOOLEAN,
    IsIndicatable: BOOLEAN,
    HasExtendedProperties: BOOLEAN,
}}
pub type PBTH_LE_GATT_CHARACTERISTIC = *mut BTH_LE_GATT_CHARACTERISTIC;
STRUCT!{struct BTH_LE_GATT_CHARACTERISTIC_VALUE {
    DataSize: ULONG,
    Data: [UCHAR; 1],
}}
pub type PBTH_LE_GATT_CHARACTERISTIC_VALUE = *mut BTH_LE_GATT_CHARACTERISTIC_VALUE;
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR {
    ServiceHandle: USHORT,
    CharacteristicHandle: USHORT,
    DescriptorType: BTH_LE_GATT_DESCRIPTOR_TYPE,
    DescriptorUuid: BTH_LE_UUID,
    AttributeHandle: USHORT,
}}
pub type PBTH_LE_GATT_DESCRIPTOR = *mut BTH_LE_GATT_DESCRIPTOR;
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR_VALUE_u_CharacteristicExtendedProperties {
    IsReliableWriteEnabled: BOOLEAN,
    IsAuxiliariesWritable: BOOLEAN,
}}
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR_VALUE_u_ClientCharacteristicConfiguration {
    IsSubscribeToNotification: BOOLEAN,
    IsSubscribeToIndication: BOOLEAN,
}}
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR_VALUE_u_ServerCharacteristicConfiguration {
    IsBroadcast: BOOLEAN,
}}
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR_VALUE_u_CharacteristicFormat {
    Format: UCHAR,
    Exponent: UCHAR,
    Unit: BTH_LE_UUID,
    NameSpace: UCHAR,
    Description: BTH_LE_UUID,
}}
UNION!{union BTH_LE_GATT_DESCRIPTOR_VALUE_u {
    [u32; 12],
    CharacteristicExtendedProperties CharacteristicExtendedProperties_mut:
        BTH_LE_GATT_DESCRIPTOR_VALUE_u_CharacteristicExtendedProperties,
    ClientCharacteristicConfiguration ClientCharacteristicConfiguration_mut:
        BTH_LE_GATT_DESCRIPTOR_VALUE_u_ClientCharacteristicConfiguration,
    ServerCharacteristicConfiguration ServerCharacteristicConfiguration_mut:
        BTH_LE_GATT_DESCRIPTOR_VALUE_u_ServerCharacteristicConfiguration,
    CharacteristicFormat CharacteristicFormat_mut:
        BTH_LE_GATT_DESCRIPTOR_VALUE_u_CharacteristicFormat,
}}
STRUCT!{struct BTH_LE_GATT_DESCRIPTOR_VALUE {
    DescriptorType: BTH_LE_GATT_DESCRIPTOR_TYPE,
    DescriptorUuid: BTH_LE_UUID,
    u: BTH_LE_GATT_DESCRIPTOR_VALUE_u,
    DataSize: ULONG,
    Data: [UCHAR; 1],
}}
pub type PBTH_LE_GATT_DESCRIPTOR_VALUE = *mut BTH_LE_GATT_DESCRIPTOR_VALUE;
ENUM!{enum BTH_LE_GATT_EVENT_TYPE {
    CharacteristicValueChangedEvent,
}}
FN!{stdcall PFNBLUETOOTH_GATT_EVENT_CALLBACK(
    EventType: BTH_LE_GATT_EVENT_TYPE,
    EventOutParameter: PVOID,
    Context: PVOID,
) -> ()}
STRUCT!{struct BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION {
    NumCharacteristics: USHORT,
    Characteristics: [BTH_LE_GATT_CHARACTERISTIC; 1],
}}
pub type PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION
    = *mut BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION;
STRUCT!{struct BLUETOOTH_GATT_VALUE_CHANGED_EVENT {
    ChangedAttributeHandle: USHORT,
    CharacteristicValueDataSize: usize,
    CharacteristicValue: PBTH_LE_GATT_CHARACTERISTIC_VALUE,
}}
pub type PBLUETOOTH_GATT_VALUE_CHANGED_EVENT = *mut BLUETOOTH_GATT_VALUE_CHANGED_EVENT;
pub type BTH_LE_GATT_RELIABLE_WRITE_CONTEXT = ULONG64;
pub type PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT = *mut ULONG64;
#[inline]
pub fn IsBthLEUuidMatch(uuid1: &BTH_LE_UUID, uuid2: &BTH_LE_UUID) -> bool {
    fn is_bluetooth_le_uuid(uuid: &GUID) -> bool {
        uuid.Data2 == BTH_LE_ATT_BLUETOOTH_BASE_GUID.Data2
            && uuid.Data3 == BTH_LE_ATT_BLUETOOTH_BASE_GUID.Data3
            && uuid.Data4 == BTH_LE_ATT_BLUETOOTH_BASE_GUID.Data4
    }
    unsafe { match (uuid1.IsShortUuid != 0, uuid2.IsShortUuid != 0) {
        (true, true) => uuid1.Value.ShortUuid() == uuid2.Value.ShortUuid(),
        (false, false) => IsEqualGUID(uuid1.Value.LongUuid(), uuid2.Value.LongUuid()),
        (true, false) => is_bluetooth_le_uuid(uuid2.Value.LongUuid())
            && ((*uuid1.Value.ShortUuid()) as u32) == uuid2.Value.LongUuid().Data1,
        (false, true) => is_bluetooth_le_uuid(uuid1.Value.LongUuid())
            && ((*uuid2.Value.ShortUuid()) as u32) == uuid1.Value.LongUuid().Data1,
    }}
}