📄 wmi.cod
字号:
; 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 + -