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

📄 btcp.cxx

📁 Windows CE操作系统中适用的蓝牙驱动程序
💻 CXX
📖 第 1 页 / 共 2 页
字号:
		++*pp;

		++iDig;
	}

	if (iDig > nDigs)
		return FALSE;

	switch (nDigs) {
	case 2:
		*(unsigned char *)pRes = (unsigned char)iRes;
		break;
	case 4:
		*(unsigned short *)pRes = (unsigned short)iRes;
		break;
	case 8:
		*(unsigned int *)pRes = (unsigned int)iRes;
		break;
	}

	return TRUE;
}

int GetUx2 (WCHAR **pp, void *pRes, int nDigs) {
	int iDig = 0;
	int iRes = 0;
	while (iswxdigit (**pp) && (iDig < nDigs)) {
		int c = **pp;
		if (c >= 'a')
			c = c - 'a' + 0xa;
		else if (c >= 'A')
			c = c - 'A' + 0xa;
		else c = c - '0';

		if ((c < 0) || (c > 16))
			return FALSE;

		iRes = iRes * 16 + c;

		++*pp;

		++iDig;
	}

	switch (nDigs) {
	case 2:
		*(unsigned char *)pRes = (unsigned char)iRes;
		break;
	case 4:
		*(unsigned short *)pRes = (unsigned short)iRes;
		break;
	case 8:
		*(unsigned int *)pRes = (unsigned int)iRes;
		break;
	}

	return TRUE;
}

int GetBA (WCHAR **pp, BT_ADDR *pba) {
	unsigned short x;
	unsigned int y;
	if (! GetUx2 (pp, &x, 4))
		return FALSE;

	if (! GetUx2 (pp, &y, 8))
		return FALSE;

	*pba = SET_NAP_SAP (x, y);
	return TRUE;
}

void Refresh (void) {
	WCHAR szLine[_MAX_PATH];
	unsigned int page = 0;
	unsigned int cod = 0;
	unsigned int auth = ((SendMessage (GetDlgItem (ghWnd, IDC_SECURE_ONLY), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 1 : 0);
	unsigned int scan = ((SendMessage (GetDlgItem (ghWnd, IDC_DISCOVERABLE), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 1 : 0) |
		((SendMessage (GetDlgItem (ghWnd, IDC_CONNECTABLE), BM_GETCHECK, 0, 0) == BST_CHECKED) ? 2 : 0);

	szLine[0] = '\0';
	GetWindowText (GetDlgItem (ghWnd, IDC_PAGE), szLine, _MAX_PATH);
	WCHAR *p = szLine;
	if (! GetDI (&p, &page)) {
		page = gPage;
		wsprintf (szLine, L"%d", gPage);
		SetWindowText (GetDlgItem (ghWnd, IDC_PAGE), szLine);
	}

	szLine[0] = '\0';
	GetWindowText (GetDlgItem (ghWnd, IDC_COD), szLine, _MAX_PATH);
	p = szLine;
	if (! GetUx (&p, &cod, 8)) {
		cod = gCod;
		wsprintf (szLine, L"0x%06x", gCod);
		SetWindowText (GetDlgItem (ghWnd, IDC_COD), szLine);
	}

	if (auth != gAuth)
		BthWriteAuthenticationEnable ((unsigned char)auth);

	if (scan != gScan)
		BthWriteScanEnableMask ((unsigned char)scan);

	if (page != gPage)
		BthWritePageTimeout ((unsigned short)page);

	if (cod != gCod)
		BthWriteCOD (cod);

	FillParameters (NULL);
}

#define MAX_CONNECTIONS		20

static void RefreshActive (HWND hWnd) {
	HWND hLB = GetDlgItem (hWnd, IDC_CONNECTION_LIST);

	for ( ; ; ) {	// Clean up
		int res = SendMessage (hLB, LB_GETCOUNT, 0, 0);
		if (res == LB_ERR)
			return;
		if (res == 0)
			break;
		SendMessage (hLB, LB_DELETESTRING, 0, 0);
	}

	int cConnections = 0;
	BASEBAND_CONNECTION pConnections[MAX_CONNECTIONS];

	if (ERROR_SUCCESS != BthGetBasebandConnections (MAX_CONNECTIONS, pConnections, &cConnections)) {
		MessageBox (hWnd, L"Information request failed", L"Error", MB_OK | MB_TOPMOST);
	}
	else {
		for (int i = 0 ; i < cConnections ; ++i) {
			if (pConnections[i].fLinkType == BTH_LINK_TYPE_ACL) {
				WCHAR sz[20];
				wsprintf (sz, L"%04x%08x", GET_NAP(pConnections->baAddress), GET_SAP(pConnections->baAddress));
				SendMessage (hLB, LB_ADDSTRING, 0, (LPARAM)sz);
			}
		}
	}
}

static int GetCurrentBt (HWND hWnd, BT_ADDR *pbt) {
	HWND hLB = GetDlgItem (hWnd, IDC_CONNECTION_LIST);

	int iSel = SendMessage (hLB, LB_GETCURSEL, 0, 0);

	WCHAR szBuf[25];
	WCHAR *p = szBuf;

	if (iSel == LB_ERR)
		return FALSE;

	if (SendMessage (hLB, LB_GETTEXTLEN, iSel, 0) >
					sizeof(szBuf) / sizeof(szBuf[0]))
		return FALSE;

	if (LB_ERR == SendMessage (hLB, LB_GETTEXT, iSel, (LPARAM)szBuf))
		return FALSE;

	return GetBA (&p, pbt);
}

static void RefreshCurrent (HWND hWnd) {
	EnableWindow (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_STATE_NORMAL), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_STATE_HOLD), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_STATE_SNIFF), FALSE);
	EnableWindow (GetDlgItem (hWnd, IDC_STATE_PARK), FALSE);

	SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
	SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);


	BT_ADDR bt;
	if (! GetCurrentBt (hWnd, &bt))
		return;

	unsigned short lps = 0;
	if (BthReadLinkPolicySettings (&bt, &lps) == ERROR_SUCCESS) {
		EnableWindow (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), TRUE);
		EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), TRUE);
		EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), TRUE);
		EnableWindow (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), TRUE);
		if (lps & 1)
			SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_SETCHECK, BST_CHECKED, 0);
		if (lps & 2)
			SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_SETCHECK, BST_CHECKED, 0);

		if (lps & 4)
			SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_SETCHECK, BST_CHECKED, 0);

		if (lps & 8)
			SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_SETCHECK, BST_CHECKED, 0);
	}

	unsigned char mode = 0;
	if (BthGetCurrentMode (&bt, &mode) == ERROR_SUCCESS) {
		// EnableWindow (GetDlgItem (hWnd, IDC_STATE_NORMAL), TRUE);
		// EnableWindow (GetDlgItem (hWnd, IDC_STATE_HOLD), TRUE);
		// EnableWindow (GetDlgItem (hWnd, IDC_STATE_SNIFF), TRUE);
		// EnableWindow (GetDlgItem (hWnd, IDC_STATE_PARK), TRUE);

		if (mode == 0)
			SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_CHECKED, 0);

		if (mode == 1)
			SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_CHECKED, 0);

		if (mode == 2)
			SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_CHECKED, 0);

		if (mode == 3)
			SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_CHECKED, 0);
	}
}

static BOOL CALLBACK ActiveDlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
	case WM_INITDIALOG:
		SetForegroundWindow (hWnd);
		SetFocus (GetDlgItem (hWnd, IDC_CONNECTION_LIST));
		RefreshActive (hWnd);

		return 0;

	case WM_COMMAND:
		{
			int wID = LOWORD(wParam);
			switch (wID)
			{
			case IDC_CONNECTION_LIST:
				if (HIWORD(wParam) == LBN_SELCHANGE)
					RefreshCurrent (hWnd);

				break;

			case IDOK:
			case IDCANCEL:
				EndDialog (hWnd, TRUE);
				return 0;

			case IDC_LP_MS_SWITCH:
			case IDC_LP_ENABLE_HOLD:
			case IDC_LP_ENABLE_SNIFF:
			case IDC_LP_ENABLE_PARK:
				{
				HWND hItem = GetDlgItem (hWnd, wID);
				unsigned short lps = 0;
				if (SendMessage (GetDlgItem (hWnd, IDC_LP_MS_SWITCH), BM_GETCHECK, 0, 0) == BST_CHECKED)
					lps |= 1;

				if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_HOLD), BM_GETCHECK, 0, 0) == BST_CHECKED)
					lps |= 2;

				if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_SNIFF), BM_GETCHECK, 0, 0) == BST_CHECKED)
					lps |= 4;

				if (SendMessage (GetDlgItem (hWnd, IDC_LP_ENABLE_PARK), BM_GETCHECK, 0, 0) == BST_CHECKED)
					lps |= 8;

				BT_ADDR bt;
				if (GetCurrentBt (hWnd, &bt)) {
					BthWriteLinkPolicySettings (&bt, lps);
					RefreshCurrent (hWnd);
				}
				break;
				}

			case IDC_STATE_NORMAL:
			case IDC_STATE_HOLD:
			case IDC_STATE_SNIFF:
			case IDC_STATE_PARK:
				{
				SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_SETCHECK, BST_UNCHECKED, 0);
				SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_SETCHECK, BST_UNCHECKED, 0);
				SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_SETCHECK, BST_UNCHECKED, 0);
				SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_SETCHECK, BST_UNCHECKED, 0);

				SendMessage (GetDlgItem (hWnd, wID), BM_SETCHECK, BST_CHECKED, 0);

				unsigned char mode = 0;
				if (SendMessage (GetDlgItem (hWnd, IDC_STATE_NORMAL), BM_GETCHECK, 0, 0) == BST_CHECKED)
					mode = 0;
				else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_HOLD), BM_GETCHECK, 0, 0) == BST_CHECKED)
					mode = 1;
				else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_SNIFF), BM_GETCHECK, 0, 0) == BST_CHECKED)
					mode = 2;
				else if (SendMessage (GetDlgItem (hWnd, IDC_STATE_PARK), BM_GETCHECK, 0, 0) == BST_CHECKED)
					mode = 3;

				BT_ADDR bt;
				if (GetCurrentBt (hWnd, &bt)) {
					unsigned char oldmode = 0;
					if (ERROR_SUCCESS != BthGetCurrentMode (&bt, &oldmode))
						break;

					if (oldmode == mode)
						break;

				}

				RefreshCurrent (hWnd);
				break;
				}

			case IDC_REFRESH:
				RefreshActive (hWnd);
				RefreshCurrent (hWnd);
				break;
			}
		}
		break;
	}

	return 0;
}

static BOOL CALLBACK DlgProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	switch (uMsg) {
	case WM_INITDIALOG:
		ghWnd = hWnd;
		SetForegroundWindow (hWnd);
		SetFocus (GetDlgItem (hWnd, IDC_OK));
		SendMessage(GetDlgItem(hWnd, IDC_DESCR), LB_SETHORIZONTALEXTENT, 250, 0); 
		CloseHandle (CreateThread (NULL, 0, FillParameters, NULL, 0, NULL));

		return 0;

	case WM_COMMAND:
		{
			int wID = LOWORD(wParam);
			switch (wID)
			{
			case IDC_OK:
				EndDialog (hWnd, TRUE);
				return 0;

			case IDC_EXIT:
			case IDCANCEL:
				EndDialog (hWnd, FALSE);
				return 0;

			case IDC_STARTSTOP:
				StartStop ();
				break;

			case IDC_ACTIVE:
				DialogBox (ghInst, MAKEINTRESOURCE (IDD_ACTIVE), NULL, ActiveDlgProc);
				break;

			case IDC_REFRESH:
				Refresh ();
			}
		}
		break;
	}

	return 0;
}

#if defined (DO_DEVICE_CONTROL)
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	switch (message) {
	case WM_CREATE:
		return 0;

	case WM_DESTROY:
		PostQuitMessage (0);
		break;

	case WM_USER + 1:
		if (lParam == WM_LBUTTONDOWN) {
			if (ghWnd) {
				SetForegroundWindow (ghWnd);
				break;
			}

			if (! DialogBox (ghInst, MAKEINTRESOURCE (IDD_MAINBOX), NULL, DlgProc)) {
				NOTIFYICONDATA nid;
				memset (&nid, 0, sizeof(nid));

			   	nid.cbSize = sizeof(NOTIFYICONDATA);
			   	nid.hWnd   = hWnd;
			    nid.uID    = 1;

 				Shell_NotifyIcon (NIM_DELETE, &nid);

				DestroyWindow (hWnd);
			}

			ghWnd = NULL;
		}

		break;

	case WM_USER + 2:
		DialogBoxParam (ghInst, MAKEINTRESOURCE (IDD_ENTERPIN), NULL, DlgProc2, lParam);
		LocalFree ((void *)lParam);
		break;

	case WM_USER + 3:
		FillFromRegistry ();
		break;

	case WM_USER + 5:
		{
			if (ghWnd) {
				SetForegroundWindow (ghWnd);
				break;
			}

			NOTIFYICONDATA nid;
			memset (&nid, 0, sizeof(nid));

		   	nid.cbSize = sizeof(NOTIFYICONDATA);
		   	nid.hWnd   = hWnd;
		    nid.uID    = 1;

 			Shell_NotifyIcon (NIM_DELETE, &nid);

			DestroyWindow (hWnd);
		}

		break;

	default:
        return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return FALSE;
}

DWORD WINAPI SecurityUI (LPVOID lpVoid) {
	HANDLE ah[2];
	ah[0] = ghEvent;
	ah[1] = CreateEvent (NULL, TRUE, FALSE, BTH_NAMEDEVENT_HARDWARE_CHANGED);

	for ( ; ; ) {
		DWORD dwRes = WaitForMultipleObjects (ah[1] ? 2 : 1, ah, FALSE, INFINITE);
		if ((WAIT_OBJECT_0 != dwRes) && ((WAIT_OBJECT_0+1) != dwRes))
			break;

		if (gExit)
			break;

		BT_ADDR bt;
		while (ERROR_SUCCESS == BthGetPINRequest (&bt)) {
			pin_request *p = (pin_request *)LocalAlloc (LMEM_FIXED, sizeof(pin_request));
			p->bt = bt;
			p->hWnd = NULL;
			PostMessage (ghWndHidden, WM_USER + 2, 0, (LPARAM)p);
		}

		if (dwRes == (WAIT_OBJECT_0+1))
			PostMessage (ghWndHidden, WM_USER + 3, 0, NULL);
	}

	if (ah[1])
		CloseHandle (ah[1]);

	return 0;
}
#endif

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPWSTR lpszCmdLine, int nCmdShow) {
	for (int i = 0 ; (i < 10) && (! IsAPIReady(SH_WMGR)); ++i)	//Wait for shell
		Sleep(1000);

	ghInst = hInst;
	gExit = FALSE;

#if defined (DO_DEVICE_CONTROL)
#if defined (SDK_BUILD)
	HMODULE hMod = LoadLibrary (L"aygshell.dll");
	if (hMod)
		gpSHInputDialog = (tSHInputDialog)GetProcAddress (hMod, L"SHInputDialog");
#endif

	ghEvent = CreateEvent (NULL, FALSE, FALSE, NULL);

	int fSecUISet = ERROR_SUCCESS != BthSetSecurityUI (ghEvent, 60000, 120000);

	CloseHandle (CreateThread (NULL, 0, SecurityUI, NULL, 0, NULL));

	WNDCLASS	wc;
	memset (&wc, 0, sizeof(wc));

	wc.lpfnWndProc 		= WndProc;
	wc.hInstance   		= hInst;
	wc.lpszClassName 	= APPNAME;

	if (! RegisterClass (&wc))
		return 0;

	ghWndHidden = CreateWindow (APPNAME, APPNAME, WS_DISABLED,
						CW_USEDEFAULT, CW_USEDEFAULT,
						CW_USEDEFAULT, CW_USEDEFAULT,
						NULL, NULL, hInst, NULL);

	NOTIFYICONDATA nid;
	memset (&nid, 0, sizeof(nid));

   	nid.cbSize 			 = sizeof(NOTIFYICONDATA);
   	nid.hWnd 			 = ghWndHidden;
   	nid.uID 			 = 1;
   	nid.uFlags 		     = NIF_ICON | NIF_MESSAGE;
   	nid.uCallbackMessage = WM_USER + 1;
	nid.hIcon            = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_BTHICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);

	if (wcsstr (lpszCmdLine, L"/noicon") == 0)
		Shell_NotifyIcon (NIM_ADD, &nid);

	FillFromRegistry ();

	MSG msg;

    while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage (&msg) ;
		DispatchMessage(&msg);
	}

	gExit = TRUE;
	SetEvent (ghEvent);
	CloseHandle (ghEvent);

	if (fSecUISet)
		BthSetSecurityUI (NULL, 0, 0);
#else
	HWND hWnd = FindWindow (L"dialog", L"Bluetooth Control");
	if (hWnd)
		SetForegroundWindow (hWnd);
	else
		DialogBox (ghInst, MAKEINTRESOURCE (IDD_MAINBOX), NULL, DlgProc);

	gExit = TRUE;
#endif

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -