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

📄 flush.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 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	_SerialDebugLevel:DWORD
EXTRN	__imp__KeGetCurrentIrql@0:NEAR
EXTRN	__imp__RtlAssert@16:NEAR
EXTRN	_SerialIRPPrologue@8:NEAR
EXTRN	_SerialIRPEpilogue@4:NEAR
EXTRN	_DbgPrint:NEAR
EXTRN	__imp_@IofCompleteRequest@8:NEAR
EXTRN	_SerialStartOrQueue@20:NEAR
EXTRN	_SerialCompleteIfError@8:NEAR
;	COMDAT _SerialFlush@8
; File f:\w2ddk\src\kernel\serial\flush.c
PAGESRP0	SEGMENT
$SG14814 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG14817 DB	'f:\w2ddk\src\kernel\serial\flush.c', 00H
	ORG $+1
$SG14818 DB	'FALSE', 00H
	ORG $+2
$SG14825 DB	'SERIAL: Dispatch entry for: %x', 0aH, 00H
$SG14838 DB	'SERIAL: Entering SerialFlush', 0aH, 00H
	ORG $+2
$SG14855 DB	'SERIAL: Leaving SerialFlush (1)', 0aH, 00H
	ORG $+3
$SG14869 DB	'SERIAL: Leaving SerialFlush (2)', 0aH, 00H
	ORG $+3
$SG14885 DB	'SERIAL: Leaving SerialFlush (3)', 0aH, 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_SerialFlush@8 PROC NEAR				; COMDAT

; 67   : {

  000fd	55		 push	 ebp
  000fe	8b ec		 mov	 ebp, esp

; 68   : 
; 69   :     PSERIAL_DEVICE_EXTENSION Extension = DeviceObject->DeviceExtension;

  00100	8b 45 08	 mov	 eax, DWORD PTR _DeviceObject$[ebp]
  00103	53		 push	 ebx
  00104	56		 push	 esi

; 70   :     NTSTATUS status;
; 71   :     PAGED_CODE();

  00105	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  0010b	8b 58 28	 mov	 ebx, DWORD PTR [eax+40]
  0010e	57		 push	 edi
  0010f	ff d6		 call	 esi
  00111	3c 01		 cmp	 al, 1
  00113	76 26		 jbe	 SHORT $L14819
  00115	ff d6		 call	 esi
  00117	0f b6 c0	 movzx	 eax, al
  0011a	50		 push	 eax
  0011b	68 00 00 00 00	 push	 OFFSET FLAT:$SG14814
  00120	e8 00 00 00 00	 call	 _DbgPrint
  00125	59		 pop	 ecx
  00126	59		 pop	 ecx
  00127	6a 00		 push	 0
  00129	6a 47		 push	 71			; 00000047H
  0012b	68 00 00 00 00	 push	 OFFSET FLAT:$SG14817
  00130	68 00 00 00 00	 push	 OFFSET FLAT:$SG14818
  00135	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
$L14819:

; 72   : 
; 73   :     SerialDump(
; 74   :         SERIRPPATH,
; 75   :         ("SERIAL: Dispatch entry for: %x\n",Irp)
; 76   :         );

  0013b	f6 05 00 00 00
	00 20		 test	 BYTE PTR _SerialDebugLevel, 32 ; 00000020H
  00142	8b 75 0c	 mov	 esi, DWORD PTR _Irp$[ebp]
  00145	74 0d		 je	 SHORT $L14820
  00147	56		 push	 esi
  00148	68 00 00 00 00	 push	 OFFSET FLAT:$SG14825
  0014d	e8 00 00 00 00	 call	 _DbgPrint
  00152	59		 pop	 ecx
  00153	59		 pop	 ecx
$L14820:

; 77   : 
; 78   :     SerialDump(SERTRACECALLS, ("SERIAL: Entering SerialFlush\n"));

  00154	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  0015b	74 0b		 je	 SHORT $L14833
  0015d	68 00 00 00 00	 push	 OFFSET FLAT:$SG14838
  00162	e8 00 00 00 00	 call	 _DbgPrint
  00167	59		 pop	 ecx
$L14833:

; 79   : 
; 80   :     
; 81   : 
; 82   :     Irp->IoStatus.Information = 0L;

  00168	83 66 1c 00	 and	 DWORD PTR [esi+28], 0

; 83   : 
; 84   :     if ((status = SerialIRPPrologue(Irp, Extension)) == STATUS_SUCCESS) {

  0016c	53		 push	 ebx
  0016d	56		 push	 esi
  0016e	e8 00 00 00 00	 call	 _SerialIRPPrologue@8
  00173	8b f8		 mov	 edi, eax
  00175	85 ff		 test	 edi, edi
  00177	75 58		 jne	 SHORT $L14846

; 85   : 
; 86   :        if (SerialCompleteIfError(DeviceObject, Irp) != STATUS_SUCCESS) {

  00179	56		 push	 esi
  0017a	ff 75 08	 push	 DWORD PTR _DeviceObject$[ebp]
  0017d	e8 00 00 00 00	 call	 _SerialCompleteIfError@8
  00182	85 c0		 test	 eax, eax
  00184	74 1b		 je	 SHORT $L14863

; 87   :           SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (1)\n"));

  00186	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  0018d	74 0b		 je	 SHORT $L14850
  0018f	68 00 00 00 00	 push	 OFFSET FLAT:$SG14855
  00194	e8 00 00 00 00	 call	 _DbgPrint
  00199	59		 pop	 ecx
$L14850:

; 88   : 
; 89   :           return STATUS_CANCELLED;

  0019a	b8 20 01 00 c0	 mov	 eax, -1073741536	; c0000120H
  0019f	eb 5d		 jmp	 SHORT $L14876
$L14863:

; 90   : 
; 91   :        }
; 92   : 
; 93   :        SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (2)\n"));

  001a1	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  001a8	74 0b		 je	 SHORT $L14864
  001aa	68 00 00 00 00	 push	 OFFSET FLAT:$SG14869
  001af	e8 00 00 00 00	 call	 _DbgPrint
  001b4	59		 pop	 ecx
$L14864:

; 94   : 
; 95   :        return SerialStartOrQueue(Extension, Irp, &Extension->WriteQueue,
; 96   :                &Extension->CurrentWriteIrp, SerialStartFlush);

  001b5	8d 83 c8 00 00
	00		 lea	 eax, DWORD PTR [ebx+200]
  001bb	68 00 00 00 00	 push	 OFFSET FLAT:_SerialStartFlush@4
  001c0	50		 push	 eax
  001c1	8d 83 ac 00 00
	00		 lea	 eax, DWORD PTR [ebx+172]
  001c7	50		 push	 eax
  001c8	56		 push	 esi
  001c9	53		 push	 ebx
  001ca	e8 00 00 00 00	 call	 _SerialStartOrQueue@20
  001cf	eb 2d		 jmp	 SHORT $L14876
$L14846:

; 97   : 
; 98   :     } else {
; 99   :        Irp->IoStatus.Status = status;
; 100  : 
; 101  :        if (!NT_SUCCESS(status)) {

  001d1	85 ff		 test	 edi, edi
  001d3	89 7e 18	 mov	 DWORD PTR [esi+24], edi
  001d6	7d 10		 jge	 SHORT $L14879

; 102  :           SerialCompleteRequest(Extension, Irp, IO_NO_INCREMENT);

  001d8	32 d2		 xor	 dl, dl
  001da	8b ce		 mov	 ecx, esi
  001dc	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8
  001e2	53		 push	 ebx
  001e3	e8 00 00 00 00	 call	 _SerialIRPEpilogue@4
$L14879:

; 103  :        }
; 104  : 
; 105  :        SerialDump(SERTRACECALLS, ("SERIAL: Leaving SerialFlush (3)\n"));

  001e8	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  001ef	74 0b		 je	 SHORT $L14880
  001f1	68 00 00 00 00	 push	 OFFSET FLAT:$SG14885
  001f6	e8 00 00 00 00	 call	 _DbgPrint
  001fb	59		 pop	 ecx
$L14880:

; 106  :        return status;

  001fc	8b c7		 mov	 eax, edi
$L14876:
  001fe	5f		 pop	 edi
  001ff	5e		 pop	 esi
  00200	5b		 pop	 ebx

; 107  :     }
; 108  : }

  00201	5d		 pop	 ebp
  00202	c2 08 00	 ret	 8
_SerialFlush@8 ENDP
PAGESRP0	ENDS
EXTRN	_SerialStartWrite@4:NEAR
EXTRN	_SerialGetNextWrite@20:NEAR
;	COMDAT _SerialStartFlush@4
PAGESRP0	SEGMENT
$SG14897 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG14900 DB	'f:\w2ddk\src\kernel\serial\flush.c', 00H
	ORG $+1
$SG14901 DB	'FALSE', 00H
	ORG $+2
$SG14906 DB	'f:\w2ddk\src\kernel\serial\flush.c', 00H
	ORG $+1
$SG14907 DB	'NewIrp == Extension->CurrentWriteIrp', 00H
; Function compile flags: /Ogs
_Extension$ = 8
_NewIrp$ = -4
_SerialStartFlush@4 PROC NEAR				; COMDAT

; 136  : {

  0009d	55		 push	 ebp
  0009e	8b ec		 mov	 ebp, esp
  000a0	51		 push	 ecx
  000a1	53		 push	 ebx
  000a2	56		 push	 esi

; 137  : 
; 138  :     PIRP NewIrp;
; 139  :     PAGED_CODE();

  000a3	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  000a9	57		 push	 edi
  000aa	ff d6		 call	 esi
  000ac	8b 1d 00 00 00
	00		 mov	 ebx, DWORD PTR __imp__RtlAssert@16
  000b2	3c 01		 cmp	 al, 1
  000b4	76 25		 jbe	 SHORT $L14898
  000b6	ff d6		 call	 esi
  000b8	0f b6 c0	 movzx	 eax, al
  000bb	50		 push	 eax
  000bc	68 00 00 00 00	 push	 OFFSET FLAT:$SG14897
  000c1	e8 00 00 00 00	 call	 _DbgPrint
  000c6	59		 pop	 ecx
  000c7	59		 pop	 ecx
  000c8	6a 00		 push	 0
  000ca	68 8b 00 00 00	 push	 139			; 0000008bH
  000cf	68 00 00 00 00	 push	 OFFSET FLAT:$SG14900
  000d4	68 00 00 00 00	 push	 OFFSET FLAT:$SG14901
  000d9	ff d3		 call	 ebx
$L14898:

; 140  : 
; 141  :     Extension->CurrentWriteIrp->IoStatus.Status = STATUS_SUCCESS;

  000db	8b 7d 08	 mov	 edi, 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  :         );

  000de	57		 push	 edi
  000df	6a 01		 push	 1
  000e1	8d b7 c8 00 00
	00		 lea	 esi, DWORD PTR [edi+200]
  000e7	8b 06		 mov	 eax, DWORD PTR [esi]
  000e9	83 60 18 00	 and	 DWORD PTR [eax+24], 0
  000ed	8d 45 fc	 lea	 eax, DWORD PTR _NewIrp$[ebp]
  000f0	50		 push	 eax
  000f1	8d 87 ac 00 00
	00		 lea	 eax, DWORD PTR [edi+172]
  000f7	50		 push	 eax
  000f8	56		 push	 esi
  000f9	e8 00 00 00 00	 call	 _SerialGetNextWrite@20

; 154  : 
; 155  :     if (NewIrp) {

  000fe	8b 45 fc	 mov	 eax, DWORD PTR _NewIrp$[ebp]
  00101	85 c0		 test	 eax, eax
  00103	74 1d		 je	 SHORT $L14903

; 156  : 
; 157  :         ASSERT(NewIrp == Extension->CurrentWriteIrp);

  00105	3b 06		 cmp	 eax, DWORD PTR [esi]
  00107	74 13		 je	 SHORT $L14904
  00109	6a 00		 push	 0
  0010b	68 9d 00 00 00	 push	 157			; 0000009dH
  00110	68 00 00 00 00	 push	 OFFSET FLAT:$SG14906
  00115	68 00 00 00 00	 push	 OFFSET FLAT:$SG14907
  0011a	ff d3		 call	 ebx
$L14904:

; 158  :         SerialStartWrite(Extension);

  0011c	57		 push	 edi
  0011d	e8 00 00 00 00	 call	 _SerialStartWrite@4
$L14903:
  00122	5f		 pop	 edi
  00123	5e		 pop	 esi

; 159  : 
; 160  :     }
; 161  : 
; 162  :     return STATUS_SUCCESS;

  00124	33 c0		 xor	 eax, eax
  00126	5b		 pop	 ebx

; 163  : 
; 164  : }

  00127	c9		 leave
  00128	c2 04 00	 ret	 4
_SerialStartFlush@4 ENDP
PAGESRP0	ENDS
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -