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

📄 passthru.cod

📁 James Antognini和Tom Divine提供的PASSTHRU的编成实例。
💻 COD
📖 第 1 页 / 共 3 页
字号:
  001ed	c7 45 80 00 00
	00 00		 mov	 DWORD PTR _DispatchTable$[ebp+8], OFFSET FLAT:_PtDispatch@8

; 311  :         DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch;

  001f4	c7 45 b0 00 00
	00 00		 mov	 DWORD PTR _DispatchTable$[ebp+56], OFFSET FLAT:_PtDispatch@8

; 312  :         
; 313  : 
; 314  :         NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING);

  001fb	68 00 00 00 00	 push	 OFFSET FLAT:$SG15926
  00200	8d 4d f4	 lea	 ecx, DWORD PTR _DeviceName$[ebp]
  00203	51		 push	 ecx
  00204	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisInitUnicodeString@8

; 315  :         NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING);

  0020a	68 00 00 00 00	 push	 OFFSET FLAT:$SG15927
  0020f	8d 55 ec	 lea	 edx, DWORD PTR _DeviceLinkUnicodeString$[ebp]
  00212	52		 push	 edx
  00213	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisInitUnicodeString@8

; 316  : 
; 317  :         //
; 318  :         // Create a device object and register our dispatch handlers
; 319  :         //
; 320  :         
; 321  :         Status = NdisMRegisterDevice(
; 322  :                     NdisWrapperHandle, 
; 323  :                     &DeviceName,
; 324  :                     &DeviceLinkUnicodeString,
; 325  :                     &DispatchTable[0],
; 326  :                     &ControlDeviceObject,
; 327  :                     &NdisDeviceHandle
; 328  :                     );

  00219	68 00 00 00 00	 push	 OFFSET FLAT:_NdisDeviceHandle
  0021e	68 00 00 00 00	 push	 OFFSET FLAT:_ControlDeviceObject
  00223	8d 85 78 ff ff
	ff		 lea	 eax, DWORD PTR _DispatchTable$[ebp]
  00229	50		 push	 eax
  0022a	8d 4d ec	 lea	 ecx, DWORD PTR _DeviceLinkUnicodeString$[ebp]
  0022d	51		 push	 ecx
  0022e	8d 55 f4	 lea	 edx, DWORD PTR _DeviceName$[ebp]
  00231	52		 push	 edx
  00232	a1 00 00 00 00	 mov	 eax, DWORD PTR _NdisWrapperHandle
  00237	50		 push	 eax
  00238	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisMRegisterDevice@24
  0023e	89 45 fc	 mov	 DWORD PTR _Status$[ebp], eax

; 329  : 
; 330  :         NdisAcquireSpinLock(&GlobalLock);

  00241	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  00246	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4

; 331  : 
; 332  :         ControlDeviceState = PS_DEVICE_STATE_READY;

  0024c	c7 05 00 00 00
	00 00 00 00 00	 mov	 DWORD PTR _ControlDeviceState, 0
$L15918:

; 333  :     }
; 334  : 
; 335  :     NdisReleaseSpinLock(&GlobalLock);

  00256	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  0025b	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4

; 336  : 
; 337  :     DBGPRINT(("<==PtRegisterDevice: %x\n", Status));

  00261	68 00 00 00 00	 push	 OFFSET FLAT:$SG15928
  00266	e8 00 00 00 00	 call	 _DbgPrint
  0026b	83 c4 04	 add	 esp, 4
  0026e	8b 4d fc	 mov	 ecx, DWORD PTR _Status$[ebp]
  00271	51		 push	 ecx
  00272	68 00 00 00 00	 push	 OFFSET FLAT:$SG15929
  00277	e8 00 00 00 00	 call	 _DbgPrint
  0027c	83 c4 08	 add	 esp, 8

; 338  : 
; 339  :     return (Status);

  0027f	8b 45 fc	 mov	 eax, DWORD PTR _Status$[ebp]

; 340  : }

  00282	5f		 pop	 edi
  00283	8b e5		 mov	 esp, ebp
  00285	5d		 pop	 ebp
  00286	c3		 ret	 0
_PtRegisterDevice@0 ENDP
_TEXT	ENDS
EXTRN	__imp_@IofCompleteRequest@8:NEAR
;	COMDAT _PtDispatch@8
_TEXT	SEGMENT
$SG15938 DB	'Passthru: ', 00H
	ORG $+1
$SG15939 DB	'==>Pt Dispatch', 0aH, 00H
$SG15949 DB	'Passthru: ', 00H
	ORG $+1
$SG15950 DB	'<== Pt Dispatch', 0aH, 00H
; Function compile flags: /Odt
tv68 = -12
_status$ = -8
_irpStack$ = -4
_DeviceObject$ = 8
_Irp$ = 12
_PtDispatch@8 PROC NEAR					; COMDAT

; 364  : {

  00039	55		 push	 ebp
  0003a	8b ec		 mov	 ebp, esp
  0003c	83 ec 0c	 sub	 esp, 12			; 0000000cH

; 365  :     PIO_STACK_LOCATION  irpStack;
; 366  :     NTSTATUS            status = STATUS_SUCCESS;

  0003f	c7 45 f8 00 00
	00 00		 mov	 DWORD PTR _status$[ebp], 0

; 367  : 
; 368  :     UNREFERENCED_PARAMETER(DeviceObject);
; 369  :     
; 370  :     DBGPRINT(("==>Pt Dispatch\n"));

  00046	68 00 00 00 00	 push	 OFFSET FLAT:$SG15938
  0004b	e8 00 00 00 00	 call	 _DbgPrint
  00050	83 c4 04	 add	 esp, 4
  00053	68 00 00 00 00	 push	 OFFSET FLAT:$SG15939
  00058	e8 00 00 00 00	 call	 _DbgPrint
  0005d	83 c4 04	 add	 esp, 4

; 371  :     irpStack = IoGetCurrentIrpStackLocation(Irp);

  00060	8b 45 0c	 mov	 eax, DWORD PTR _Irp$[ebp]
  00063	8b 48 60	 mov	 ecx, DWORD PTR [eax+96]
  00066	89 4d fc	 mov	 DWORD PTR _irpStack$[ebp], ecx

; 372  :       
; 373  : 
; 374  :     switch (irpStack->MajorFunction)
; 375  :     {

  00069	8b 55 fc	 mov	 edx, DWORD PTR _irpStack$[ebp]
  0006c	0f b6 02	 movzx	 eax, BYTE PTR [edx]
  0006f	89 45 f4	 mov	 DWORD PTR tv68[ebp], eax

; 376  :         case IRP_MJ_CREATE:
; 377  :             break;
; 378  :             
; 379  :         case IRP_MJ_CLEANUP:
; 380  :             break;
; 381  :             
; 382  :         case IRP_MJ_CLOSE:
; 383  :             break;        
; 384  :             
; 385  :         case IRP_MJ_DEVICE_CONTROL:
; 386  :             //
; 387  :             // Add code here to handle ioctl commands sent to passthru.
; 388  :             //
; 389  :             break;        
; 390  :         default:
; 391  :             break;
; 392  :     }
; 393  : 
; 394  :     Irp->IoStatus.Status = status;

  00072	8b 4d 0c	 mov	 ecx, DWORD PTR _Irp$[ebp]
  00075	8b 55 f8	 mov	 edx, DWORD PTR _status$[ebp]
  00078	89 51 18	 mov	 DWORD PTR [ecx+24], edx

; 395  :     IoCompleteRequest(Irp, IO_NO_INCREMENT);

  0007b	32 d2		 xor	 dl, dl
  0007d	8b 4d 0c	 mov	 ecx, DWORD PTR _Irp$[ebp]
  00080	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8

; 396  : 
; 397  :     DBGPRINT(("<== Pt Dispatch\n"));

  00086	68 00 00 00 00	 push	 OFFSET FLAT:$SG15949
  0008b	e8 00 00 00 00	 call	 _DbgPrint
  00090	83 c4 04	 add	 esp, 4
  00093	68 00 00 00 00	 push	 OFFSET FLAT:$SG15950
  00098	e8 00 00 00 00	 call	 _DbgPrint
  0009d	83 c4 04	 add	 esp, 4

; 398  : 
; 399  :     return status;

  000a0	8b 45 f8	 mov	 eax, DWORD PTR _status$[ebp]

; 400  : 
; 401  : } 

  000a3	8b e5		 mov	 esp, ebp
  000a5	5d		 pop	 ebp
  000a6	c2 08 00	 ret	 8
_PtDispatch@8 ENDP
_TEXT	ENDS
PUBLIC	_PtDeregisterDevice@0
EXTRN	__imp__NdisMDeregisterDevice@4:NEAR
;	COMDAT _PtDeregisterDevice@0
_TEXT	SEGMENT
$SG15956 DB	'Passthru: ', 00H
	ORG $+1
$SG15957 DB	'==>PassthruDeregisterDevice', 0aH, 00H
	ORG $+3
$SG15959 DB	'g:\pcadev\ndisim\passthruex\part2\james\james\sys\passth'
	DB	'ru.c', 00H
	ORG $+3
$SG15960 DB	'MiniportCount > 0', 00H
	ORG $+2
$SG15963 DB	'g:\pcadev\ndisim\passthruex\part2\james\james\sys\passth'
	DB	'ru.c', 00H
	ORG $+3
$SG15964 DB	'ControlDeviceState == PS_DEVICE_STATE_READY', 00H
$SG15968 DB	'Passthru: ', 00H
	ORG $+1
$SG15969 DB	'<== PassthruDeregisterDevice: %x', 0aH, 00H
; Function compile flags: /Odt
tv80 = -12
tv72 = -8
_Status$ = -4
_PtDeregisterDevice@0 PROC NEAR				; COMDAT

; 425  : {

  0011a	55		 push	 ebp
  0011b	8b ec		 mov	 ebp, esp
  0011d	83 ec 0c	 sub	 esp, 12			; 0000000cH

; 426  :     NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

  00120	c7 45 fc 00 00
	00 00		 mov	 DWORD PTR _Status$[ebp], 0

; 427  : 
; 428  :     DBGPRINT(("==>PassthruDeregisterDevice\n"));

  00127	68 00 00 00 00	 push	 OFFSET FLAT:$SG15956
  0012c	e8 00 00 00 00	 call	 _DbgPrint
  00131	83 c4 04	 add	 esp, 4
  00134	68 00 00 00 00	 push	 OFFSET FLAT:$SG15957
  00139	e8 00 00 00 00	 call	 _DbgPrint
  0013e	83 c4 04	 add	 esp, 4

; 429  : 
; 430  :     NdisAcquireSpinLock(&GlobalLock);

  00141	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  00146	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4

; 431  : 
; 432  :     ASSERT(MiniportCount > 0);

  0014c	83 3d 00 00 00
	00 00		 cmp	 DWORD PTR _MiniportCount, 0
  00153	7f 20		 jg	 SHORT $L16018
  00155	6a 00		 push	 0
  00157	68 b0 01 00 00	 push	 432			; 000001b0H
  0015c	68 00 00 00 00	 push	 OFFSET FLAT:$SG15959
  00161	68 00 00 00 00	 push	 OFFSET FLAT:$SG15960
  00166	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
  0016c	c7 45 f8 00 00
	00 00		 mov	 DWORD PTR tv72[ebp], 0
  00173	eb 07		 jmp	 SHORT $L16019
$L16018:
  00175	c7 45 f8 01 00
	00 00		 mov	 DWORD PTR tv72[ebp], 1
$L16019:

; 433  : 
; 434  :     --MiniportCount;

  0017c	a1 00 00 00 00	 mov	 eax, DWORD PTR _MiniportCount
  00181	83 e8 01	 sub	 eax, 1
  00184	a3 00 00 00 00	 mov	 DWORD PTR _MiniportCount, eax

; 435  :     
; 436  :     if (0 == MiniportCount)

  00189	83 3d 00 00 00
	00 00		 cmp	 DWORD PTR _MiniportCount, 0
  00190	75 7d		 jne	 SHORT $L15961

; 437  :     {
; 438  :         //
; 439  :         // All miniport instances have been halted. Deregister
; 440  :         // the control device.
; 441  :         //
; 442  : 
; 443  :         ASSERT(ControlDeviceState == PS_DEVICE_STATE_READY);

  00192	83 3d 00 00 00
	00 00		 cmp	 DWORD PTR _ControlDeviceState, 0
  00199	74 20		 je	 SHORT $L16020
  0019b	6a 00		 push	 0
  0019d	68 bb 01 00 00	 push	 443			; 000001bbH
  001a2	68 00 00 00 00	 push	 OFFSET FLAT:$SG15963
  001a7	68 00 00 00 00	 push	 OFFSET FLAT:$SG15964
  001ac	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
  001b2	c7 45 f4 00 00
	00 00		 mov	 DWORD PTR tv80[ebp], 0
  001b9	eb 07		 jmp	 SHORT $L16021
$L16020:
  001bb	c7 45 f4 01 00
	00 00		 mov	 DWORD PTR tv80[ebp], 1
$L16021:

; 444  : 
; 445  :         //
; 446  :         // Block PtRegisterDevice() while we release the control
; 447  :         // device lock and deregister the device.
; 448  :         // 
; 449  :         ControlDeviceState = PS_DEVICE_STATE_DELETING;

  001c2	c7 05 00 00 00
	00 02 00 00 00	 mov	 DWORD PTR _ControlDeviceState, 2

; 450  : 
; 451  :         NdisReleaseSpinLock(&GlobalLock);

  001cc	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  001d1	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4

; 452  : 
; 453  :         if (NdisDeviceHandle != NULL)

  001d7	83 3d 00 00 00
	00 00		 cmp	 DWORD PTR _NdisDeviceHandle, 0
  001de	74 1a		 je	 SHORT $L15966

; 454  :         {
; 455  :             Status = NdisMDeregisterDevice(NdisDeviceHandle);

  001e0	8b 0d 00 00 00
	00		 mov	 ecx, DWORD PTR _NdisDeviceHandle
  001e6	51		 push	 ecx
  001e7	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisMDeregisterDevice@4
  001ed	89 45 fc	 mov	 DWORD PTR _Status$[ebp], eax

; 456  :             NdisDeviceHandle = NULL;

  001f0	c7 05 00 00 00
	00 00 00 00 00	 mov	 DWORD PTR _NdisDeviceHandle, 0
$L15966:

; 457  :         }
; 458  : 
; 459  :         NdisAcquireSpinLock(&GlobalLock);

  001fa	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  001ff	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisAcquireSpinLock@4

; 460  :         ControlDeviceState = PS_DEVICE_STATE_READY;

  00205	c7 05 00 00 00
	00 00 00 00 00	 mov	 DWORD PTR _ControlDeviceState, 0
$L15961:

; 461  :     }
; 462  : 
; 463  :     NdisReleaseSpinLock(&GlobalLock);

  0020f	68 00 00 00 00	 push	 OFFSET FLAT:_GlobalLock
  00214	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisReleaseSpinLock@4

; 464  : 
; 465  :     DBGPRINT(("<== PassthruDeregisterDevice: %x\n", Status));

  0021a	68 00 00 00 00	 push	 OFFSET FLAT:$SG15968
  0021f	e8 00 00 00 00	 call	 _DbgPrint
  00224	83 c4 04	 add	 esp, 4
  00227	8b 55 fc	 mov	 edx, DWORD PTR _Status$[ebp]
  0022a	52		 push	 edx
  0022b	68 00 00 00 00	 push	 OFFSET FLAT:$SG15969
  00230	e8 00 00 00 00	 call	 _DbgPrint
  00235	83 c4 08	 add	 esp, 8

; 466  :     return Status;

  00238	8b 45 fc	 mov	 eax, DWORD PTR _Status$[ebp]

; 467  :     
; 468  : }

  0023b	8b e5		 mov	 esp, ebp
  0023d	5d		 pop	 ebp
  0023e	c3		 ret	 0
_PtDeregisterDevice@0 ENDP
_TEXT	ENDS
;	COMDAT _PtUnload@4
_TEXT	SEGMENT
$SG15973 DB	'Passthru: ', 00H
	ORG $+1
$SG15974 DB	'PtUnload: entered', 0aH, 00H
	ORG $+1
$SG15975 DB	'Passthru: ', 00H
	ORG $+1
$SG15976 DB	'PtUnload: done!', 0aH, 00H
; Function compile flags: /Odt
_DriverObject$ = 8
_PtUnload@4 PROC NEAR					; COMDAT

; 477  : {

  0003d	55		 push	 ebp
  0003e	8b ec		 mov	 ebp, esp

; 478  :     UNREFERENCED_PARAMETER(DriverObject);
; 479  :     
; 480  :     DBGPRINT(("PtUnload: entered\n"));

  00040	68 00 00 00 00	 push	 OFFSET FLAT:$SG15973
  00045	e8 00 00 00 00	 call	 _DbgPrint
  0004a	83 c4 04	 add	 esp, 4
  0004d	68 00 00 00 00	 push	 OFFSET FLAT:$SG15974
  00052	e8 00 00 00 00	 call	 _DbgPrint
  00057	83 c4 04	 add	 esp, 4

; 481  :     PtUnloadProtocol();

  0005a	e8 00 00 00 00	 call	 _PtUnloadProtocol@0

; 482  :     NdisIMDeregisterLayeredMiniport(DriverHandle);

  0005f	a1 00 00 00 00	 mov	 eax, DWORD PTR _DriverHandle
  00064	50		 push	 eax
  00065	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__NdisIMDeregisterLayeredMiniport@4

; 483  :     DBGPRINT(("PtUnload: done!\n"));

  0006b	68 00 00 00 00	 push	 OFFSET FLAT:$SG15975
  00070	e8 00 00 00 00	 call	 _DbgPrint
  00075	83 c4 04	 add	 esp, 4
  00078	68 00 00 00 00	 push	 OFFSET FLAT:$SG15976
  0007d	e8 00 00 00 00	 call	 _DbgPrint
  00082	83 c4 04	 add	 esp, 4

; 484  : }

  00085	5d		 pop	 ebp
  00086	c2 04 00	 ret	 4
_PtUnload@4 ENDP
_TEXT	ENDS
END

⌨️ 快捷键说明

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