⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 COD
📖 第 1 页 / 共 5 页
字号:
; 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 + -