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

📄 miniport.cxx

📁 WinCE5.0部分核心源码
💻 CXX
📖 第 1 页 / 共 5 页
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
#define NDIS51_MINIPORT     1

#include <windows.h>
#include <ndis.h>
#include <winsock2.h>

#include <svsutil.hxx>

#include <bt_buffer.h>
#include <bt_ddi.h>

#include <bt_debug.h>

#include <bt_api.h>

#include <bthapi.h>
#include <bt_sdp.h>
#include <sdpnode.h>
#include <sdplib.h>

#define BTHPAN_PACKETS                  25
#define BTHPAN_BUFFERS                  25

#define BTHPAN_NDIS_MAJOR_VERSION       5
#define BTHPAN_NDIS_MINOR_VERSION       1

#define BTHPAN_CHECK_FOR_HANG_TIMEOUT   0

#define BTHPAN_MEDIADELAY_MIN           30000
#define BTHPAN_MEDIADELAY_DEFAULT       120000

#define BTHPAN_CONNECT_WAIT             1000
#define BTHPAN_CONNECT_THRESHOLD        60000

#define BTHPAN_FILTER_RETRY_TO          10000

#define BTHPAN_CRT_MIN                  1000
#define BTHPAN_CRT_DEFAULT              20000
#define BTHPAN_CRT_MAX                  30000

#define BTHPAN_CONNECTIONS_MAX          20
#define BTHPAN_MAXCONNECTIONS_DEFAULT   6

#define BTHPAN_INQUIRY_DEFAULT          8

#define BTHPAN_MIN_FRAME                1691
#define BTHPAN_PSM                      0x000f

#define ETH_ADDR_SIZE                   6
#define ETH_MAX_PAYLOAD                 1500

typedef struct _ETH_HDR {
    unsigned char  destAddr[6];
    unsigned char  srcAddr[6];
    unsigned short ethType;
} ETH_HDR, *PETH_HDR;

#define ETH_HDR_SIZE        sizeof(ETH_HDR)
#define ETH_MAX_HDR_SIZE    sizeof(ETH_HDR)
#define ETH_MIN_HDR_SIZE    sizeof(ETH_HDR)
#define ETH_MAX_PACKET_SIZE (ETH_MAX_PAYLOAD + ETH_MAX_HDR_SIZE)

#define BTHPAN_MAX_MCAST_LIST                  32

#define BTHPAN_VERSION      0x00010005

enum FILTER_TYPE {
    MCAST,
    NETTYPE,
    ALL
};

enum Type {
    NONE,
    PANU,
    GN,
    NAP
};

enum State {
    DOWN,
    SDP,
    CONNECTING,
    CONFIG_LINK,
    CONFIG_BNEP,
    CONFIG_SECURITY,
    UP,
    CLOSING
};

#define CONFIG_OUT_DONE     1
#define CONFIG_IN_DONE      2
#define CONFIG_DONE         3

#define BTHPAN_MAX_CONNECTIONS      16
#define BTHPAN_MAX_ADAPTERS         16

#define BTHPAN_MAX_NETFILTERS       16
#define BTHPAN_MAX_MCASTFILTERS     16

#define NET_ACCESS_TYPE_ETH_100MB       0x0005
#define MAX_NET_ACCESS_RATE_ETH_100MB   100000
#define SDP_LANGID_ENGLISH              0x656E
#define MIBENUM_ENCODING_UTF16          0x03F7
#define MIBENUM_ENCODING_UTF8           0x6A

#define BNEP_VERSION       0x0100
#define BNEP_MAJOR_VERSION 0x01
#define BNEP_MINOR_VERSION 0x00

#define LANG_DEFAULT_ID                         0x0100

unsigned char gRates[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x48};

enum SDP_WALK_PROTO_DESC_LIST_STATE {
    SDP_WALK_PROTO_DESC_LIST_STATE_ROOT_SEQ = 0,
    SDP_WALK_PROTO_DESC_LIST_STATE_PROTO_DESC_SEQ,
    SDP_WALK_PROTO_DESC_LIST_STATE_PROTO_UUID,
    SDP_WALK_PROTO_DESC_LIST_STATE_PROTO_INFO
};

enum SDP_WALK_CLASS_ID_LIST_STATE {
    SDP_WALK_CLASS_ID_LIST_STATE_ROOT_SEQ = 0,
    SDP_WALK_CLASS_ID_LIST_STATE_UUID
};

struct BTHPAN_SDP_WALK_CONTEXT {
    ULONG               attribState;
    UINT16              currProtocol;
    BOOLEAN             successfullParse;
    UINT16              psm;
    GUID                *pservice_id;
};

struct BTHPAN_LANG_ATTRIB {
    UINT16 ui16LangID;
    UINT16 ui16Encoding;
    UINT16 ui16AttribID;

    // Service name
    WCHAR *panServiceName;

    // Service description
    WCHAR *panServiceDesc;
};

struct BTHPAN_ADAPTER;

struct NETTYPERANGE {
    unsigned short  from;
    unsigned short  to;
};

struct MCASTRANGE {
    BD_ADDR         from;
    BD_ADDR         to;
};

struct FILTER {
    unsigned int cNetTypes;
    unsigned int cMCasts;

    NETTYPERANGE    ant[BTHPAN_MAX_NETFILTERS];
    MCASTRANGE      amc[BTHPAN_MAX_MCASTFILTERS];
};

struct BNEPPacket {
    BNEPPacket  *pNext;
    BD_BUFFER   *pBuffer;

    BNEPPacket (BD_BUFFER* pBuff) {
        memset (this, 0, sizeof(this));
        pBuffer = pBuff;
    }

    ~BNEPPacket () {
        if (pBuffer) {
            pBuffer->pFree (pBuffer);
        }
    }

    void *operator new (size_t iSize);
    void operator delete (void *ptr);
};

struct BTHPAN_CONNECTION {
    unsigned short      cid;

    BD_ADDR             ba;
    unsigned char       eth[6];

    State               state;
    unsigned int        fConfigState;

    union {
        struct {
            unsigned int        fPeerInitiated   : 1;
            unsigned int        fNetTypeMsgOut   : 1;
            unsigned int        fNetTypeMsgReq   : 1;
            unsigned int        fMCastMsgOut     : 1;
            unsigned int        fMCastMsgReq     : 1;
            unsigned int        fAuthenticated   : 1;
            unsigned int        fEncrypted       : 1;
        };
        unsigned int flags;
    };

    int                 nAdapter;

    unsigned int        uiRef;  // This is instance reference (incremented when the struct is freed)

    SVSCookie           scTimeout;

    GUID                dest_service_id;

    FILTER              filter;

    BNEPPacket          *pPacketsPending;

    SVSCookie           scMCastFilter;
    SVSCookie           scNetFilter;

    BD_BUFFER           *pMCastFilterRetryBuff;
    BD_BUFFER           *pNetFilterRetryBuff;

    void Reinit (void) {
        memset (this, 0, sizeof(*this));
        nAdapter = -1;
        state    = DOWN;
    }
};

#define BTHPAN_MAX_ASSOCIATIONS     14

struct BTHPAN_ASSOCIATION {
    WCHAR               szSSID[32];

    BD_ADDR             ba;

    GUID                service_id;

    unsigned int        pri;
};

struct BTHPAN_ADAPTER {
    long                lRef;       // This is reference for temporary locking
    unsigned int        uiRef;      // This is instance reference (incremented when the struct is freed)

    State               state;      // Adapter's state indicates configuration state of adapter, but not it's connection state

    Type                type;

    // NDIS part
    NDIS_HANDLE         hAdapter;

    NDIS_HANDLE         NdisPacketPool;
    NDIS_HANDLE         NdisBufferPool;

    WCHAR               szIfName[_MAX_PATH];
    WCHAR               szFriendlyName[_MAX_PATH];
    WCHAR               szDescription[_MAX_PATH];

    unsigned long       ulPacketFilter;
    unsigned long       ulLookAhead;

    FILTER              filter;    

    //  Addresses are set through registry
    unsigned char       ethAddr[6];

    FixedMemDescr       *pfmdEthHeaders;

    NDIS_STATUS         LastIndicatedStatus;

    // Statistics
    unsigned __int64    ul64XmitOk;
    unsigned __int64    ul64RcvOk;
    unsigned __int64    ul64XmitError;
    unsigned __int64    ul64RcvError;
    unsigned __int64    ul64RcvNoBuffer;
    unsigned int        ui32RcvErrAlign;
    unsigned int        ui32XmitOneCollision;
    unsigned int        ui32XmitMoreCollisions;

    // Bluetooth part

    BTHPAN_ASSOCIATION  aAssoc[BTHPAN_MAX_ASSOCIATIONS];
    unsigned int        cAssoc;

    unsigned int        cMaxConn;

    ULONG               ulSdpRecordId;

    GUID                service_id;

    unsigned int        fAcceptIncoming : 1;
    unsigned int        fAddressSet : 1;

    unsigned int        uiCrtTimeout;

    void Reinit (void) {
        memset (this, 0, sizeof(*this));

        state = DOWN;
        type  = NONE;

        LastIndicatedStatus = 0;    // neither connect, nor disconnect. Forces the first indication
    }

    long AddRef (void) {
        return InterlockedIncrement (&lRef);
    }

    long DelRef (void) {
        long ll = InterlockedDecrement (&lRef);

        SVSUTIL_ASSERT (ll >= 0);

        return ll;
    }

    long GetRefCount (void) {
        return lRef;
    }
};

#define BTHPAN_MAX_NETWORKS         128

#define REF_EMPTY       0xff
#define REF_CONNECT     0xfe
#define REF_DISCOVERY   3

struct BTHPAN_NETWORK {
    BTHPAN_ASSOCIATION      a;
    unsigned int            iRef;
};

struct PAN_CONTEXT : public SVSAllocClass, public SVSSynch, public SVSRefObj {
    State               state;

    FixedMemDescr       *pfmdPackets;

    BD_ADDR             ba;
    unsigned char       eth[6];

    HANDLE              hL2CAP;
    L2CAP_INTERFACE     l2cap_if;

    int                 cDataHeaders;
    int                 cDataTrailers;

    BTHPAN_ADAPTER      aAdapters[BTHPAN_MAX_ADAPTERS];

    BTHPAN_CONNECTION   aConn[BTHPAN_MAX_CONNECTIONS];

    BTHPAN_NETWORK      aNetworks[BTHPAN_MAX_NETWORKS];

    HANDLE              hMediaThread;
    HANDLE              hRefreshEvent;
    unsigned int        mediaDelay;
    unsigned char       ucInquiryLength;

    NDIS_HANDLE         ndisDriverHandle;

    unsigned int        fAuthenticate : 1;
    unsigned int        fEncrypt : 1;

    void Reinit (void) {
        state = DOWN;
        pfmdPackets = NULL;

        ba.NAP = 0;
        ba.SAP = 0;
        memset (eth, 0, sizeof(eth));

        hL2CAP = NULL;
        memset (&l2cap_if, 0, sizeof(l2cap_if));
        cDataHeaders = 0;
        cDataTrailers = 0;

        int i;
        for (i = 0 ; i < SVSUTIL_ARRLEN(aAdapters) ; ++i)
            aAdapters[i].Reinit ();

        for (i = 0 ; i < SVSUTIL_ARRLEN(aConn) ; ++i)
            aConn[i].Reinit ();

        memset (aNetworks, 0, sizeof(aNetworks));
        for (i = 0 ; i < SVSUTIL_ARRLEN(aNetworks) ; ++i)
            aNetworks[i].iRef = REF_EMPTY;

⌨️ 快捷键说明

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