📄 btclient.cxx
字号:
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 + -