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

📄 btclient.cxx

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

		if (! hWriteEvent)
			hWriteEvent = CreateEvent (NULL, FALSE, FALSE, NULL);

		OVERLAPPED o;
		memset (&o, 0, sizeof(o));
		o.hEvent = hWriteEvent;
		while (! WriteFile (hFile, &(pBuffer[dwFilledSoFar]), cSize - dwFilledSoFar, &dwWrit, &o)) {
			if ((GetLastError() == ERROR_IO_PENDING) &&
					GetOverlappedResult (hFile, &o, &dwWrit, TRUE))
				break;

			if (hFile != INVALID_HANDLE_VALUE)
				wprintf (L"Error writing COM port: GetLastError = 0x%08x (%d)\n", GetLastError (), GetLastError ());
			return FALSE;
		}
#else
		if ((! WriteFile (hFile, &(pBuffer[dwFilledSoFar]), cSize - dwFilledSoFar, &dwWrit, NULL)) &&
												(dwWrit == 0)) {

			if (GetLastError() == ERROR_IO_PENDING) {
				wprintf (L"Pending...\n");
				continue;
			}

#if defined (DEBUG) || defined (_DEBUG) || defined (RETAILLOG)
			if (hFile != INVALID_HANDLE_VALUE)
				wprintf (L"Error writing COM port: GetLastError = 0x%08x (%d)\n", GetLastError (), GetLastError ());
#endif
			return FALSE;
		}

#endif
		dwFilledSoFar += dwWrit;
	}

	return TRUE;
}

void ProcessRFCOMMCommand (WCHAR *szBuffer) {
	if (! g_fPortsInit) {
		g_fPortsInit = TRUE;
		for (int i = 0 ; i < 10 ; ++i) {
			g_ports[i].hDevice = NULL;
			g_ports[i].hFile   = INVALID_HANDLE_VALUE;
			g_ports[i].fActivated = FALSE;
		}
	}

	if (wcsnicmp (szBuffer, L"create ", 7) == 0) {
		szBuffer += 7;
		DWORD index = 0;

		if ((! GetDI (&szBuffer, (unsigned int *)&index)) || (index > 9)) {
			wprintf (L"syntax: index\n");
			return;
		}

		PORTEMUPortParams pp;
		memset (&pp, 0, sizeof(pp));

		if (wcsnicmp (szBuffer, L" server ", 8) == 0)
			pp.flocal = TRUE;
		else if (wcsnicmp (szBuffer, L" client ", 8) != 0) {
			wprintf (L"syntax: client/server\n");
			return;
		}

		szBuffer += 8;

		if (! pp.flocal) {
			if (! GetBA (&szBuffer, &pp.device)) {
				wprintf (L"Syntax : BA\n");
				return;
			}
		}

		if (! GetDI (&szBuffer, (unsigned int *)&pp.channel)) {
			wprintf (L"Syntax : channel\n");
			return;
		}

		GetDI (&szBuffer, (unsigned int *)&pp.imtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.iminmtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.imaxmtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.isendquota) &&
			GetDI(&szBuffer, (unsigned int *)&pp.irecvquota) &&
			GetUx(&szBuffer, (unsigned int *)&pp.uiportflags, 8);
		
		DWORD dwData;
		if (GetDI(&szBuffer, (unsigned int *)&dwData)) {
			GUID uuidBase = {0x00000000, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};
			memcpy(&pp.uuidService, &uuidBase, sizeof(GUID));
			pp.uuidService.Data1 = dwData;
		} else
			memcpy(&pp.uuidService, &CLSID_NULL, sizeof(GUID));
	

		HANDLE h = rfRegisterDevice (L"COM", index, L"btd.dll", (DWORD)&pp);
		wprintf (L"handle = 0x%08x\n", h);

		if (h) {
			g_ports[index].hDevice = h;
			g_ports[index].hFile   = INVALID_HANDLE_VALUE;
			g_ports[index].fActivated = FALSE;
		}

		return;
	}

#if defined (UNDER_CE)
	if (wcsnicmp (szBuffer, L"activate ", 9) == 0) {
		szBuffer += 9;
		WCHAR szDevName[_MAX_PATH];
		WCHAR *p = szDevName;

		while (*szBuffer && (! iswspace (*szBuffer))) {
			*p++ = *szBuffer++;
			if ((p - szDevName) >= (_MAX_PATH-2))
				break;
		}

		*p = '\0';

		while (iswspace (*szBuffer))
			++szBuffer;

		DWORD index = 0;

		if ((! GetDI (&szBuffer, (unsigned int *)&index)) || (index > 9)) {
			wprintf (L"syntax: index\n");
			return;
		}

		PORTEMUPortParams pp;
		memset (&pp, 0, sizeof(pp));

		pp.flocal = TRUE;

		if (! GetDI (&szBuffer, (unsigned int *)&pp.channel)) {
			wprintf (L"Syntax : channel\n");
			return;
		}

		GetDI (&szBuffer, (unsigned int *)&pp.imtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.iminmtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.imaxmtu) &&
			GetDI(&szBuffer, (unsigned int *)&pp.isendquota) &&
			GetDI(&szBuffer, (unsigned int *)&pp.irecvquota) &&
			GetUx(&szBuffer, (unsigned int *)&pp.uiportflags, 8);
		
		DWORD dwData;
		if (GetDI(&szBuffer, (unsigned int *)&dwData)) {
			GUID uuidBase = {0x00000000, 0x0000, 0x1000, {0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}};
			memcpy(&pp.uuidService, &uuidBase, sizeof(GUID));
			pp.uuidService.Data1 = dwData;
		} else
			memcpy(&pp.uuidService, &CLSID_NULL, sizeof(GUID));

		WCHAR szKeyName[_MAX_PATH];
		wsprintf (szKeyName, L"software\\microsoft\\btdc\\com%d", index);

		HKEY hk;
		DWORD dwDisp = 0;

		if (ERROR_SUCCESS != RegCreateKeyEx (HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, 0, KEY_WRITE, NULL, &hk, &dwDisp)) {
			wprintf (L"Failed to create registry key %s, error = %d\n", szKeyName, GetLastError ());
			return;
		}

		RegSetValueEx (hk, L"dll", 0, REG_SZ, (BYTE *)L"btd.dll", sizeof(L"btd.dll"));
		RegSetValueEx (hk, L"prefix", 0, REG_SZ, (BYTE *)L"COM", sizeof(L"COM"));

		DWORD dw = index;
		RegSetValueEx (hk, L"index", 0, REG_DWORD, (BYTE *)&dw, sizeof(dw));

		dw = (DWORD) &pp;
		RegSetValueEx (hk, L"context", 0, REG_DWORD, (BYTE *)&dw, sizeof(dw));

		HKEY hk2;

		if (ERROR_SUCCESS != RegCreateKeyEx (hk, L"unimodem", 0, NULL, 0, KEY_WRITE, NULL, &hk2, &dwDisp)) {
			RegCloseKey (hk);
			RegDeleteKey (HKEY_LOCAL_MACHINE, szKeyName);
			wprintf (L"Failed to create unimodem subkey of %s, error = %d\n", szKeyName, GetLastError ());
			return;
		}

		RegSetValueEx (hk2, L"friendlyname", 0, REG_SZ, (BYTE *)szDevName, (wcslen (szDevName) + 1) * sizeof(WCHAR));
		RegSetValueEx (hk2, L"tsp", 0, REG_SZ, (BYTE *)L"unimodem.dll", sizeof(L"unimodem.dll"));
		dw = 0;
		RegSetValueEx (hk2, L"devicetype", 0, REG_DWORD, (BYTE *)&dw, sizeof(dw));

		RegCloseKey (hk2);
		RegCloseKey (hk);

		HANDLE h = ActivateDevice (szKeyName, 0);
		wprintf (L"handle = 0x%08x\n", h);

		if (h) {
			g_ports[index].hDevice = h;
			g_ports[index].hFile   = INVALID_HANDLE_VALUE;
			g_ports[index].fActivated  = TRUE;
		}

		return;
	}
#endif

	if (wcsnicmp (szBuffer, L"open ", 5) == 0) {
		szBuffer += 5;

		DWORD index = 0;

		if ((! GetDI (&szBuffer, (unsigned int *)&index)) || (index > 9)) {
			wprintf (L"syntax: index\n");
			return;
		}

		CloseHandle (CreateThread (NULL, 0, RFCOMMReadThread, (LPVOID)index, 0, NULL));

		return;
	}

	if (wcsnicmp (szBuffer, L"write ", 6) == 0) {
		szBuffer += 6;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		if (*szBuffer != ' ') {
			wprintf (L"Syntax : string\n");
			return;
		}

		++szBuffer;

		HANDLE h = g_ports[index].hFile;

		DWORD dwWritten = 0;
		wprintf (L"Result = 0x%08x ", rfWriteFile (h, szBuffer, sizeof(WCHAR) * (wcslen (szBuffer) + 1), &dwWritten, NULL));
		wprintf (L"Bytes written %d\n", dwWritten);

		return;
	}

	if (wcsnicmp (szBuffer, L"writeansi ", 10) == 0) {
		szBuffer += 10;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		if (*szBuffer != ' ') {
			wprintf (L"Syntax : string\n");
			return;
		}

		++szBuffer;

		HANDLE h = g_ports[index].hFile;

		char buffer[128];
		int ichars;
		if (ichars = WideCharToMultiByte (CP_ACP, 0, szBuffer, -1, buffer, sizeof(buffer), NULL, NULL)) {
			DWORD dwWritten = 0;
			wprintf (L"Result = 0x%08x ", rfWriteFile (h, buffer, ichars, &dwWritten, NULL));
			wprintf (L"Bytes written %d\n", dwWritten);
		}

		return;
	}

	if (wcsnicmp (szBuffer, L"close ", 6) == 0) {
		szBuffer += 6;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		HANDLE h = g_ports[index].hFile;
		g_ports[index].hFile = INVALID_HANDLE_VALUE;
		rfCloseHandle (h);
		return;
	}

	if (wcsnicmp (szBuffer, L"destroy ", 8) == 0) {
		szBuffer += 8;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		if (g_ports[index].fActivated) {
			wprintf (L"This is activated device!\n");
			return;
		}

		HANDLE h = g_ports[index].hDevice;

		rfDeregisterDevice (h);

		g_ports[index].hFile = INVALID_HANDLE_VALUE;
		g_ports[index].hDevice = NULL;
		g_ports[index].fActivated = FALSE;

		return;
	}

#if defined (UNDER_CE)
	if (wcsnicmp (szBuffer, L"deactivate ", 11) == 0) {
		szBuffer += 11;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		if (! g_ports[index].fActivated) {
			wprintf (L"This is activated device!\n");
			return;
		}

		HANDLE h = g_ports[index].hDevice;

		DeactivateDevice (h);

		g_ports[index].hFile = INVALID_HANDLE_VALUE;
		g_ports[index].hDevice = NULL;
		g_ports[index].fActivated = FALSE;

		return;
	}
#endif

	if (wcsnicmp (szBuffer, L"send ", 5) == 0) {
		szBuffer += 5;

		unsigned int index;

		if ((! GetDI (&szBuffer, &index)) || (index > 9)) {
			wprintf (L"Syntax: handle\n");
			return;
		}

		if (*szBuffer != ' ') {
			wprintf (L"Syntax : filename\n");
			return;
		}

		++szBuffer;
		HANDLE h = g_ports[index].hFile;
		HANDLE hFile = CreateFile (szBuffer, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
		if (hFile == INVALID_HANDLE_VALUE) {
			wprintf (L"Could not open file %s\n", szBuffer);
			return;
		}

		unsigned char block[1024];
		for ( ; ; ) {
			DWORD dwBytesRead = 0;
			if ((! ReadFile (hFile, block, sizeof(block), &dwBytesRead, NULL)) || (dwBytesRead == 0))
				break;

			if (! WriteCommPort (h, block, dwBytesRead))
				break;
		}

		CloseHandle (hFile);

		return;
	}

	wprintf (L"Usage:\n");
	wprintf (L"\trfcomm create <index> {server | client <bt_addr>} <channel> <mtu or 0> <minmtu or 0> <maxmtu or 0> <sendquota or 0> <recvquota or 0> <uuid32> - create device (COMx:), returns device handle\n\n(uuid32 : Data1 portion of the uuid. The rest of the uuid used is the same as Obex base uuid)\n\n");
	wprintf (L"\trfcomm destroy <index>          - shut down device (COMx:)\n");
	wprintf (L"\trfcomm open <index>             - open device (COMx:), returns handle\n");
	wprintf (L"\trfcomm write <index> string     - write unicode string out to port\n");
	wprintf (L"\trfcomm writeansi <index> string - write ansi string out to port\n");
	wprintf (L"\trfcomm send <index> filename    - send file to port\n");
}

DWORD WINAPI ListenThread (LPVOID lpVoid) {
	unsigned short psm = (unsigned short)lpVoid;

	wprintf (L"Listen thread created for psm = 0x%04x\n", psm);

	for ( ; ; ) {
		BT_ADDR ba;
		unsigned short cid, outmtu;
		int iErr = L2CAPAccept (psm, &ba, &cid, &outmtu);
		if (iErr != ERROR_SUCCESS) {
			wprintf (L"Listen exited with code 0x%08x (%d)\n", iErr, iErr);
			L2CAPClosePSM (psm);
			break;
		}

		wprintf (L"Connection successful, cid = 0x%04x - spinning read thread\n", cid);

		DWORD dwTID;
		CloseHandle (CreateThread (NULL, 0, ReadThread, (void *)cid, 0, &dwTID));
	}

	wprintf (L"Exiting listening thread for psm = 0x%04x\n", psm);
	return 0;
}

static void DumpFeatures (unsigned char *pf) {
	wprintf (L"Supported LMP features:\n");
	if ((*pf) & 0x01)
		wprintf (L"\t3-slot packets\n");
	if ((*pf) & 0x02)
		wprintf (L"\t5-slot packets\n");
	if ((*pf) & 0x04)
		wprintf (L"\tencryption\n");
	if ((*pf) & 0x08)
		wprintf (L"\tslot offset\n");
	if ((*pf) & 0x10)
		wprintf (L"\ttiming accuracy\n");
	if ((*pf) & 0x20)
		wprintf (L"\tswitch\n");
	if ((*pf) & 0x40)
		wprintf (L"\thold\n");
	if ((*pf) & 0x80)
		wprintf (L"\tsniff\n");
	++pf;

⌨️ 快捷键说明

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