📄 flush.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0
TITLE F:\W2DDK\src\kernel\serial\flush.c
.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
PAGESRP0 SEGMENT PARA USE32 PUBLIC ''
PAGESRP0 ENDS
; COMDAT _RtlConvertLongToLargeInteger@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialFlush@8
PAGESRP0 SEGMENT PARA USE32 PUBLIC ''
PAGESRP0 ENDS
; COMDAT _SerialStartFlush@4
PAGESRP0 SEGMENT PARA USE32 PUBLIC ''
PAGESRP0 ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
INCLUDELIB LIBC
INCLUDELIB OLDNAMES
PUBLIC _SerialStartFlush@4
PUBLIC _SerialFlush@8
EXTRN _SerialDebugLevel:DWORD
EXTRN __imp__KeGetCurrentIrql@0:NEAR
EXTRN __imp__RtlAssert@16:NEAR
EXTRN _SerialIRPPrologue@8:NEAR
EXTRN _SerialIRPEpilogue@4:NEAR
EXTRN _DbgPrint:NEAR
EXTRN __imp_@IofCompleteRequest@8:NEAR
EXTRN _SerialStartOrQueue@20:NEAR
EXTRN _SerialCompleteIfError@8:NEAR
; COMDAT _SerialFlush@8
; File f:\w2ddk\src\kernel\serial\flush.c
PAGESRP0 SEGMENT
$SG14814 DB 'EX: Pageable code called at IRQL %d', 0aH, 00H
ORG $+3
$SG14817 DB 'f:\w2ddk\src\kernel\serial\flush.c', 00H
ORG $+1
$SG14818 DB 'FALSE', 00H
ORG $+2
$SG14825 DB 'SERIAL: Dispatch entry for: %x', 0aH, 00H
$SG14838 DB 'SERIAL: Entering SerialFlush', 0aH, 00H
ORG $+2
$SG14855 DB 'SERIAL: Leaving SerialFlush (1)', 0aH, 00H
ORG $+3
$SG14869 DB 'SERIAL: Leaving SerialFlush (2)', 0aH, 00H
ORG $+3
$SG14885 DB 'SERIAL: Leaving SerialFlush (3)', 0aH, 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_SerialFlush@8 PROC NEAR ; COMDAT
; 67 : {
000fd 55 push ebp
000fe 8b ec mov ebp, esp
; 68 :
; 69 : PSERIAL_DEVICE_EXTENSION Extension = DeviceObject->DeviceExtension;
00100 8b 45 08 mov eax, DWORD PTR _DeviceObject$[ebp]
00103 53 push ebx
00104 56 push esi
; 70 : NTSTATUS status;
; 71 : PAGED_CODE();
00105 8b 35 00 00 00
00 mov esi, DWORD PTR __imp__KeGetCurrentIrql@0
0010b 8b 58 28 mov ebx, DWORD PTR [eax+40]
0010e 57 push edi
0010f ff d6 call esi
00111 3c 01 cmp al, 1
00113 76 26 jbe SHORT $L14819
00115 ff d6 call esi
00117 0f b6 c0 movzx eax, al
0011a 50 push eax
0011b 68 00 00 00 00 push OFFSET FLAT:$SG14814
00120 e8 00 00 00 00 call _DbgPrint
00125 59 pop ecx
00126 59 pop ecx
00127 6a 00 push 0
00129 6a 47 push 71 ; 00000047H
0012b 68 00 00 00 00 push OFFSET FLAT:$SG14817
00130 68 00 00 00 00 push OFFSET FLAT:$SG14818
00135 ff 15 00 00 00
00 call DWORD PTR __imp__RtlAssert@16
$L14819:
; 72 :
; 73 : SerialDump(
; 74 : SERIRPPATH,
; 75 : ("SERIAL: Dispatch entry for: %x\n",Irp)
; 76 : );
0013b f6 05 00 00 00
00 20 test BYTE PTR _SerialDebugLevel, 32 ; 00000020H
00142 8b 75 0c mov esi, DWORD PTR _Irp$[ebp]
00145 74 0d je SHORT $L14820
00147 56 push esi
00148 68 00 00 00 00 push OFFSET FLAT:$SG14825
0014d e8 00 00 00 00 call _DbgPrint
00152 59 pop ecx
00153 59 pop ecx
$L14820:
; 77 :
; 78 : SerialDump(SERTRACECALLS, ("SERIAL: Entering SerialFlush\n"));
00154 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
0015b 74 0b je SHORT $L14833
0015d 68 00 00 00 00 push OFFSET FLAT:$SG14838
00162 e8 00 00 00 00 call _DbgPrint
00167 59 pop ecx
$L14833:
; 79 :
; 80 :
; 81 :
; 82 : Irp->IoStatus.Information = 0L;
00168 83 66 1c 00 and DWORD PTR [esi+28], 0
; 83 :
; 84 : if ((status = SerialIRPPrologue(Irp, Extension)) == STATUS_SUCCESS) {
0016c 53 push ebx
0016d 56 push esi
0016e e8 00 00 00 00 call _SerialIRPPrologue@8
00173 8b f8 mov edi, eax
00175 85 ff test edi, edi
00177 75 58 jne SHORT $L14846
; 85 :
; 86 : if (SerialCompleteIfError(DeviceObject, Irp) != STATUS_SUCCESS) {
00179 56 push esi
0017a ff 75 08 push DWORD PTR _DeviceObject$[ebp]
0017d e8 00 00 00 00 call _SerialCompleteIfError@8
00182 85 c0 test eax, eax
00184 74 1b je SHORT $L14863
; 87 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (1)\n"));
00186 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
0018d 74 0b je SHORT $L14850
0018f 68 00 00 00 00 push OFFSET FLAT:$SG14855
00194 e8 00 00 00 00 call _DbgPrint
00199 59 pop ecx
$L14850:
; 88 :
; 89 : return STATUS_CANCELLED;
0019a b8 20 01 00 c0 mov eax, -1073741536 ; c0000120H
0019f eb 5d jmp SHORT $L14876
$L14863:
; 90 :
; 91 : }
; 92 :
; 93 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (2)\n"));
001a1 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
001a8 74 0b je SHORT $L14864
001aa 68 00 00 00 00 push OFFSET FLAT:$SG14869
001af e8 00 00 00 00 call _DbgPrint
001b4 59 pop ecx
$L14864:
; 94 :
; 95 : return SerialStartOrQueue(Extension, Irp, &Extension->WriteQueue,
; 96 : &Extension->CurrentWriteIrp, SerialStartFlush);
001b5 8d 83 c8 00 00
00 lea eax, DWORD PTR [ebx+200]
001bb 68 00 00 00 00 push OFFSET FLAT:_SerialStartFlush@4
001c0 50 push eax
001c1 8d 83 ac 00 00
00 lea eax, DWORD PTR [ebx+172]
001c7 50 push eax
001c8 56 push esi
001c9 53 push ebx
001ca e8 00 00 00 00 call _SerialStartOrQueue@20
001cf eb 2d jmp SHORT $L14876
$L14846:
; 97 :
; 98 : } else {
; 99 : Irp->IoStatus.Status = status;
; 100 :
; 101 : if (!NT_SUCCESS(status)) {
001d1 85 ff test edi, edi
001d3 89 7e 18 mov DWORD PTR [esi+24], edi
001d6 7d 10 jge SHORT $L14879
; 102 : SerialCompleteRequest(Extension, Irp, IO_NO_INCREMENT);
001d8 32 d2 xor dl, dl
001da 8b ce mov ecx, esi
001dc ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
001e2 53 push ebx
001e3 e8 00 00 00 00 call _SerialIRPEpilogue@4
$L14879:
; 103 : }
; 104 :
; 105 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (3)\n"));
001e8 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
001ef 74 0b je SHORT $L14880
001f1 68 00 00 00 00 push OFFSET FLAT:$SG14885
001f6 e8 00 00 00 00 call _DbgPrint
001fb 59 pop ecx
$L14880:
; 106 : return status;
001fc 8b c7 mov eax, edi
$L14876:
001fe 5f pop edi
001ff 5e pop esi
00200 5b pop ebx
; 107 : }
; 108 : }
00201 5d pop ebp
00202 c2 08 00 ret 8
_SerialFlush@8 ENDP
PAGESRP0 ENDS
EXTRN _SerialStartWrite@4:NEAR
EXTRN _SerialGetNextWrite@20:NEAR
; COMDAT _SerialStartFlush@4
PAGESRP0 SEGMENT
$SG14897 DB 'EX: Pageable code called at IRQL %d', 0aH, 00H
ORG $+3
$SG14900 DB 'f:\w2ddk\src\kernel\serial\flush.c', 00H
ORG $+1
$SG14901 DB 'FALSE', 00H
ORG $+2
$SG14906 DB 'f:\w2ddk\src\kernel\serial\flush.c', 00H
ORG $+1
$SG14907 DB 'NewIrp == Extension->CurrentWriteIrp', 00H
; Function compile flags: /Ogs
_Extension$ = 8
_NewIrp$ = -4
_SerialStartFlush@4 PROC NEAR ; COMDAT
; 136 : {
0009d 55 push ebp
0009e 8b ec mov ebp, esp
000a0 51 push ecx
000a1 53 push ebx
000a2 56 push esi
; 137 :
; 138 : PIRP NewIrp;
; 139 : PAGED_CODE();
000a3 8b 35 00 00 00
00 mov esi, DWORD PTR __imp__KeGetCurrentIrql@0
000a9 57 push edi
000aa ff d6 call esi
000ac 8b 1d 00 00 00
00 mov ebx, DWORD PTR __imp__RtlAssert@16
000b2 3c 01 cmp al, 1
000b4 76 25 jbe SHORT $L14898
000b6 ff d6 call esi
000b8 0f b6 c0 movzx eax, al
000bb 50 push eax
000bc 68 00 00 00 00 push OFFSET FLAT:$SG14897
000c1 e8 00 00 00 00 call _DbgPrint
000c6 59 pop ecx
000c7 59 pop ecx
000c8 6a 00 push 0
000ca 68 8b 00 00 00 push 139 ; 0000008bH
000cf 68 00 00 00 00 push OFFSET FLAT:$SG14900
000d4 68 00 00 00 00 push OFFSET FLAT:$SG14901
000d9 ff d3 call ebx
$L14898:
; 140 :
; 141 : Extension->CurrentWriteIrp->IoStatus.Status = STATUS_SUCCESS;
000db 8b 7d 08 mov edi, DWORD PTR _Extension$[ebp]
; 142 :
; 143 : //
; 144 : // The following call will actually complete the flush.
; 145 : //
; 146 :
; 147 : SerialGetNextWrite(
; 148 : &Extension->CurrentWriteIrp,
; 149 : &Extension->WriteQueue,
; 150 : &NewIrp,
; 151 : TRUE,
; 152 : Extension
; 153 : );
000de 57 push edi
000df 6a 01 push 1
000e1 8d b7 c8 00 00
00 lea esi, DWORD PTR [edi+200]
000e7 8b 06 mov eax, DWORD PTR [esi]
000e9 83 60 18 00 and DWORD PTR [eax+24], 0
000ed 8d 45 fc lea eax, DWORD PTR _NewIrp$[ebp]
000f0 50 push eax
000f1 8d 87 ac 00 00
00 lea eax, DWORD PTR [edi+172]
000f7 50 push eax
000f8 56 push esi
000f9 e8 00 00 00 00 call _SerialGetNextWrite@20
; 154 :
; 155 : if (NewIrp) {
000fe 8b 45 fc mov eax, DWORD PTR _NewIrp$[ebp]
00101 85 c0 test eax, eax
00103 74 1d je SHORT $L14903
; 156 :
; 157 : ASSERT(NewIrp == Extension->CurrentWriteIrp);
00105 3b 06 cmp eax, DWORD PTR [esi]
00107 74 13 je SHORT $L14904
00109 6a 00 push 0
0010b 68 9d 00 00 00 push 157 ; 0000009dH
00110 68 00 00 00 00 push OFFSET FLAT:$SG14906
00115 68 00 00 00 00 push OFFSET FLAT:$SG14907
0011a ff d3 call ebx
$L14904:
; 158 : SerialStartWrite(Extension);
0011c 57 push edi
0011d e8 00 00 00 00 call _SerialStartWrite@4
$L14903:
00122 5f pop edi
00123 5e pop esi
; 159 :
; 160 : }
; 161 :
; 162 : return STATUS_SUCCESS;
00124 33 c0 xor eax, eax
00126 5b pop ebx
; 163 :
; 164 : }
00127 c9 leave
00128 c2 04 00 ret 4
_SerialStartFlush@4 ENDP
PAGESRP0 ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -