📄 write.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0
TITLE F:\W2DDK\src\kernel\serial\write.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
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _RtlConvertLongToLargeInteger@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialWrite@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialStartWrite@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGetNextWrite@20
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCompleteWrite@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialProcessEmptyTransmit@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGiveWriteToIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCancelCurrentWrite@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialWriteTimeout@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialGrabWriteFromIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGrabXoffFromIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCompleteXoff@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialTimeoutXoff@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialCancelCurrentXoff@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGiveXoffToIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
INCLUDELIB LIBC
INCLUDELIB OLDNAMES
PUBLIC _SerialWrite@8
PUBLIC _SerialStartWrite@4
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 _SerialGlobals:BYTE
EXTRN __imp_@IofCompleteRequest@8:NEAR
EXTRN _SerialStartOrQueue@20:NEAR
EXTRN _SerialCompleteIfError@8:NEAR
; COMDAT _SerialWrite@8
; File f:\w2ddk\src\kernel\serial\write.c
PAGESER SEGMENT
$SG14833 DB 'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
DB 00H
ORG $+1
$SG14836 DB 'f:\w2ddk\src\kernel\serial\write.c', 00H
ORG $+1
$SG14837 DB 'FALSE', 00H
ORG $+2
$SG14844 DB 'Entering SerialWrite', 0aH, 00H
ORG $+2
$SG14859 DB 'Leaving SerialWrite (1)', 0aH, 00H
ORG $+3
$SG14872 DB 'SERIAL: Dispatch entry for: %x', 0aH, 00H
$SG14887 DB 'Leaving SerialWrite (2)', 0aH, 00H
ORG $+3
$SG14902 DB 'Leaving SerialWrite (3)', 0aH, 00H
ORG $+3
$SG14917 DB 'SERIAL: Complete Irp: %x', 0aH, 00H
ORG $+2
$SG14930 DB 'Leaving SerialWrite (4)', 0aH, 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_SerialWrite@8 PROC NEAR ; COMDAT
; 100 : {
00125 55 push ebp
00126 8b ec mov ebp, esp
; 101 :
; 102 : PSERIAL_DEVICE_EXTENSION Extension = DeviceObject->DeviceExtension;
00128 8b 45 08 mov eax, DWORD PTR _DeviceObject$[ebp]
0012b 53 push ebx
0012c 56 push esi
; 103 : NTSTATUS status;
; 104 :
; 105 : SERIAL_LOCKED_PAGED_CODE();
0012d 8b 35 00 00 00
00 mov esi, DWORD PTR __imp__KeGetCurrentIrql@0
00133 57 push edi
00134 8b 78 28 mov edi, DWORD PTR [eax+40]
00137 ff d6 call esi
00139 3c 01 cmp al, 1
0013b 76 2f jbe SHORT $L14838
0013d 83 3d 14 00 00
00 00 cmp DWORD PTR _SerialGlobals+20, 0
00144 75 26 jne SHORT $L14838
00146 ff d6 call esi
00148 0f b6 c0 movzx eax, al
0014b 50 push eax
0014c 68 00 00 00 00 push OFFSET FLAT:$SG14833
00151 e8 00 00 00 00 call _DbgPrint
00156 59 pop ecx
00157 59 pop ecx
00158 6a 00 push 0
0015a 6a 69 push 105 ; 00000069H
0015c 68 00 00 00 00 push OFFSET FLAT:$SG14836
00161 68 00 00 00 00 push OFFSET FLAT:$SG14837
00166 ff 15 00 00 00
00 call DWORD PTR __imp__RtlAssert@16
$L14838:
; 106 :
; 107 : SerialDump(SERTRACECALLS, ("Entering SerialWrite\n"));
0016c f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
00173 74 0b je SHORT $L14839
00175 68 00 00 00 00 push OFFSET FLAT:$SG14844
0017a e8 00 00 00 00 call _DbgPrint
0017f 59 pop ecx
$L14839:
; 108 :
; 109 : if ((status = SerialIRPPrologue(Irp, Extension)) != STATUS_SUCCESS) {
00180 8b 75 0c mov esi, DWORD PTR _Irp$[ebp]
00183 57 push edi
00184 56 push esi
00185 e8 00 00 00 00 call _SerialIRPPrologue@8
0018a 8b d8 mov ebx, eax
0018c 85 db test ebx, ebx
0018e 74 2b je SHORT $L14866
; 110 : SerialCompleteRequest(Extension, Irp, IO_NO_INCREMENT);
00190 32 d2 xor dl, dl
00192 8b ce mov ecx, esi
00194 ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
0019a 57 push edi
0019b e8 00 00 00 00 call _SerialIRPEpilogue@4
; 111 : SerialDump(SERTRACECALLS, ("Leaving SerialWrite (1)\n"));
001a0 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
001a7 74 0b je SHORT $L14854
001a9 68 00 00 00 00 push OFFSET FLAT:$SG14859
001ae e8 00 00 00 00 call _DbgPrint
001b3 59 pop ecx
$L14854:
; 112 : return status;
001b4 8b c3 mov eax, ebx
001b6 e9 ba 00 00 00 jmp $L14909
$L14866:
; 113 : }
; 114 :
; 115 : SerialDump(
; 116 : SERIRPPATH,
; 117 : ("SERIAL: Dispatch entry for: %x\n",Irp)
; 118 : );
001bb f6 05 00 00 00
00 20 test BYTE PTR _SerialDebugLevel, 32 ; 00000020H
001c2 74 0d je SHORT $L14867
001c4 56 push esi
001c5 68 00 00 00 00 push OFFSET FLAT:$SG14872
001ca e8 00 00 00 00 call _DbgPrint
001cf 59 pop ecx
001d0 59 pop ecx
$L14867:
; 119 : if (SerialCompleteIfError(
; 120 : DeviceObject,
; 121 : Irp
; 122 : ) != STATUS_SUCCESS) {
001d1 56 push esi
001d2 ff 75 08 push DWORD PTR _DeviceObject$[ebp]
001d5 e8 00 00 00 00 call _SerialCompleteIfError@8
001da 85 c0 test eax, eax
001dc 74 1b je SHORT $L14880
; 123 :
; 124 : SerialDump(SERTRACECALLS, ("Leaving SerialWrite (2)\n"));
001de f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
001e5 74 0b je SHORT $L14882
001e7 68 00 00 00 00 push OFFSET FLAT:$SG14887
001ec e8 00 00 00 00 call _DbgPrint
001f1 59 pop ecx
$L14882:
; 125 :
; 126 : return STATUS_CANCELLED;
001f2 b8 20 01 00 c0 mov eax, -1073741536 ; c0000120H
001f7 eb 7c jmp SHORT $L14909
$L14880:
; 127 :
; 128 : }
; 129 :
; 130 : Irp->IoStatus.Information = 0L;
; 131 :
; 132 : //
; 133 : // Quick check for a zero length write. If it is zero length
; 134 : // then we are already done!
; 135 : //
; 136 :
; 137 : if (IoGetCurrentIrpStackLocation(Irp)->Parameters.Write.Length) {
001f9 8b 4e 60 mov ecx, DWORD PTR [esi+96]
001fc 33 c0 xor eax, eax
001fe 89 46 1c mov DWORD PTR [esi+28], eax
00201 39 41 04 cmp DWORD PTR [ecx+4], eax
00204 74 30 je SHORT $L14895
; 138 :
; 139 : //
; 140 : // Well it looks like we actually have to do some
; 141 : // work. Put the write on the queue so that we can
; 142 : // process it when our previous writes are done.
; 143 : //
; 144 :
; 145 :
; 146 : SerialDump(SERTRACECALLS, ("Leaving SerialWrite (3)\n"));
00206 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
0020d 74 0b je SHORT $L14897
0020f 68 00 00 00 00 push OFFSET FLAT:$SG14902
00214 e8 00 00 00 00 call _DbgPrint
00219 59 pop ecx
$L14897:
; 147 :
; 148 : return SerialStartOrQueue(
; 149 : Extension,
; 150 : Irp,
; 151 : &Extension->WriteQueue,
; 152 : &Extension->CurrentWriteIrp,
; 153 : SerialStartWrite
; 154 : );
0021a 8d 87 c8 00 00
00 lea eax, DWORD PTR [edi+200]
00220 68 00 00 00 00 push OFFSET FLAT:_SerialStartWrite@4
00225 50 push eax
00226 8d 87 ac 00 00
00 lea eax, DWORD PTR [edi+172]
0022c 50 push eax
0022d 56 push esi
0022e 57 push edi
0022f e8 00 00 00 00 call _SerialStartOrQueue@20
00234 eb 3f jmp SHORT $L14909
$L14895:
; 155 :
; 156 : } else {
; 157 :
; 158 : Irp->IoStatus.Status = STATUS_SUCCESS;
00236 89 46 18 mov DWORD PTR [esi+24], eax
; 159 : SerialDump(
; 160 : SERIRPPATH,
; 161 : ("SERIAL: Complete Irp: %x\n",Irp)
; 162 : );
00239 f6 05 00 00 00
00 20 test BYTE PTR _SerialDebugLevel, 32 ; 00000020H
00240 74 0d je SHORT $L14912
00242 56 push esi
00243 68 00 00 00 00 push OFFSET FLAT:$SG14917
00248 e8 00 00 00 00 call _DbgPrint
0024d 59 pop ecx
0024e 59 pop ecx
$L14912:
; 163 : SerialCompleteRequest(Extension, Irp, 0);
0024f 32 d2 xor dl, dl
00251 8b ce mov ecx, esi
00253 ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
00259 57 push edi
0025a e8 00 00 00 00 call _SerialIRPEpilogue@4
; 164 :
; 165 : SerialDump(SERTRACECALLS, ("Leaving SerialWrite (4)\n"));
0025f f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
00266 74 0b je SHORT $L14925
00268 68 00 00 00 00 push OFFSET FLAT:$SG14930
0026d e8 00 00 00 00 call _DbgPrint
00272 59 pop ecx
$L14925:
; 166 : return STATUS_SUCCESS;
00273 33 c0 xor eax, eax
$L14909:
00275 5f pop edi
00276 5e pop esi
00277 5b pop ebx
; 167 :
; 168 : }
; 169 :
; 170 : }
00278 5d pop ebp
00279 c2 08 00 ret 8
_SerialWrite@8 ENDP
PAGESER ENDS
PUBLIC _SerialGiveWriteToIsr@4
PUBLIC _SerialCancelCurrentWrite@8
PUBLIC _SerialGrabXoffFromIsr@4
PUBLIC _SerialGetNextWrite@20
EXTRN __imp__KeSynchronizeExecution@12:NEAR
EXTRN __imp_@InterlockedExchange@8:NEAR
EXTRN __imp_@KfAcquireSpinLock@4:NEAR
EXTRN __imp_@KfReleaseSpinLock@8:NEAR
EXTRN __allmul:NEAR
EXTRN __imp__IoAcquireCancelSpinLock@4:NEAR
EXTRN _SerialSetTimer@20:NEAR
EXTRN __imp__IoReleaseCancelSpinLock@4:NEAR
EXTRN _SerialTryToCompleteCurrent@44:NEAR
; COMDAT _SerialStartWrite@4
PAGESER SEGMENT
$SG14949 DB 'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
DB 00H
ORG $+1
$SG14952 DB 'f:\w2ddk\src\kernel\serial\write.c', 00H
ORG $+1
$SG14953 DB 'FALSE', 00H
ORG $+2
$SG14960 DB 'SERIAL: SerialStartWrite', 0aH, 00H
ORG $+2
$SG14981 DB 'f:\w2ddk\src\kernel\serial\write.c', 00H
ORG $+1
$SG14982 DB '!(*_arg4 & _refType)', 00H
ORG $+3
$SG15026 DB 'f:\w2ddk\src\kernel\serial\write.c', 00H
ORG $+1
$SG15027 DB '!(*_arg4 & _refType)', 00H
ORG $+3
$SG15037 DB 'f:\w2ddk\src\kernel\serial\write.c', 00H
ORG $+1
$SG15038 DB '!(*_arg4 & _refType)', 00H
; Function compile flags: /Ogs
_Extension$ = 8
_NewIrp$ = -16
_OldIrql$ = -5
_TotalTime$ = -24
_UseATimer$ = 11
_Timeouts$ = -44
_SetFirstStatus$ = -1
_FirstStatus$ = -12
_SerialStartWrite@4 PROC NEAR ; COMDAT
; 196 : {
00131 55 push ebp
00132 8b ec mov ebp, esp
00134 83 ec 2c sub esp, 44 ; 0000002cH
; 197 :
; 198 : PIRP NewIrp;
; 199 : KIRQL OldIrql;
; 200 : LARGE_INTEGER TotalTime;
; 201 : BOOLEAN UseATimer;
; 202 : SERIAL_TIMEOUTS Timeouts;
; 203 : BOOLEAN SetFirstStatus = FALSE;
00137 80 65 ff 00 and BYTE PTR _SetFirstStatus$[ebp], 0
0013b 53 push ebx
0013c 56 push esi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -