⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l2capapi.cxx

📁 Windows CE操作系统中适用的蓝牙驱动程序
💻 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 + -