.

解决方案 »

  1.   

    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 <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 
    );*/
      

  2.   

    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;
      

  3.   

    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.
    //