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

📄 read.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\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 + -