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

📄 miniport.cod

📁 James Antognini和Tom Divine提供的PASSTHRU的编成实例。
💻 COD
📖 第 1 页 / 共 5 页
字号:
  0027e	8b 55 0c	 mov	 edx, DWORD PTR _Packet$[ebp]
  00281	0f b7 42 1e	 movzx	 eax, WORD PTR [edx+30]
  00285	8b 4d 0c	 mov	 ecx, DWORD PTR _Packet$[ebp]
  00288	8b 54 01 18	 mov	 edx, DWORD PTR [ecx+eax+24]
  0028c	89 55 ec	 mov	 DWORD PTR _MediaSpecificInfo$[ebp], edx
  0028f	8b 45 0c	 mov	 eax, DWORD PTR _Packet$[ebp]
  00292	0f b7 48 1e	 movzx	 ecx, WORD PTR [eax+30]
  00296	8b 55 0c	 mov	 edx, DWORD PTR _Packet$[ebp]
  00299	8b 44 0a 14	 mov	 eax, DWORD PTR [edx+ecx+20]
  0029d	89 45 f8	 mov	 DWORD PTR _MediaSpecificInfoSize$[ebp], eax
$L16126:

; 438  : 
; 439  :         if (MediaSpecificInfo || MediaSpecificInfoSize)

  002a0	83 7d ec 00	 cmp	 DWORD PTR _MediaSpecificInfo$[ebp], 0
  002a4	75 06		 jne	 SHORT $L16132
  002a6	83 7d f8 00	 cmp	 DWORD PTR _MediaSpecificInfoSize$[ebp], 0
  002aa	74 43		 je	 SHORT $L16131
$L16132:

; 440  :         {
; 441  :             NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket,
; 442  :                                                 MediaSpecificInfo,
; 443  :                                                 MediaSpecificInfoSize);

  002ac	8b 4d f0	 mov	 ecx, DWORD PTR _MyPacket$[ebp]
  002af	0f b6 51 1d	 movzx	 edx, BYTE PTR [ecx+29]
  002b3	81 e2 80 00 00
	00		 and	 edx, 128		; 00000080H
  002b9	85 d2		 test	 edx, edx
  002bb	74 32		 je	 SHORT $L16131
  002bd	8b 45 f0	 mov	 eax, DWORD PTR _MyPacket$[ebp]
  002c0	0f b6 48 1d	 movzx	 ecx, BYTE PTR [eax+29]
  002c4	83 c9 40	 or	 ecx, 64			; 00000040H
  002c7	8b 55 f0	 mov	 edx, DWORD PTR _MyPacket$[ebp]
  002ca	88 4a 1d	 mov	 BYTE PTR [edx+29], cl
  002cd	8b 45 f0	 mov	 eax, DWORD PTR _MyPacket$[ebp]
  002d0	0f b7 48 1e	 movzx	 ecx, WORD PTR [eax+30]
  002d4	8b 55 f0	 mov	 edx, DWORD PTR _MyPacket$[ebp]
  002d7	8b 45 ec	 mov	 eax, DWORD PTR _MediaSpecificInfo$[ebp]
  002da	89 44 0a 18	 mov	 DWORD PTR [edx+ecx+24], eax
  002de	8b 4d f0	 mov	 ecx, DWORD PTR _MyPacket$[ebp]
  002e1	0f b7 51 1e	 movzx	 edx, WORD PTR [ecx+30]
  002e5	8b 45 f0	 mov	 eax, DWORD PTR _MyPacket$[ebp]
  002e8	8b 4d f8	 mov	 ecx, DWORD PTR _MediaSpecificInfoSize$[ebp]
  002eb	89 4c 10 14	 mov	 DWORD PTR [eax+edx+20], ecx
$L16131:

; 444  :         }
; 445  : 
; 446  :         NdisSend(&Status,
; 447  :                  pAdapt->BindingHandle,
; 448  :                  MyPacket);

  002ef	8b 55 f0	 mov	 edx, DWORD PTR _MyPacket$[ebp]
  002f2	52		 push	 edx
  002f3	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  002f6	8b 48 04	 mov	 ecx, DWORD PTR [eax+4]
  002f9	51		 push	 ecx
  002fa	8d 55 f4	 lea	 edx, DWORD PTR _Status$[ebp]
  002fd	52		 push	 edx
  002fe	e8 00 00 00 00	 call	 _NdisSend@12

; 449  : 
; 450  : 
; 451  :         if (Status != NDIS_STATUS_PENDING)

  00303	81 7d f4 03 01
	00 00		 cmp	 DWORD PTR _Status$[ebp], 259 ; 00000103H
  0030a	74 4c		 je	 SHORT $L16140

; 452  :         {
; 453  : #ifndef WIN9X
; 454  :             NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);

  0030c	8b 45 f0	 mov	 eax, DWORD PTR _MyPacket$[ebp]
  0030f	50		 push	 eax
  00310	8b 4d 0c	 mov	 ecx, DWORD PTR _Packet$[ebp]
  00313	51		 push	 ecx
  00314	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisIMCopySendCompletePerPacketInfo@8

; 455  : #endif
; 456  :             NdisFreePacket(MyPacket);

  0031a	8b 55 f0	 mov	 edx, DWORD PTR _MyPacket$[ebp]
  0031d	52		 push	 edx
  0031e	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisFreePacket@4

; 457  :             ADAPT_DECR_PENDING_SENDS(pAdapt);

  00324	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  00327	05 98 00 00 00	 add	 eax, 152		; 00000098H
  0032c	50		 push	 eax
  0032d	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4
  00333	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  00336	8b 91 cc 00 00
	00		 mov	 edx, DWORD PTR [ecx+204]
  0033c	83 ea 01	 sub	 edx, 1
  0033f	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  00342	89 90 cc 00 00
	00		 mov	 DWORD PTR [eax+204], edx
  00348	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  0034b	81 c1 98 00 00
	00		 add	 ecx, 152		; 00000098H
  00351	51		 push	 ecx
  00352	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4
$L16140:

; 458  :         }
; 459  :     }
; 460  :     else

  00358	eb 34		 jmp	 SHORT $L16141
$L16115:

; 461  :     {
; 462  :         ADAPT_DECR_PENDING_SENDS(pAdapt);

  0035a	8b 55 fc	 mov	 edx, DWORD PTR _pAdapt$[ebp]
  0035d	81 c2 98 00 00
	00		 add	 edx, 152		; 00000098H
  00363	52		 push	 edx
  00364	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4
  0036a	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  0036d	8b 88 cc 00 00
	00		 mov	 ecx, DWORD PTR [eax+204]
  00373	83 e9 01	 sub	 ecx, 1
  00376	8b 55 fc	 mov	 edx, DWORD PTR _pAdapt$[ebp]
  00379	89 8a cc 00 00
	00		 mov	 DWORD PTR [edx+204], ecx
  0037f	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  00382	05 98 00 00 00	 add	 eax, 152		; 00000098H
  00387	50		 push	 eax
  00388	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4
$L16141:

; 463  :         //
; 464  :         // We are out of packets. Silently drop it. Alternatively we can deal with it:
; 465  :         //    - By keeping separate send and receive pools
; 466  :         //    - Dynamically allocate more pools as needed and free them when not needed
; 467  :         //
; 468  :     }
; 469  : 
; 470  :     return(Status);

  0038e	8b 45 f4	 mov	 eax, DWORD PTR _Status$[ebp]
$L16087:

; 471  : }

  00391	5f		 pop	 edi
  00392	5e		 pop	 esi
  00393	8b e5		 mov	 esp, ebp
  00395	5d		 pop	 ebp
  00396	c2 0c 00	 ret	 12			; 0000000cH
_MPSend@12 ENDP
_TEXT	ENDS
PUBLIC	_MPSendPackets@12
EXTRN	_FilterPacket@20:NEAR
EXTRN	__imp__NdisInterlockedIncrement@4:NEAR
;	COMDAT _MPSendPackets@12
_TEXT	SEGMENT
$SG16170 DB	'g:\pcadev\ndisim\passthruex\part2\james\james\sys\minipo'
	DB	'rt.c', 00H
	ORG $+3
$SG16171 DB	'pStack', 00H
; Function compile flags: /Odt
tv88 = -48
_SendRsvd$16198 = -44
_Remaining$16167 = -37
_pStack$16166 = -36
_Packet$16160 = -32
_MyPacket$16161 = -28
_bDecision$16159 = -21
_MediaSpecificInfo$ = -20
_Status$ = -16
_MediaSpecificInfoSize$ = -12
_i$ = -8
_pAdapt$ = -4
_MiniportAdapterContext$ = 8
_PacketArray$ = 12
_NumberOfPackets$ = 16
_MPSendPackets@12 PROC NEAR				; COMDAT

; 498  : {

  00047	55		 push	 ebp
  00048	8b ec		 mov	 ebp, esp
  0004a	83 ec 30	 sub	 esp, 48			; 00000030H
  0004d	56		 push	 esi
  0004e	57		 push	 edi

; 499  :     PADAPT              pAdapt = (PADAPT)MiniportAdapterContext;

  0004f	8b 45 08	 mov	 eax, DWORD PTR _MiniportAdapterContext$[ebp]
  00052	89 45 fc	 mov	 DWORD PTR _pAdapt$[ebp], eax

; 500  :     NDIS_STATUS         Status;
; 501  :     UINT                i;
; 502  :     PVOID               MediaSpecificInfo = NULL;

  00055	c7 45 ec 00 00
	00 00		 mov	 DWORD PTR _MediaSpecificInfo$[ebp], 0

; 503  :     UINT                MediaSpecificInfoSize = 0;

  0005c	c7 45 f4 00 00
	00 00		 mov	 DWORD PTR _MediaSpecificInfoSize$[ebp], 0

; 504  :     
; 505  :     // Bump entry count.  ja, 02.10.2003.
; 506  :     
; 507  :     NdisInterlockedIncrement(&pAdapt->PassThruStats.MPSendPktsSeen);

  00063	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  00066	81 c1 f4 02 00
	00		 add	 ecx, 756		; 000002f4H
  0006c	51		 push	 ecx
  0006d	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisInterlockedIncrement@4

; 508  : 
; 509  : //  DBGPRINT(("MPSendPackets:  pAdapt = 0x%08x, MPSendPktsCt = %d\n", pAdapt, pAdapt->PassThruStats.MPSendPktsSeen));
; 510  : 
; 511  :     for (i = 0; i < NumberOfPackets; i++)

  00073	c7 45 f8 00 00
	00 00		 mov	 DWORD PTR _i$[ebp], 0
  0007a	eb 09		 jmp	 SHORT $L16156
$L16157:
  0007c	8b 55 f8	 mov	 edx, DWORD PTR _i$[ebp]
  0007f	83 c2 01	 add	 edx, 1
  00082	89 55 f8	 mov	 DWORD PTR _i$[ebp], edx
$L16156:
  00085	8b 45 f8	 mov	 eax, DWORD PTR _i$[ebp]
  00088	3b 45 10	 cmp	 eax, DWORD PTR _NumberOfPackets$[ebp]
  0008b	0f 83 48 04 00
	00		 jae	 $L16148

; 512  :     {
; 513  :         BOOLEAN         bDecision;                    // ja, 02.10.2003
; 514  :         PNDIS_PACKET    Packet, MyPacket;
; 515  :     
; 516  :         Packet = PacketArray[i];

  00091	8b 4d f8	 mov	 ecx, DWORD PTR _i$[ebp]
  00094	8b 55 0c	 mov	 edx, DWORD PTR _PacketArray$[ebp]
  00097	8b 04 8a	 mov	 eax, DWORD PTR [edx+ecx*4]
  0009a	89 45 e0	 mov	 DWORD PTR _Packet$16160[ebp], eax

; 517  : 
; 518  :         //
; 519  :         // The driver should fail the send if the virtual miniport is in low 
; 520  :         // power state
; 521  :         //
; 522  :         if (pAdapt->MPDeviceState > NdisDeviceStateD0)

  0009d	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  000a0	83 b9 a0 00 00
	00 01		 cmp	 DWORD PTR [ecx+160], 1
  000a7	7e 1e		 jle	 SHORT $L16162

; 523  :         {
; 524  :             NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
; 525  :                             Packet,
; 526  :                             NDIS_STATUS_FAILURE);

  000a9	68 01 00 00 c0	 push	 -1073741823		; c0000001H
  000ae	8b 55 e0	 mov	 edx, DWORD PTR _Packet$16160[ebp]
  000b1	52		 push	 edx
  000b2	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  000b5	8b 48 08	 mov	 ecx, DWORD PTR [eax+8]
  000b8	51		 push	 ecx
  000b9	8b 55 fc	 mov	 edx, DWORD PTR _pAdapt$[ebp]
  000bc	8b 42 08	 mov	 eax, DWORD PTR [edx+8]
  000bf	ff 90 ec 00 00
	00		 call	 DWORD PTR [eax+236]

; 527  :             continue;

  000c5	eb b5		 jmp	 SHORT $L16157
$L16162:

; 528  :         }
; 529  : 
; 530  : #ifdef NDIS51
; 531  : 
; 532  :         //
; 533  :         // Use NDIS 5.1 packet stacking:
; 534  :         //
; 535  :         {
; 536  :             PNDIS_PACKET_STACK        pStack;
; 537  :             BOOLEAN                   Remaining;
; 538  : 
; 539  :             //
; 540  :             // Packet stacks: Check if we can use the same packet for sending down.
; 541  :             //
; 542  :             pStack = NdisIMGetCurrentPacketStack(Packet, &Remaining);

  000c7	8d 4d db	 lea	 ecx, DWORD PTR _Remaining$16167[ebp]
  000ca	51		 push	 ecx
  000cb	8b 55 e0	 mov	 edx, DWORD PTR _Packet$16160[ebp]
  000ce	52		 push	 edx
  000cf	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisIMGetCurrentPacketStack@8
  000d5	89 45 dc	 mov	 DWORD PTR _pStack$16166[ebp], eax

; 543  :             if (Remaining)

  000d8	0f b6 45 db	 movzx	 eax, BYTE PTR _Remaining$16167[ebp]
  000dc	85 c0		 test	 eax, eax
  000de	0f 84 5a 01 00
	00		 je	 $L16185

; 544  :             {
; 545  :                 //
; 546  :                 // We can reuse "Packet".
; 547  :                 //
; 548  :                 // NOTE: if we needed to keep per-packet information in packets
; 549  :                 // sent down, we can use pStack->IMReserved[].
; 550  :                 //
; 551  :                 ASSERT(pStack);

  000e4	83 7d dc 00	 cmp	 DWORD PTR _pStack$16166[ebp], 0
  000e8	75 20		 jne	 SHORT $L16596
  000ea	6a 00		 push	 0
  000ec	68 27 02 00 00	 push	 551			; 00000227H
  000f1	68 00 00 00 00	 push	 OFFSET FLAT:$SG16170
  000f6	68 00 00 00 00	 push	 OFFSET FLAT:$SG16171
  000fb	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
  00101	c7 45 d0 00 00
	00 00		 mov	 DWORD PTR tv88[ebp], 0
  00108	eb 07		 jmp	 SHORT $L16597
$L16596:
  0010a	c7 45 d0 01 00
	00 00		 mov	 DWORD PTR tv88[ebp], 1
$L16597:

; 552  :                 //
; 553  :                 // If the below miniport is going to low power state, stop sending down any packet.
; 554  :                 //
; 555  :                 NdisAcquireSpinLock(&pAdapt->Lock);

  00111	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  00114	81 c1 98 00 00
	00		 add	 ecx, 152		; 00000098H
  0011a	51		 push	 ecx
  0011b	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4

; 556  :                 if (pAdapt->PTDeviceState > NdisDeviceStateD0)

  00121	8b 55 fc	 mov	 edx, DWORD PTR _pAdapt$[ebp]
  00124	83 ba a4 00 00
	00 01		 cmp	 DWORD PTR [edx+164], 1
  0012b	7e 30		 jle	 SHORT $L16172

; 557  :                 {
; 558  :                     NdisReleaseSpinLock(&pAdapt->Lock);

  0012d	8b 45 fc	 mov	 eax, DWORD PTR _pAdapt$[ebp]
  00130	05 98 00 00 00	 add	 eax, 152		; 00000098H
  00135	50		 push	 eax
  00136	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4

; 559  :                     NdisMSendComplete(ADAPT_MINIPORT_HANDLE(pAdapt),
; 560  :                                         Packet,
; 561  :                                         NDIS_STATUS_FAILURE);

  0013c	68 01 00 00 c0	 push	 -1073741823		; c0000001H
  00141	8b 4d e0	 mov	 ecx, DWORD PTR _Packet$16160[ebp]
  00144	51		 push	 ecx
  00145	8b 55 fc	 mov	 edx, DWORD PTR _pAdapt$[ebp]
  00148	8b 42 08	 mov	 eax, DWORD PTR [edx+8]
  0014b	50		 push	 eax
  0014c	8b 4d fc	 mov	 ecx, DWORD PTR _pAdapt$[ebp]
  0014f	8b 51 08	 mov	 edx, DWORD PTR [ecx+8]
  00152	ff 92 ec 00 00
	00		 call	 DWORD PTR [edx+236]

; 562  :                 }
; 563  :                 else

⌨️ 快捷键说明

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