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