📄 driverlist.c
字号:
/////////////////////////////////////////////
// 一些集合数组及它们的管理函数
//
//////////////////////////////////////////////
/////////////////////////////////////////////
// TCPIP绑定句柄集合及管理函数
//
#define MAX_TCPIPBIND 8
SAdapterHandle *g_pTcpIpBindHandles[MAX_TCPIPBIND];
NDIS_HANDLE g_TcpIpHandle=NULL;
int g_nTcpIpBindNum=0;
//增加TCPIP绑定句柄
void AddTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
if(g_nTcpIpBindNum<MAX_TCPIPBIND)
{
g_pTcpIpBindHandles[g_nTcpIpBindNum++]=pTcpIpBindHandle;
}
}
//删除TCPIP绑定句柄
void DelTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
int i;
for(i=0;i<g_nTcpIpBindNum;i++)
{
if(g_pTcpIpBindHandles[i]==pTcpIpBindHandle)
{
int j;
for(j=i;j<g_nTcpIpBindNum-1;j++)
{
g_pTcpIpBindHandles[j]=g_pTcpIpBindHandles[j+1];
}
g_nTcpIpBindNum--;
DbgPrint("!!!!! DelTcpIpBindHandle\n");
break;
}
}
}
//是否TCPIP绑定句柄
int IsTcpIpBindHandle(SAdapterHandle *pTcpIpBindHandle)
{
int i;
for(i=0;i<g_nTcpIpBindNum;i++)
{
if(g_pTcpIpBindHandles[i]==pTcpIpBindHandle)
{
return 1;
}
}
return 0;
}
///////////////////////////////////////////////////////////////
// 协议句柄集合和NDIS绑定句柄集合及它们各自的管理函数
//
#define MAX_PROTOHANDLE 32
#define MAX_ADAPTERHANDLE 128
static SProtoHandle g_ProtoHandles[MAX_PROTOHANDLE];
static SAdapterHandle g_AdapterHandles[MAX_ADAPTERHANDLE];
#ifdef _WIN32_WINNT
static KSPIN_LOCK g_ProtoHandleLock;
static KSPIN_LOCK g_AdapterHandleLock;
#endif
//分配协议句柄
SProtoHandle* AllocProtoHandle()
{
static int s_nProtoPos;
int i,nPos;
SProtoHandle* pProtoHandle=NULL;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif
for(i=0;i<MAX_PROTOHANDLE;i++)
{
nPos=s_nProtoPos+i;
if(nPos>=MAX_PROTOHANDLE) nPos=0;
if(g_ProtoHandles[nPos].ProtoHandle==NULL)
{
pProtoHandle=&g_ProtoHandles[nPos];
s_nProtoPos=nPos+1;
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif
return pProtoHandle;
}
//分配NDIS绑定句柄
SAdapterHandle* AllocAdapterHandle(NDIS_HANDLE ProtocolBindingContext)
{
static int s_nAdapterPos;
int i,nPos;
SAdapterHandle* pAdapterHandle=NULL;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif
for(i=0;i<MAX_ADAPTERHANDLE;i++)
{
nPos=s_nAdapterPos+i;
if(nPos>=MAX_ADAPTERHANDLE) nPos=0;
if( g_AdapterHandles[nPos].NdisBindingHandle==NULL &&
g_AdapterHandles[nPos].pNdisBindingHandle==NULL &&
g_AdapterHandles[nPos].ProtocolBindingContext==NULL)
{
pAdapterHandle=&g_AdapterHandles[nPos];
pAdapterHandle->ProtocolBindingContext=ProtocolBindingContext;
s_nAdapterPos=nPos+1;
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif
return pAdapterHandle;
}
//查找协议句柄
SProtoHandle* FindProtoHandle(NDIS_HANDLE ProtoHandle)
{
SProtoHandle* pProtoHandle=NULL;
int i;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif
for(i=0;i<MAX_PROTOHANDLE;i++)
{
if(g_ProtoHandles[i].ProtoHandle==ProtoHandle)
{
pProtoHandle=&g_ProtoHandles[i];
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif
return pProtoHandle;
}
//查找NDIS绑定句柄
SAdapterHandle* FindAdapterHandle(NDIS_HANDLE ProtocolBindingContext)
{
SAdapterHandle* pAdapterHandle=NULL;
int i;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif
for(i=0;i<MAX_ADAPTERHANDLE;i++)
{
if(g_AdapterHandles[i].ProtocolBindingContext==ProtocolBindingContext)
{
pAdapterHandle=&g_AdapterHandles[i];
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif
return pAdapterHandle;
}
//删除NDIS绑定句柄
void DelAdapterHandle(NDIS_HANDLE NdisBindingHandle)
{
int i;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_AdapterHandleLock, &irql);
#endif
for(i=0;i<MAX_ADAPTERHANDLE;i++)
{
if(g_AdapterHandles[i].NdisBindingHandle==NdisBindingHandle)
{
DbgPrint("!!!!!DelAdapterHandle\n");
DelTcpIpBindHandle(&g_AdapterHandles[i]);
memset(&g_AdapterHandles[i],0,sizeof(SAdapterHandle));
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_AdapterHandleLock, irql);
#endif
}
//删除协议句柄
void DelProtoHandle(NDIS_HANDLE ProtoHandle)
{
int i;
#ifdef _WIN32_WINNT
KIRQL irql;
KeAcquireSpinLock(&g_ProtoHandleLock, &irql);
#endif
if(g_TcpIpHandle==ProtoHandle)
{
DbgPrint("!!!!!W2K_NdisDeregisterProtocol TcpIp\n");
g_nTcpIpBindNum=0;
}
for(i=0;i<MAX_PROTOHANDLE;i++)
{
if(g_ProtoHandles[i].ProtoHandle==ProtoHandle)
{
DbgPrint("!!!!!DelProtoHandle\n");
memset(&g_ProtoHandles[i],0,sizeof(SProtoHandle));
break;
}
}
#ifdef _WIN32_WINNT
KeReleaseSpinLock(&g_ProtoHandleLock, irql);
#endif
}
///////////////////////////////////////////////////////////////
// 上线MAC或正请求上线MAC集合及管理函数
//
int g_maccount=0; //当前记录上线MAC数
SMac g_macs[MAX_MAC]; //上线MAC集合
//查找某上线MAC或正请求上线MAC,返回不为空则成功,否则失败
SMac* FindMac(UCHAR mac[],int *pPos)
{
int begin,end;
if(g_maccount==0) return 0;
begin=0;
end=g_maccount-1;
*pPos=(begin+end)/2;
while(end>begin)
{
int cmp=memcmp(mac,g_macs[*pPos].mac,6);
if(cmp>0)
{
begin=(*pPos)+1;
*pPos=(begin+end)/2;
}
else if(cmp<0)
{
end=(*pPos)-1;
*pPos=(begin+end)/2;
}
else
{
return &g_macs[*pPos];
}
}
if(memcmp(mac,g_macs[*pPos].mac,6)==0) return &g_macs[*pPos];
return NULL;
}
//增加某上线MAC或正请求上线MAC,返回不为空则成功,否则失败
//bSetOKTime表示是否设置确认其上线的时间
SMac* AddMac(UCHAR mac[],ULONG ip,BOOLEAN bSetOKTime)
{
int n,nPos=0;
SMac *pMac=FindMac(mac,&nPos);
if(pMac)
{
pMac->ip=ip;
if(bSetOKTime) pMac->oktime=GetSystemTime();
return pMac;
}
if(g_maccount==0)
{
nPos=0;
goto add;
}
if(g_maccount>=MAX_MAC)
{
ULONG uCurTime=GetSystemTime();
for(nPos=MAX_MAC-1;nPos>=0;nPos--)
{
if(!MAC_OK(uCurTime,&g_macs[nPos]))
{
for(n=nPos;n<g_maccount-1;n++)
{
memcpy(&g_macs[n],&g_macs[n+1],sizeof(SMac));
}
g_maccount--;
break;
}
}
return 0;
}
if(memcmp(mac,g_macs[nPos].mac,6)>0) nPos++;
for(n=g_maccount-1;n>=nPos;n--)
{
memcpy(&g_macs[n+1],&g_macs[n],sizeof(SMac));
}
add:
memcpy(g_macs[nPos].mac,mac,6);
g_macs[nPos].chktime=0;
g_macs[nPos].ip=ip;
g_macs[nPos].oktime=bSetOKTime ? GetSystemTime() : 0;
g_maccount++;
return &g_macs[nPos];
}
//删除某上线MAC或正请求上线MAC
void DelMac(UCHAR mac[])
{
int nPos,n;
if(!FindMac(mac,&nPos)) return;
for(n=nPos;n<g_maccount-1;n++)
{
memcpy(&g_macs[n],&g_macs[n+1],sizeof(SMac));
}
g_maccount--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -