aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/include/any-windows-any/bthledef.h
blob: 0918d42f4b213db77342dd46bb99cec16d977554 (plain)
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
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifndef __BTHLEDEF_H__
#define __BTHLEDEF_H__

#include <winapifamily.h>
#include <minwindef.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#if NTDDI_VERSION >= NTDDI_WIN8

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);

#define BTH_LE_SERVICE_GAP (0x1800)
#define BTH_LE_SERVICE_GATT (0x1801)

#define BTH_LE_GATT_ATTRIBUTE_TYPE_PRIMARY_SERVICE (0x2800)
#define BTH_LE_GATT_ATTRIBUTE_TYPE_SECONDARY_SERVICE (0x2801)
#define BTH_LE_GATT_ATTRIBUTE_TYPE_INCLUDE (0x2802)
#define BTH_LE_GATT_ATTRIBUTE_TYPE_CHARACTERISTIC (0x2803)

#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_EXTENDED_PROPERTIES (0x2900)
#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_USER_DESCRIPTION (0x2901)
#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_CLIENT_CONFIGURATION (0x2902)
#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_SERVER_CONFIGURATION (0x2903)
#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_FORMAT (0x2904)
#define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_AGGREGATE_FORMAT (0x2905)

#define BTH_LE_GATT_CHARACTERISTIC_TYPE_DEVICE_NAME (0x2a00)
#define BTH_LE_GATT_CHARACTERISTIC_TYPE_APPEARANCE (0x2a01)
#define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PRIVACY_FLAG (0x2a02)
#define BTH_LE_GATT_CHARACTERISTIC_TYPE_RECONNECTION_ADDRESS (0x2a03)
#define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PREFERED_CONNECTION_PARAMETER (0x2a04)
#define BTH_LE_GATT_CHARACTERISTIC_TYPE_SERVICE_CHANGED (0x2a05)

#define BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET 0x6
#define BTH_LE_GAP_APPEARANCE_CATEGORY_MASK 0x3ff
#define BTH_LE_GAP_APPEARANCE_GET_CATEGORY(a) ((a >> BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET) & BTH_LE_GAP_APPEARANCE_CATEGORY_MASK)
#define BTH_LE_GAP_APPEARANCE_SET_CATEGORY(a, c) a = ((a & ~BTH_LE_GAP_APPEARANCE_CATEGORY_MASK) | (c << BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET))
#define BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK 0x3f
#define BTH_LE_GAP_APPEARANCE_GET_SUB_CATEGORY(a) ((UCHAR)(a & BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK))
#define BTH_LE_GAP_APPEARANCE_SET_SUB_CATEGORY(a, s) a = ((a & ~BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK) | s)

#define BTH_LE_GAP_APPEARANCE_CATEGORY_UNCATEGORIZED 0x0000
#define BTH_LE_GAP_APPEARANCE_CATEGORY_PHONE 0x0001
#define BTH_LE_GAP_APPEARANCE_CATEGORY_COMPUTER 0x0002
#define BTH_LE_GAP_APPEARANCE_CATEGORY_WATCH 0x0003
#define BTH_LE_GAP_APPEARANCE_CATEGORY_CLOCK 0x0004
#define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY 0x0005
#define BTH_LE_GAP_APPEARANCE_CATEGORY_REMOTE_CONTROL 0x0006
#define BTH_LE_GAP_APPEARANCE_CATEGORY_EYE_GLASSES 0x0007
#define BTH_LE_GAP_APPEARANCE_CATEGORY_TAG 0x0008
#define BTH_LE_GAP_APPEARANCE_CATEGORY_KEYRING 0x0009
#define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDIA_PLAYER 0x000a
#define BTH_LE_GAP_APPEARANCE_CATEGORY_BARCODE_SCANNER 0x000b
#define BTH_LE_GAP_APPEARANCE_CATEGORY_THERMOMETER 0x000c
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEART_RATE 0x000d
#define BTH_LE_GAP_APPEARANCE_CATEGORY_BLOOD_PRESSURE 0x000e
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HID 0x000f
#define BTH_LE_GAP_APPEARANCE_CATEGORY_GLUCOSE_METER 0x0010
#define BTH_LE_GAP_APPEARANCE_CATEGORY_RUNNING_WALKING_SENSOR 0x0011
#define BTH_LE_GAP_APPEARANCE_CATEGORY_CYCLING 0x0012
#define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTROL_DEVICE 0x0013
#define BTH_LE_GAP_APPEARANCE_CATEGORY_NETWORK_DEVICE 0x0014
#define BTH_LE_GAP_APPEARANCE_CATEGORY_SENSOR 0x0015
#define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_FIXTURES 0x0016
#define BTH_LE_GAP_APPEARANCE_CATEGORY_FAN 0x0017
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HVAC 0x0018
#define BTH_LE_GAP_APPEARANCE_CATEGORY_AIR_CONDITIONING 0x0019
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HUMIDIFIER 0x001a
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEATING 0x001b
#define BTH_LE_GAP_APPEARANCE_CATEGORY_ACCESS_CONTROL 0x001c
#define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_DEVICE 0x001d
#define BTH_LE_GAP_APPEARANCE_CATEGORY_POWER_DEVICE 0x001e
#define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_SOURCE 0x001f
#define BTH_LE_GAP_APPEARANCE_CATEGORY_WINDOW_COVERING 0x0020
#define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SINK 0x0021
#define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SOURCE 0x0022
#define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_VEHICLE 0x0023
#define BTH_LE_GAP_APPEARANCE_CATEGORY_DOMESTIC_APPLIANCE 0x0024
#define BTH_LE_GAP_APPEARANCE_CATEGORY_WEARABLE_AUDIO_DEVICE 0x0025
#define BTH_LE_GAP_APPEARANCE_CATEGORY_AIRCRAFT 0x0026
#define BTH_LE_GAP_APPEARANCE_CATEGORY_AV_EQUIPMENT 0x0027
#define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY_EQUIPMENT 0x0028
#define BTH_LE_GAP_APPEARANCE_CATEGORY_HEARING_AID 0x0029
#define BTH_LE_GAP_APPEARANCE_CATEGORY_GAMING 0x002a
#define BTH_LE_GAP_APPEARANCE_CATEGORY_SIGNAGE 0x002b
#define BTH_LE_GAP_APPEARANCE_CATEGORY_PLUSE_OXIMETER 0x0031
#define BTH_LE_GAP_APPEARANCE_CATEGORY_WEIGHT_SCALE 0x0032
#define BTH_LE_GAP_APPEARANCE_CATEGORY_PERSONAL_MOBILITY_DEVICE 0x0033
#define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTINUOUS_GLUCOSE_MONITOR 0x0034
#define BTH_LE_GAP_APPEARANCE_CATEGORY_INSULIN_PUMP 0x0035
#define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDICATION_DELIVERY 0x0036
#define BTH_LE_GAP_APPEARANCE_CATEGORY_OUTDOOR_SPORTS_ACTIVITY 0x0051
#define BTH_LE_GAP_APPEARANCE_SUBCATEGORY_GENERIC 0x00
#define BTH_LE_GAP_APPEARANCE_WATCH_SUBCATEGORY_SPORTS_WATCH 0x01
#define BTH_LE_GAP_APPEARANCE_THERMOMETER_SUBCATEGORY_EAR 0x01
#define BTH_LE_GAP_APPEARANCE_HEART_RATE_SUBCATEGORY_HEART_RATE_BELT 0x01
#define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_ARM 0x01
#define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_WRIST 0x02
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_KEYBOARD 0x01
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_MOUSE 0x02
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_JOYSTICK 0x03
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_GAMEPAD 0x04
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITIZER_TABLET 0x05
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_CARD_READER 0x06
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITAL_PEN 0x07
#define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_BARCODE_SCANNER 0x08
#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_IN_SHOE 0x01
#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_SHOE 0x02
#define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_HIP 0x03
#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CYCLING_COMPUTER 0x01
#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_SENSOR 0x02
#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CADENCE_SENSOR 0x03
#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_POWER_SENSOR 0x04
#define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_AND_CADENCE_SENSOR 0x05
#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDALONE_SPEAKER 0x01
#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SOUNDBAR 0x02
#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_BOOKSHELF_SPEAKER 0x03
#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDMOUNTED_SPEAKER 0x04
#define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SPEAKERPHONE 0x05
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_MICROPHONE 0x01
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_ALARM 0x02
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BELL 0x03
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_HORN 0x04
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_DEVICE 0x05
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_SERVICE_DESK 0x06
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_KIOSK 0x07
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_ROOM 0x08
#define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_AUDITORIUM 0x09
#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_EARBUD 0x01
#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADSET 0x02
#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADPHONES 0x03
#define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_NECKBAND 0x04
#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_IN_EAR_HEARING_AID 0x01
#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_BEHIND_EAR_HEARING_AID 0x02
#define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_COCHLEAR_IMPLANT 0x03
#define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_FINGERTIP 0x01
#define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_WRIST_WORN 0x02
#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_DISPLAY_DEVICE 0x01
#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_DISPLAY_DEVICE 0x02
#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_POD 0x03
#define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_POD 0x04

#define BTH_LE_GATT_DEFAULT_MAX_INCLUDED_SERVICES_DEPTH (3)

#define BTH_LE_ATT_TRANSACTION_TIMEOUT 30

#define BTH_LE_ATT_MAX_VALUE_SIZE 512

#define BTH_LE_ATT_CID (0x0004)

#define BTHLEENUM_ATT_MTU_MIN (23)
#define BTHLEENUM_ATT_MTU_MAX (0xffff)
#define BTHLEENUM_ATT_MTU_DEFAULT (BTHLEENUM_ATT_MTU_MIN)
#define BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION (525)

#define BTH_LE_ERROR_INVALID_HANDLE (0x01)
#define BTH_LE_ERROR_READ_NOT_PERMITTED (0x02)
#define BTH_LE_ERROR_WRITE_NOT_PERMITTED (0x03)
#define BTH_LE_ERROR_INVALID_PDU (0x04)
#define BTH_LE_ERROR_INSUFFICIENT_AUTHENTICATION (0x05)
#define BTH_LE_ERROR_REQUEST_NOT_SUPPORTED (0x06)
#define BTH_LE_ERROR_INVALID_OFFSET (0x07)
#define BTH_LE_ERROR_INSUFFICIENT_AUTHORIZATION (0x08)
#define BTH_LE_ERROR_PREPARE_QUEUE_FULL (0x09)
#define BTH_LE_ERROR_ATTRIBUTE_NOT_FOUND (0x0a)
#define BTH_LE_ERROR_ATTRIBUTE_NOT_LONG (0x0b)
#define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE (0x0c)
#define BTH_LE_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH (0x0d)
#define BTH_LE_ERROR_UNLIKELY (0x0e)
#define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION (0x0f)
#define BTH_LE_ERROR_UNSUPPORTED_GROUP_TYPE (0x10)
#define BTH_LE_ERROR_INSUFFICIENT_RESOURCES (0x11)
#define BTH_LE_ERROR_UNKNOWN (0x1000)

#define BLUETOOTH_GATT_FLAG_NONE 0x00000000
#define BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED 0x00000001
#define BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED 0x00000002
#define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE 0x00000004
#define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE 0x00000008
#define BLUETOOTH_GATT_FLAG_SIGNED_WRITE 0x00000010
#define BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE 0x00000020
#define BLUETOOTH_GATT_FLAG_RETURN_ALL 0x00000040
#define BLUETOOTH_GATT_FLAG_VALID_MASK (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)

#define IS_BLUETOOTH_GATT_FLAG_VALID(f) (0 == (f & ~BLUETOOTH_GATT_FLAG_VALID_MASK))

typedef HANDLE BLUETOOTH_GATT_EVENT_HANDLE;

typedef struct _BTH_LE_UUID {
  BOOLEAN IsShortUuid;
#ifdef __WIDL__
  [switch_type(BOOLEAN), switch_is((BOOLEAN)IsShortUuid)]
#endif
  union {
#ifdef __WIDL__
    [case(TRUE)]
#endif
    USHORT ShortUuid;
#ifdef __WIDL__
    [case(FALSE)]
#endif
    GUID LongUuid;
  } Value;
} BTH_LE_UUID, *PBTH_LE_UUID;

typedef struct _BTH_LE_GATT_SERVICE {
  BTH_LE_UUID ServiceUuid;
  USHORT AttributeHandle;
} BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE;

typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE {
  CharacteristicExtendedProperties,
  CharacteristicUserDescription,
  ClientCharacteristicConfiguration,
  ServerCharacteristicConfiguration,
  CharacteristicFormat,
  CharacteristicAggregateFormat,
  CustomDescriptor
} BTH_LE_GATT_DESCRIPTOR_TYPE, *PBTH_LE_GATT_DESCRIPTOR_TYPE;

typedef struct _BTH_LE_GATT_CHARACTERISTIC {
  USHORT ServiceHandle;
  BTH_LE_UUID CharacteristicUuid;
  USHORT AttributeHandle;
  USHORT CharacteristicValueHandle;
  BOOLEAN IsBroadcastable;
  BOOLEAN IsReadable;
  BOOLEAN IsWritable;
  BOOLEAN IsWritableWithoutResponse;
  BOOLEAN IsSignedWritable;
  BOOLEAN IsNotifiable;
  BOOLEAN IsIndicatable;
  BOOLEAN HasExtendedProperties;
} BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC;

typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
  ULONG DataSize;
#ifdef __WIDL__
  [size_is(DataSize)] UCHAR Data[*];
#else
  UCHAR Data[1];
#endif
} BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;

typedef struct _BTH_LE_GATT_DESCRIPTOR {
  USHORT ServiceHandle;
  USHORT CharacteristicHandle;
  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
  BTH_LE_UUID DescriptorUuid;
  USHORT AttributeHandle;
} BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR;

typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE {
  BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
  BTH_LE_UUID DescriptorUuid;
#ifdef __WIDL__
  [switch_type(BTH_LE_GATT_DESCRIPTOR_TYPE), switch_is((BTH_LE_GATT_DESCRIPTOR_TYPE)DescriptorType)]
#endif
  __C89_NAMELESS union {
#ifdef __WIDL__
    [case(CharacteristicExtendedProperties)]
#endif
    struct {
      BOOLEAN IsReliableWriteEnabled;
      BOOLEAN IsAuxiliariesWritable;
    } CharacteristicExtendedProperties;
#ifdef __WIDL__
    [case(ClientCharacteristicConfiguration)]
#endif
    struct {
      BOOLEAN IsSubscribeToNotification;
      BOOLEAN IsSubscribeToIndication;
    } ClientCharacteristicConfiguration;
#ifdef __WIDL__
    [case(ServerCharacteristicConfiguration)]
#endif
    struct {
      BOOLEAN IsBroadcast;
    } ServerCharacteristicConfiguration;
#ifdef __WIDL__
    [case(CharacteristicFormat)]
#endif
    struct {
      UCHAR Format;
      UCHAR Exponent;
      BTH_LE_UUID Unit;
      UCHAR NameSpace;
      BTH_LE_UUID Description;
    } CharacteristicFormat;
#ifdef __WIDL__
    [default]
      ;
#endif
  };
  ULONG DataSize;
#ifdef __WIDL__
  [size_is(DataSize)] UCHAR Data[*];
#else
  UCHAR Data[1];
#endif
} BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE;

typedef enum _BTH_LE_GATT_EVENT_TYPE {
  CharacteristicValueChangedEvent
} BTH_LE_GATT_EVENT_TYPE;

typedef VOID (CALLBACK *PFNBLUETOOTH_GATT_EVENT_CALLBACK)(BTH_LE_GATT_EVENT_TYPE EventType, PVOID EventOutParameter, PVOID Context);

typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION {
  USHORT NumCharacteristics;
  BTH_LE_GATT_CHARACTERISTIC Characteristics[1];
} BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION;

typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT {
  USHORT ChangedAttributeHandle;
  size_t CharacteristicValueDataSize;
  PBTH_LE_GATT_CHARACTERISTIC_VALUE CharacteristicValue;
} BLUETOOTH_GATT_VALUE_CHANGED_EVENT, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT;

typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT;

#ifdef __cplusplus
extern "C"{
#endif

FORCEINLINE BOOLEAN IsBthLEUuidMatch(BTH_LE_UUID uuid1, BTH_LE_UUID uuid2) {
  BTH_LE_UUID tempLongUuid = {0};
  tempLongUuid.IsShortUuid = FALSE;
  tempLongUuid.Value.LongUuid = BTH_LE_ATT_BLUETOOTH_BASE_GUID;
  if (uuid1.IsShortUuid && uuid2.IsShortUuid) {
    return (uuid1.Value.ShortUuid == uuid2.Value.ShortUuid);
  } else if (!uuid1.IsShortUuid && !uuid2.IsShortUuid) {
    return (0 == memcmp(&uuid1.Value.LongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
  } else if (uuid1.IsShortUuid) {
    tempLongUuid.Value.LongUuid.Data1 += uuid1.Value.ShortUuid;
    return (0 == memcmp(&tempLongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
  } else if (uuid2.IsShortUuid) {
    tempLongUuid.Value.LongUuid.Data1 += uuid2.Value.ShortUuid;
    return (0 == memcmp(&uuid1.Value.LongUuid, &tempLongUuid.Value.LongUuid, sizeof(GUID)));
  }
  return FALSE;
}

#ifdef __cplusplus
  }
#endif

#endif /* NTDDI_WIN8 */

#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */

#endif /* __BTHLEDEF_H__ */