Get Bluetooth Dongle Address for WINCE 5.0/WM5/WM6

Just need 2 step.

  1. Get “BTD0:" handle
  2. Call DeviceIOControl, ReadLocalAddr (14)
BOOL GetBTH_ADDR(BT_ADDR *btaddr)
{
	HANDLE hDev = INVALID_HANDLE_VALUE;

	unsigned buff[8];

	memset(buff, 0, sizeof(buff));

	*btaddr = 0;

	hDev = CreateFile(L"BTD0:", GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);

	if (hDev == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

#define BT_IOCTL_ReadLocalAddr 14

	int iErr = DeviceIoControl(hDev, BT_IOCTL_ReadLocalAddr, &buff, sizeof(buff), NULL, NULL, NULL, NULL);
	CloseHandle(hDev);
	hDev = INVALID_HANDLE_VALUE;

	if (iErr)
	{
		*btaddr = *((BT_ADDR*)buff);
		return TRUE;
	}

	return FALSE;
}

static WCHAR NUM2HEX(UINT i)
{
	const WCHAR idx[] = { L'0', L'1', L'2', L'3',
			L'4', L'5', L'6', L'7',
			L'8', L'9', L'A', L'B',
			L'C', L'D', L'E', L'F' };
	i &= 0xF;
	return idx[i];
/*
	if (i < 10)
	 return i + L'0';

	i -= 10;
	return i + L'A';
*/
}

static WCHAR LOBYTE2WC(const UCHAR x)
{
	return NUM2HEX(x & 0x0F);
}

static WCHAR HIBYTE2WC(const UCHAR x)
{
	return NUM2HEX(x>>4);
}

void BTADDR2WC(WCHAR* buff, BT_ADDR _btAddr, UINT sz)
{
	BYTE *pB = (BYTE*)&_btAddr+5;
	UINT i = 0;

	if (sz < (6*3 + 1))
		return;

	do
	{
		buff[i*3]=HIBYTE2WC(*(pB-i));
		buff[i*3+1]=LOBYTE2WC(*(pB-i));
		buff[i*3+2]=L':';
	} while (++i < 6);
	buff[i*3-1] = L'/0';
}
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: