📄 filterrtns.cod
字号:
; 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 + -