📄 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 _SerialIRPPrologue@8:NEAR
EXTRN _SerialIRPEpilogue@4:NEAR
EXTRN __imp_@IofCompleteRequest@8:NEAR
EXTRN _SerialStartOrQueue@20:NEAR
EXTRN _SerialCompleteIfError@8:NEAR
; Function compile flags: /Ogsy
; File f:\w2ddk\src\kernel\serial\flush.c
; COMDAT _SerialFlush@8
PAGESRP0 SEGMENT
_DeviceObject$ = 8
_Irp$ = 12
_SerialFlush@8 PROC NEAR ; COMDAT
; 68 :
; 69 : PSERIAL_DEVICE_EXTENSION Extension = DeviceObject->DeviceExtension;
00000 8b 44 24 04 mov eax, DWORD PTR _DeviceObject$[esp-4]
00004 53 push ebx
00005 56 push esi
; 70 : NTSTATUS status;
; 71 : PAGED_CODE();
; 72 :
; 73 : SerialDump(
; 74 : SERIRPPATH,
; 75 : ("SERIAL: Dispatch entry for: %x\n",Irp)
; 76 : );
; 77 :
; 78 : SerialDump(SERTRACECALLS, ("SERIAL: Entering SerialFlush\n"));
; 79 :
; 80 :
; 81 :
; 82 : Irp->IoStatus.Information = 0L;
00006 8b 74 24 10 mov esi, DWORD PTR _Irp$[esp+4]
0000a 57 push edi
0000b 8b 78 28 mov edi, DWORD PTR [eax+40]
0000e 83 66 1c 00 and DWORD PTR [esi+28], 0
; 83 :
; 84 : if ((status = SerialIRPPrologue(Irp, Extension)) == STATUS_SUCCESS) {
00012 57 push edi
00013 56 push esi
00014 e8 00 00 00 00 call _SerialIRPPrologue@8
00019 8b d8 mov ebx, eax
0001b 85 db test ebx, ebx
0001d 75 31 jne SHORT $L14782
; 85 :
; 86 : if (SerialCompleteIfError(DeviceObject, Irp) != STATUS_SUCCESS) {
0001f 56 push esi
00020 ff 74 24 14 push DWORD PTR _DeviceObject$[esp+12]
00024 e8 00 00 00 00 call _SerialCompleteIfError@8
00029 85 c0 test eax, eax
0002b 74 07 je SHORT $L14789
; 87 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (1)\n"));
; 88 :
; 89 : return STATUS_CANCELLED;
0002d b8 20 01 00 c0 mov eax, -1073741536 ; c0000120H
00032 eb 35 jmp SHORT $L14792
$L14789:
; 90 :
; 91 : }
; 92 :
; 93 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (2)\n"));
; 94 :
; 95 : return SerialStartOrQueue(Extension, Irp, &Extension->WriteQueue,
; 96 : &Extension->CurrentWriteIrp, SerialStartFlush);
00034 8d 87 c8 00 00
00 lea eax, DWORD PTR [edi+200]
0003a 68 00 00 00 00 push OFFSET FLAT:_SerialStartFlush@4
0003f 50 push eax
00040 8d 87 ac 00 00
00 lea eax, DWORD PTR [edi+172]
00046 50 push eax
00047 56 push esi
00048 57 push edi
00049 e8 00 00 00 00 call _SerialStartOrQueue@20
0004e eb 19 jmp SHORT $L14792
$L14782:
; 97 :
; 98 : } else {
; 99 : Irp->IoStatus.Status = status;
; 100 :
; 101 : if (!NT_SUCCESS(status)) {
00050 85 db test ebx, ebx
00052 89 5e 18 mov DWORD PTR [esi+24], ebx
00055 7d 10 jge SHORT $L14795
; 102 : SerialCompleteRequest(Extension, Irp, IO_NO_INCREMENT);
00057 32 d2 xor dl, dl
00059 8b ce mov ecx, esi
0005b ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
00061 57 push edi
00062 e8 00 00 00 00 call _SerialIRPEpilogue@4
$L14795:
; 103 : }
; 104 :
; 105 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (3)\n"));
; 106 : return status;
00067 8b c3 mov eax, ebx
$L14792:
00069 5f pop edi
0006a 5e pop esi
0006b 5b pop ebx
; 107 : }
; 108 : }
0006c c2 08 00 ret 8
_SerialFlush@8 ENDP
PAGESRP0 ENDS
EXTRN _SerialStartWrite@4:NEAR
EXTRN _SerialGetNextWrite@20:NEAR
; Function compile flags: /Ogsy
; COMDAT _SerialStartFlush@4
PAGESRP0 SEGMENT
_Extension$ = 8
_NewIrp$ = 8
_SerialStartFlush@4 PROC NEAR ; COMDAT
; 136 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 56 push esi
; 137 :
; 138 : PIRP NewIrp;
; 139 : PAGED_CODE();
; 140 :
; 141 : Extension->CurrentWriteIrp->IoStatus.Status = STATUS_SUCCESS;
00004 8b 75 08 mov esi, 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 : );
00007 56 push esi
00008 6a 01 push 1
0000a 8d 86 c8 00 00
00 lea eax, DWORD PTR [esi+200]
00010 8b 08 mov ecx, DWORD PTR [eax]
00012 83 61 18 00 and DWORD PTR [ecx+24], 0
00016 8d 4d 08 lea ecx, DWORD PTR _NewIrp$[ebp]
00019 51 push ecx
0001a 8d 8e ac 00 00
00 lea ecx, DWORD PTR [esi+172]
00020 51 push ecx
00021 50 push eax
00022 e8 00 00 00 00 call _SerialGetNextWrite@20
; 154 :
; 155 : if (NewIrp) {
00027 83 7d 08 00 cmp DWORD PTR _NewIrp$[ebp], 0
0002b 74 06 je SHORT $L14803
; 156 :
; 157 : ASSERT(NewIrp == Extension->CurrentWriteIrp);
; 158 : SerialStartWrite(Extension);
0002d 56 push esi
0002e e8 00 00 00 00 call _SerialStartWrite@4
$L14803:
; 159 :
; 160 : }
; 161 :
; 162 : return STATUS_SUCCESS;
00033 33 c0 xor eax, eax
00035 5e pop esi
; 163 :
; 164 : }
00036 5d pop ebp
00037 c2 04 00 ret 4
_SerialStartFlush@4 ENDP
PAGESRP0 ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -