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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle&& BindingAdapterInfo[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_HEADER_LEN, Packet, MAC_HEADER_LEN, //+IP_HEADER_LEN, CurSendPktLen-MAC_HEADER_LEN //-IP_HEADER_LEN );switch( QueryAccessList(SendIPHeader,QUERY_SEND_PACKET,&sndkeyno) ){case PACKET_REFUSE :*Status=NDIS_STATUS_SUCCESS; return;case PACKET_CLEAR :break;case PACKET_MUD :CurSendPktLen = Encrypt_reg( (PUCHAR)SendIPHeader+IP_HEADER_LEN, CurSendPktLen-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_HEADER_LEN)&0xff; SendIPHeader->LengthU = ((CurSendPktLen-MAC_HEADER_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[SendPktListHead],&BUFFER); NdisFreeBuffer(BUFFER); }NdisAllocateBuffer( &ReturnStatus, &BUFFER, SendBufferPoolHandle, CurSendBuffer, //VirtualAddress, CurSendPktLen //Length );NdisChainBufferAtBack( SendPktList[SendPktListHead],BUFFER);SendPktList[SendPktListHead]->ProtocolReserved[0]=SendPktListHead; 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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingContext+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<BindingAdapterNum;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.InformationBuffer=1024-14; break;case OID_GEN_MAXIMUM_TOTAL_SIZE:*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuffer=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->OpenAdapterCompleteHandler; ProtocolCharacteristics->OpenAdapterCompleteHandler = NSHIM_IPOpenAdapterComplete;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 = ProtocolBindingContext; 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 = *NdisBindingHandle; BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameBuf[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<PendOpenNum;i++){if(PendingOpenAdapter[i].ProtocolBindingContext==ProtocolBindingContext) break;}if(i==PendOpenNum) goto forward;if(Status==NDIS_STATUS_SUCCESS){BindingAdapterInfo[BindingAdapterNum].BindingHandle = *PendingOpenAdapter[i].NdisBindingHandle; BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameBuf[BindingAdapterNum];CopyNdisString( &BindingAdapterInfo[BindingAdapterNum].Name, &PendingOpenAdapter[i].Name );BindingAdapterNum++; }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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingContext+1)) && BindingAdapterInfo[i].CtrlActived) break;}if(i==BindingAdapterNum) goto forward;if(LookaheadBufferSize!=PacketSize){IndicateBuffer=TransferBuffer-HeaderBufferSize-LookaheadBufferSize;NdisMoveMemory( IndicateBuffer, HeaderBuffer, HeaderBufferSize); NdisMoveMemory( IndicateBuffer+HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize); NdisTransferData( &ReturnStatus, *((PUINT)NdisBindingContext+1), MacReceiveContext, LookaheadBufferSize, // ByteOffset, PacketSize-LookaheadBufferSize, //BytesToTransfer, 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)RcvIPHeader+IP_HEADER_LEN, (USHORT)PacketSize-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 copyReturn 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. //
/****************************************************************************
* *
* 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 <basedef.h>
#include <vmm.h>
#include <shell.h>
#include <debug.h>
#include <vxdwraps.h>
#include <vwin32.h>
#include <winerror.h>
#include <ndis.h>
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_Hook)
#define _SHELL_PostMessage PREPEND(_SHELL_PostMessage)
#define Encrypt_reg PREPEND(Encrypt_reg)
#define Decrypt_reg PREPEND(Decrypt_reg)#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 0x1800Begin_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
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
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_HANDLE,
NDIS_HANDLE ,
NDIS_HANDLE ,
PNDIS_MAC_CHARACTERISTICS,
UINT
);*/
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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==NdisBindingHandle&& BindingAdapterInfo[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_HEADER_LEN,
Packet,
MAC_HEADER_LEN, //+IP_HEADER_LEN,
CurSendPktLen-MAC_HEADER_LEN //-IP_HEADER_LEN
);switch( QueryAccessList(SendIPHeader,QUERY_SEND_PACKET,&sndkeyno) ){case PACKET_REFUSE :*Status=NDIS_STATUS_SUCCESS;
return;case PACKET_CLEAR :break;case PACKET_MUD :CurSendPktLen = Encrypt_reg(
(PUCHAR)SendIPHeader+IP_HEADER_LEN,
CurSendPktLen-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_HEADER_LEN)&0xff;
SendIPHeader->LengthU = ((CurSendPktLen-MAC_HEADER_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[SendPktListHead],&BUFFER);
NdisFreeBuffer(BUFFER);
}NdisAllocateBuffer(
&ReturnStatus,
&BUFFER,
SendBufferPoolHandle,
CurSendBuffer, //VirtualAddress,
CurSendPktLen //Length
);NdisChainBufferAtBack( SendPktList[SendPktListHead],BUFFER);SendPktList[SendPktListHead]->ProtocolReserved[0]=SendPktListHead;
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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingContext+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<BindingAdapterNum;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.InformationBuffer=1024-14;
break;case OID_GEN_MAXIMUM_TOTAL_SIZE:*(PULONG)Request->DATA.QUERY_INFORMATION.InformationBuffer=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->OpenAdapterCompleteHandler;
ProtocolCharacteristics->OpenAdapterCompleteHandler = NSHIM_IPOpenAdapterComplete;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].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 = *NdisBindingHandle;
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameBuf[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<PendOpenNum;i++){if(PendingOpenAdapter[i].ProtocolBindingContext==ProtocolBindingContext)
break;}if(i==PendOpenNum) goto forward;if(Status==NDIS_STATUS_SUCCESS){BindingAdapterInfo[BindingAdapterNum].BindingHandle = *PendingOpenAdapter[i].NdisBindingHandle;
BindingAdapterInfo[BindingAdapterNum].Name.Buffer = AdapterNameBuf[BindingAdapterNum];CopyNdisString(
&BindingAdapterInfo[BindingAdapterNum].Name,
&PendingOpenAdapter[i].Name
);BindingAdapterNum++;
}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<BindingAdapterNum;i++){if(BindingAdapterInfo[i].BindingHandle==(*((PUINT)NdisBindingContext+1)) &&
BindingAdapterInfo[i].CtrlActived)
break;}if(i==BindingAdapterNum) goto forward;if(LookaheadBufferSize!=PacketSize){IndicateBuffer=TransferBuffer-HeaderBufferSize-LookaheadBufferSize;NdisMoveMemory( IndicateBuffer, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory( IndicateBuffer+HeaderBufferSize, LookaheadBuffer, LookaheadBufferSize);
NdisTransferData(
&ReturnStatus,
*((PUINT)NdisBindingContext+1),
MacReceiveContext,
LookaheadBufferSize, // ByteOffset,
PacketSize-LookaheadBufferSize, //BytesToTransfer,
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)RcvIPHeader+IP_HEADER_LEN,
(USHORT)PacketSize-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 copyReturn 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.
//