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

📄 miniport.cxx

📁 WinCE5.0部分核心源码
💻 CXX
📖 第 1 页 / 共 5 页
字号:
        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 + -