📄 miniport.cxx
字号:
hMediaThread = NULL;
hRefreshEvent = NULL;
mediaDelay = BTHPAN_MEDIADELAY_DEFAULT;
ucInquiryLength = BTHPAN_INQUIRY_DEFAULT;
fAuthenticate = TRUE;
fEncrypt = TRUE;
}
PAN_CONTEXT (void) {
Reinit ();
}
};
// Ascending order list as preferred by ndis
static NDIS_OID g_oidSupported[] =
{
// Required GEN oids
OID_GEN_SUPPORTED_LIST,
OID_GEN_HARDWARE_STATUS,
OID_GEN_MEDIA_SUPPORTED,
OID_GEN_MEDIA_IN_USE,
OID_GEN_MAXIMUM_LOOKAHEAD,
OID_GEN_MAXIMUM_FRAME_SIZE,
OID_GEN_LINK_SPEED,
OID_GEN_TRANSMIT_BUFFER_SPACE,
OID_GEN_RECEIVE_BUFFER_SPACE,
OID_GEN_TRANSMIT_BLOCK_SIZE,
OID_GEN_RECEIVE_BLOCK_SIZE,
OID_GEN_VENDOR_ID,
OID_GEN_VENDOR_DESCRIPTION,
OID_GEN_CURRENT_PACKET_FILTER,
OID_GEN_CURRENT_LOOKAHEAD,
OID_GEN_DRIVER_VERSION,
OID_GEN_MAXIMUM_TOTAL_SIZE,
OID_GEN_PROTOCOL_OPTIONS,
OID_GEN_MAC_OPTIONS,
OID_GEN_MEDIA_CONNECT_STATUS,
OID_GEN_MAXIMUM_SEND_PACKETS,
OID_GEN_VENDOR_DRIVER_VERSION,
// Optional GEN oids
OID_GEN_SUPPORTED_GUIDS,
// OID_GEN_MEDIA_CAPABILITIES,
// OID_GEN_PHYSICAL_MEDIUM,
// Required GEN statistic oids
OID_GEN_XMIT_OK,
OID_GEN_RCV_OK,
OID_GEN_XMIT_ERROR,
OID_GEN_RCV_ERROR,
OID_GEN_RCV_NO_BUFFER,
// Required 802.3 oids
OID_802_3_PERMANENT_ADDRESS,
OID_802_3_CURRENT_ADDRESS,
OID_802_3_MULTICAST_LIST,
OID_802_3_MAXIMUM_LIST_SIZE,
// Required 802.3 statistic oids
OID_802_3_RCV_ERROR_ALIGNMENT,
OID_802_3_XMIT_ONE_COLLISION,
OID_802_3_XMIT_MORE_COLLISIONS,
// Power management oids
// OID_PNP_CAPABILITIES,
// OID_PNP_SET_POWER,
// OID_PNP_QUERY_POWER,
// OID_PNP_ADD_WAKE_UP_PATTERN,
// OID_PNP_REMOVE_WAKE_UP_PATTERN,
// OID_PNP_ENABLE_WAKE_UP
// Bluetooth PAN oids
OID_PAN_CONNECT,
OID_PAN_DISCONNECT,
OID_PAN_AUTHENTICATE,
OID_PAN_ENCRYPT,
// OID_PAN_CONFIG,
// OID_PAN_ENUM_CONNECTIONS,
// OID_PAN_ENUM_DEVICES
};
static PAN_CONTEXT *gpPAN;
static void MpAttemptConnection (BTHPAN_ADAPTER *pAdapter, BD_ADDR *pba, GUID *pService);
static void MpGetAssociations (BTHPAN_ADAPTER *pAdapter);
static VOID MpMediaStatusIndicate (BTHPAN_ADAPTER *pAdapter);
static int StartAuthenticatingThread (BTHPAN_CONNECTION *pConn);
//
// General utilities
//
void *BNEPPacket::operator new (size_t iSize) {
SVSUTIL_ASSERT (gpPAN->pfmdPackets);
SVSUTIL_ASSERT (gpPAN->IsLocked ());
SVSUTIL_ASSERT (iSize == sizeof(BNEPPacket));
void *pRes = svsutil_GetFixed (gpPAN->pfmdPackets);
SVSUTIL_ASSERT (pRes);
return pRes;
}
void BNEPPacket::operator delete(void *ptr) {
SVSUTIL_ASSERT (gpPAN->IsLocked ());
SVSUTIL_ASSERT (ptr);
svsutil_FreeFixed (ptr, gpPAN->pfmdPackets);
}
#if defined (DEBUG) || defined (_DEBUG)
static int DumpBnepControl (unsigned char *&p) {
DebugOut (DEBUG_PAN_PACKETS, L"BNEP CONTROL : ");
switch (*p) {
case 0x00:
DebugOut (DEBUG_PAN_PACKETS, L"CONTROL NOT UNDERSTOOD, type=0x%02x", p[1]);
p += 2;
break;
case 0x01:
{
DebugOut (DEBUG_PAN_PACKETS, L"SETUP CONNECTION REQUEST ");
int cUuidSize = p[1];
switch (cUuidSize) {
case 2:
DebugOut (DEBUG_PAN_PACKETS, L"dst=0x%04x src=0x%04x\n", (p[2] << 8) | p[3], (p[4] << 8) | p[5]);
break;
case 4:
DebugOut (DEBUG_PAN_PACKETS, L"dst=0x%08x src=0x%08x\n", (p[2] << 24) | (p[3] << 16) | (p[4] << 8) | p[5],
(p[6] << 24) | (p[7] << 16) | (p[8] << 8) | p[9]);
break;
case 16:
DebugOut (DEBUG_PAN_PACKETS, L"\n dst=%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
(p[2] << 24) | (p[3] << 16) | (p[4] << 8) | p[5],
(p[6] << 8) | p[7],
(p[8] << 8) | p[9],
p[10], p[11],
p[12], p[13], p[14], p[15], p[16], p[17]);
DebugOut (DEBUG_PAN_PACKETS, L"\n src=%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
(p[18] << 24) | (p[19] << 16) | (p[20] << 8) | p[21],
(p[22] << 8) | p[23],
(p[24] << 8) | p[25],
p[26], p[27],
p[28], p[29], p[30], p[31], p[32], p[33]);
break;
}
p += 2 + cUuidSize * 2;
}
break;
case 0x02:
{
unsigned short usResult = (p[1] << 8) | p[2];
WCHAR *szResult = L"UNKNOWN";
switch (usResult) {
case 0x0000:
szResult = L"SUCCESS";
break;
case 0x0001:
szResult = L"FAILED, bad dest UUID";
break;
case 0x0002:
szResult = L"FAILED, bad src UUID";
break;
case 0x0003:
szResult = L"FAILED, bad UUID size";
break;
case 0x0004:
szResult = L"FAILED, not allowed";
break;
}
DebugOut (DEBUG_PAN_PACKETS, L"SETUP CONNECTION RESPONSE, 0x%04x (%s)\n", usResult, szResult);
p += 3;
}
break;
case 0x03:
{
int cPairs = ((p[1] << 8) | p[2]) / 4;
DebugOut (DEBUG_PAN_PACKETS, L"FILTER NET TYPE SET, %d pairs\n", cPairs);
if (p[2] & 3)
DebugOut (DEBUG_PAN_PACKETS, L"ERROR: bad length (%d)!\n", p[1]);
p += 3;
for (int i = 0 ; i < cPairs ; ++i, p += 4)
DebugOut (DEBUG_PAN_PACKETS, L" 0x%04x-0x%04x\n", (p[0] << 8) | p[1], (p[2] << 8) | p[3]);
break;
}
case 0x04:
{
unsigned short usResult = (p[1] << 8) | p[2];
WCHAR *szResult = L"UNKNOWN";
switch (usResult) {
case 0x0000:
szResult = L"SUCCESS";
break;
case 0x0001:
szResult = L"Unsupported";
break;
case 0x0002:
szResult = L"FAILED, invalid range";
break;
case 0x0003:
szResult = L"FAILED, too many";
break;
case 0x0004:
szResult = L"FAILED, security";
break;
}
DebugOut (DEBUG_PAN_PACKETS, L"FILTER NET TYPE RESPONSE, 0x%04x (%s)\n", usResult, szResult);
p += 3;
}
break;
case 0x05:
{
int cPairs = ((p[1] << 8) | p[2]) / 12;
DebugOut (DEBUG_PAN_PACKETS, L"FILTER MULTI ADDR SET, %d pairs\n", cPairs);
if (cPairs * 12 != ((p[1] << 8) | p[2]))
DebugOut (DEBUG_PAN_PACKETS, L"ERROR: bad length (%d)!\n", p[1]);
p += 3;
for (int i = 0 ; i < cPairs ; ++i, p += 12)
DebugOut (DEBUG_PAN_PACKETS, L" %02x%02x%02x%02x%02x%02x-%02x%02x%02x%02x%02x%02x\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11]);
break;
}
case 0x06:
{
unsigned short usResult = (p[1] << 8) | p[2];
WCHAR *szResult = L"UNKNOWN";
switch (usResult) {
case 0x0000:
szResult = L"SUCCESS";
break;
case 0x0001:
szResult = L"Unsupported";
break;
case 0x0002:
szResult = L"FAILED, invalid range";
break;
case 0x0003:
szResult = L"FAILED, too many";
break;
case 0x0004:
szResult = L"FAILED, security";
break;
}
DebugOut (DEBUG_PAN_PACKETS, L"FILTER MULTI ADDR RESPONSE, 0x%04x (%s)\n", usResult, szResult);
p += 3;
}
break;
default:
DebugOut (DEBUG_PAN_PACKETS, L"UNKNOWN BNEP CONTROL 0x%02x\n", *p);
return FALSE;
}
return TRUE;
}
static void DumpBnepPacket (WCHAR *sz, BD_BUFFER *pBuff) {
DebugOut (DEBUG_PAN_PACKETS, L"%s\n", sz);
DumpBuff (DEBUG_PAN_PACKETS, pBuff->pBuffer + pBuff->cStart, BufferTotal (pBuff));
unsigned char *p = pBuff->pBuffer + pBuff->cStart;
unsigned char cType = *p & 0x7f;
int fExt = (*p & 0x80) != 0;
++p;
switch (cType) {
case 0x00:
DebugOut (DEBUG_PAN_PACKETS, L"BNEP GENERAL ETHERNET : dst=%02x%02x%02x%02x%02x%02x src=%02x%02x%02x%02x%02x%02x proto=0x%04x\n",
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], (p[12] << 8) | p[13]);
p+=14;
break;
case 0x01:
if (! DumpBnepControl (p))
return;
break;
case 0x02:
DebugOut (DEBUG_PAN_PACKETS, L"BNEP COMPRESSED ETHERNET proto=0x%04x\n", (p[0] << 8) | p[1]);
p += 2;
break;
case 0x03:
DebugOut (DEBUG_PAN_PACKETS, L"BNEP COMPRESSED ETHERNET SOURCE ONLY: src=%02x%02x%02x%02x%02x%02x proto=0x%04x\n",
p[0], p[1], p[2], p[3], p[4], p[5], (p[6] << 8) | p[7]);
p+=8;
break;
case 0x04:
DebugOut (DEBUG_PAN_PACKETS, L"BNEP COMPRESSED ETHERNET DEST ONLY: dst=%02x%02x%02x%02x%02x%02x proto=0x%04x\n",
p[0], p[1], p[2], p[3], p[4], p[5], (p[6] << 8) | p[7]);
p+=8;
break;
default:
DebugOut (DEBUG_PAN_PACKETS, L"UNKNOWN BNEP TYPE 0x%02x\n", cType);
return;
}
if (p > pBuff->pBuffer + pBuff->cEnd) {
DebugOut (DEBUG_PAN_PACKETS, L"ERROR! Buffer overrun!\n");
return;
}
while (fExt) {
fExt = (*p & 0x80) != 0;
cType = *p & 0x7f;
int cLen = p[1];
if (cType == 0x00) {
DebugOut (DEBUG_PAN_PACKETS, L"EXTENSION CONTROL\n");
unsigned char *q = p + 2;
if (DumpBnepControl (q)) {
if (q != p + cLen + 2) {
DebugOut (DEBUG_PAN_PACKETS, L"ERROR! Buffer size mismatch in extension processing!\n");
}
}
} else {
DebugOut (DEBUG_PAN_PACKETS, L"UNKNOWN EXTENSION 0x%02x, skipping\n", cType);
}
p += cLen + 2;
if (p > pBuff->pBuffer + pBuff->cEnd) {
DebugOut (DEBUG_PAN_PACKETS, L"ERROR! Buffer overrun!\n");
return;
}
}
}
#endif
static int GetBD (WCHAR *pString, BD_ADDR *pba) {
pba->NAP = 0;
for (int i = 0 ; i < 4 ; ++i, ++pString) {
if (! iswxdigit (*pString))
return FALSE;
int c = *pString;
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;
pba->NAP = pba->NAP * 16 + c;
}
pba->SAP = 0;
for (i = 0 ; i < 8 ; ++i, ++pString) {
if (! iswxdigit (*pString))
return FALSE;
int c = *pString;
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;
pba->SAP = pba->SAP * 16 + c;
}
if (*pString != '\0')
return FALSE;
return TRUE;
}
static void BtToEth (unsigned char *pEth, BD_ADDR *pbd_addr) {
unsigned char *pbd = (unsigned char *)pbd_addr;
for (int i = 0 ; i < 6 ; ++i) {
pEth[i] = pbd[5-i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -