📄 read.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0
TITLE F:\W2DDK\src\kernel\serial\read.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 _SerialRead@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialStartRead@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCompleteRead@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialCancelCurrentRead@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGrabReadFromIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialReadTimeout@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialUpdateReadByIsr@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialIntervalReadTimeout@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialGetCharsFromIntBuffer@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialUpdateInterruptBuffer@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialUpdateAndSwitchToUser@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialResizeBuffer@4
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialMoveToNewIntBuffer@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialUpdateAndSwitchToNew@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 _SerialRead@8
PUBLIC _SerialStartRead@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 _SerialRead@8
; File f:\w2ddk\src\kernel\serial\read.c
PAGESER SEGMENT
$SG14843 DB 'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
DB 00H
ORG $+1
$SG14846 DB 'f:\w2ddk\src\kernel\serial\read.c', 00H
ORG $+2
$SG14847 DB 'FALSE', 00H
ORG $+2
$SG14854 DB 'SERIAL: Entering SerialRead', 0aH, 00H
ORG $+3
$SG14869 DB 'SERIAL: Leaving SerialRead (1)', 0aH, 00H
$SG14882 DB 'SERIAL: Dispatch entry for: %x', 0aH, 00H
$SG14897 DB 'SERIAL: Leaving SerialRead (2)', 0aH, 00H
$SG14912 DB 'SERIAL: Leaving SerialRead (3)', 0aH, 00H
$SG14927 DB 'SERIAL: Complete Irp: %x', 0aH, 00H
ORG $+2
$SG14940 DB 'SERIAL: Leaving SerialRead (4)', 0aH, 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_SerialRead@8 PROC NEAR ; COMDAT
; 117 : {
00140 55 push ebp
00141 8b ec mov ebp, esp
; 118 :
; 119 : PSERIAL_DEVICE_EXTENSION extension = DeviceObject->DeviceExtension;
00143 8b 45 08 mov eax, DWORD PTR _DeviceObject$[ebp]
00146 53 push ebx
00147 56 push esi
; 120 : BOOLEAN acceptingIRPs;
; 121 : NTSTATUS status;
; 122 :
; 123 : SERIAL_LOCKED_PAGED_CODE();
00148 8b 35 00 00 00
00 mov esi, DWORD PTR __imp__KeGetCurrentIrql@0
0014e 57 push edi
0014f 8b 78 28 mov edi, DWORD PTR [eax+40]
00152 ff d6 call esi
00154 3c 01 cmp al, 1
00156 76 2f jbe SHORT $L14848
00158 83 3d 14 00 00
00 00 cmp DWORD PTR _SerialGlobals+20, 0
0015f 75 26 jne SHORT $L14848
00161 ff d6 call esi
00163 0f b6 c0 movzx eax, al
00166 50 push eax
00167 68 00 00 00 00 push OFFSET FLAT:$SG14843
0016c e8 00 00 00 00 call _DbgPrint
00171 59 pop ecx
00172 59 pop ecx
00173 6a 00 push 0
00175 6a 7b push 123 ; 0000007bH
00177 68 00 00 00 00 push OFFSET FLAT:$SG14846
0017c 68 00 00 00 00 push OFFSET FLAT:$SG14847
00181 ff 15 00 00 00
00 call DWORD PTR __imp__RtlAssert@16
$L14848:
; 124 :
; 125 : SerialDump(SERTRACECALLS, ("SERIAL: Entering SerialRead\n"));
00187 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
0018e 74 0b je SHORT $L14849
00190 68 00 00 00 00 push OFFSET FLAT:$SG14854
00195 e8 00 00 00 00 call _DbgPrint
0019a 59 pop ecx
$L14849:
; 126 :
; 127 : if ((status = SerialIRPPrologue(Irp, extension)) != STATUS_SUCCESS) {
0019b 8b 75 0c mov esi, DWORD PTR _Irp$[ebp]
0019e 57 push edi
0019f 56 push esi
001a0 e8 00 00 00 00 call _SerialIRPPrologue@8
001a5 8b d8 mov ebx, eax
001a7 85 db test ebx, ebx
001a9 74 2b je SHORT $L14876
; 128 : SerialCompleteRequest(extension, Irp, IO_NO_INCREMENT);
001ab 32 d2 xor dl, dl
001ad 8b ce mov ecx, esi
001af ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
001b5 57 push edi
001b6 e8 00 00 00 00 call _SerialIRPEpilogue@4
; 129 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialRead (1)\n"));
001bb f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
001c2 74 0b je SHORT $L14864
001c4 68 00 00 00 00 push OFFSET FLAT:$SG14869
001c9 e8 00 00 00 00 call _DbgPrint
001ce 59 pop ecx
$L14864:
; 130 : return status;
001cf 8b c3 mov eax, ebx
001d1 e9 ba 00 00 00 jmp $L14919
$L14876:
; 131 : }
; 132 :
; 133 : SerialDump(
; 134 : SERIRPPATH,
; 135 : ("SERIAL: Dispatch entry for: %x\n",Irp)
; 136 : );
001d6 f6 05 00 00 00
00 20 test BYTE PTR _SerialDebugLevel, 32 ; 00000020H
001dd 74 0d je SHORT $L14877
001df 56 push esi
001e0 68 00 00 00 00 push OFFSET FLAT:$SG14882
001e5 e8 00 00 00 00 call _DbgPrint
001ea 59 pop ecx
001eb 59 pop ecx
$L14877:
; 137 : if (SerialCompleteIfError(
; 138 : DeviceObject,
; 139 : Irp
; 140 : ) != STATUS_SUCCESS) {
001ec 56 push esi
001ed ff 75 08 push DWORD PTR _DeviceObject$[ebp]
001f0 e8 00 00 00 00 call _SerialCompleteIfError@8
001f5 85 c0 test eax, eax
001f7 74 1b je SHORT $L14890
; 141 :
; 142 :
; 143 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialRead (2)\n"));
001f9 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
00200 74 0b je SHORT $L14892
00202 68 00 00 00 00 push OFFSET FLAT:$SG14897
00207 e8 00 00 00 00 call _DbgPrint
0020c 59 pop ecx
$L14892:
; 144 :
; 145 : return STATUS_CANCELLED;
0020d b8 20 01 00 c0 mov eax, -1073741536 ; c0000120H
00212 eb 7c jmp SHORT $L14919
$L14890:
; 146 :
; 147 : }
; 148 :
; 149 : Irp->IoStatus.Information = 0L;
; 150 :
; 151 : //
; 152 : // Quick check for a zero length read. If it is zero length
; 153 : // then we are already done!
; 154 : //
; 155 :
; 156 : if (IoGetCurrentIrpStackLocation(Irp)->Parameters.Read.Length) {
00214 8b 4e 60 mov ecx, DWORD PTR [esi+96]
00217 33 c0 xor eax, eax
00219 89 46 1c mov DWORD PTR [esi+28], eax
0021c 39 41 04 cmp DWORD PTR [ecx+4], eax
0021f 74 30 je SHORT $L14905
; 157 :
; 158 : //
; 159 : // Well it looks like we actually have to do some
; 160 : // work. Put the read on the queue so that we can
; 161 : // process it when our previous reads are done.
; 162 : //
; 163 :
; 164 :
; 165 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialRead (3)\n"));
00221 f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
00228 74 0b je SHORT $L14907
0022a 68 00 00 00 00 push OFFSET FLAT:$SG14912
0022f e8 00 00 00 00 call _DbgPrint
00234 59 pop ecx
$L14907:
; 166 : return SerialStartOrQueue(
; 167 : extension,
; 168 : Irp,
; 169 : &extension->ReadQueue,
; 170 : &extension->CurrentReadIrp,
; 171 : SerialStartRead
; 172 : );
00235 8d 87 c4 00 00
00 lea eax, DWORD PTR [edi+196]
0023b 68 00 00 00 00 push OFFSET FLAT:_SerialStartRead@4
00240 50 push eax
00241 8d 87 a4 00 00
00 lea eax, DWORD PTR [edi+164]
00247 50 push eax
00248 56 push esi
00249 57 push edi
0024a e8 00 00 00 00 call _SerialStartOrQueue@20
0024f eb 3f jmp SHORT $L14919
$L14905:
; 173 :
; 174 : } else {
; 175 :
; 176 : Irp->IoStatus.Status = STATUS_SUCCESS;
00251 89 46 18 mov DWORD PTR [esi+24], eax
; 177 : SerialDump(
; 178 : SERIRPPATH,
; 179 : ("SERIAL: Complete Irp: %x\n",Irp)
; 180 : );
00254 f6 05 00 00 00
00 20 test BYTE PTR _SerialDebugLevel, 32 ; 00000020H
0025b 74 0d je SHORT $L14922
0025d 56 push esi
0025e 68 00 00 00 00 push OFFSET FLAT:$SG14927
00263 e8 00 00 00 00 call _DbgPrint
00268 59 pop ecx
00269 59 pop ecx
$L14922:
; 181 : SerialCompleteRequest(extension, Irp, 0);
0026a 32 d2 xor dl, dl
0026c 8b ce mov ecx, esi
0026e ff 15 00 00 00
00 call DWORD PTR __imp_@IofCompleteRequest@8
00274 57 push edi
00275 e8 00 00 00 00 call _SerialIRPEpilogue@4
; 182 :
; 183 :
; 184 : SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialRead (4)\n"));
0027a f6 05 00 00 00
00 40 test BYTE PTR _SerialDebugLevel, 64 ; 00000040H
00281 74 0b je SHORT $L14935
00283 68 00 00 00 00 push OFFSET FLAT:$SG14940
00288 e8 00 00 00 00 call _DbgPrint
0028d 59 pop ecx
$L14935:
; 185 :
; 186 : return STATUS_SUCCESS;
0028e 33 c0 xor eax, eax
$L14919:
00290 5f pop edi
00291 5e pop esi
00292 5b pop ebx
; 187 :
; 188 : }
; 189 :
; 190 : }
00293 5d pop ebp
00294 c2 08 00 ret 8
_SerialRead@8 ENDP
PAGESER ENDS
PUBLIC _SerialGetCharsFromIntBuffer@4
PUBLIC _SerialUpdateInterruptBuffer@4
PUBLIC _SerialUpdateAndSwitchToUser@4
PUBLIC _SerialResizeBuffer@4
EXTRN __imp__KeSynchronizeExecution@12:NEAR
EXTRN __allmul:NEAR
EXTRN __imp_@KfAcquireSpinLock@4:NEAR
EXTRN __imp_@KfReleaseSpinLock@8:NEAR
EXTRN __imp__KeQuerySystemTime@4:NEAR
EXTRN __imp__IoAcquireCancelSpinLock@4:NEAR
EXTRN _SerialSetTimer@20:NEAR
EXTRN _SerialCancelTimer@8:NEAR
EXTRN _SerialGetNextIrp@20:NEAR
EXTRN __imp__IoReleaseCancelSpinLock@4:NEAR
; COMDAT _SerialStartRead@4
PAGESER SEGMENT
$SG14967 DB 'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
DB 00H
ORG $+1
$SG14970 DB 'f:\w2ddk\src\kernel\serial\read.c', 00H
ORG $+2
$SG14971 DB 'FALSE', 00H
ORG $+2
$SG14978 DB 'SERIAL: SerialStartRead', 0aH, 00H
ORG $+3
$SG15036 DB 'f:\w2ddk\src\kernel\serial\read.c', 00H
ORG $+6
$SG15037 DB '(!Extension->CurrentReadIrp->IoStatus.Information) && (E'
DB 'xtension->NumberNeededForRead == IoGetCurrentIrpStackLocation'
DB '( Extension->CurrentReadIrp )->Parameters.Read.Length)', 00H
$SG15048 DB 'f:\w2ddk\src\kernel\serial\read.c', 00H
ORG $+2
$SG15049 DB '!(*_arg4 & _refType)', 00H
ORG $+3
$SG15059 DB 'f:\w2ddk\src\kernel\serial\read.c', 00H
ORG $+2
$SG15060 DB '!(*_arg4 & _refType)', 00H
; Function compile flags: /Ogs
_Extension$ = 8
_updateChar$ = -40
_newIrp$ = -20
_oldIrql$ = -16
_controlIrql$ = -2
_returnWithWhatsPresent$ = -4
_os2ssreturn$ = -3
_crunchDownToOne$ = -5
_useTotalTimer$ = 11
_useIntervalTimer$ = -6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -