7 #include "fbtHciDefs.h"
9 // Number of overlapped requests to have pending in the driver
10 #define HCI_NUMBER_OF_OVERLAPPED_LISTENS MAXIMUM_WAIT_OBJECTS-1
12 // HCI Abstraction layer
16 PFBT_HCI_EVENT_HEADER pEvent
;
20 } HCI_EVENT
, *PHCI_EVENT
;
22 class CHci
: public CBTHW
28 virtual DWORD
StartEventListener(void);
29 virtual DWORD
StopEventListener(void);
30 virtual DWORD
OnEvent(PFBT_HCI_EVENT_HEADER pEvent
, DWORD Length
);
32 static LPCTSTR
GetEventText(BYTE Event
);
33 static LPCTSTR
GetStatusText(BYTE Status
);
34 static LPCTSTR
GetManufacturerName(USHORT Company
);
36 virtual DWORD
OnCommandComplete(BYTE NumHCICommandPackets
, USHORT CommandOpcode
, BYTE
*Parameters
, DWORD ParameterLength
);
37 virtual DWORD
OnCommandStatus(BYTE Status
, BYTE NumHCICommandPackets
, USHORT CommandOpcode
);
39 virtual DWORD
OnConnectionRequest(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], ULONG ClassOfDevice
[FBT_HCI_DEVICE_CLASS_SIZE
], BYTE LinkType
);
40 virtual DWORD
OnConnectionComplete(BYTE Status
, USHORT ConnectionHandle
, BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE LinkType
, BYTE EncryptionMode
);
41 virtual DWORD
OnDisconnectionComplete(BYTE Status
, USHORT ConnectionHandle
, BYTE Reason
);
43 virtual DWORD
OnInquiryComplete(BYTE Status
, BYTE NumResponses
);
44 virtual DWORD
OnInquiryResult(BYTE NumResponses
, BYTE BD_ADDR
[FBT_HCI_VARIABLE_SIZE
][FBT_HCI_BDADDR_SIZE
], BYTE PageScanRepetitionMode
[FBT_HCI_VARIABLE_SIZE
], BYTE PageScanPeriodMode
[FBT_HCI_VARIABLE_SIZE
], BYTE PageScanMode
[FBT_HCI_VARIABLE_SIZE
], BYTE ClassOfDevice
[FBT_HCI_VARIABLE_SIZE
][FBT_HCI_DEVICE_CLASS_SIZE
], USHORT ClockOffset
[FBT_HCI_VARIABLE_SIZE
]);
46 virtual DWORD
OnRemoteNameRequestComplete(BYTE Status
, BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE RemoteName
[FBT_HCI_NAME_SIZE
]);
48 virtual DWORD
OnRoleChange(BYTE Status
, BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE Role
);
50 virtual DWORD
OnPINCodeRequest(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
]);
52 virtual DWORD
OnLinkKeyNotification(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE LinkKey
[FBT_HCI_LINK_KEY_SIZE
]);
53 virtual DWORD
OnLinkKeyRequest(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
]);
55 virtual DWORD
OnAuthenticationComplete(BYTE Status
, USHORT ConnectionHandle
);
57 virtual DWORD
OnReadLocalNameComplete(BYTE Status
, BYTE Name
[FBT_HCI_NAME_SIZE
]);
59 virtual DWORD
OnUnknown(PFBT_HCI_EVENT_HEADER pEvent
, DWORD Length
);
61 virtual DWORD
SendReset(void);
63 virtual DWORD
SendInquiry(ULONG LAP
, BYTE InquiryLength
, BYTE NumResponses
);
64 virtual DWORD
SendInquiryCancel(void);
66 virtual DWORD
SendReadBDADDR(void);
68 virtual DWORD
SendWriteScanEnable(BYTE ScanEnable
);
70 virtual DWORD
SendWriteAuthenticationEnable(BYTE ScanEnable
);
72 virtual DWORD
SendSetEventFilter(BYTE FilterType
,
73 BYTE FilterConditionType
,
74 BYTE Condition
[FBT_HCI_MAX_CONDITION_SIZE
],
77 virtual DWORD
SendReadClassOfDevice(void);
79 virtual DWORD
SendWriteClassOfDevice(BYTE ClassOfDevice
[FBT_HCI_DEVICE_CLASS_SIZE
]);
81 virtual DWORD
SendCreateConnection(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
],
83 BYTE PageScanRepetitionMode
,
86 BYTE AllowRoleSwitch
);
88 virtual DWORD
SendAcceptConnectionRequest(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE RoleSwitch
);
90 virtual DWORD
SendDisconnect(USHORT ConnectionHandle
, BYTE Reason
);
92 virtual DWORD
SendWriteLinkSupervisionTimeout(USHORT ConnectionHandle
, USHORT LinkSupervisionTimeout
);
94 virtual DWORD
SendWritePageTimeout(USHORT PageTimeout
);
96 virtual DWORD
SendRemoteNameRequest(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE PageScanRepetitionMode
, BYTE PageScanMode
, USHORT ClockOffset
);
98 virtual DWORD
SendReadLocalName(void);
100 virtual DWORD
SendChangeLocalName(BYTE Name
[FBT_HCI_NAME_SIZE
]);
102 virtual DWORD
SendSwitchRole(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE Role
);
104 virtual DWORD
SendPINCodeRequestReply(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE PINCodeLength
, BYTE PINCode
[FBT_HCI_PIN_CODE_SIZE
]);
105 virtual DWORD
SendPINCodeRequestNegativeReply(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
]);
107 virtual DWORD
SendLinkKeyRequestReply(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
], BYTE LinkKey
[FBT_HCI_LINK_KEY_SIZE
]);
108 virtual DWORD
SendLinkKeyRequestNegativeReply(BYTE BD_ADDR
[FBT_HCI_BDADDR_SIZE
]);
110 virtual DWORD
SendReadLocalVersionInformation(void);
112 DWORD
CompareBDADDRs(BYTE BD_ADDR1
[FBT_HCI_BDADDR_SIZE
], BYTE BD_ADDR2
[FBT_HCI_BDADDR_SIZE
]);
115 friend static DWORD CALLBACK
Listener(LPVOID pContext
);
116 friend static DWORD
EventHandler(PFBT_HCI_EVENT_HEADER pEvent
, DWORD Length
);
118 virtual DWORD
SendHciCommand(PFBT_HCI_CMD_HEADER lpCommand
, DWORD dwBufferSize
);
120 DWORD
SendListenForEvent(OVERLAPPED
*pOverlapped
, BYTE
*pEventBuffer
);
122 HANDLE m_hStopListeningEvent
;
123 HANDLE m_hListenerReadyEvent
;
124 HANDLE m_hListenerThread
;
126 DWORD m_dwListenerThreadId
;
128 OVERLAPPED m_Overlappeds
[HCI_NUMBER_OF_OVERLAPPED_LISTENS
];
129 BYTE m_pEventBuffers
[HCI_NUMBER_OF_OVERLAPPED_LISTENS
][FBT_HCI_EVENT_MAX_SIZE
];