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

📄 wmi.cod

📁 怎样在win2000下构造驱动程序znsoft_Serial2000_demo.ZIP
💻 COD
📖 第 1 页 / 共 2 页
字号:
;	COMDAT _SerialQueryWmiDataBlock@32
PAGESRP0	SEGMENT
_PDevObj$ = 8
_PIrp$ = 12
_GuidIndex$ = 16
_InstanceLengthArray$ = 28
_OutBufferSize$ = 32
_PBuffer$ = 36
_SerialQueryWmiDataBlock@32 PROC NEAR			; COMDAT

; 297  : {

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

; 298  :     NTSTATUS status;
; 299  :     ULONG size = 0;
; 300  :     PSERIAL_DEVICE_EXTENSION pDevExt
; 301  :        = (PSERIAL_DEVICE_EXTENSION)PDevObj->DeviceExtension;

  00003	8b 45 08	 mov	 eax, DWORD PTR _PDevObj$[ebp]

; 302  : 
; 303  :     PAGED_CODE();
; 304  : 
; 305  :     switch (GuidIndex) {

  00006	8b 4d 10	 mov	 ecx, DWORD PTR _GuidIndex$[ebp]
  00009	53		 push	 ebx
  0000a	33 db		 xor	 ebx, ebx
  0000c	8b 40 28	 mov	 eax, DWORD PTR [eax+40]
  0000f	56		 push	 esi
  00010	2b cb		 sub	 ecx, ebx
  00012	57		 push	 edi
  00013	0f 84 82 00 00
	00		 je	 $L15027
  00019	49		 dec	 ecx
  0001a	74 62		 je	 SHORT $L15041
  0001c	49		 dec	 ecx
  0001d	74 4d		 je	 SHORT $L15047
  0001f	49		 dec	 ecx
  00020	74 38		 je	 SHORT $L15053
  00022	49		 dec	 ecx
  00023	74 0a		 je	 SHORT $L15059

; 404  : 
; 405  :     default:
; 406  :         status = STATUS_WMI_GUID_NOT_FOUND;

  00025	b8 95 02 00 c0	 mov	 eax, -1073741163	; c0000295H

; 407  :         break;

  0002a	e9 b4 00 00 00	 jmp	 $L15024
$L15059:

; 384  : 
; 385  :     case WMI_SERIAL_PORT_PROPERTIES: 
; 386  :       size = sizeof(SERIAL_COMMPROP) + sizeof(ULONG);

  0002f	6a 44		 push	 68			; 00000044H
  00031	5b		 pop	 ebx

; 387  : 
; 388  :       if (OutBufferSize < size) {

  00032	39 5d 20	 cmp	 DWORD PTR _OutBufferSize$[ebp], ebx
  00035	73 0a		 jae	 SHORT $L15062
$L15117:

; 389  :          status = STATUS_BUFFER_TOO_SMALL;

  00037	b8 23 00 00 c0	 mov	 eax, -1073741789	; c0000023H

; 390  :          break;

  0003c	e9 a2 00 00 00	 jmp	 $L15024
$L15062:

; 391  :       }
; 392  : 
; 393  :       *InstanceLengthArray = size;
; 394  :       SerialGetProperties(
; 395  :                 pDevExt,
; 396  :                 (PSERIAL_COMMPROP)PBuffer
; 397  :                 );

  00041	8b 75 24	 mov	 esi, DWORD PTR _PBuffer$[ebp]
  00044	8b 4d 1c	 mov	 ecx, DWORD PTR _InstanceLengthArray$[ebp]
  00047	56		 push	 esi
  00048	50		 push	 eax
  00049	89 19		 mov	 DWORD PTR [ecx], ebx
  0004b	e8 00 00 00 00	 call	 _SerialGetProperties@8

; 398  : 	
; 399  :       *((PULONG)(((PSERIAL_COMMPROP)PBuffer)->ProvChar)) = 0;

  00050	33 c0		 xor	 eax, eax
  00052	89 46 3c	 mov	 DWORD PTR [esi+60], eax

; 400  : 
; 401  :       status = STATUS_SUCCESS;
; 402  : 
; 403  :       break;

  00055	e9 89 00 00 00	 jmp	 $L15024
$L15053:

; 369  : 
; 370  :     case WMI_SERIAL_PORT_PERF_INFORMATION: 
; 371  :       size = sizeof(SERIAL_WMI_PERF_DATA);

  0005a	6a 18		 push	 24			; 00000018H
  0005c	5b		 pop	 ebx

; 372  : 
; 373  :       if (OutBufferSize < size) {

  0005d	39 5d 20	 cmp	 DWORD PTR _OutBufferSize$[ebp], ebx

; 374  :          status = STATUS_BUFFER_TOO_SMALL;
; 375  :          break;

  00060	72 d5		 jb	 SHORT $L15117

; 376  :       }
; 377  : 
; 378  :       *InstanceLengthArray = size;
; 379  :       *(PSERIAL_WMI_PERF_DATA)PBuffer = pDevExt->WmiPerfData;

  00062	8d b0 18 06 00
	00		 lea	 esi, DWORD PTR [eax+1560]
  00068	6a 06		 push	 6

; 380  : 
; 381  :       status = STATUS_SUCCESS;
; 382  : 
; 383  :       break;

  0006a	eb 22		 jmp	 SHORT $L15118
$L15047:

; 354  : 
; 355  :     case WMI_SERIAL_PORT_HW_INFORMATION:
; 356  :        size = sizeof(SERIAL_WMI_HW_DATA);

  0006c	6a 20		 push	 32			; 00000020H
  0006e	5b		 pop	 ebx

; 357  : 
; 358  :        if (OutBufferSize < size) {

  0006f	39 5d 20	 cmp	 DWORD PTR _OutBufferSize$[ebp], ebx

; 359  :           status = STATUS_BUFFER_TOO_SMALL;
; 360  :           break;

  00072	72 c3		 jb	 SHORT $L15117

; 361  :        }
; 362  : 
; 363  :        *InstanceLengthArray = size;
; 364  :        *(PSERIAL_WMI_HW_DATA)PBuffer = pDevExt->WmiHwData;

  00074	8d b0 f8 05 00
	00		 lea	 esi, DWORD PTR [eax+1528]
  0007a	6a 08		 push	 8

; 365  : 
; 366  :        status = STATUS_SUCCESS;
; 367  : 
; 368  :        break;

  0007c	eb 10		 jmp	 SHORT $L15118
$L15041:

; 337  : 
; 338  :         break;
; 339  : 
; 340  :     case WMI_SERIAL_PORT_COMM_INFORMATION: 
; 341  :        size = sizeof(SERIAL_WMI_COMM_DATA);

  0007e	6a 40		 push	 64			; 00000040H
  00080	5b		 pop	 ebx

; 342  : 
; 343  :        if (OutBufferSize < size) {

  00081	39 5d 20	 cmp	 DWORD PTR _OutBufferSize$[ebp], ebx

; 344  :           status = STATUS_BUFFER_TOO_SMALL;
; 345  :           break;

  00084	72 b1		 jb	 SHORT $L15117

; 346  :         }
; 347  : 
; 348  :         *InstanceLengthArray = size;
; 349  :         *(PSERIAL_WMI_COMM_DATA)PBuffer = pDevExt->WmiCommData;

  00086	8d b0 b4 05 00
	00		 lea	 esi, DWORD PTR [eax+1460]
  0008c	6a 10		 push	 16			; 00000010H
$L15118:
  0008e	8b 4d 1c	 mov	 ecx, DWORD PTR _InstanceLengthArray$[ebp]
  00091	8b 7d 24	 mov	 edi, DWORD PTR _PBuffer$[ebp]
  00094	89 19		 mov	 DWORD PTR [ecx], ebx
  00096	59		 pop	 ecx
  00097	f3 a5		 rep movsd

; 350  : 
; 351  :         status = STATUS_SUCCESS;
; 352  : 
; 353  :         break;

  00099	eb 46		 jmp	 SHORT $L15115
$L15027:

; 306  :     case WMI_SERIAL_PORT_NAME_INFORMATION:
; 307  :        size = pDevExt->WmiIdentifier.Length;

  0009b	0f b7 98 ac 05
	00 00		 movzx	 ebx, WORD PTR [eax+1452]

; 308  : 
; 309  :        if (OutBufferSize < (size + sizeof(USHORT))) {

  000a2	8d 53 02	 lea	 edx, DWORD PTR [ebx+2]
  000a5	39 55 20	 cmp	 DWORD PTR _OutBufferSize$[ebp], edx
  000a8	73 04		 jae	 SHORT $L15029

; 310  :             size += sizeof(USHORT);

  000aa	8b da		 mov	 ebx, edx

; 311  :             status = STATUS_BUFFER_TOO_SMALL;
; 312  :             break;

  000ac	eb 89		 jmp	 SHORT $L15117
$L15029:

; 313  :         }
; 314  : 
; 315  :        if (pDevExt->WmiIdentifier.Buffer == NULL) {

  000ae	05 b0 05 00 00	 add	 eax, 1456		; 000005b0H
  000b3	83 38 00	 cmp	 DWORD PTR [eax], 0
  000b6	75 07		 jne	 SHORT $L15033

; 316  :            status = STATUS_INSUFFICIENT_RESOURCES;

  000b8	b8 9a 00 00 c0	 mov	 eax, -1073741670	; c000009aH

; 317  :            break;

  000bd	eb 24		 jmp	 SHORT $L15024
$L15033:

; 318  :         }
; 319  : 
; 320  :         //
; 321  :         // First, copy the string over containing our identifier
; 322  :         //
; 323  : 
; 324  :         *(USHORT *)PBuffer = (USHORT)size;

  000bf	8b 7d 24	 mov	 edi, DWORD PTR _PBuffer$[ebp]

; 325  :         (UCHAR *)PBuffer += sizeof(USHORT);
; 326  : 
; 327  :         RtlCopyMemory(PBuffer, pDevExt->WmiIdentifier.Buffer, size);

  000c2	8b cb		 mov	 ecx, ebx
  000c4	66 89 1f	 mov	 WORD PTR [edi], bx
  000c7	8b 30		 mov	 esi, DWORD PTR [eax]
  000c9	8b c1		 mov	 eax, ecx
  000cb	83 c7 02	 add	 edi, 2
  000ce	c1 e9 02	 shr	 ecx, 2
  000d1	f3 a5		 rep movsd
  000d3	8b c8		 mov	 ecx, eax

; 328  : 
; 329  :         //
; 330  :         // Increment total size to include the WORD containing our len
; 331  :         //
; 332  : 
; 333  :         size += sizeof(USHORT);
; 334  :         *InstanceLengthArray = size;

  000d5	8b 45 1c	 mov	 eax, DWORD PTR _InstanceLengthArray$[ebp]
  000d8	83 e1 03	 and	 ecx, 3
  000db	8b da		 mov	 ebx, edx
  000dd	f3 a4		 rep movsb
  000df	89 18		 mov	 DWORD PTR [eax], ebx
$L15115:

; 335  :                 
; 336  :         status = STATUS_SUCCESS;

  000e1	33 c0		 xor	 eax, eax
$L15024:

; 408  :     }
; 409  : 
; 410  :     status = WmiCompleteRequest( PDevObj, PIrp,
; 411  :                                   status, size, IO_NO_INCREMENT);

  000e3	6a 00		 push	 0
  000e5	53		 push	 ebx
  000e6	50		 push	 eax
  000e7	ff 75 0c	 push	 DWORD PTR _PIrp$[ebp]
  000ea	ff 75 08	 push	 DWORD PTR _PDevObj$[ebp]
  000ed	e8 00 00 00 00	 call	 _WmiCompleteRequest@20
  000f2	5f		 pop	 edi
  000f3	5e		 pop	 esi
  000f4	5b		 pop	 ebx

; 412  : 
; 413  :     return status;
; 414  : }

  000f5	5d		 pop	 ebp
  000f6	c2 20 00	 ret	 32			; 00000020H
_SerialQueryWmiDataBlock@32 ENDP
PAGESRP0	ENDS
PUBLIC	_SerialQueryWmiRegInfo@24
EXTRN	_SerialGlobals:BYTE
; Function compile flags: /Ogsy
;	COMDAT _SerialQueryWmiRegInfo@24
PAGESRP0	SEGMENT
_PDevObj$ = 8
_PRegFlags$ = 12
_PRegistryPath$ = 20
_Pdo$ = 28
_SerialQueryWmiRegInfo@24 PROC NEAR			; COMDAT

; 469  :    PSERIAL_DEVICE_EXTENSION pDevExt
; 470  :        = (PSERIAL_DEVICE_EXTENSION)PDevObj->DeviceExtension;

  00000	8b 44 24 04	 mov	 eax, DWORD PTR _PDevObj$[esp-4]

; 471  :    
; 472  :    PAGED_CODE();
; 473  : 
; 474  :    *PRegFlags = WMIREG_FLAG_INSTANCE_PDO;

  00004	8b 4c 24 08	 mov	 ecx, DWORD PTR _PRegFlags$[esp-4]
  00008	8b 40 28	 mov	 eax, DWORD PTR [eax+40]
  0000b	c7 01 20 00 00
	00		 mov	 DWORD PTR [ecx], 32	; 00000020H

; 475  :    *PRegistryPath = &SerialGlobals.RegistryPath;

  00011	8b 4c 24 10	 mov	 ecx, DWORD PTR _PRegistryPath$[esp-4]
  00015	c7 01 0c 00 00
	00		 mov	 DWORD PTR [ecx], OFFSET FLAT:_SerialGlobals+12

; 476  :    *Pdo = pDevExt->Pdo;

  0001b	8b 4c 24 18	 mov	 ecx, DWORD PTR _Pdo$[esp-4]
  0001f	8b 80 80 05 00
	00		 mov	 eax, DWORD PTR [eax+1408]
  00025	89 01		 mov	 DWORD PTR [ecx], eax

; 477  : 
; 478  :    return STATUS_SUCCESS;

  00027	33 c0		 xor	 eax, eax

; 479  : }

  00029	c2 18 00	 ret	 24			; 00000018H
_SerialQueryWmiRegInfo@24 ENDP
PAGESRP0	ENDS
END

⌨️ 快捷键说明

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