作者:huyuguang 文章出处:武汉白云黄鹤站 发布时间:2005-11-08 点击:
这个代码是17(oneseven)写的,我和他是源代码共享的,
由于前面友人向我要win9x下的vpn源代码,我相信肯定有
人看了我前面的简介还是不太明白,干脆贴在下面。
下文来自17的毕业论文,别的东西不好都贴上来,毕竟还有
点军队背景。
为了免得大家看的麻烦,我就不分成几块了,其实我是很喜欢
灌水的;-)
垫片模块的源程序:
1.Ndisshim.h,C语言头文件。
/****************************************************************************
* *
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY *
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR *
* PURPOSE. *
* *
****************************************************************************/
#define WANTVXDWRAPS
#include
#include
#include
#include
#include
#include
#include
#include
MAKE_HEADER(DWORD,_stdcall,VKD_Filter_Keyboard_Input, (VOID))
MAKE_HEADER(VOID,_cdecl,Ndis_Hook, ())
MAKE_HEADER(DWORD,_cdecl,_SHELL_PostMessage,(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD
)
MAKE_HEADER(USHORT,_cdecl,Encrypt_reg,(PUCHAR,USHORT,USHORT))
MAKE_HEADER(USHORT,_cdecl,Decrypt_reg,(PUCHAR,USHORT,USHORT))
#define Ndis_Hook PREPEND(Ndis_Hoo
)
#define _SHELL_PostMessage PREPEND(_SHELL_PostMessage)
#define Encrypt_reg PREPEND(Encrypt_
eg)
#define Decrypt_reg PREPEND(Decrypt_
eg)
#define WM_NSHIM_NEW 3002
#define IP_PROTOCOL 0x0008
#define IP_HEADER_LEN 20
#define MAC_HEADER_LEN 14
#define NSHIM_VERSION 0x400
#define NSHIM_V86_FUNCTION1 1
#define NSHIM_V86_FUNCTION2 2
#define NSHIM_PM_FUNCTION1 1
#define NSHIM_PM_FUNCTION2 2
#define MAX_NSHIM_W32_API (sizeof(NSHIM_W32_Proc)/sizeof(DWORD))
#define MAX_SEND_BUF_LIST 10
#define MAX_SEND_PKT_LIST 10
#define MAX_SEND_APPEND_LEN 21
#define MAX_ADAPTER_NUM 5
#define PACKET_REFUSE 0
#define PACKET_MUD 1
#define PACKET_CLEAR 2
#define PACKET_D_REFUSE 3
#define PACKET_D_QUERY 4
#define PACKET_D_CLEAR 5
#define QUERY_SEND_PACKET 0
#define QUERY_RCV_PACKET 1
/*#define ENCRYPT_Service Declare_Service
#define ENCRYPT_DEVICE_ID 0x1800
Begin_Service_Table(ENCRYPT)
ENCRYPT_Service(Encrypt_reg)
ENCRYPT_Service(Decrypt_reg)
End_Service_Table(ENCRYPT)*/
typedef DIOCPARAMETERS *LPDIOC;
typedef struct _MAC_HEADER{
UCHAR MAC_DA[6];
UCHAR MAC_SA[6];
USHORT ProtocolType;
} MAC_HEADER, *PMAC_HEADER;
typedef struct _IP_HEADER{
UCHAR Ver;
UCHAR Service;
UCHAR LengthU;
UCHAR LengthL;
USHORT Identification;
USHORT FragmentOffset;
UCHAR LiveTime;
UCHAR Protocol;
USHORT HeaderCRC;
ULONG IP_SA;
ULONG IP_DA;
} IP_HEADER, *PIP_HEADER;
typedef struct _AC_ITEM
{
ULONG ip;
ULONG net_mask;
USHORT access;
USHORT sndkeyno;
} AC_ITEM, *PAC_ITEM;
typedef struct _EXCP_ITEM
{
ULONG ip;
USHORT tcp_port;
} EXCP_ITEM, *PEXCP_ITEM;
typedef struct _BINDING_INFO{
NDIS_HANDLE BindingHandle;
UCHAR CtrlActived;
NDIS_STRING Name;
} BINDING_INFO, *PBINDING_INFO;
typedef struct _PENDING_INFO{
NDIS_HANDLE ProtocolBindingContext;
PNDIS_HANDLE NdisBindingHandle;
NDIS_STRING Name;
} PENDING_INFO, *PPENDING_INFO;
DWORD _stdcall NSHIM_W32_DeviceIOControl(DWORD, DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_CleanUp(void);
DWORD _stdcall NSHIM_W32_OpenWnd(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_CloseWnd(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_GetAdapterInfo(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_SetAdapterState(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_SetACState(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_LoadAccList(DWORD, DWORD, LPDIOC);
DWORD _stdcall NSHIM_W32_LoadExcpList(DWORD, DWORD, LPDIOC);
VOID _stdcall NSHIM_Send(PNDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET);
VOID _stdcall NSHIM_Request(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
IN PNDIS_REQUEST Request
);
VOID NDIS_API
NSHIM_RegisterProtocol(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisProtocolHandle,
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
IN UINT CharacteristicsLength
);
NDIS_STATUS NDIS_API
NSHIM_IPReceive(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookaheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
);
VOID NDIS_API
VOID NDIS_API
NSHIM_IPSendComplete(
IN NDIS_HANDLE NdisBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status
);
VOID NDIS_API
NSHIM_IPOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
UINT
CopyPacketToBuffer(
IN OUT PUCHAR Buf, // destination
IN PNDIS_PACKET Packet, // source packet
IN UINT Offset, // offset in packet
IN UINT Length // number of bytes to copy
);
VOID
VOID
CopyNdisString( PNDIS_STRING D_string,
PNDIS_STRING S_string
);
extern USHORT In_cksum( unsigned char *buf,
int len);
/*USHORT Encrypt_reg(PUCHAR buffer,
USHORT buflen,
USHORT sndkeyno
);
USHORT Decrypt_reg(PUCHAR buffer,
USHORT buflen,
USHORT sndkeyno
);*/
UCHAR QueryAccessList(PIP_HEADER Ip_header,
UCHAR QueryType,
PUSHORT sndkeyno
);
UCHAR LoadAccessList(PUCHAR buffer,
ULONG buflen
);
UCHAR LoadExceptList(PUCHAR buffer,
ULONG buflen
);
VOID UnloadLists();
extern DWORD NdisIndicateReceiveAddr;
extern DWORD NdisRequestAddr;
extern DWORD NdisCompleteSendAddr;
//extern DWORD NdisRegisterProtocolAddr;
extern DWORD IPReceiveAddr;
extern DWORD IPSendCompleteAddr;
extern PUCHAR RcvBuffer;
extern PUCHAR IndicateBuffer;
extern PUCHAR TransferBuffer;
extern NDIS_HANDLE RcvPacketPoolHandle;
extern PNDIS_PACKET RcvTransferPacket;
extern NDIS_HANDLE RcvBufferPoolHandle;
extern PNDIS_BUFFER RcvPacketBuffer;
extern PMAC_HEADER RcvMACHeader;
extern PIP_HEADER RcvIPHeader;
extern PUCHAR SendBuffer;
extern PUCHAR CurSendBuffer;
extern PMAC_HEADER SendMACHeader;
extern PIP_HEADER SendIPHeader;
extern NDIS_HANDLE SendBufferPoolHandle;
extern NDIS_HANDLE SendPacketPoolHandle;
extern PNDIS_PACKET SendPktList[MAX_SEND_PKT_LIST];
extern CHAR SendPktListHead;
extern CHAR SendPktListTail;
extern PNDIS_PACKET ReservedPkt[MAX_SEND_PKT_LIST];
extern NDIS_STATUS ReturnStatus;
extern PNDIS_BUFFER BUFFER;
extern DWORD CopiedLen;
extern UINT BytesTransfered;
extern USHORT Old_cksum,New_cksum;
extern DWORD ViewHandle;
extern BINDING_INFO BindingAdapterInfo[MAX_ADAPTER_NUM];
extern UCHAR BindingAdapterNum;
2.Nshim.c 垫片的C语言程序
#include "ndisshim.h"
UINT CurSendPktLen;
UINT MaxSendPktLen;
DWORD NdisIndicateReceiveAddr;
DWORD NdisRequestAddr;
DWORD NdisCompleteSendAddr;
//DWORD NdisRegisterProtocolAddr;
DWORD IPReceiveAddr;
DWORD IPSendCompleteAddr;
DWORD IPOpenAdapterCompleteAddr;
VOID (NDIS_API *NdisSendAddr )( PNDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET);
VOID (NDIS_API *NdisOpenAdapterAddr)(
PNDIS_STATUS ,
PNDIS_STATUS ,
PNDIS_HANDLE ,
PUINT ,
PNDIS_MEDIUM ,
UINT ,
NDIS_HANDLE ,
NDIS_HANDLE ,
PNDIS_STRING ,
UINT ,
PSTRING
);
VOID (NDIS_API *NdisRegisterProtocolAddr)(
PNDIS_STATUS ,
PNDIS_HANDLE ,
PNDIS_PROTOCOL_CHARACTERISTICS ,
UINT
);
/*VOID (NDIS_API *NdisRegisterMacAddr)( PNDIS_STATUS ,
PNDIS_H
NDLE,
NDIS_HA
DLE ,
NDIS_HA
DLE ,
PNDIS_M
C_CHARACTERISTICS,
UINT
);*/
PUCHAR RcvBuffer;
PUCHAR IndicateBuffer;
PUCHAR TransferBuffer;
NDIS_HANDLE RcvPacketPoolHandle;
PNDIS_PACKET RcvTransferPacket;
NDIS_HANDLE RcvBufferPoolHandle;
PNDIS_BUFFER RcvPacketBuffer;
PMAC_HEADER RcvMACHeader;
PIP_HEADER RcvIPHeader;
PUCHAR SendBuffer;
PUCHAR CurSendBuffer;
PMAC_HEADER SendMACHeader;
PIP_HEADER SendIPHeader;
NDIS_HANDLE SendBufferPoolHandle;
NDIS_HANDLE SendPacketPoolHandle;
PNDIS_PACKET SendPktList[MAX_SEND_PKT_LIST];
CHAR SendPktListHead;
CHAR SendPktListTail;
PNDIS_PACKET ReservedPkt[MAX_SEND_PKT_LIST];
NDIS_STATUS ReturnStatus;
PNDIS_BUFFER BUFFER;
DWORD CopiedLen;
UINT BytesTransfered;
UCHAR ReadInfoOK=0;
NDIS_HANDLE IPHandle;
UCHAR AdapterNameBuf[2*MAX_ADAPTER_NUM][10];
BINDING_INFO BindingAdapterInfo[MAX_ADAPTER_NUM];
PENDING_INFO PendingOpenAdapter[MAX_ADAPTER_NUM];
UCHAR BindingAdapterNum = 0;
UCHAR PendOpenNum = 0;
NDIS_STRING TcpName = NDIS_STRING_CONST("MSTCP");
//NDIS_HANDLE MacHandle;
//NDIS_HANDLE WrapperHandle;
//NDIS_HANDLE MacContext;
USHORT Old_cksum,New_cksum;
VOID _stdcall NSHIM_Send(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
IN PNDIS_PACKET Packet
)
{
USHORT sndkeyno;
UCHAR i;
for(i=0;i
if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle&& Bind
ngAdapterInfo[i].CtrlActived)
break;
}
if(i==BindingAdapterNum) goto forward;
NdisQueryPacket(Packet, NULL, NULL, NULL, &CurSendPktLen);
if(CurSendPktLen>MaxSendPktLen) MaxSendPktLen=CurSendPktLen;
if(SendBuffer!=NULL){
CurSendBuffer=SendBuffer+1500*SendPktListHead;
SendMACHeader=(PMAC_HEADER)CurSendBuffer;
SendIPHeader=(PIP_HEADER)(CurSendBuffer+MAC_HEADER_LEN);
CopiedLen=CopyPacketToBuffer(
CurSendBuffer,
Packet,
0,
MAC_HEADER_LEN //+IP_HEADER_LEN
);
if(SendMACHeader->ProtocolType==IP_PROTOCOL){
CopiedLen = CopyPacketToBuffer(
CurSendBuffer+MAC_HEADER_LEN,//+IP_HEADE
_LEN,
Packet,
MAC_HEADER_LEN, //+IP_HEADER_LEN,
CurSendPktLen-MAC_HEADER_LEN //-IP_HEAD
R_LEN
);
switch( QueryAccessList(SendIPHeader,QUERY_SEND_PACKET,&
ndkeyno) ){
case PACKET_REFUSE :
*Status=NDIS_STATUS_SUCCESS;
return;
case PACKET_CLEAR :
break;
case PACKET_MUD :
CurSendPktLen = Encrypt_reg(
(PUCHAR)
endIPHeader+IP_HEADER_LEN,
CurSendP
tLen-MAC_HEADER_LEN-IP_HEADER_LEN,
sndkeyno
);
CurSendPktLen += (MAC_HEADER_LEN+IP_HEADER_LEN);
Old_cksum = SendIPHeader->HeaderCRC;
SendIPHeader->HeaderCRC = 0;
SendIPHeader->LengthL = (CurSendPktLen-MAC_HEADE
_LEN)&0xff;
SendIPHeader->LengthU = ((CurSendPktLen-MAC_HEAD
R_LEN)&0xff00)>>8;
New_cksum = In_cksum((PUCHAR)SendIPHeader,20);
SendIPHeader->HeaderCRC = New_cksum;
break;
}
NdisQueryPacket(SendPktList[SendPktListHead], NULL, NULL
&BUFFER, NULL);
if(BUFFER!=NULL){
NdisUnchainBufferAtBack( SendPktList[SendPktList
ead],&BUFFER);
NdisFreeBuffer(BUFFER);
}
NdisAllocateBuffer(
&ReturnStatus,
&BUFFER,
SendBufferPoolHandle,
CurSendBuffer, //VirtualAddress,
CurSendPktLen //Length
);
NdisChainBufferAtBack( SendPktList[SendPktListHead],BUFF
R);
R);
SendPktList[SendPktListHead]->ProtocolReserved[0]=SendPk
ListHead;
ReservedPkt[SendPktListHead]=Packet;
NdisSendAddr( Status,
NdisBindingHandle,
SendPktList[SendPktListHead]
);
if(*Status!=NDIS_STATUS_SUCCESS){
SendPktListHead++;
if(SendPktListHead==MAX_SEND_PKT_LIST)
SendPktListHead=0;
}
return;
}
}
}
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
//_asm pop ebp
_asm leave
_asm jmp [NdisSendAddr]
}
VOID NDIS_API
NSHIM_IPSendComplete(
IN NDIS_HANDLE NdisBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status
)
{
UCHAR i;
for(i=0;i
if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingCon
ext+1)) &&
BindingAdapterInfo[i].CtrlActived)
break;
}
if(i==BindingAdapterNum) goto forward;
if(SendBuffer!= NULL){
CurSendBuffer = SendBuffer+SendPktListHead*1500;
SendMACHeader = (PMAC_HEADER)CurSendBuffer;
CopiedLen = CopyPacketToBuffer(
CurSendBuffer,
Packet,
0,
MAC_HEADER_LEN //+IP_HEADER_LEN
);
if(SendMACHeader->ProtocolType==IP_PROTOCOL){
Packet=ReservedPkt[Packet->ProtocolReserved[0]];
}
}
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [IPSendCompleteAddr]
}
VOID NDIS_API
NSHIM_Request(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
IN PNDIS_REQUEST Request
)
{
{
UCHAR i;
for(i=0;i
if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle )
break;
}
if(i==BindingAdapterNum) goto forward;
if( Request->RequestType == NdisRequestQueryInformation){
switch ( Request->DATA.QUERY_INFORMATION.Oid ){
case OID_GEN_MAXIMUM_FRAME_SIZE:
*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuff
r=1024-14;
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuff
r=1024;
break;
default:
goto forward;
}
Request->DATA.QUERY_INFORMATION.BytesWritten=4;
Request->DATA.QUERY_INFORMATION.BytesNeeded=4;
*Status=NDIS_STATUS_SUCCESS;
return;
}
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [NdisRequestAddr]
}
VOID NDIS_API
NSHIM_RegisterProtocol(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisProtocolHandle,
IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
IN UINT CharacteristicsLength
)
{
if( !(NdisEqualString(
&TcpName,
&ProtocolCharacteristics->Name,
FALSE
)) )
goto forward;
IPReceiveAddr = ProtocolCharacteristics->ReceiveHandler;
ProtocolCharacteristics->ReceiveHandler = NSHIM_IPReceive;
IPSendCompleteAddr = ProtocolCharacteristics->SendCompleteHandler;
ProtocolCharacteristics->SendCompleteHandler = NSHIM_IPSendComplete;
IPOpenAdapterCompleteAddr = ProtocolCharacteristics->OpenAdapterComplete
andler;
ProtocolCharacteristics->OpenAdapterCompleteHandler = NSHIM_IPOpenAdapte
Complete;
NdisRegisterProtocolAddr(
Status,
NdisProtocolHandle,
ProtocolCharacteristics,
CharacteristicsLength
);
if( *Status==NDIS_STATUS_SUCCESS)
IPHandle = *NdisProtocolHandle;
return;
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [NdisRegisterProtocolAddr]
}
VOID NDIS_API
NSHIM_OpenAdapter(
OUT PNDIS_STATUS Status,
OUT PNDIS_STATUS OpenErrorStatus,
OUT PNDIS_HANDLE NdisBindingHandle,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE NdisProtocolHandle,
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_STRING AdapterName,
IN UINT OpenOptions,
IN PSTRING AddressingInformation OPTIONAL
)
{
{
if( NdisProtocolHandle!=IPHandle ) goto forward;
PendingOpenAdapter[PendOpenNum].ProtocolBindingContext = ProtocolBinding
ontext;
PendingOpenAdapter[PendOpenNum].NdisBindingHandle = NdisBindingHandle;
PendingOpenAdapter[PendOpenNum].Name.Buffer = AdapterNameBuf[PendOpenNum
MAX_ADAPTER_NUM];
CopyNdisString(
&PendingOpenAdapter[PendOpenNum].Name,
AdapterName
);
PendOpenNum++;
NdisOpenAdapterAddr(
Status,
OpenErrorStatus,
NdisBindingHandle,
SelectedMediumIndex,
MediumArray,
MediumArraySize,
NdisProtocolHandle,
ProtocolBindingContext,
AdapterName,
OpenOptions,
AddressingInformation
);
if(*Status==NDIS_STATUS_SUCCESS){
BindingAdapterInfo[BindingAdapterNum].BindingHandle = *NdisBindi
gHandle;
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameB
f[BindingAdapterNum];
CopyNdisString(
&BindingAdapterInfo[BindingAdapterNum].Name,
AdapterName
);
BindingAdapterNum++;
}
return;
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [NdisOpenAdapterAddr]
}
VOID NDIS_API
NSHIM_IPOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
)
{
UCHAR i;
for(i=0;i
if(PendingOpenAdapter[i].ProtocolBindingContext==ProtocolBinding
ontext)
ontext)
break;
}
if(i==PendOpenNum) goto forward;
if(Status==NDIS_STATUS_SUCCESS){
BindingAdapterInfo[BindingAdapterNum].BindingHandle = *PendingOp
nAdapter[i].NdisBindingHandle;
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameB
f[BindingAdapterNum];
CopyNdisString(
&BindingAdapterInfo[BindingAdapterNum].Name,
&PendingOpenAdapter[i].Name
);
BindingAdapterNum++;
}
forward:
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [IPOpenAdapterCompleteAddr]
}
NDIS_STATUS NDIS_API
NSHIM_IPReceive(
IN NDIS_HANDLE NdisBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookaheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
)
{
USHORT sndkeyno;
UCHAR i;
for(i=0;i
if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingCon
ext+1)) &&
BindingAdapterInfo[i].CtrlActived)
break;
}
if(i==BindingAdapterNum) goto forward;
if(LookaheadBufferSize!=PacketSize){
IndicateBuffer=TransferBuffer-HeaderBufferSize-LookaheadBufferSi
e;
NdisMoveMemory( IndicateBuffer, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory( IndicateBuffer+HeaderBufferSize, LookaheadBuffer
LookaheadBufferSize);
NdisTransferData(
&ReturnStatus,
*((PUINT)NdisBindingContext+1),
MacReceiveContext,
LookaheadBufferSize, // ByteOffset,
PacketSize-LookaheadBufferSize, //BytesT
Transfer,
RcvTransferPacket,
&BytesTransfered
);
HeaderBuffer=IndicateBuffer;
LookaheadBuffer=IndicateBuffer+HeaderBufferSize;
LookaheadBufferSize = PacketSize;
}else{
IndicateBuffer=HeaderBuffer;
}
RcvMACHeader=(PMAC_HEADER)IndicateBuffer;
if(RcvMACHeader->ProtocolType==IP_PROTOCOL){
RcvIPHeader=(PIP_HEADER)(IndicateBuffer+MAC_HEADER_LEN);
switch( QueryAccessList(RcvIPHeader,QUERY_RCV_PACKET,&sndkeyno)
{
case PACKET_REFUSE:
return NDIS_STATUS_SUCCESS;
case PACKET_CLEAR:
goto forward;
case PACKET_MUD:
PacketSize = Decrypt_reg(
(PUCHAR)RcvIPHea
er+IP_HEADER_LEN,
(USHORT)PacketSi
e-IP_HEADER_LEN,
sndkeyno
);
PacketSize += IP_HEADER_LEN;
Old_cksum = RcvIPHeader->HeaderCRC;
RcvIPHeader->HeaderCRC = 0;
RcvIPHeader->LengthL = (USHORT)(PacketSize)&0x00ff;
RcvIPHeader->LengthU = ((USHORT)(PacketSize)&0xff00)>>8;
New_cksum=In_cksum((PUCHAR)RcvIPHeader,IP_HEADER_LEN);
RcvIPHeader->HeaderCRC=New_cksum;
LookaheadBufferSize=PacketSize;
break;
}
}
forward:
_asm pop edi
_asm pop esi
_asm pop ebx
_asm leave
_asm jmp [IPReceiveAddr]
}
/*VOID NDIS_API
NSHIM_RegisterMac(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE NdisMacHandle,
IN NDIS_HANDLE NdisWrapperHandle,
IN NDIS_HANDLE MacMacContext,
IN PNDIS_MAC_CHARACTERISTICS MacCharacteristics,
IN UINT CharacteristicsLength
)
{
WrapperHandle = NdisWrapperHandle;
MacContext = MacMacContext;
NdisRegisterMacAddr(
Status,
NdisMacHandle,
NdisWrapperHandle,
MacMacContext,
MacCharacteristics,
CharacteristicsLength
);
if(*Status==NDIS_STATUS_SUCCESS){
MacHandle = *NdisMacHandle;
}
return;
}*/
UINT
CopyPacketToBuffer(
IN OUT PUCHAR Buf, // destination
IN PNDIS_PACKET Packet, // source packet
IN UINT Offset, // offset in packet
IN UINT Length // number of bytes to copy
)
/*++
Routine Description:
Copies bytes from a packet into a buffer. Used to copy data
out of a packet during loopback indications.
Arguments:
Buf - the destination buffer
Packet - the source packet
Offset - the offset in the packet to start copying at
Length - the number of bytes to copy
Return Value:
The actual number of bytes copied; will be less than Length if
the packet length is less than Offset+Length.
--*/
--*/
{
PNDIS_BUFFER CurBuffer;
UINT BytesCopied;
PUCHAR BufVA;
UINT BufLen;
UINT ToCopy;
UINT CurOffset;
BytesCopied = 0;
//
// First find a spot Offset bytes into the packet.
//
CurOffset = 0;
NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, NULL);
while (CurBuffer != (PNDIS_BUFFER)NULL) {
NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);
if (CurOffset + BufLen > Offset) {
break;
}
CurOffset += BufLen;
NdisGetNextBuffer(CurBuffer, &CurBuffer);
}
//
// See if the end of the packet has already been passed.
//
if (CurBuffer == (PNDIS_BUFFER)NULL) {
return 0;
}
}
//
// Now copy over Length bytes.
//
BufVA += (Offset - CurOffset);
BufLen -= (Offset - CurOffset);
for (;;) {
ToCopy = (BytesCopied+BufLen > Length) ? Length - BytesCopied : BufLen;
NdisMoveMemory(Buf+BytesCopied, BufVA, ToCopy);
BytesCopied += ToCopy;
if (BytesCopied == Length) {
return BytesCopied;
}
}
NdisGetNextBuffer(CurBuffer, &CurBuffer);
if (CurBuffer == (PNDIS_BUFFER)NULL) {
break;
}
NdisQueryBuffer(CurBuffer, (PVOID *)&BufVA, &BufLen);
}
return BytesCopied;
}
VOID
CopyNdisString( PNDIS_STRING D_string,
PNDIS_STRING S_string
)
{
{
D_string->Length = S_string->Length;
D_string->MaximumLength = S_string->MaximumLength;
NdisMoveMemory( D_string->Buffer, S_string->Buffer, S_string->Length);
return;
}
#pragma VxD_ICODE_SEG
#pragma VxD_IDATA_SEG
DWORD _stdcall NSHIM_Device_Init(void)
{
Out_Debug_String("NSHIMSAMP: Dynamic Init\n\r");
return(VXD_SUCCESS);
}
DWORD _stdcall NSHIM_Sys_Crit_Init(void)
{
UCHAR i;
Ndis_Hook();
if((SendBuffer=(PUCHAR)_HeapAllocate(15000,HEAPLOCKEDIFDP|HEAPZEROINIT))
=NULL){
// SendMACHeader=(PMAC_HEADER)SendBuffer;
// SendIPHeader =(PIP_HEADER)(SendBuffer+14);
NdisAllocateBufferPool(
&ReturnStatus,
&SendBufferPoolHandle,
MAX_SEND_BUF_LIST //* NumberOfD
scriptors
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
NdisAllocatePacketPool(
&ReturnStatus,
&SendPacketPoolHandle,
MAX_SEND_PKT_LIST, //NumberOfDes
riptors,
1 //ProtocolReservedLength
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
for(i=0;i
NdisAllocatePacket(
&ReturnStatus,
&SendPktList[i],
SendPacketPoolHandle
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
}
SendPktListHead=SendPktListTail=0;
}
if((RcvBuffer=(PUCHAR)_HeapAllocate(2000,HEAPLOCKEDIFDP|HEAPZEROINIT))!=
ULL){
TransferBuffer=RcvBuffer+500;
NdisAllocatePacketPool(
&ReturnStatus,
&RcvPacketPoolHandle,
1, //NumberOfDescriptors,
0 //ProtocolReservedLength
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
NdisAllocatePacket(
&ReturnStatus,
&RcvTransferPacket,
RcvPacketPoolHandle
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
NdisAllocateBufferPool(
&ReturnStatus,
&RcvBufferPoolHandle,
1 //* NumberOfDescriptors
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
NdisAllocateBuffer(
&ReturnStatus,
&RcvPacketBuffer,
RcvBufferPoolHandle,
TransferBuffer, //VirtualAddress
1500 //Length
);
if(ReturnStatus!=NDIS_STATUS_SUCCESS){}
NdisChainBufferAtBack(
RcvTransferPacket,
RcvPacketBuffer
);
}
// InitAccessList();
}