📄 utils.cod
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0
TITLE F:\W2DDK\src\kernel\serial\utils.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
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _RtlConvertLongToLargeInteger@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialKillAllReadsOrWrites@12
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialGetNextIrp@20
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialGetNextIrpLocked@24
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialTryToCompleteCurrent@44
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialRundownIrpRefs@16
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialStartOrQueue@20
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCancelQueued@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialCompleteIfError@8
PAGESER SEGMENT PARA USE32 PUBLIC ''
PAGESER ENDS
; COMDAT _SerialFilterCancelQueued@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialKillAllStalled@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialFilterIrps@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialUnstallIrps@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialIRPPrologue@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialIRPEpilogue@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialInsertQueueDpc@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialSetTimer@20
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialCancelTimer@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialDpcEpilogue@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialUnlockPages@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialIoCallDriver@12
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialPoCallDriver@12
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _SerialLogError@64
PAGESRP0 SEGMENT PARA USE32 PUBLIC ''
PAGESRP0 ENDS
; COMDAT _SerialMarkHardwareBroken@4
PAGESRP0 SEGMENT PARA USE32 PUBLIC ''
PAGESRP0 ENDS
; COMDAT _SerialSetDeviceFlags@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
INCLUDELIB LIBC
INCLUDELIB OLDNAMES
CONST SEGMENT
_SerialPhysicalZero DD 00H
ORG $+4
CONST ENDS
PUBLIC _SerialKillAllReadsOrWrites@12
EXTRN __imp__IoAcquireCancelSpinLock@4:NEAR
EXTRN __imp__IoReleaseCancelSpinLock@4:NEAR
; Function compile flags: /Ogsy
; File f:\w2ddk\src\kernel\serial\utils.c
; COMDAT _SerialKillAllReadsOrWrites@12
_TEXT SEGMENT
_DeviceObject$ = 8
_QueueToClean$ = 12
_CurrentOpIrp$ = 16
_cancelIrql$ = -4
_SerialKillAllReadsOrWrites@12 PROC NEAR ; COMDAT
; 79 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 51 push ecx
00004 56 push esi
; 80 :
; 81 : KIRQL cancelIrql;
; 82 : PDRIVER_CANCEL cancelRoutine;
; 83 :
; 84 : //
; 85 : // We acquire the cancel spin lock. This will prevent the
; 86 : // irps from moving around.
; 87 : //
; 88 :
; 89 : IoAcquireCancelSpinLock(&cancelIrql);
00005 8d 45 fc lea eax, DWORD PTR _cancelIrql$[ebp]
00008 57 push edi
00009 8b 3d 00 00 00
00 mov edi, DWORD PTR __imp__IoAcquireCancelSpinLock@4
0000f 50 push eax
00010 ff d7 call edi
; 90 :
; 91 : //
; 92 : // Clean the list from back to front.
; 93 : //
; 94 :
; 95 : while (!IsListEmpty(QueueToClean)) {
00012 8b 75 0c mov esi, DWORD PTR _QueueToClean$[ebp]
00015 eb 2d jmp SHORT $L15329
$L14786:
; 96 :
; 97 : PIRP currentLastIrp = CONTAINING_RECORD(
; 98 : QueueToClean->Blink,
; 99 : IRP,
; 100 : Tail.Overlay.ListEntry
; 101 : );
00017 8b 4e 04 mov ecx, DWORD PTR [esi+4]
; 102 :
; 103 : RemoveEntryList(QueueToClean->Blink);
0001a 8b 11 mov edx, DWORD PTR [ecx]
0001c 8d 41 a8 lea eax, DWORD PTR [ecx-88]
0001f 8b 49 04 mov ecx, DWORD PTR [ecx+4]
; 104 :
; 105 : cancelRoutine = currentLastIrp->CancelRoutine;
; 106 : currentLastIrp->CancelIrql = cancelIrql;
; 107 : currentLastIrp->CancelRoutine = NULL;
; 108 : currentLastIrp->Cancel = TRUE;
; 109 :
; 110 : cancelRoutine(
; 111 : DeviceObject,
; 112 : currentLastIrp
; 113 : );
00022 50 push eax
00023 ff 75 08 push DWORD PTR _DeviceObject$[ebp]
00026 89 11 mov DWORD PTR [ecx], edx
00028 89 4a 04 mov DWORD PTR [edx+4], ecx
0002b 8a 55 fc mov dl, BYTE PTR _cancelIrql$[ebp]
0002e 8b 48 38 mov ecx, DWORD PTR [eax+56]
00031 83 60 38 00 and DWORD PTR [eax+56], 0
00035 88 50 25 mov BYTE PTR [eax+37], dl
00038 c6 40 24 01 mov BYTE PTR [eax+36], 1
0003c ff d1 call ecx
; 114 :
; 115 : IoAcquireCancelSpinLock(&cancelIrql);
0003e 8d 45 fc lea eax, DWORD PTR _cancelIrql$[ebp]
00041 50 push eax
00042 ff d7 call edi
$L15329:
; 90 :
; 91 : //
; 92 : // Clean the list from back to front.
; 93 : //
; 94 :
; 95 : while (!IsListEmpty(QueueToClean)) {
00044 39 36 cmp DWORD PTR [esi], esi
00046 75 cf jne SHORT $L14786
; 116 :
; 117 : }
; 118 :
; 119 : //
; 120 : // The queue is clean. Now go after the current if
; 121 : // it's there.
; 122 : //
; 123 :
; 124 : if (*CurrentOpIrp) {
00048 8b 45 10 mov eax, DWORD PTR _CurrentOpIrp$[ebp]
0004b 5f pop edi
0004c 5e pop esi
0004d 8b 08 mov ecx, DWORD PTR [eax]
0004f 85 c9 test ecx, ecx
00051 74 24 je SHORT $L14796
; 125 :
; 126 :
; 127 : cancelRoutine = (*CurrentOpIrp)->CancelRoutine;
00053 8b 51 38 mov edx, DWORD PTR [ecx+56]
; 128 : (*CurrentOpIrp)->Cancel = TRUE;
00056 c6 41 24 01 mov BYTE PTR [ecx+36], 1
; 129 :
; 130 : //
; 131 : // If the current irp is not in a cancelable state
; 132 : // then it *will* try to enter one and the above
; 133 : // assignment will kill it. If it already is in
; 134 : // a cancelable state then the following will kill it.
; 135 : //
; 136 :
; 137 : if (cancelRoutine) {
0005a 85 d2 test edx, edx
0005c 74 19 je SHORT $L14796
; 138 :
; 139 : (*CurrentOpIrp)->CancelRoutine = NULL;
0005e 8b 08 mov ecx, DWORD PTR [eax]
00060 53 push ebx
00061 83 61 38 00 and DWORD PTR [ecx+56], 0
; 140 : (*CurrentOpIrp)->CancelIrql = cancelIrql;
00065 8b 08 mov ecx, DWORD PTR [eax]
00067 8a 5d fc mov bl, BYTE PTR _cancelIrql$[ebp]
0006a 88 59 25 mov BYTE PTR [ecx+37], bl
; 141 :
; 142 : //
; 143 : // This irp is already in a cancelable state. We simply
; 144 : // mark it as canceled and call the cancel routine for
; 145 : // it.
; 146 : //
; 147 :
; 148 : cancelRoutine(
; 149 : DeviceObject,
; 150 : *CurrentOpIrp
; 151 : );
0006d ff 30 push DWORD PTR [eax]
0006f ff 75 08 push DWORD PTR _DeviceObject$[ebp]
00072 ff d2 call edx
00074 5b pop ebx
; 152 :
; 153 : } else {
00075 eb 09 jmp SHORT $L14800
$L14796:
; 154 :
; 155 : IoReleaseCancelSpinLock(cancelIrql);
; 156 :
; 157 : }
; 158 :
; 159 : } else {
; 160 :
; 161 : IoReleaseCancelSpinLock(cancelIrql);
00077 ff 75 fc push DWORD PTR _cancelIrql$[ebp]
0007a ff 15 00 00 00
00 call DWORD PTR __imp__IoReleaseCancelSpinLock@4
$L14800:
; 162 :
; 163 : }
; 164 :
; 165 : }
00080 c9 leave
00081 c2 0c 00 ret 12 ; 0000000cH
_SerialKillAllReadsOrWrites@12 ENDP
_TEXT ENDS
PUBLIC _SerialGetNextIrp@20
PUBLIC _SerialGetNextIrpLocked@24
; Function compile flags: /Ogsy
; COMDAT _SerialGetNextIrp@20
PAGESER SEGMENT
_CurrentOpIrp$ = 8
_QueueToProcess$ = 12
_NextIrp$ = 16
_CompleteCurrent$ = 20
_extension$ = 24
_oldIrql$ = -4
_SerialGetNextIrp@20 PROC NEAR ; COMDAT
; 211 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 51 push ecx
; 212 :
; 213 : KIRQL oldIrql;
; 214 : SERIAL_LOCKED_PAGED_CODE();
; 215 :
; 216 :
; 217 : IoAcquireCancelSpinLock(&oldIrql);
00004 8d 45 fc lea eax, DWORD PTR _oldIrql$[ebp]
00007 50 push eax
00008 ff 15 00 00 00
00 call DWORD PTR __imp__IoAcquireCancelSpinLock@4
; 218 : SerialGetNextIrpLocked(CurrentOpIrp, QueueToProcess, NextIrp,
; 219 : CompleteCurrent, extension, oldIrql);
0000e ff 75 fc push DWORD PTR _oldIrql$[ebp]
00011 ff 75 18 push DWORD PTR _extension$[ebp]
00014 ff 75 14 push DWORD PTR _CompleteCurrent$[ebp]
00017 ff 75 10 push DWORD PTR _NextIrp$[ebp]
0001a ff 75 0c push DWORD PTR _QueueToProcess$[ebp]
0001d ff 75 08 push DWORD PTR _CurrentOpIrp$[ebp]
00020 e8 00 00 00 00 call _SerialGetNextIrpLocked@24
; 220 : }
00025 c9 leave
00026 c2 14 00 ret 20 ; 00000014H
_SerialGetNextIrp@20 ENDP
PAGESER ENDS
PUBLIC _SerialIRPEpilogue@4
EXTRN __imp_@InterlockedExchange@8:NEAR
EXTRN __imp_@IofCompleteRequest@8:NEAR
; Function compile flags: /Ogsy
; COMDAT _SerialGetNextIrpLocked@24
PAGESER SEGMENT
_CurrentOpIrp$ = 8
_QueueToProcess$ = 12
_NextIrp$ = 16
_CompleteCurrent$ = 20
_extension$ = 24
_OldIrql$ = 28
_SerialGetNextIrpLocked@24 PROC NEAR ; COMDAT
; 272 : {
00000 55 push ebp
00001 8b ec mov ebp, esp
; 273 :
; 274 : PIRP oldIrp;
; 275 :
; 276 : SERIAL_LOCKED_PAGED_CODE();
; 277 :
; 278 :
; 279 : oldIrp = *CurrentOpIrp;
; 280 :
; 281 : #if DBG
; 282 : if (oldIrp) {
; 283 :
; 284 : if (CompleteCurrent) {
; 285 :
; 286 : ASSERT(!oldIrp->CancelRoutine);
; 287 :
; 288 : }
; 289 :
; 290 : }
; 291 : #endif
; 292 :
; 293 : //
; 294 : // Check to see if there is a new irp to start up.
; 295 : //
; 296 :
; 297 : if (!IsListEmpty(QueueToProcess)) {
00003 8b 4d 0c mov ecx, DWORD PTR _QueueToProcess$[ebp]
00006 56 push esi
00007 8b 75 08 mov esi, DWORD PTR _CurrentOpIrp$[ebp]
0000a 57 push edi
0000b 8b 01 mov eax, DWORD PTR [ecx]
0000d 8b 3e mov edi, DWORD PTR [esi]
0000f 3b c1 cmp eax, ecx
00011 74 1c je SHORT $L14827
; 298 :
; 299 : PLIST_ENTRY headOfList;
; 300 :
; 301 : headOfList = RemoveHeadList(QueueToProcess);
00013 8b 50 04 mov edx, DWORD PTR [eax+4]
00016 8b 08 mov ecx, DWORD PTR [eax]
; 302 :
; 303 : *CurrentOpIrp = CONTAINING_RECORD(
; 304 : headOfList,
; 305 : IRP,
; 306 : Tail.Overlay.ListEntry
; 307 : );
00018 83 c0 a8 add eax, -88 ; ffffffa8H
0001b 89 0a mov DWORD PTR [edx], ecx
0001d 89 51 04 mov DWORD PTR [ecx+4], edx
; 308 :
; 309 : IoSetCancelRoutine(
; 310 : *CurrentOpIrp,
; 311 : NULL
; 312 : );
00020 8d 48 38 lea ecx, DWORD PTR [eax+56]
00023 33 d2 xor edx, edx
00025 89 06 mov DWORD PTR [esi], eax
00027 ff 15 00 00 00
00 call DWORD PTR __imp_@InterlockedExchange@8
; 313 :
; 314 : } else {
0002d eb 03 jmp SHORT $L14842
$L14827:
; 315 :
; 316 : *CurrentOpIrp = NULL;
0002f 83 26 00 and DWORD PTR [esi], 0
$L14842:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -