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

📄 utils.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 COD
📖 第 1 页 / 共 5 页
字号:

; 909  : 
; 910  :         //
; 911  :         // There is a current error in the driver.  No requests should
; 912  :         // come through except for the GET_COMMSTATUS.
; 913  :         //
; 914  : 
; 915  :         if ((irpSp->MajorFunction != IRP_MJ_DEVICE_CONTROL) ||
; 916  :             (irpSp->Parameters.DeviceIoControl.IoControlCode !=
; 917  :              IOCTL_SERIAL_GET_COMMSTATUS)) {

  000e3	80 38 0e	 cmp	 BYTE PTR [eax], 14	; 0000000eH
  000e6	75 09		 jne	 SHORT $L15153
  000e8	81 78 0c 6c 00
	1b 00		 cmp	 DWORD PTR [eax+12], 1769580 ; 001b006cH
  000ef	74 35		 je	 SHORT $L15152
$L15153:

; 918  : 
; 919  :             status = STATUS_CANCELLED;
; 920  :             Irp->IoStatus.Status = STATUS_CANCELLED;
; 921  :             Irp->IoStatus.Information = 0;

  000f1	83 66 1c 00	 and	 DWORD PTR [esi+28], 0
  000f5	b8 20 01 00 c0	 mov	 eax, -1073741536	; c0000120H
  000fa	89 46 18	 mov	 DWORD PTR [esi+24], eax
  000fd	89 45 08	 mov	 DWORD PTR _status$[ebp], eax

; 922  : 
; 923  :             SerialDump(
; 924  :                 SERIRPPATH,
; 925  :                 ("SERIAL: Complete Irp: %x\n",Irp)
; 926  :                 );

  00100	f6 05 00 00 00
	00 20		 test	 BYTE PTR _SerialDebugLevel, 32 ; 00000020H
  00107	74 0d		 je	 SHORT $L15157
  00109	56		 push	 esi
  0010a	68 00 00 00 00	 push	 OFFSET FLAT:$SG15162
  0010f	e8 00 00 00 00	 call	 _DbgPrint
  00114	59		 pop	 ecx
  00115	59		 pop	 ecx
$L15157:

; 927  :             SerialCompleteRequest(extension, Irp, 0);

  00116	32 d2		 xor	 dl, dl
  00118	8b ce		 mov	 ecx, esi
  0011a	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCompleteRequest@8
  00120	57		 push	 edi
  00121	e8 00 00 00 00	 call	 _SerialIRPEpilogue@4
$L15152:

; 928  :         }
; 929  : 
; 930  :     }
; 931  : 
; 932  :     return status;

  00126	8b 45 08	 mov	 eax, DWORD PTR _status$[ebp]
  00129	5f		 pop	 edi
  0012a	5e		 pop	 esi

; 933  : 
; 934  : }

  0012b	5d		 pop	 ebp
  0012c	c2 08 00	 ret	 8
_SerialCompleteIfError@8 ENDP
PAGESER	ENDS
PUBLIC	_SerialFilterCancelQueued@8
; Function compile flags: /Ogs
;	COMDAT _SerialFilterCancelQueued@8
_TEXT	SEGMENT
_PIrp$ = 12
_SerialFilterCancelQueued@8 PROC NEAR			; COMDAT

; 955  : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp

; 956  :    PSERIAL_DEVICE_EXTENSION pDevExt = PDevObj->DeviceExtension;
; 957  :    PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation(PIrp);
; 958  : 
; 959  :    PIrp->IoStatus.Status = STATUS_CANCELLED;

  00003	8b 45 0c	 mov	 eax, DWORD PTR _PIrp$[ebp]

; 960  :    PIrp->IoStatus.Information = 0;
; 961  : 
; 962  :    RemoveEntryList(&PIrp->Tail.Overlay.ListEntry);

  00006	8b 50 5c	 mov	 edx, DWORD PTR [eax+92]
  00009	8b 48 58	 mov	 ecx, DWORD PTR [eax+88]
  0000c	83 60 1c 00	 and	 DWORD PTR [eax+28], 0
  00010	c7 40 18 20 01
	00 c0		 mov	 DWORD PTR [eax+24], -1073741536 ; c0000120H
  00017	89 0a		 mov	 DWORD PTR [edx], ecx
  00019	89 51 04	 mov	 DWORD PTR [ecx+4], edx

; 963  : 
; 964  :    IoReleaseCancelSpinLock(PIrp->CancelIrql);

  0001c	8a 40 25	 mov	 al, BYTE PTR [eax+37]
  0001f	50		 push	 eax
  00020	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoReleaseCancelSpinLock@4

; 965  : }

  00026	5d		 pop	 ebp
  00027	c2 08 00	 ret	 8
_SerialFilterCancelQueued@8 ENDP
_TEXT	ENDS
PUBLIC	_SerialKillAllStalled@4
; Function compile flags: /Ogs
;	COMDAT _SerialKillAllStalled@4
_TEXT	SEGMENT
_PDevObj$ = 8
_cancelIrql$ = -4
_SerialKillAllStalled@4 PROC NEAR			; COMDAT

; 969  : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp
  00003	51		 push	 ecx

; 970  :    KIRQL cancelIrql;
; 971  :    PDRIVER_CANCEL cancelRoutine;
; 972  :    PSERIAL_DEVICE_EXTENSION pDevExt = PDevObj->DeviceExtension;

  00004	8b 45 08	 mov	 eax, DWORD PTR _PDevObj$[ebp]
  00007	53		 push	 ebx
  00008	56		 push	 esi
  00009	57		 push	 edi
  0000a	8b 58 28	 mov	 ebx, DWORD PTR [eax+40]

; 973  : 
; 974  :    IoAcquireCancelSpinLock(&cancelIrql);

  0000d	8b 3d 00 00 00
	00		 mov	 edi, DWORD PTR __imp__IoAcquireCancelSpinLock@4
  00013	8d 45 fc	 lea	 eax, DWORD PTR _cancelIrql$[ebp]
  00016	50		 push	 eax
  00017	ff d7		 call	 edi

; 975  : 
; 976  :    while (!IsListEmpty(&pDevExt->StalledIrpQueue)) {

  00019	8d b3 2c 05 00
	00		 lea	 esi, DWORD PTR [ebx+1324]
  0001f	eb 30		 jmp	 SHORT $L15598
$L15187:

; 977  : 
; 978  :       PIRP currentLastIrp = CONTAINING_RECORD(pDevExt->StalledIrpQueue.Blink,
; 979  :                                               IRP, Tail.Overlay.ListEntry);

  00021	8b 8b 30 05 00
	00		 mov	 ecx, DWORD PTR [ebx+1328]

; 980  : 
; 981  :       RemoveEntryList(pDevExt->StalledIrpQueue.Blink);

  00027	8b 11		 mov	 edx, DWORD PTR [ecx]
  00029	8d 41 a8	 lea	 eax, DWORD PTR [ecx-88]
  0002c	8b 49 04	 mov	 ecx, DWORD PTR [ecx+4]

; 982  : 
; 983  :       cancelRoutine = currentLastIrp->CancelRoutine;
; 984  :       currentLastIrp->CancelIrql = cancelIrql;
; 985  :       currentLastIrp->CancelRoutine = NULL;
; 986  :       currentLastIrp->Cancel = TRUE;
; 987  : 
; 988  :       cancelRoutine(PDevObj, currentLastIrp);

  0002f	50		 push	 eax
  00030	ff 75 08	 push	 DWORD PTR _PDevObj$[ebp]
  00033	89 11		 mov	 DWORD PTR [ecx], edx
  00035	89 4a 04	 mov	 DWORD PTR [edx+4], ecx
  00038	8a 55 fc	 mov	 dl, BYTE PTR _cancelIrql$[ebp]
  0003b	8b 48 38	 mov	 ecx, DWORD PTR [eax+56]
  0003e	83 60 38 00	 and	 DWORD PTR [eax+56], 0
  00042	88 50 25	 mov	 BYTE PTR [eax+37], dl
  00045	c6 40 24 01	 mov	 BYTE PTR [eax+36], 1
  00049	ff d1		 call	 ecx

; 989  : 
; 990  :       IoAcquireCancelSpinLock(&cancelIrql);

  0004b	8d 45 fc	 lea	 eax, DWORD PTR _cancelIrql$[ebp]
  0004e	50		 push	 eax
  0004f	ff d7		 call	 edi
$L15598:

; 975  : 
; 976  :    while (!IsListEmpty(&pDevExt->StalledIrpQueue)) {

  00051	39 36		 cmp	 DWORD PTR [esi], esi
  00053	75 cc		 jne	 SHORT $L15187

; 991  :    }
; 992  : 
; 993  :    IoReleaseCancelSpinLock(cancelIrql);

  00055	ff 75 fc	 push	 DWORD PTR _cancelIrql$[ebp]
  00058	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoReleaseCancelSpinLock@4
  0005e	5f		 pop	 edi
  0005f	5e		 pop	 esi
  00060	5b		 pop	 ebx

; 994  : }

  00061	c9		 leave
  00062	c2 04 00	 ret	 4
_SerialKillAllStalled@4 ENDP
_TEXT	ENDS
PUBLIC	_SerialFilterIrps@8
EXTRN	__imp_@KfAcquireSpinLock@4:NEAR
EXTRN	__imp_@KfReleaseSpinLock@8:NEAR
; Function compile flags: /Ogs
;	COMDAT _SerialFilterIrps@8
_TEXT	SEGMENT
_PIrp$ = 8
_PDevExt$ = 12
_pIrpStack$ = -4
_oldIrql$15213 = 8
_SerialFilterIrps@8 PROC NEAR				; COMDAT

; 1018 : {

  00000	55		 push	 ebp
  00001	8b ec		 mov	 ebp, esp
  00003	51		 push	 ecx
  00004	56		 push	 esi

; 1019 :    PIO_STACK_LOCATION pIrpStack;
; 1020 :    KIRQL oldIrqlFlags;
; 1021 : 
; 1022 :    pIrpStack = IoGetCurrentIrpStackLocation(PIrp);

  00005	8b 75 08	 mov	 esi, DWORD PTR _PIrp$[ebp]
  00008	57		 push	 edi

; 1023 : 
; 1024 :    KeAcquireSpinLock(&PDevExt->FlagsLock, &oldIrqlFlags);

  00009	8b 7d 0c	 mov	 edi, DWORD PTR _PDevExt$[ebp]
  0000c	8b 46 60	 mov	 eax, DWORD PTR [esi+96]
  0000f	8d 8f e8 01 00
	00		 lea	 ecx, DWORD PTR [edi+488]
  00015	89 45 fc	 mov	 DWORD PTR _pIrpStack$[ebp], eax
  00018	89 4d 08	 mov	 DWORD PTR 8+[ebp], ecx
  0001b	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@KfAcquireSpinLock@4

; 1025 : 
; 1026 :    if ((PDevExt->DevicePNPAccept == SERIAL_PNPACCEPT_OK)
; 1027 :        && ((PDevExt->Flags & SERIAL_FLAGS_BROKENHW) == 0)) {

  00021	8b 8f cc 04 00
	00		 mov	 ecx, DWORD PTR [edi+1228]
  00027	8a d0		 mov	 dl, al
  00029	85 c9		 test	 ecx, ecx
  0002b	75 19		 jne	 SHORT $L15204
  0002d	f6 87 e4 04 00
	00 04		 test	 BYTE PTR [edi+1252], 4
  00034	75 10		 jne	 SHORT $L15204

; 1028 :       KeReleaseSpinLock(&PDevExt->FlagsLock, oldIrqlFlags);

  00036	8b 4d 08	 mov	 ecx, DWORD PTR 8+[ebp]
$L15219:

; 1088 :       }
; 1089 :    }
; 1090 : 
; 1091 :    KeReleaseSpinLock(&PDevExt->FlagsLock, oldIrqlFlags);

  00039	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@KfReleaseSpinLock@8
$L15603:

; 1092 : 
; 1093 :    return STATUS_SUCCESS;

  0003f	33 c0		 xor	 eax, eax
  00041	e9 a7 00 00 00	 jmp	 $L15201
$L15204:

; 1029 :       return STATUS_SUCCESS;
; 1030 :    }
; 1031 : 
; 1032 :    if ((PDevExt->DevicePNPAccept & SERIAL_PNPACCEPT_REMOVING)
; 1033 :        || (PDevExt->Flags & SERIAL_FLAGS_BROKENHW)
; 1034 :        || (PDevExt->DevicePNPAccept & SERIAL_PNPACCEPT_SURPRISE_REMOVING)) {

  00046	f6 c1 09	 test	 cl, 9
  00049	0f 85 81 00 00
	00		 jne	 $L15207
  0004f	f6 87 e4 04 00
	00 04		 test	 BYTE PTR [edi+1252], 4
  00056	75 78		 jne	 SHORT $L15207

; 1047 :       return STATUS_DELETE_PENDING;
; 1048 :    }
; 1049 : 
; 1050 :    if (PDevExt->DevicePNPAccept & SERIAL_PNPACCEPT_STOPPING) {

  00058	f6 c1 02	 test	 cl, 2

; 1051 :        KIRQL oldIrql;
; 1052 : 
; 1053 :        KeReleaseSpinLock(&PDevExt->FlagsLock, oldIrqlFlags);

  0005b	8b 4d 08	 mov	 ecx, DWORD PTR 8+[ebp]
  0005e	74 d9		 je	 SHORT $L15219
  00060	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@KfReleaseSpinLock@8

; 1054 : 
; 1055 : 
; 1056 :       //
; 1057 :       // Accept all PNP IRP's -- we assume PNP can synchronize itself
; 1058 :       //
; 1059 : 
; 1060 :       if (pIrpStack->MajorFunction == IRP_MJ_PNP) {

  00066	8b 45 fc	 mov	 eax, DWORD PTR _pIrpStack$[ebp]
  00069	80 38 1b	 cmp	 BYTE PTR [eax], 27	; 0000001bH

; 1061 :          return STATUS_SUCCESS;

  0006c	74 d1		 je	 SHORT $L15603

; 1062 :       }
; 1063 : 
; 1064 :       IoAcquireCancelSpinLock(&oldIrql);

  0006e	8d 45 08	 lea	 eax, DWORD PTR _oldIrql$15213[ebp]
  00071	50		 push	 eax
  00072	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoAcquireCancelSpinLock@4

; 1065 : 
; 1066 :       if (PIrp->Cancel) {

  00078	80 7e 24 00	 cmp	 BYTE PTR [esi+36], 0
  0007c	74 10		 je	 SHORT $L15216

; 1067 :          IoReleaseCancelSpinLock(oldIrql);

  0007e	ff 75 08	 push	 DWORD PTR _oldIrql$15213[ebp]
  00081	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoReleaseCancelSpinLock@4

; 1068 :          PIrp->IoStatus.Status = STATUS_CANCELLED;

  00087	b8 20 01 00 c0	 mov	 eax, -1073741536	; c0000120H

; 1069 :          return STATUS_CANCELLED;

  0008c	eb 5c		 jmp	 SHORT $L15602
$L15216:

; 1070 :       } else {
; 1071 :          //
; 1072 :          // Mark the Irp as pending
; 1073 :          //
; 1074 : 
; 1075 :          PIrp->IoStatus.Status = STATUS_PENDING;
; 1076 :          IoMarkIrpPending(PIrp);

  0008e	8b 46 60	 mov	 eax, DWORD PTR [esi+96]
  00091	c7 46 18 03 01
	00 00		 mov	 DWORD PTR [esi+24], 259	; 00000103H

; 1077 : 
; 1078 :          //
; 1079 :          // Queue up the IRP
; 1080 :          //
; 1081 : 
; 1082 :          InsertTailList(&PDevExt->StalledIrpQueue,
; 1083 :                         &PIrp->Tail.Overlay.ListEntry);

  00098	8d 4e 58	 lea	 ecx, DWORD PTR [esi+88]
  0009b	80 48 03 01	 or	 BYTE PTR [eax+3], 1
  0009f	8d 87 2c 05 00
	00		 lea	 eax, DWORD PTR [edi+1324]
  000a5	8b 50 04	 mov	 edx, DWORD PTR [eax+4]
  000a8	89 01		 mov	 DWORD PTR [ecx], eax
  000aa	89 56 5c	 mov	 DWORD PTR [esi+92], edx
  000ad	89 0a		 mov	 DWORD PTR [edx], ecx
  000af	89 48 04	 mov	 DWORD PTR [eax+4], ecx

; 1084 : 
; 1085 :          IoSetCancelRoutine(PIrp, SerialFilterCancelQueued);

  000b2	8d 4e 38	 lea	 ecx, DWORD PTR [esi+56]
  000b5	ba 00 00 00 00	 mov	 edx, OFFSET FLAT:_SerialFilterCancelQueued@8
  000ba	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@InterlockedExchange@8

; 1086 :          IoReleaseCancelSpinLock(oldIrql);

  000c0	ff 75 08	 push	 DWORD PTR _oldIrql$15213[ebp]
  000c3	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__IoReleaseCancelSpinLock@4

; 1087 :          return STATUS_PENDING;

  000c9	b8 03 01 00 00	 mov	 eax, 259		; 00000103H
  000ce	eb 1d		 jmp	 SHORT $L15201
$L15207:

; 1035 : 
; 1036 :       KeReleaseSpinLock(&PDevExt->FlagsLock, oldIrqlFlags);

  000d0	8b 4d 08	 mov	 ecx, DWORD PTR 8+[ebp]
  000d3	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@KfReleaseSpinLock@8

; 1037 : 
; 1038 :       //
; 1039 :       // Accept all PNP IRP's -- we assume PNP can synchronize itself
; 1040 :       //
; 1041 : 
; 1042 :       if (pIrpStack->MajorFunction == IRP_MJ_PNP) {

  000d9	8b 45 fc	 mov	 eax, DWORD PTR _pIrpStack$[ebp]
  000dc	80 38 1b	 cmp	 BYTE PTR [eax], 27	; 0000001bH

; 1043 :          return STATUS_SUCCESS;

  000df	0f 84 5a ff ff
	ff		 je	 $L15603

; 1044 :       }
; 1045 : 
; 1046 :       PIrp->IoStatus.Status = STATUS_DELETE_PENDING;

  000e5	b8 56 00 00 c0	 mov	 eax, -1073741738	; c0000056H
$L15602:
  000ea	89 46 18	 mov	 DWORD P

⌨️ 快捷键说明

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