📄 l2capapi.cxx
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/**
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
Abstract:
Windows CE Bluetooth stack layer sample
**/
#include <windows.h>
#include <svsutil.hxx>
#include <bt_buffer.h>
#include <bt_ddi.h>
#include <winsock.h>
#include <ws2bth.h>
#include <bt_os.h>
#include "l2capapi.hxx"
#include "../l2capdev/l2capdev.hxx"
extern "C" const BOOL g_fl2capApiCOM;
HANDLE hDev = INVALID_HANDLE_VALUE;
int Initialize (void) {
if (hDev != INVALID_HANDLE_VALUE)
return TRUE;
hDev = CreateFile (L"L2C0:", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
return (hDev != INVALID_HANDLE_VALUE) ? TRUE : FALSE;
}
int L2CAPLoad (void) {
HANDLE hDevice = RegisterDevice (L"L2C", 0, L"l2capdev.dll", 0);
if (hDevice) {
HKEY hk;
if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_BASE, L"Software\\Microsoft\\Bluetooth", 0, KEY_READ, &hk)) {
RegSetValueEx (hk, L"l2capdev_handle", 0, REG_DWORD, (LPBYTE)&hDevice, sizeof(hDevice));
RegCloseKey (hk);
}
}
return hDevice != NULL ? ERROR_SUCCESS : ERROR_SERVICE_NOT_ACTIVE;
}
int L2CAPUnload (void) {
HKEY hk;
int iRes = FALSE;
if (hDev != INVALID_HANDLE_VALUE) {
CloseHandle (hDev);
hDev = INVALID_HANDLE_VALUE;
}
if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_BASE, L"Software\\Microsoft\\Bluetooth", 0, KEY_READ, &hk)) {
HANDLE hDevice = NULL;
DWORD dwSize = sizeof (hDevice);
DWORD dwType;
if ((ERROR_SUCCESS == RegQueryValueEx (hk, L"l2capdev_handle", NULL, &dwType, (LPBYTE)&hDevice, &dwSize)) &&
(dwType == REG_DWORD) && (dwSize == sizeof (hDevice)) && hDevice) {
RegDeleteValue (hk, L"l2capdev_handle");
DeregisterDevice (hDevice);
iRes = TRUE;
}
RegCloseKey (hk);
}
return iRes ? ERROR_SUCCESS : ERROR_SERVICE_NOT_ACTIVE;
}
int L2CAPConnect
(
BT_ADDR *pba, // =>
unsigned short usPSM, // =>
unsigned short usInMTU, // =>
unsigned short *pCID, // <=
unsigned short *pusOutMTU // <=
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPConnect_p.ba = *pba;
bc.L2CAPConnect_p.usPSM = usPSM;
bc.L2CAPConnect_p.usInMTU = usInMTU;
int iErr = DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPConnect, &bc, sizeof(bc), NULL, NULL, NULL, NULL);
if (iErr) {
*pCID = bc.L2CAPConnect_p.usCID;
*pusOutMTU = bc.L2CAPConnect_p.usOutMTU;
return ERROR_SUCCESS;
}
return GetLastError();
}
int L2CAPListen
(
unsigned short usPSM, // =>
unsigned short usInMTU // =>
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPListen_p.usPSM = usPSM;
bc.L2CAPListen_p.usInMTU = usInMTU;
return ((DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPListen, &bc, sizeof(bc), NULL, NULL, NULL, NULL)) ? ERROR_SUCCESS : GetLastError());
}
int L2CAPAccept
(
unsigned short usPSM, // =>
BT_ADDR *pba, // <=
unsigned short *pusCID, // <=
unsigned short *pusOutMTU // <=
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPAccept_p.usPSM = usPSM;
int iErr = DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPAccept, &bc, sizeof(bc), NULL, NULL, NULL, NULL);
if (iErr) {
*pba = bc.L2CAPAccept_p.ba;
*pusCID = bc.L2CAPAccept_p.usCID;
*pusOutMTU = bc.L2CAPAccept_p.usOutMTU;
return ERROR_SUCCESS;
}
return GetLastError();
}
int L2CAPWrite
(
unsigned short cid,
unsigned int cBuffer,
unsigned char *pBuffer
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPReadWrite_p.cBuffer = cBuffer;
bc.L2CAPReadWrite_p.usCID = cid;
bc.L2CAPReadWrite_p.pBuffer = pBuffer;
return ((DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPWrite, &bc, sizeof(bc), NULL, NULL, NULL, NULL)) ? ERROR_SUCCESS : GetLastError());
}
int L2CAPRead
(
unsigned short cid,
unsigned int cBuffer,
unsigned int *pRequired,
unsigned char *pBuffer
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPReadWrite_p.cBuffer = cBuffer;
bc.L2CAPReadWrite_p.usCID = cid;
bc.L2CAPReadWrite_p.pBuffer = pBuffer;
int iErr = DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPRead, &bc, sizeof(bc), NULL, NULL, NULL, NULL);
*pRequired = bc.L2CAPReadWrite_p.cRequired;
return ((iErr) ? ERROR_SUCCESS : GetLastError());
}
int L2CAPCloseCID
(
unsigned short cid
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPClose_p.us = cid;
return ((DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPCloseCID, &bc, sizeof(bc), NULL, NULL, NULL, NULL)) ? ERROR_SUCCESS : GetLastError());
}
int L2CAPClosePSM
(
unsigned short psm
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPClose_p.us = psm;
return ((DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPClosePSM, &bc, sizeof(bc), NULL, NULL, NULL, NULL)) ? ERROR_SUCCESS : GetLastError());
}
int L2CAPPing
(
BT_ADDR *pbt,
unsigned int cBufferIn,
unsigned char *pBufferIn,
unsigned int *pcBufferOut,
unsigned char *pBufferOut
) {
if (! Initialize())
return ERROR_SERVICE_NOT_ACTIVE;
L2CAPDEVAPICALL bc;
memset (&bc, 0, sizeof(bc));
bc.L2CAPPing_p.ba = *pbt;
bc.L2CAPPing_p.cBufferIn = cBufferIn;
bc.L2CAPPing_p.cBufferOut = *pcBufferOut;
bc.L2CAPPing_p.pBufferIn = pBufferIn;
bc.L2CAPPing_p.pBufferOut = pBufferOut;
int iRes = ((DeviceIoControl (hDev, L2CAPDEV_IOCTL_L2CAPPing, &bc, sizeof(bc), NULL, NULL, NULL, NULL)) ? ERROR_SUCCESS : GetLastError());
if (iRes == ERROR_SUCCESS)
*pcBufferOut = bc.L2CAPPing_p.cBufferOut;
else
*pcBufferOut = 0;
return iRes;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -