zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

bthledef.h (16152B) - Raw


      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 
      7 #ifndef __BTHLEDEF_H__
      8 #define __BTHLEDEF_H__
      9 
     10 #include <winapifamily.h>
     11 #include <minwindef.h>
     12 
     13 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
     14 
     15 #if NTDDI_VERSION >= NTDDI_WIN8
     16 
     17 DEFINE_GUID(GUID_BLUETOOTHLE_DEVICE_INTERFACE, 0x781aee18, 0x7733, 0x4ce4, 0xad, 0xd0, 0x91, 0xf4, 0x1c, 0x67, 0xb5, 0x92);
     18 DEFINE_GUID(GUID_BLUETOOTH_GATT_SERVICE_DEVICE_INTERFACE, 0x6e3bb679, 0x4372, 0x40c8, 0x9e, 0xaa, 0x45, 0x09, 0xdf, 0x26, 0x0c, 0xd8);
     19 DEFINE_GUID(BTH_LE_ATT_BLUETOOTH_BASE_GUID, 0x00000000, 0x0000, 0x1000, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb);
     20 
     21 #define BTH_LE_SERVICE_GAP (0x1800)
     22 #define BTH_LE_SERVICE_GATT (0x1801)
     23 
     24 #define BTH_LE_GATT_ATTRIBUTE_TYPE_PRIMARY_SERVICE (0x2800)
     25 #define BTH_LE_GATT_ATTRIBUTE_TYPE_SECONDARY_SERVICE (0x2801)
     26 #define BTH_LE_GATT_ATTRIBUTE_TYPE_INCLUDE (0x2802)
     27 #define BTH_LE_GATT_ATTRIBUTE_TYPE_CHARACTERISTIC (0x2803)
     28 
     29 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_EXTENDED_PROPERTIES (0x2900)
     30 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_USER_DESCRIPTION (0x2901)
     31 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_CLIENT_CONFIGURATION (0x2902)
     32 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_SERVER_CONFIGURATION (0x2903)
     33 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_FORMAT (0x2904)
     34 #define BTH_LE_GATT_CHARACTERISTIC_DESCRIPTOR_AGGREGATE_FORMAT (0x2905)
     35 
     36 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_DEVICE_NAME (0x2a00)
     37 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_APPEARANCE (0x2a01)
     38 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PRIVACY_FLAG (0x2a02)
     39 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_RECONNECTION_ADDRESS (0x2a03)
     40 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_PERIPHERAL_PREFERED_CONNECTION_PARAMETER (0x2a04)
     41 #define BTH_LE_GATT_CHARACTERISTIC_TYPE_SERVICE_CHANGED (0x2a05)
     42 
     43 #define BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET 0x6
     44 #define BTH_LE_GAP_APPEARANCE_CATEGORY_MASK 0x3ff
     45 #define BTH_LE_GAP_APPEARANCE_GET_CATEGORY(a) ((a >> BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET) & BTH_LE_GAP_APPEARANCE_CATEGORY_MASK)
     46 #define BTH_LE_GAP_APPEARANCE_SET_CATEGORY(a, c) a = ((a & ~BTH_LE_GAP_APPEARANCE_CATEGORY_MASK) | (c << BTH_LE_GAP_APPEARANCE_CATEGORY_OFFSET))
     47 #define BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK 0x3f
     48 #define BTH_LE_GAP_APPEARANCE_GET_SUB_CATEGORY(a) ((UCHAR)(a & BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK))
     49 #define BTH_LE_GAP_APPEARANCE_SET_SUB_CATEGORY(a, s) a = ((a & ~BTH_LE_GAP_APPEARANCE_SUB_CATEGORY_MASK) | s)
     50 
     51 #define BTH_LE_GAP_APPEARANCE_CATEGORY_UNCATEGORIZED 0x0000
     52 #define BTH_LE_GAP_APPEARANCE_CATEGORY_PHONE 0x0001
     53 #define BTH_LE_GAP_APPEARANCE_CATEGORY_COMPUTER 0x0002
     54 #define BTH_LE_GAP_APPEARANCE_CATEGORY_WATCH 0x0003
     55 #define BTH_LE_GAP_APPEARANCE_CATEGORY_CLOCK 0x0004
     56 #define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY 0x0005
     57 #define BTH_LE_GAP_APPEARANCE_CATEGORY_REMOTE_CONTROL 0x0006
     58 #define BTH_LE_GAP_APPEARANCE_CATEGORY_EYE_GLASSES 0x0007
     59 #define BTH_LE_GAP_APPEARANCE_CATEGORY_TAG 0x0008
     60 #define BTH_LE_GAP_APPEARANCE_CATEGORY_KEYRING 0x0009
     61 #define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDIA_PLAYER 0x000a
     62 #define BTH_LE_GAP_APPEARANCE_CATEGORY_BARCODE_SCANNER 0x000b
     63 #define BTH_LE_GAP_APPEARANCE_CATEGORY_THERMOMETER 0x000c
     64 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HEART_RATE 0x000d
     65 #define BTH_LE_GAP_APPEARANCE_CATEGORY_BLOOD_PRESSURE 0x000e
     66 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HID 0x000f
     67 #define BTH_LE_GAP_APPEARANCE_CATEGORY_GLUCOSE_METER 0x0010
     68 #define BTH_LE_GAP_APPEARANCE_CATEGORY_RUNNING_WALKING_SENSOR 0x0011
     69 #define BTH_LE_GAP_APPEARANCE_CATEGORY_CYCLING 0x0012
     70 #define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTROL_DEVICE 0x0013
     71 #define BTH_LE_GAP_APPEARANCE_CATEGORY_NETWORK_DEVICE 0x0014
     72 #define BTH_LE_GAP_APPEARANCE_CATEGORY_SENSOR 0x0015
     73 #define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_FIXTURES 0x0016
     74 #define BTH_LE_GAP_APPEARANCE_CATEGORY_FAN 0x0017
     75 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HVAC 0x0018
     76 #define BTH_LE_GAP_APPEARANCE_CATEGORY_AIR_CONDITIONING 0x0019
     77 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HUMIDIFIER 0x001a
     78 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HEATING 0x001b
     79 #define BTH_LE_GAP_APPEARANCE_CATEGORY_ACCESS_CONTROL 0x001c
     80 #define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_DEVICE 0x001d
     81 #define BTH_LE_GAP_APPEARANCE_CATEGORY_POWER_DEVICE 0x001e
     82 #define BTH_LE_GAP_APPEARANCE_CATEGORY_LIGHT_SOURCE 0x001f
     83 #define BTH_LE_GAP_APPEARANCE_CATEGORY_WINDOW_COVERING 0x0020
     84 #define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SINK 0x0021
     85 #define BTH_LE_GAP_APPEARANCE_CATEGORY_AUDIO_SOURCE 0x0022
     86 #define BTH_LE_GAP_APPEARANCE_CATEGORY_MOTORIZED_VEHICLE 0x0023
     87 #define BTH_LE_GAP_APPEARANCE_CATEGORY_DOMESTIC_APPLIANCE 0x0024
     88 #define BTH_LE_GAP_APPEARANCE_CATEGORY_WEARABLE_AUDIO_DEVICE 0x0025
     89 #define BTH_LE_GAP_APPEARANCE_CATEGORY_AIRCRAFT 0x0026
     90 #define BTH_LE_GAP_APPEARANCE_CATEGORY_AV_EQUIPMENT 0x0027
     91 #define BTH_LE_GAP_APPEARANCE_CATEGORY_DISPLAY_EQUIPMENT 0x0028
     92 #define BTH_LE_GAP_APPEARANCE_CATEGORY_HEARING_AID 0x0029
     93 #define BTH_LE_GAP_APPEARANCE_CATEGORY_GAMING 0x002a
     94 #define BTH_LE_GAP_APPEARANCE_CATEGORY_SIGNAGE 0x002b
     95 #define BTH_LE_GAP_APPEARANCE_CATEGORY_PLUSE_OXIMETER 0x0031
     96 #define BTH_LE_GAP_APPEARANCE_CATEGORY_WEIGHT_SCALE 0x0032
     97 #define BTH_LE_GAP_APPEARANCE_CATEGORY_PERSONAL_MOBILITY_DEVICE 0x0033
     98 #define BTH_LE_GAP_APPEARANCE_CATEGORY_CONTINUOUS_GLUCOSE_MONITOR 0x0034
     99 #define BTH_LE_GAP_APPEARANCE_CATEGORY_INSULIN_PUMP 0x0035
    100 #define BTH_LE_GAP_APPEARANCE_CATEGORY_MEDICATION_DELIVERY 0x0036
    101 #define BTH_LE_GAP_APPEARANCE_CATEGORY_OUTDOOR_SPORTS_ACTIVITY 0x0051
    102 #define BTH_LE_GAP_APPEARANCE_SUBCATEGORY_GENERIC 0x00
    103 #define BTH_LE_GAP_APPEARANCE_WATCH_SUBCATEGORY_SPORTS_WATCH 0x01
    104 #define BTH_LE_GAP_APPEARANCE_THERMOMETER_SUBCATEGORY_EAR 0x01
    105 #define BTH_LE_GAP_APPEARANCE_HEART_RATE_SUBCATEGORY_HEART_RATE_BELT 0x01
    106 #define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_ARM 0x01
    107 #define BTH_LE_GAP_APPEARANCE_BLOOD_PRESSURE_SUBCATEGORY_WRIST 0x02
    108 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_KEYBOARD 0x01
    109 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_MOUSE 0x02
    110 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_JOYSTICK 0x03
    111 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_GAMEPAD 0x04
    112 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITIZER_TABLET 0x05
    113 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_CARD_READER 0x06
    114 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_DIGITAL_PEN 0x07
    115 #define BTH_LE_GAP_APPEARANCE_HID_SUBCATEGORY_BARCODE_SCANNER 0x08
    116 #define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_IN_SHOE 0x01
    117 #define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_SHOE 0x02
    118 #define BTH_LE_GAP_APPEARANCE_RUNNING_WALKING_SENSOR_SUBCATEGORY_ON_HIP 0x03
    119 #define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CYCLING_COMPUTER 0x01
    120 #define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_SENSOR 0x02
    121 #define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_CADENCE_SENSOR 0x03
    122 #define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_POWER_SENSOR 0x04
    123 #define BTH_LE_GAP_APPEARANCE_CYCLING_SUBCATEGORY_SPEED_AND_CADENCE_SENSOR 0x05
    124 #define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDALONE_SPEAKER 0x01
    125 #define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SOUNDBAR 0x02
    126 #define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_BOOKSHELF_SPEAKER 0x03
    127 #define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_STANDMOUNTED_SPEAKER 0x04
    128 #define BTH_LE_GAP_APPEARANCE_AUDIO_SINK_SUBCATEGORY_SPEAKERPHONE 0x05
    129 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_MICROPHONE 0x01
    130 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_ALARM 0x02
    131 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BELL 0x03
    132 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_HORN 0x04
    133 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_DEVICE 0x05
    134 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_SERVICE_DESK 0x06
    135 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_KIOSK 0x07
    136 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_BROADCASTING_ROOM 0x08
    137 #define BTH_LE_GAP_APPEARANCE_AUDIO_SOURCE_SUBCATEGORY_AUDITORIUM 0x09
    138 #define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_EARBUD 0x01
    139 #define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADSET 0x02
    140 #define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_HEADPHONES 0x03
    141 #define BTH_LE_GAP_APPEARANCE_WEARABLE_AUDIO_DEVICE_SUBCATEGORY_NECKBAND 0x04
    142 #define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_IN_EAR_HEARING_AID 0x01
    143 #define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_BEHIND_EAR_HEARING_AID 0x02
    144 #define BTH_LE_GAP_APPEARANCE_HEARING_AID_SUBCATEGORY_COCHLEAR_IMPLANT 0x03
    145 #define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_FINGERTIP 0x01
    146 #define BTH_LE_GAP_APPEARANCE_PULSE_OXIMETER_SUBCATEGORY_WRIST_WORN 0x02
    147 #define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_DISPLAY_DEVICE 0x01
    148 #define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_DISPLAY_DEVICE 0x02
    149 #define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_POD 0x03
    150 #define BTH_LE_GAP_APPEARANCE_OUTDOOR_SPORTS_ACTIVITY_SUBCATEGORY_LOCATION_NAVIGATION_POD 0x04
    151 
    152 #define BTH_LE_GATT_DEFAULT_MAX_INCLUDED_SERVICES_DEPTH (3)
    153 
    154 #define BTH_LE_ATT_TRANSACTION_TIMEOUT 30
    155 
    156 #define BTH_LE_ATT_MAX_VALUE_SIZE 512
    157 
    158 #define BTH_LE_ATT_CID (0x0004)
    159 
    160 #define BTHLEENUM_ATT_MTU_MIN (23)
    161 #define BTHLEENUM_ATT_MTU_MAX (0xffff)
    162 #define BTHLEENUM_ATT_MTU_DEFAULT (BTHLEENUM_ATT_MTU_MIN)
    163 #define BTHLEENUM_ATT_MTU_INITIAL_NEGOTIATION (525)
    164 
    165 #define BTH_LE_ERROR_INVALID_HANDLE (0x01)
    166 #define BTH_LE_ERROR_READ_NOT_PERMITTED (0x02)
    167 #define BTH_LE_ERROR_WRITE_NOT_PERMITTED (0x03)
    168 #define BTH_LE_ERROR_INVALID_PDU (0x04)
    169 #define BTH_LE_ERROR_INSUFFICIENT_AUTHENTICATION (0x05)
    170 #define BTH_LE_ERROR_REQUEST_NOT_SUPPORTED (0x06)
    171 #define BTH_LE_ERROR_INVALID_OFFSET (0x07)
    172 #define BTH_LE_ERROR_INSUFFICIENT_AUTHORIZATION (0x08)
    173 #define BTH_LE_ERROR_PREPARE_QUEUE_FULL (0x09)
    174 #define BTH_LE_ERROR_ATTRIBUTE_NOT_FOUND (0x0a)
    175 #define BTH_LE_ERROR_ATTRIBUTE_NOT_LONG (0x0b)
    176 #define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE (0x0c)
    177 #define BTH_LE_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH (0x0d)
    178 #define BTH_LE_ERROR_UNLIKELY (0x0e)
    179 #define BTH_LE_ERROR_INSUFFICIENT_ENCRYPTION (0x0f)
    180 #define BTH_LE_ERROR_UNSUPPORTED_GROUP_TYPE (0x10)
    181 #define BTH_LE_ERROR_INSUFFICIENT_RESOURCES (0x11)
    182 #define BTH_LE_ERROR_UNKNOWN (0x1000)
    183 
    184 #define BLUETOOTH_GATT_FLAG_NONE 0x00000000
    185 #define BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED 0x00000001
    186 #define BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED 0x00000002
    187 #define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE 0x00000004
    188 #define BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE 0x00000008
    189 #define BLUETOOTH_GATT_FLAG_SIGNED_WRITE 0x00000010
    190 #define BLUETOOTH_GATT_FLAG_WRITE_WITHOUT_RESPONSE 0x00000020
    191 #define BLUETOOTH_GATT_FLAG_RETURN_ALL 0x00000040
    192 #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)
    193 
    194 #define IS_BLUETOOTH_GATT_FLAG_VALID(f) (0 == (f & ~BLUETOOTH_GATT_FLAG_VALID_MASK))
    195 
    196 typedef HANDLE BLUETOOTH_GATT_EVENT_HANDLE;
    197 
    198 typedef struct _BTH_LE_UUID {
    199   BOOLEAN IsShortUuid;
    200 #ifdef __WIDL__
    201   [switch_type(BOOLEAN), switch_is((BOOLEAN)IsShortUuid)]
    202 #endif
    203   union {
    204 #ifdef __WIDL__
    205     [case(TRUE)]
    206 #endif
    207     USHORT ShortUuid;
    208 #ifdef __WIDL__
    209     [case(FALSE)]
    210 #endif
    211     GUID LongUuid;
    212   } Value;
    213 } BTH_LE_UUID, *PBTH_LE_UUID;
    214 
    215 typedef struct _BTH_LE_GATT_SERVICE {
    216   BTH_LE_UUID ServiceUuid;
    217   USHORT AttributeHandle;
    218 } BTH_LE_GATT_SERVICE, *PBTH_LE_GATT_SERVICE;
    219 
    220 typedef enum _BTH_LE_GATT_DESCRIPTOR_TYPE {
    221   CharacteristicExtendedProperties,
    222   CharacteristicUserDescription,
    223   ClientCharacteristicConfiguration,
    224   ServerCharacteristicConfiguration,
    225   CharacteristicFormat,
    226   CharacteristicAggregateFormat,
    227   CustomDescriptor
    228 } BTH_LE_GATT_DESCRIPTOR_TYPE, *PBTH_LE_GATT_DESCRIPTOR_TYPE;
    229 
    230 typedef struct _BTH_LE_GATT_CHARACTERISTIC {
    231   USHORT ServiceHandle;
    232   BTH_LE_UUID CharacteristicUuid;
    233   USHORT AttributeHandle;
    234   USHORT CharacteristicValueHandle;
    235   BOOLEAN IsBroadcastable;
    236   BOOLEAN IsReadable;
    237   BOOLEAN IsWritable;
    238   BOOLEAN IsWritableWithoutResponse;
    239   BOOLEAN IsSignedWritable;
    240   BOOLEAN IsNotifiable;
    241   BOOLEAN IsIndicatable;
    242   BOOLEAN HasExtendedProperties;
    243 } BTH_LE_GATT_CHARACTERISTIC, *PBTH_LE_GATT_CHARACTERISTIC;
    244 
    245 typedef struct _BTH_LE_GATT_CHARACTERISTIC_VALUE {
    246   ULONG DataSize;
    247 #ifdef __WIDL__
    248   [size_is(DataSize)] UCHAR Data[*];
    249 #else
    250   UCHAR Data[1];
    251 #endif
    252 } BTH_LE_GATT_CHARACTERISTIC_VALUE, *PBTH_LE_GATT_CHARACTERISTIC_VALUE;
    253 
    254 typedef struct _BTH_LE_GATT_DESCRIPTOR {
    255   USHORT ServiceHandle;
    256   USHORT CharacteristicHandle;
    257   BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
    258   BTH_LE_UUID DescriptorUuid;
    259   USHORT AttributeHandle;
    260 } BTH_LE_GATT_DESCRIPTOR, *PBTH_LE_GATT_DESCRIPTOR;
    261 
    262 typedef struct _BTH_LE_GATT_DESCRIPTOR_VALUE {
    263   BTH_LE_GATT_DESCRIPTOR_TYPE DescriptorType;
    264   BTH_LE_UUID DescriptorUuid;
    265 #ifdef __WIDL__
    266   [switch_type(BTH_LE_GATT_DESCRIPTOR_TYPE), switch_is((BTH_LE_GATT_DESCRIPTOR_TYPE)DescriptorType)]
    267 #endif
    268   __C89_NAMELESS union {
    269 #ifdef __WIDL__
    270     [case(CharacteristicExtendedProperties)]
    271 #endif
    272     struct {
    273       BOOLEAN IsReliableWriteEnabled;
    274       BOOLEAN IsAuxiliariesWritable;
    275     } CharacteristicExtendedProperties;
    276 #ifdef __WIDL__
    277     [case(ClientCharacteristicConfiguration)]
    278 #endif
    279     struct {
    280       BOOLEAN IsSubscribeToNotification;
    281       BOOLEAN IsSubscribeToIndication;
    282     } ClientCharacteristicConfiguration;
    283 #ifdef __WIDL__
    284     [case(ServerCharacteristicConfiguration)]
    285 #endif
    286     struct {
    287       BOOLEAN IsBroadcast;
    288     } ServerCharacteristicConfiguration;
    289 #ifdef __WIDL__
    290     [case(CharacteristicFormat)]
    291 #endif
    292     struct {
    293       UCHAR Format;
    294       UCHAR Exponent;
    295       BTH_LE_UUID Unit;
    296       UCHAR NameSpace;
    297       BTH_LE_UUID Description;
    298     } CharacteristicFormat;
    299 #ifdef __WIDL__
    300     [default]
    301       ;
    302 #endif
    303   };
    304   ULONG DataSize;
    305 #ifdef __WIDL__
    306   [size_is(DataSize)] UCHAR Data[*];
    307 #else
    308   UCHAR Data[1];
    309 #endif
    310 } BTH_LE_GATT_DESCRIPTOR_VALUE, *PBTH_LE_GATT_DESCRIPTOR_VALUE;
    311 
    312 typedef enum _BTH_LE_GATT_EVENT_TYPE {
    313   CharacteristicValueChangedEvent
    314 } BTH_LE_GATT_EVENT_TYPE;
    315 
    316 typedef VOID (CALLBACK *PFNBLUETOOTH_GATT_EVENT_CALLBACK)(BTH_LE_GATT_EVENT_TYPE EventType, PVOID EventOutParameter, PVOID Context);
    317 
    318 typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION {
    319   USHORT NumCharacteristics;
    320   BTH_LE_GATT_CHARACTERISTIC Characteristics[1];
    321 } BLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT_REGISTRATION;
    322 
    323 typedef struct _BLUETOOTH_GATT_VALUE_CHANGED_EVENT {
    324   USHORT ChangedAttributeHandle;
    325   size_t CharacteristicValueDataSize;
    326   PBTH_LE_GATT_CHARACTERISTIC_VALUE CharacteristicValue;
    327 } BLUETOOTH_GATT_VALUE_CHANGED_EVENT, *PBLUETOOTH_GATT_VALUE_CHANGED_EVENT;
    328 
    329 typedef ULONG64 BTH_LE_GATT_RELIABLE_WRITE_CONTEXT, *PBTH_LE_GATT_RELIABLE_WRITE_CONTEXT;
    330 
    331 #ifdef __cplusplus
    332 extern "C"{
    333 #endif
    334 
    335 FORCEINLINE BOOLEAN IsBthLEUuidMatch(BTH_LE_UUID uuid1, BTH_LE_UUID uuid2) {
    336   BTH_LE_UUID tempLongUuid = {0};
    337   tempLongUuid.IsShortUuid = FALSE;
    338   tempLongUuid.Value.LongUuid = BTH_LE_ATT_BLUETOOTH_BASE_GUID;
    339   if (uuid1.IsShortUuid && uuid2.IsShortUuid) {
    340     return (uuid1.Value.ShortUuid == uuid2.Value.ShortUuid);
    341   } else if (!uuid1.IsShortUuid && !uuid2.IsShortUuid) {
    342     return (0 == memcmp(&uuid1.Value.LongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
    343   } else if (uuid1.IsShortUuid) {
    344     tempLongUuid.Value.LongUuid.Data1 += uuid1.Value.ShortUuid;
    345     return (0 == memcmp(&tempLongUuid, &uuid2.Value.LongUuid, sizeof(GUID)));
    346   } else if (uuid2.IsShortUuid) {
    347     tempLongUuid.Value.LongUuid.Data1 += uuid2.Value.ShortUuid;
    348     return (0 == memcmp(&uuid1.Value.LongUuid, &tempLongUuid.Value.LongUuid, sizeof(GUID)));
    349   }
    350   return FALSE;
    351 }
    352 
    353 #ifdef __cplusplus
    354   }
    355 #endif
    356 
    357 #endif /* NTDDI_WIN8 */
    358 
    359 #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
    360 
    361 #endif /* __BTHLEDEF_H__ */