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