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

📄 write.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\write.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 _SerialWrite@8
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialStartWrite@4
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialGetNextWrite@20
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialCompleteWrite@16
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialProcessEmptyTransmit@4
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialGiveWriteToIsr@4
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialCancelCurrentWrite@8
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialWriteTimeout@16
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialGrabWriteFromIsr@4
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialGrabXoffFromIsr@4
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialCompleteXoff@16
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialTimeoutXoff@16
_TEXT	SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT	ENDS
;	COMDAT _SerialCancelCurrentXoff@8
PAGESER	SEGMENT PARA USE32 PUBLIC ''
PAGESER	ENDS
;	COMDAT _SerialGiveXoffToIsr@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	_SerialWrite@8
PUBLIC	_SerialStartWrite@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 _SerialWrite@8
; File f:\w2ddk\src\kernel\serial\write.c
PAGESER	SEGMENT
$SG14833 DB	'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
	DB	00H
	ORG $+1
$SG14836 DB	'f:\w2ddk\src\kernel\serial\write.c', 00H
	ORG $+1
$SG14837 DB	'FALSE', 00H
	ORG $+2
$SG14844 DB	'Entering SerialWrite', 0aH, 00H
	ORG $+2
$SG14859 DB	'Leaving SerialWrite (1)', 0aH, 00H
	ORG $+3
$SG14872 DB	'SERIAL: Dispatch entry for: %x', 0aH, 00H
$SG14887 DB	'Leaving SerialWrite (2)', 0aH, 00H
	ORG $+3
$SG14902 DB	'Leaving SerialWrite (3)', 0aH, 00H
	ORG $+3
$SG14917 DB	'SERIAL: Complete Irp: %x', 0aH, 00H
	ORG $+2
$SG14930 DB	'Leaving SerialWrite (4)', 0aH, 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_SerialWrite@8 PROC NEAR				; COMDAT

; 100  : {

  00125	55		 push	 ebp
  00126	8b ec		 mov	 ebp, esp

; 101  : 
; 102  :     PSERIAL_DEVICE_EXTENSION Extension = DeviceObject->DeviceExtension;

  00128	8b 45 08	 mov	 eax, DWORD PTR _DeviceObject$[ebp]
  0012b	53		 push	 ebx
  0012c	56		 push	 esi

; 103  :     NTSTATUS status;
; 104  : 
; 105  :     SERIAL_LOCKED_PAGED_CODE();

  0012d	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  00133	57		 push	 edi
  00134	8b 78 28	 mov	 edi, DWORD PTR [eax+40]
  00137	ff d6		 call	 esi
  00139	3c 01		 cmp	 al, 1
  0013b	76 2f		 jbe	 SHORT $L14838
  0013d	83 3d 14 00 00
	00 00		 cmp	 DWORD PTR _SerialGlobals+20, 0
  00144	75 26		 jne	 SHORT $L14838
  00146	ff d6		 call	 esi
  00148	0f b6 c0	 movzx	 eax, al
  0014b	50		 push	 eax
  0014c	68 00 00 00 00	 push	 OFFSET FLAT:$SG14833
  00151	e8 00 00 00 00	 call	 _DbgPrint
  00156	59		 pop	 ecx
  00157	59		 pop	 ecx
  00158	6a 00		 push	 0
  0015a	6a 69		 push	 105			; 00000069H
  0015c	68 00 00 00 00	 push	 OFFSET FLAT:$SG14836
  00161	68 00 00 00 00	 push	 OFFSET FLAT:$SG14837
  00166	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
$L14838:

; 106  : 
; 107  :     SerialDump(SERTRACECALLS, ("Entering SerialWrite\n"));

  0016c	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  00173	74 0b		 je	 SHORT $L14839
  00175	68 00 00 00 00	 push	 OFFSET FLAT:$SG14844
  0017a	e8 00 00 00 00	 call	 _DbgPrint
  0017f	59		 pop	 ecx
$L14839:

; 108  : 
; 109  :     if ((status = SerialIRPPrologue(Irp, Extension)) != STATUS_SUCCESS) {

  00180	8b 75 0c	 mov	 esi, DWORD PTR _Irp$[ebp]
  00183	57		 push	 edi
  00184	56		 push	 esi
  00185	e8 00 00 00 00	 call	 _SerialIRPPrologue@8
  0018a	8b d8		 mov	 ebx, eax
  0018c	85 db		 test	 ebx, ebx
  0018e	74 2b		 je	 SHORT $L14866

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

  00190	32 d2		 xor	 dl, dl
  00192	8b ce		 mov	 ecx, esi
  00194	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8
  0019a	57		 push	 edi
  0019b	e8 00 00 00 00	 call	 _SerialIRPEpilogue@4

; 111  :       SerialDump(SERTRACECALLS, ("Leaving SerialWrite (1)\n"));

  001a0	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  001a7	74 0b		 je	 SHORT $L14854
  001a9	68 00 00 00 00	 push	 OFFSET FLAT:$SG14859
  001ae	e8 00 00 00 00	 call	 _DbgPrint
  001b3	59		 pop	 ecx
$L14854:

; 112  :       return status;

  001b4	8b c3		 mov	 eax, ebx
  001b6	e9 ba 00 00 00	 jmp	 $L14909
$L14866:

; 113  :    }
; 114  : 
; 115  :     SerialDump(
; 116  :         SERIRPPATH,
; 117  :         ("SERIAL: Dispatch entry for: %x\n",Irp)
; 118  :         );

  001bb	f6 05 00 00 00
	00 20		 test	 BYTE PTR _SerialDebugLevel, 32 ; 00000020H
  001c2	74 0d		 je	 SHORT $L14867
  001c4	56		 push	 esi
  001c5	68 00 00 00 00	 push	 OFFSET FLAT:$SG14872
  001ca	e8 00 00 00 00	 call	 _DbgPrint
  001cf	59		 pop	 ecx
  001d0	59		 pop	 ecx
$L14867:

; 119  :     if (SerialCompleteIfError(
; 120  :             DeviceObject,
; 121  :             Irp
; 122  :             ) != STATUS_SUCCESS) {

  001d1	56		 push	 esi
  001d2	ff 75 08	 push	 DWORD PTR _DeviceObject$[ebp]
  001d5	e8 00 00 00 00	 call	 _SerialCompleteIfError@8
  001da	85 c0		 test	 eax, eax
  001dc	74 1b		 je	 SHORT $L14880

; 123  : 
; 124  :        SerialDump(SERTRACECALLS, ("Leaving SerialWrite (2)\n"));

  001de	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  001e5	74 0b		 je	 SHORT $L14882
  001e7	68 00 00 00 00	 push	 OFFSET FLAT:$SG14887
  001ec	e8 00 00 00 00	 call	 _DbgPrint
  001f1	59		 pop	 ecx
$L14882:

; 125  : 
; 126  :         return STATUS_CANCELLED;

  001f2	b8 20 01 00 c0	 mov	 eax, -1073741536	; c0000120H
  001f7	eb 7c		 jmp	 SHORT $L14909
$L14880:

; 127  : 
; 128  :     }
; 129  : 
; 130  :     Irp->IoStatus.Information = 0L;
; 131  : 
; 132  :     //
; 133  :     // Quick check for a zero length write.  If it is zero length
; 134  :     // then we are already done!
; 135  :     //
; 136  : 
; 137  :     if (IoGetCurrentIrpStackLocation(Irp)->Parameters.Write.Length) {

  001f9	8b 4e 60	 mov	 ecx, DWORD PTR [esi+96]
  001fc	33 c0		 xor	 eax, eax
  001fe	89 46 1c	 mov	 DWORD PTR [esi+28], eax
  00201	39 41 04	 cmp	 DWORD PTR [ecx+4], eax
  00204	74 30		 je	 SHORT $L14895

; 138  : 
; 139  :         //
; 140  :         // Well it looks like we actually have to do some
; 141  :         // work.  Put the write on the queue so that we can
; 142  :         // process it when our previous writes are done.
; 143  :         //
; 144  : 
; 145  : 
; 146  :        SerialDump(SERTRACECALLS, ("Leaving SerialWrite (3)\n"));

  00206	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  0020d	74 0b		 je	 SHORT $L14897
  0020f	68 00 00 00 00	 push	 OFFSET FLAT:$SG14902
  00214	e8 00 00 00 00	 call	 _DbgPrint
  00219	59		 pop	 ecx
$L14897:

; 147  : 
; 148  :         return SerialStartOrQueue(
; 149  :                    Extension,
; 150  :                    Irp,
; 151  :                    &Extension->WriteQueue,
; 152  :                    &Extension->CurrentWriteIrp,
; 153  :                    SerialStartWrite
; 154  :                    );

  0021a	8d 87 c8 00 00
	00		 lea	 eax, DWORD PTR [edi+200]
  00220	68 00 00 00 00	 push	 OFFSET FLAT:_SerialStartWrite@4
  00225	50		 push	 eax
  00226	8d 87 ac 00 00
	00		 lea	 eax, DWORD PTR [edi+172]
  0022c	50		 push	 eax
  0022d	56		 push	 esi
  0022e	57		 push	 edi
  0022f	e8 00 00 00 00	 call	 _SerialStartOrQueue@20
  00234	eb 3f		 jmp	 SHORT $L14909
$L14895:

; 155  : 
; 156  :     } else {
; 157  : 
; 158  :         Irp->IoStatus.Status = STATUS_SUCCESS;

  00236	89 46 18	 mov	 DWORD PTR [esi+24], eax

; 159  :         SerialDump(
; 160  :             SERIRPPATH,
; 161  :             ("SERIAL: Complete Irp: %x\n",Irp)
; 162  :             );

  00239	f6 05 00 00 00
	00 20		 test	 BYTE PTR _SerialDebugLevel, 32 ; 00000020H
  00240	74 0d		 je	 SHORT $L14912
  00242	56		 push	 esi
  00243	68 00 00 00 00	 push	 OFFSET FLAT:$SG14917
  00248	e8 00 00 00 00	 call	 _DbgPrint
  0024d	59		 pop	 ecx
  0024e	59		 pop	 ecx
$L14912:

; 163  :         SerialCompleteRequest(Extension, Irp, 0);

  0024f	32 d2		 xor	 dl, dl
  00251	8b ce		 mov	 ecx, esi
  00253	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8
  00259	57		 push	 edi
  0025a	e8 00 00 00 00	 call	 _SerialIRPEpilogue@4

; 164  : 
; 165  :         SerialDump(SERTRACECALLS, ("Leaving SerialWrite (4)\n"));

  0025f	f6 05 00 00 00
	00 40		 test	 BYTE PTR _SerialDebugLevel, 64 ; 00000040H
  00266	74 0b		 je	 SHORT $L14925
  00268	68 00 00 00 00	 push	 OFFSET FLAT:$SG14930
  0026d	e8 00 00 00 00	 call	 _DbgPrint
  00272	59		 pop	 ecx
$L14925:

; 166  :         return STATUS_SUCCESS;

  00273	33 c0		 xor	 eax, eax
$L14909:
  00275	5f		 pop	 edi
  00276	5e		 pop	 esi
  00277	5b		 pop	 ebx

; 167  : 
; 168  :     }
; 169  : 
; 170  : }

  00278	5d		 pop	 ebp
  00279	c2 08 00	 ret	 8
_SerialWrite@8 ENDP
PAGESER	ENDS
PUBLIC	_SerialGiveWriteToIsr@4
PUBLIC	_SerialCancelCurrentWrite@8
PUBLIC	_SerialGrabXoffFromIsr@4
PUBLIC	_SerialGetNextWrite@20
EXTRN	__imp__KeSynchronizeExecution@12:NEAR
EXTRN	__imp_@InterlockedExchange@8:NEAR
EXTRN	__imp_@KfAcquireSpinLock@4:NEAR
EXTRN	__imp_@KfReleaseSpinLock@8:NEAR
EXTRN	__allmul:NEAR
EXTRN	__imp__IoAcquireCancelSpinLock@4:NEAR
EXTRN	_SerialSetTimer@20:NEAR
EXTRN	__imp__IoReleaseCancelSpinLock@4:NEAR
EXTRN	_SerialTryToCompleteCurrent@44:NEAR
;	COMDAT _SerialStartWrite@4
PAGESER	SEGMENT
$SG14949 DB	'SERIAL: Pageable code called at IRQL %d without lock ', 0aH
	DB	00H
	ORG $+1
$SG14952 DB	'f:\w2ddk\src\kernel\serial\write.c', 00H
	ORG $+1
$SG14953 DB	'FALSE', 00H
	ORG $+2
$SG14960 DB	'SERIAL: SerialStartWrite', 0aH, 00H
	ORG $+2
$SG14981 DB	'f:\w2ddk\src\kernel\serial\write.c', 00H
	ORG $+1
$SG14982 DB	'!(*_arg4 & _refType)', 00H
	ORG $+3
$SG15026 DB	'f:\w2ddk\src\kernel\serial\write.c', 00H
	ORG $+1
$SG15027 DB	'!(*_arg4 & _refType)', 00H
	ORG $+3
$SG15037 DB	'f:\w2ddk\src\kernel\serial\write.c', 00H
	ORG $+1
$SG15038 DB	'!(*_arg4 & _refType)', 00H
; Function compile flags: /Ogs
_Extension$ = 8
_NewIrp$ = -16
_OldIrql$ = -5
_TotalTime$ = -24
_UseATimer$ = 11
_Timeouts$ = -44
_SetFirstStatus$ = -1
_FirstStatus$ = -12
_SerialStartWrite@4 PROC NEAR				; COMDAT

; 196  : {

  00131	55		 push	 ebp
  00132	8b ec		 mov	 ebp, esp
  00134	83 ec 2c	 sub	 esp, 44			; 0000002cH

; 197  : 
; 198  :     PIRP NewIrp;
; 199  :     KIRQL OldIrql;
; 200  :     LARGE_INTEGER TotalTime;
; 201  :     BOOLEAN UseATimer;
; 202  :     SERIAL_TIMEOUTS Timeouts;
; 203  :     BOOLEAN SetFirstStatus = FALSE;

  00137	80 65 ff 00	 and	 BYTE PTR _SetFirstStatus$[ebp], 0
  0013b	53		 push	 ebx
  0013c	56		 push	 esi

⌨️ 快捷键说明

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