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

📄 wmi.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 COD
📖 第 1 页 / 共 2 页
字号:
; Listing generated by Microsoft (R) Optimizing Compiler Version 12.00.9044.0 

	TITLE	F:\W2DDK\src\kernel\serial\wmi.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 _SerialSystemControlDispatch@8
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialTossWMIRequest@12
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialSetWmiDataItem@28
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialSetWmiDataBlock@24
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialQueryWmiDataBlock@32
PAGESRP0	SEGMENT PARA USE32 PUBLIC ''
PAGESRP0	ENDS
;	COMDAT _SerialQueryWmiRegInfo@24
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	_SerialWmiGuidList
PUBLIC	_SerialPortNameGuid
PUBLIC	_SerialPortCommGuid
PUBLIC	_SerialPortHWGuid
PUBLIC	_SerailPortPerfGuid
PUBLIC	_SerialPortPropertiesGuid
_DATA	SEGMENT
_SerialPortNameGuid DD 0a0ec11a8H
	DW	0b16cH
	DW	011d1H
	DB	0bdH
	DB	098H
	DB	00H
	DB	0a0H
	DB	0c9H
	DB	06H
	DB	0beH
	DB	02dH
_SerialPortCommGuid DD 0edb16a62H
	DW	0b16cH
	DW	011d1H
	DB	0bdH
	DB	098H
	DB	00H
	DB	0a0H
	DB	0c9H
	DB	06H
	DB	0beH
	DB	02dH
_SerialPortHWGuid DD 0270b9b86H
	DW	0b16dH
	DW	011d1H
	DB	0bdH
	DB	098H
	DB	00H
	DB	0a0H
	DB	0c9H
	DB	06H
	DB	0beH
	DB	02dH
_SerailPortPerfGuid DD 056415accH
	DW	0b16dH
	DW	011d1H
	DB	0bdH
	DB	098H
	DB	00H
	DB	0a0H
	DB	0c9H
	DB	06H
	DB	0beH
	DB	02dH
_SerialPortPropertiesGuid DD 08209ec2aH
	DW	02d6bH
	DW	011d2H
	DB	0baH
	DB	049H
	DB	00H
	DB	0a0H
	DB	0c9H
	DB	06H
	DB	029H
	DB	010H
_SerialWmiGuidList DD FLAT:_SerialPortNameGuid
	DD	01H
	DD	00H
	DD	FLAT:_SerialPortCommGuid
	DD	01H
	DD	00H
	DD	FLAT:_SerialPortHWGuid
	DD	01H
	DD	00H
	DD	FLAT:_SerailPortPerfGuid
	DD	01H
	DD	00H
	DD	FLAT:_SerialPortPropertiesGuid
	DD	01H
	DD	00H
_DATA	ENDS
PUBLIC	_SerialSystemControlDispatch@8
EXTRN	__imp__KeGetCurrentIrql@0:NEAR
EXTRN	__imp__RtlAssert@16:NEAR
EXTRN	_DbgPrint:NEAR
EXTRN	__imp_@IofCallDriver@8:NEAR
EXTRN	__imp_@IofCompleteRequest@8:NEAR
EXTRN	_WmiSystemControl@16:NEAR
;	COMDAT _SerialSystemControlDispatch@8
; File f:\w2ddk\src\kernel\serial\wmi.c
PAGESRP0	SEGMENT
$SG14977 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG14980 DB	'f:\w2ddk\src\kernel\serial\wmi.c', 00H
	ORG $+3
$SG14981 DB	'FALSE', 00H
	ORG $+2
$SG14992 DB	'f:\w2ddk\src\kernel\serial\wmi.c', 00H
	ORG $+3
$SG14993 DB	'FALSE', 00H
; Function compile flags: /Ogs
_DeviceObject$ = 8
_Irp$ = 12
_disposition$ = -4
_status$ = 8
_SerialSystemControlDispatch@8 PROC NEAR		; COMDAT

; 36   : {

  0007e	55		 push	 ebp
  0007f	8b ec		 mov	 ebp, esp
  00081	51		 push	 ecx

; 37   :     SYSCTL_IRP_DISPOSITION disposition;
; 38   :     NTSTATUS status;
; 39   :     PSERIAL_DEVICE_EXTENSION pDevExt
; 40   :       = (PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

  00082	8b 45 08	 mov	 eax, DWORD PTR _DeviceObject$[ebp]
  00085	53		 push	 ebx
  00086	56		 push	 esi

; 41   : 
; 42   :     PAGED_CODE();

  00087	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  0008d	57		 push	 edi
  0008e	8b 78 28	 mov	 edi, DWORD PTR [eax+40]
  00091	ff d6		 call	 esi
  00093	8b 1d 00 00 00
	00		 mov	 ebx, DWORD PTR __imp__RtlAssert@16
  00099	3c 01		 cmp	 al, 1
  0009b	76 22		 jbe	 SHORT $L14978
  0009d	ff d6		 call	 esi
  0009f	0f b6 c0	 movzx	 eax, al
  000a2	50		 push	 eax
  000a3	68 00 00 00 00	 push	 OFFSET FLAT:$SG14977
  000a8	e8 00 00 00 00	 call	 _DbgPrint
  000ad	59		 pop	 ecx
  000ae	59		 pop	 ecx
  000af	6a 00		 push	 0
  000b1	6a 2a		 push	 42			; 0000002aH
  000b3	68 00 00 00 00	 push	 OFFSET FLAT:$SG14980
  000b8	68 00 00 00 00	 push	 OFFSET FLAT:$SG14981
  000bd	ff d3		 call	 ebx
$L14978:

; 43   : 
; 44   :     status = WmiSystemControl(   &pDevExt->WmiLibInfo,
; 45   :                                  DeviceObject, 
; 46   :                                  Irp,
; 47   :                                  &disposition);

  000bf	8b 75 0c	 mov	 esi, DWORD PTR _Irp$[ebp]
  000c2	8d 45 fc	 lea	 eax, DWORD PTR _disposition$[ebp]
  000c5	50		 push	 eax
  000c6	56		 push	 esi
  000c7	ff 75 08	 push	 DWORD PTR _DeviceObject$[ebp]
  000ca	8d 87 8c 05 00
	00		 lea	 eax, DWORD PTR [edi+1420]
  000d0	50		 push	 eax
  000d1	e8 00 00 00 00	 call	 _WmiSystemControl@16
  000d6	89 45 08	 mov	 DWORD PTR _status$[ebp], eax

; 48   :     switch(disposition)
; 49   :     {

  000d9	8b 45 fc	 mov	 eax, DWORD PTR _disposition$[ebp]
  000dc	85 c0		 test	 eax, eax
  000de	74 40		 je	 SHORT $L14986
  000e0	83 f8 01	 cmp	 eax, 1
  000e3	74 31		 je	 SHORT $L14987
  000e5	7e 05		 jle	 SHORT $L14989
  000e7	83 f8 03	 cmp	 eax, 3

; 63   :             break;
; 64   :         }
; 65   :         
; 66   :         case IrpForward:
; 67   :         case IrpNotWmi:
; 68   :         {
; 69   :             //
; 70   :             // This irp is either not a WMI irp or is a WMI irp targetted
; 71   :             // at a device lower in the stack.
; 72   :             IoSkipCurrentIrpStackLocation(Irp);
; 73   :             status = IoCallDriver(pDevExt->LowerDeviceObject, Irp);
; 74   :             break;

  000ea	7e 10		 jle	 SHORT $L15183
$L14989:

; 75   :         }
; 76   :                                     
; 77   :         default:
; 78   :         {
; 79   :             //
; 80   :             // We really should never get here, but if we do just forward....
; 81   :             ASSERT(FALSE);

  000ec	6a 00		 push	 0
  000ee	6a 51		 push	 81			; 00000051H
  000f0	68 00 00 00 00	 push	 OFFSET FLAT:$SG14992
  000f5	68 00 00 00 00	 push	 OFFSET FLAT:$SG14993
  000fa	ff d3		 call	 ebx
$L15183:

; 82   :             IoSkipCurrentIrpStackLocation(Irp);

  000fc	fe 46 23	 inc	 BYTE PTR [esi+35]
  000ff	83 46 60 24	 add	 DWORD PTR [esi+96], 36	; 00000024H

; 83   :             status = IoCallDriver(pDevExt->LowerDeviceObject, Irp);

  00103	8b 8f a0 04 00
	00		 mov	 ecx, DWORD PTR [edi+1184]
  00109	8b d6		 mov	 edx, esi
  0010b	ff 15 00 00 00
	00		 call	 DWORD PTR __imp_@IofCallDriver@8
  00111	89 45 08	 mov	 DWORD PTR _status$[ebp], eax

; 84   :             break;

  00114	eb 0a		 jmp	 SHORT $L14986
$L14987:

; 50   :         case IrpProcessed:
; 51   :         {
; 52   :             //
; 53   :             // This irp has been processed and may be completed or pending.
; 54   :             break;
; 55   :         }
; 56   :         
; 57   :         case IrpNotCompleted:
; 58   :         {
; 59   :             //
; 60   :             // This irp has not been completed, but has been fully processed.
; 61   :             // we will complete it now
; 62   :             IoCompleteRequest(Irp, IO_NO_INCREMENT);                

  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
$L14986:

; 85   :         }        
; 86   :     }
; 87   :     
; 88   :     return(status);

  00120	8b 45 08	 mov	 eax, DWORD PTR _status$[ebp]
  00123	5f		 pop	 edi
  00124	5e		 pop	 esi
  00125	5b		 pop	 ebx

; 89   : 
; 90   : }

  00126	c9		 leave
  00127	c2 08 00	 ret	 8
_SerialSystemControlDispatch@8 ENDP
PAGESRP0	ENDS
PUBLIC	_SerialTossWMIRequest@12
EXTRN	_WmiCompleteRequest@20:NEAR
;	COMDAT _SerialTossWMIRequest@12
PAGESRP0	SEGMENT
$SG15014 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG15017 DB	'f:\w2ddk\src\kernel\serial\wmi.c', 00H
	ORG $+3
$SG15018 DB	'FALSE', 00H
; Function compile flags: /Ogs
_PDevObj$ = 8
_PIrp$ = 12
_GuidIndex$ = 16
_SerialTossWMIRequest@12 PROC NEAR			; COMDAT

; 123  : {

  00052	55		 push	 ebp
  00053	8b ec		 mov	 ebp, esp
  00055	56		 push	 esi

; 124  :    PSERIAL_DEVICE_EXTENSION pDevExt;
; 125  :    NTSTATUS status;
; 126  : 
; 127  :    PAGED_CODE();

  00056	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  0005c	ff d6		 call	 esi
  0005e	3c 01		 cmp	 al, 1
  00060	76 26		 jbe	 SHORT $L15015
  00062	ff d6		 call	 esi
  00064	0f b6 c0	 movzx	 eax, al
  00067	50		 push	 eax
  00068	68 00 00 00 00	 push	 OFFSET FLAT:$SG15014
  0006d	e8 00 00 00 00	 call	 _DbgPrint
  00072	59		 pop	 ecx
  00073	59		 pop	 ecx
  00074	6a 00		 push	 0
  00076	6a 7f		 push	 127			; 0000007fH
  00078	68 00 00 00 00	 push	 OFFSET FLAT:$SG15017
  0007d	68 00 00 00 00	 push	 OFFSET FLAT:$SG15018
  00082	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
$L15015:

; 128  : 
; 129  :    pDevExt = (PSERIAL_DEVICE_EXTENSION)PDevObj->DeviceExtension;
; 130  : 
; 131  :    switch (GuidIndex) {

  00088	6a 04		 push	 4
  0008a	58		 pop	 eax
  0008b	3b 45 10	 cmp	 eax, DWORD PTR _GuidIndex$[ebp]

; 132  : 
; 133  :    case WMI_SERIAL_PORT_NAME_INFORMATION:
; 134  :    case WMI_SERIAL_PORT_COMM_INFORMATION:
; 135  :    case WMI_SERIAL_PORT_HW_INFORMATION:
; 136  :    case WMI_SERIAL_PORT_PERF_INFORMATION:
; 137  :    case WMI_SERIAL_PORT_PROPERTIES:
; 138  :       status = STATUS_INVALID_DEVICE_REQUEST;
; 139  :       break;
; 140  : 
; 141  :    default:
; 142  :       status = STATUS_WMI_GUID_NOT_FOUND;
; 143  :       break;
; 144  :    }
; 145  : 
; 146  :    status = WmiCompleteRequest(PDevObj, PIrp,
; 147  :                                  status, 0, IO_NO_INCREMENT);

  0008e	6a 00		 push	 0
  00090	6a 00		 push	 0
  00092	1b c0		 sbb	 eax, eax
  00094	25 85 02 00 00	 and	 eax, 645		; 00000285H
  00099	05 10 00 00 c0	 add	 eax, -1073741808	; c0000010H
  0009e	50		 push	 eax
  0009f	ff 75 0c	 push	 DWORD PTR _PIrp$[ebp]
  000a2	ff 75 08	 push	 DWORD PTR _PDevObj$[ebp]
  000a5	e8 00 00 00 00	 call	 _WmiCompleteRequest@20
  000aa	5e		 pop	 esi

; 148  : 
; 149  :    return status;
; 150  : }

  000ab	5d		 pop	 ebp
  000ac	c2 0c 00	 ret	 12			; 0000000cH
_SerialTossWMIRequest@12 ENDP
PAGESRP0	ENDS
PUBLIC	_SerialSetWmiDataItem@28
;	COMDAT _SerialSetWmiDataItem@28
PAGESRP0	SEGMENT
$SG15044 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG15047 DB	'f:\w2ddk\src\kernel\serial\wmi.c', 00H
	ORG $+3
$SG15048 DB	'FALSE', 00H
; Function compile flags: /Ogs
_PDevObj$ = 8
_PIrp$ = 12
_GuidIndex$ = 16
_SerialSetWmiDataItem@28 PROC NEAR			; COMDAT

; 191  : {

  00052	55		 push	 ebp
  00053	8b ec		 mov	 ebp, esp
  00055	56		 push	 esi

; 192  :    PAGED_CODE();

  00056	8b 35 00 00 00
	00		 mov	 esi, DWORD PTR __imp__KeGetCurrentIrql@0
  0005c	ff d6		 call	 esi
  0005e	3c 01		 cmp	 al, 1
  00060	76 29		 jbe	 SHORT $L15045
  00062	ff d6		 call	 esi
  00064	0f b6 c0	 movzx	 eax, al
  00067	50		 push	 eax
  00068	68 00 00 00 00	 push	 OFFSET FLAT:$SG15044
  0006d	e8 00 00 00 00	 call	 _DbgPrint
  00072	59		 pop	 ecx
  00073	59		 pop	 ecx
  00074	6a 00		 push	 0
  00076	68 c0 00 00 00	 push	 192			; 000000c0H
  0007b	68 00 00 00 00	 push	 OFFSET FLAT:$SG15047
  00080	68 00 00 00 00	 push	 OFFSET FLAT:$SG15048
  00085	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__RtlAssert@16
$L15045:

; 193  : 
; 194  :    //
; 195  :    // Toss this request -- we don't support anything for it
; 196  :    //
; 197  : 
; 198  :    return SerialTossWMIRequest(PDevObj, PIrp, GuidIndex);

  0008b	ff 75 10	 push	 DWORD PTR _GuidIndex$[ebp]
  0008e	ff 75 0c	 push	 DWORD PTR _PIrp$[ebp]
  00091	ff 75 08	 push	 DWORD PTR _PDevObj$[ebp]
  00094	e8 00 00 00 00	 call	 _SerialTossWMIRequest@12
  00099	5e		 pop	 esi

; 199  : }

  0009a	5d		 pop	 ebp
  0009b	c2 1c 00	 ret	 28			; 0000001cH
_SerialSetWmiDataItem@28 ENDP
PAGESRP0	ENDS
PUBLIC	_SerialSetWmiDataBlock@24
;	COMDAT _SerialSetWmiDataBlock@24
PAGESRP0	SEGMENT
$SG15063 DB	'EX: Pageable code called at IRQL %d', 0aH, 00H
	ORG $+3
$SG15066 DB	'f:\w2ddk\src\kernel\serial\wmi.c', 00H
	ORG $+3
$SG15067 DB	'FALSE', 00H
; Function compile flags: /Ogs
_PDevObj$ = 8
_PIrp$ = 12
_GuidIndex$ = 16
_SerialSetWmiDataBlock@24 PROC NEAR			; COMDAT

; 238  : {

  00052	55		 push	 ebp
  00053	8b ec		 mov	 ebp, esp
  00055	56		 push	 esi

⌨️ 快捷键说明

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