⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filterrtns.cod

📁 James Antognini和Tom Divine提供的PASSTHRU的编成实例。
💻 COD
📖 第 1 页 / 共 2 页
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 13.00.9178 

	TITLE	.\filterrtns.cpp
	.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS	ENDS
$$SYMBOLS	SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS	ENDS
$$TYPES	SEGMENT BYTE USE32 'DEBTYP'
$$TYPES	ENDS
_TLS	SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS	ENDS
;	COMDAT ??_C@_0CF@DMGHPOPJ@h?3?2winddk?22600?2inc?2ddk?2wdm?2wxp?2w@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BN@LNCICLID@allocateCommonBuffer?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BJ@FEHDECOO@freeCommonBuffer?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BP@KANDHLLG@allocateAdapterChannel?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BM@EHBDCMHD@flushAdapterBuffers?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BL@EEOOFOPL@freeAdapterChannel?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BJ@LFNJJHAK@freeMapRegisters?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BE@JFCEOPNH@mapTransfer?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BI@NHKOAKLK@getDmaAlignment?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT ??_C@_0BH@IOFGABID@readDmaCounter?5?$CB?$DN?5NULL?$AA@
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT _IsEqualGUID@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _==@8
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _FilterPacket@20
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
FLAT	GROUP _DATA, CONST, _BSS
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif

INCLUDELIB LIBC
INCLUDELIB OLDNAMES

_DATA	SEGMENT
_home3	DB	00H
	DB	0c0H
	DB	0a8H
	DB	082H
	DB	050H
	DB	07bH
	ORG $+2
_home2_2 DB	00H
	DB	020H
	DB	078H
	DB	00H
	DB	0e9H
	DB	0cdH
	ORG $+2
_home2_4 DB	00H
	DB	04H
	DB	05aH
	DB	07dH
	DB	04dH
	DB	00H
	ORG $+2
_home3IPAddr DD	0c0a80105H
_home2_2IPAddr DD 0c0a80102H
_home2_4IPAddr DD 0c0a80104H
_DATA	ENDS
PUBLIC	_FilterPacket@20
EXTRN	__imp__NdisAllocateMemoryWithTag@12:NEAR
EXTRN	__imp__NdisFreeMemory@12:NEAR
EXTRN	_PassthruWMIGetAddrArray@12:NEAR
EXTRN	_DbgPrint:NEAR
EXTRN	_GetPktPayload@16:NEAR
;	COMDAT _FilterPacket@20
; File g:\pcadev\ndisim\passthruex\part2\james\james\sys\filterrtns.cpp
_TEXT	SEGMENT
$SG15914 DB	'Passthru: ', 00H
	ORG $+5
$SG15915 DB	'FilterPacket():  Failed to get memory for IP address arr'
	DB	'ay for adapter at 0x%08x!', 0aH, 00H
	ORG $+1
$SG15924 DB	'Passthru: ', 00H
	ORG $+1
$SG15925 DB	'FilterPacket():  Failed to get array last time, status 0'
	DB	'x%08x!', 0aH, 00H
; Function compile flags: /Odt
_status$ = -1836
_midPt$ = -1832
_IPAddr$ = -1828
_pETH$ = -1824
_LoopLim$ = -1820
_ulOrigPayload$ = -1816
_bGotStorage$ = -1809
_PayloadCopy$ = -1808
_pIPH$ = -284
_highIdx$ = -280
_i$ = -276
_$S1$ = -272
_ulUsed$ = -12
_pAddrArr$ = -8
_lowIdx$ = -4
_pAdapt$ = 8
_pPktDesc$ = 12
_pPayload$ = 16
_bSend$ = 20
_pBDecision$ = 24
_FilterPacket@20 PROC NEAR				; COMDAT

; 42   : {

  000b0	55		 push	 ebp
  000b1	8b ec		 mov	 ebp, esp
  000b3	81 ec 2c 07 00
	00		 sub	 esp, 1836		; 0000072cH
  000b9	56		 push	 esi
  000ba	57		 push	 edi

; 43   :  NDIS_STATUS             status = NDIS_STATUS_SUCCESS;

  000bb	c7 85 d4 f8 ff
	ff 00 00 00 00	 mov	 DWORD PTR _status$[ebp], 0

; 44   :  #define                 szPayloadCopy ETH_MAX_PACKET_SIZE
; 45   :  UCHAR                   PayloadCopy[szPayloadCopy];  // Area to receive packet payload if NDIS_PACKET provided.
; 46   :  pEthHdr                 pETH;
; 47   :  pIPHdr                  pIPH;
; 48   :  ULONG const             LoopLim = 5;

  000c5	c7 85 e4 f8 ff
	ff 05 00 00 00	 mov	 DWORD PTR _LoopLim$[ebp], 5

; 49   :  ULONG                   i,
; 50   :                          ulUsed,
; 51   :                          IPAddr,
; 52   :                          ulOrigPayload;
; 53   :  int                     lowIdx,
; 54   :                          highIdx,
; 55   :                          midPt;
; 56   :  PPassthruIPAddrArray    pAddrArr;
; 57   :  BOOLEAN                 bGotStorage = FALSE;

  000cf	c6 85 ef f8 ff
	ff 00		 mov	 BYTE PTR _bGotStorage$[ebp], 0

; 58   :  #define                 szLclStorage 256
; 59   :  union                                                // Area in stack to receive IP-address array, if the latter can be accommodated.
; 60   :    {
; 61   :     PassthruIPAddrArray  lclIPArray;
; 62   :     char                 stuff[szLclStorage];         // EnsurelclIPArray is padded out to szLclStorage.
; 63   :    };
; 64   : 
; 65   :  *pBDecision = FALSE;                                 // Default action is not to drop the packet.

  000d6	8b 45 18	 mov	 eax, DWORD PTR _pBDecision$[ebp]
  000d9	c6 00 00	 mov	 BYTE PTR [eax], 0
$L15890:

; 66   : 
; 67   :  do                                                   // Big 'do' group.
; 68   :    {
; 69   :     if (NULL!=pPktDesc)                               // NDIS_PACKET provided?

  000dc	83 7d 0c 00	 cmp	 DWORD PTR _pPktDesc$[ebp], 0
  000e0	74 1e		 je	 SHORT $L15893

; 70   :       GetPktPayload(pPktDesc,                         // Copy payload
; 71   :                     PayloadCopy,                      //   to area.
; 72   :                     szPayloadCopy,                    // Amount of space in area.
; 73   :                     &ulOrigPayload                    // Return number of bytes in packet.
; 74   :                    );

  000e2	8d 8d e8 f8 ff
	ff		 lea	 ecx, DWORD PTR _ulOrigPayload$[ebp]
  000e8	51		 push	 ecx
  000e9	68 ea 05 00 00	 push	 1514			; 000005eaH
  000ee	8d 95 f0 f8 ff
	ff		 lea	 edx, DWORD PTR _PayloadCopy$[ebp]
  000f4	52		 push	 edx
  000f5	8b 45 0c	 mov	 eax, DWORD PTR _pPktDesc$[ebp]
  000f8	50		 push	 eax
  000f9	e8 00 00 00 00	 call	 _GetPktPayload@16

; 75   : 
; 76   :     else

  000fe	eb 12		 jmp	 SHORT $L15894
$L15893:

; 77   :       NdisMoveMemory(PayloadCopy,                     // An IP packet (on ethernet) comprises the ethernet header + the IP header/body.  An ARP or RARP packet
; 78   :                      pPayload,                        // similarly comprises the ethernet header and the ARP or RARP body.  Since the mapped IP header is 20
; 79   :                      sizeof(EthHdr)+sizeof(IPHdr)     // bytes and an ARP or RARP is 28 bytes, an amount = sizeof(EthHdr)+sizeof(IPHdr) is safely copied.
; 80   :                     );

  00100	b9 08 00 00 00	 mov	 ecx, 8
  00105	8b 75 10	 mov	 esi, DWORD PTR _pPayload$[ebp]
  00108	8d bd f0 f8 ff
	ff		 lea	 edi, DWORD PTR _PayloadCopy$[ebp]
  0010e	f3 a5		 rep movsd
  00110	66 a5		 movsw
$L15894:

; 81   : 
; 82   :     pETH = (pEthHdr)PayloadCopy;                      // Point to ethernet header.

  00112	8d 8d f0 f8 ff
	ff		 lea	 ecx, DWORD PTR _PayloadCopy$[ebp]
  00118	89 8d e0 f8 ff
	ff		 mov	 DWORD PTR _pETH$[ebp], ecx

; 83   : 
; 84   :     if (EthHTypeIP!=RtlUshortByteSwap(pETH->Type))    // No IP header?

  0011e	8b 95 e0 f8 ff
	ff		 mov	 edx, DWORD PTR _pETH$[ebp]
  00124	66 8b 42 0c	 mov	 ax, WORD PTR [edx+12]
  00128	8a e8		 mov	 ch, al
  0012a	8a cc		 mov	 cl, ah
  0012c	0f b7 d1	 movzx	 edx, cx
  0012f	81 fa 00 08 00
	00		 cmp	 edx, 2048		; 00000800H
  00135	74 05		 je	 SHORT $L15899

; 85   :       break;                                          // Leave big 'do' group and do nothing more.

  00137	e9 f0 01 00 00	 jmp	 $done$15918
$L15899:

; 86   : 
; 87   :     pIPH = (pIPHdr)(PayloadCopy + sizeof(EthHdr));    // Point to IP header in copy of payload.

  0013c	8d 85 fe f8 ff
	ff		 lea	 eax, DWORD PTR _PayloadCopy$[ebp+14]
  00142	89 85 e4 fe ff
	ff		 mov	 DWORD PTR _pIPH$[ebp], eax

; 88   : 
; 89   :     if (TRUE==bSend)                                  // Send operation?

  00148	0f b6 4d 14	 movzx	 ecx, BYTE PTR _bSend$[ebp]
  0014c	83 f9 01	 cmp	 ecx, 1
  0014f	75 11		 jne	 SHORT $L15902

; 90   :       IPAddr = pIPH->DestinationAddress;              // Use destination IP address.

  00151	8b 95 e4 fe ff
	ff		 mov	 edx, DWORD PTR _pIPH$[ebp]
  00157	8b 42 10	 mov	 eax, DWORD PTR [edx+16]
  0015a	89 85 dc f8 ff
	ff		 mov	 DWORD PTR _IPAddr$[ebp], eax

; 91   :     else

  00160	eb 0f		 jmp	 SHORT $L15903
$L15902:

; 92   :       IPAddr = pIPH->SourceAddress;                   // Use source IP address.

  00162	8b 8d e4 fe ff
	ff		 mov	 ecx, DWORD PTR _pIPH$[ebp]
  00168	8b 51 0c	 mov	 edx, DWORD PTR [ecx+12]
  0016b	89 95 dc f8 ff
	ff		 mov	 DWORD PTR _IPAddr$[ebp], edx
$L15903:

; 93   : 
; 94   :     for (i = 0; i < LoopLim; i ++)                    // Try several times to get current IP-address array, with ever-increasing amounts of working storage.

  00171	c7 85 ec fe ff
	ff 00 00 00 00	 mov	 DWORD PTR _i$[ebp], 0
  0017b	eb 0f		 jmp	 SHORT $L15904
$L15905:
  0017d	8b 85 ec fe ff
	ff		 mov	 eax, DWORD PTR _i$[ebp]
  00183	83 c0 01	 add	 eax, 1
  00186	89 85 ec fe ff
	ff		 mov	 DWORD PTR _i$[ebp], eax
$L15904:
  0018c	83 bd ec fe ff
	ff 05		 cmp	 DWORD PTR _i$[ebp], 5
  00193	0f 83 04 01 00
	00		 jae	 $L15906

; 95   :       {
; 96   :        if (0==i)                                      // First try?

  00199	83 bd ec fe ff
	ff 00		 cmp	 DWORD PTR _i$[ebp], 0
  001a0	75 12		 jne	 SHORT $L15907

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -