📄 pcidpprivate.cod
字号:
; 377 :
; 378 : return Status;
00086 8a 45 ff mov al, BYTE PTR _Status$[ebp]
00089 5f pop edi
0008a 5e pop esi
0008b 5b pop ebx
; 379 : }
0008c c9 leave
0008d c2 10 00 ret 16 ; 00000010H
_GetNextEntry@16 ENDP
_TEXT ENDS
PUBLIC _PutBackEntry@8
; COMDAT _PutBackEntry@8
_TEXT SEGMENT
_ObjExt$ = 8
_CurrentLink$ = 12
_PutBackEntry@8 PROC NEAR ; COMDAT
; 382 : BOOLEAN PutBackEntry(PPCIDP_EXTENSION ObjExt, PLINKED_LIST CurrentLink){
00000 53 push ebx
00001 56 push esi
; 383 :
; 384 : BOOLEAN Status;
; 385 : KIRQL LListIrql;
; 386 :
; 387 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00002 8b 74 24 0c mov esi, DWORD PTR _ObjExt$[esp+4]
00006 57 push edi
00007 8d 7e 74 lea edi, DWORD PTR [esi+116]
0000a 8b cf mov ecx, edi
0000c ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 388 : if(CurrentLink->Status == LL_CHECKEDOUT){
00012 8b 4c 24 14 mov ecx, DWORD PTR _CurrentLink$[esp+8]
00016 80 79 08 04 cmp BYTE PTR [ecx+8], 4
0001a 75 0c jne SHORT $L8563
; 389 : CurrentLink->Status = LL_INSERTED;
0001c c6 41 08 02 mov BYTE PTR [ecx+8], 2
; 390 : ObjExt->LLData.InsertedCount++;
00020 66 ff 46 6a inc WORD PTR [esi+106]
; 391 : Status = TRUE;
00024 b3 01 mov bl, 1
; 392 : }
; 393 : else
00026 eb 02 jmp SHORT $L8564
$L8563:
; 394 : Status = FALSE;
00028 32 db xor bl, bl
$L8564:
; 395 :
; 396 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
0002a 8a d0 mov dl, al
0002c 8b cf mov ecx, edi
0002e ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
00034 5f pop edi
; 397 : //ObjExt->MemoryBase[0x1C57] = ObjExt->LLData.InsertedCount;//debug
; 398 : //ObjExt->MemoryBase[0x1C58]++;//debug
; 399 : return Status;
00035 8a c3 mov al, bl
00037 5e pop esi
00038 5b pop ebx
; 400 : }
00039 c2 08 00 ret 8
_PutBackEntry@8 ENDP
_TEXT ENDS
PUBLIC _FreeEntry@8
; COMDAT _FreeEntry@8
_TEXT SEGMENT
_ObjExt$ = 8
_CurrentLink$ = 12
_FreeEntry@8 PROC NEAR ; COMDAT
; 403 : BOOLEAN FreeEntry(PPCIDP_EXTENSION ObjExt, PLINKED_LIST CurrentLink){
00000 53 push ebx
00001 56 push esi
; 404 :
; 405 : BOOLEAN Status;
; 406 : KIRQL LListIrql;
; 407 :
; 408 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00002 8b 74 24 0c mov esi, DWORD PTR _ObjExt$[esp+4]
00006 57 push edi
00007 8d 7e 74 lea edi, DWORD PTR [esi+116]
0000a 8b cf mov ecx, edi
0000c ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 409 : if(CurrentLink->Status == LL_CHECKEDOUT || CurrentLink->Status == LL_ACQUIRED){
00012 8b 4c 24 14 mov ecx, DWORD PTR _CurrentLink$[esp+8]
00016 8a 59 08 mov bl, BYTE PTR [ecx+8]
00019 80 fb 04 cmp bl, 4
0001c 74 09 je SHORT $L8573
0001e 80 fb 01 cmp bl, 1
00021 74 04 je SHORT $L8573
; 413 : }
; 414 : else
; 415 : Status = FALSE;
00023 32 db xor bl, bl
00025 eb 0c jmp SHORT $L8574
$L8573:
; 410 : CurrentLink->Status = LL_AVAILABLE;
00027 c6 41 08 03 mov BYTE PTR [ecx+8], 3
; 411 : ObjExt->LLData.CurrentLink = CurrentLink->Prev;
0002b 8b 49 04 mov ecx, DWORD PTR [ecx+4]
0002e 89 4e 70 mov DWORD PTR [esi+112], ecx
; 412 : Status = TRUE;
00031 b3 01 mov bl, 1
$L8574:
; 416 :
; 417 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
00033 8a d0 mov dl, al
00035 8b cf mov ecx, edi
00037 ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
0003d 5f pop edi
; 418 : //ObjExt->MemoryBase[0x1C59]++;//debug
; 419 :
; 420 : return Status;
0003e 8a c3 mov al, bl
00040 5e pop esi
00041 5b pop ebx
; 421 : }
00042 c2 08 00 ret 8
_FreeEntry@8 ENDP
_TEXT ENDS
PUBLIC _GetFreeEntry@4
EXTRN __imp__ExAllocatePoolWithTag@12:NEAR
; COMDAT _GetFreeEntry@4
_TEXT SEGMENT
_ObjExt$ = 8
_GetFreeEntry@4 PROC NEAR ; COMDAT
; 424 : PLINKED_LIST GetFreeEntry(PPCIDP_EXTENSION ObjExt){
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 53 push ebx
00004 56 push esi
; 425 :
; 426 : PLINKED_LIST FirstLink;
; 427 : PLINKED_LIST ReturnLink = NULL;
; 428 : KIRQL LListIrql;
; 429 :
; 430 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00005 8b 75 08 mov esi, DWORD PTR _ObjExt$[ebp]
00008 57 push edi
00009 33 db xor ebx, ebx
0000b 8d 4e 74 lea ecx, DWORD PTR [esi+116]
0000e 89 4d 08 mov DWORD PTR 8+[ebp], ecx
00011 ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 431 : if(ObjExt->LLData.IsEmpty == FALSE) {
00017 38 5e 68 cmp BYTE PTR [esi+104], bl
0001a 75 1d jne SHORT $L8585
; 432 : FirstLink = ObjExt->LLData.CurrentLink;
0001c 8b 7e 70 mov edi, DWORD PTR [esi+112]
; 433 : do{
; 434 : ObjExt->LLData.CurrentLink = ObjExt->LLData.CurrentLink->Next;
0001f 8b 0f mov ecx, DWORD PTR [edi]
$L8700:
00021 89 4e 70 mov DWORD PTR [esi+112], ecx
; 435 : if(ObjExt->LLData.CurrentLink->Status == LL_AVAILABLE){
00024 80 79 08 03 cmp BYTE PTR [ecx+8], 3
00028 74 08 je SHORT $L8697
; 438 :
; 439 : //ObjExt->MemoryBase[0x1C65]++; //debug
; 440 :
; 441 : break;
; 442 : }
; 443 : } while(FirstLink != ObjExt->LLData.CurrentLink);
0002a 3b f9 cmp edi, ecx
0002c 74 0b je SHORT $L8585
; 433 : do{
; 434 : ObjExt->LLData.CurrentLink = ObjExt->LLData.CurrentLink->Next;
0002e 8b 09 mov ecx, DWORD PTR [ecx]
; 435 : if(ObjExt->LLData.CurrentLink->Status == LL_AVAILABLE){
00030 eb ef jmp SHORT $L8700
$L8697:
; 436 : ObjExt->LLData.CurrentLink->Status = LL_ACQUIRED;
00032 c6 41 08 01 mov BYTE PTR [ecx+8], 1
; 437 : ReturnLink = ObjExt->LLData.CurrentLink;
00036 8b 5e 70 mov ebx, DWORD PTR [esi+112]
$L8585:
; 444 : }
; 445 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
00039 8b 4d 08 mov ecx, DWORD PTR 8+[ebp]
0003c 8a d0 mov dl, al
0003e ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
; 446 :
; 447 : if(ReturnLink == NULL){
00044 85 db test ebx, ebx
00046 75 18 jne SHORT $L8591
; 448 : ReturnLink = ExAllocatePool(NonPagedPool, sizeof(LINKED_LIST));
00048 68 44 64 6b 20 push 543908932 ; 206b6444H
0004d 6a 14 push 20 ; 00000014H
0004f 53 push ebx
00050 ff 15 00 00 00
00 call DWORD PTR __imp__ExAllocatePoolWithTag@12
00056 8b d8 mov ebx, eax
; 449 : if(ReturnLink != NULL){
00058 85 db test ebx, ebx
0005a 74 04 je SHORT $L8591
; 450 : ReturnLink->Status = LL_NEW;
0005c 80 63 08 00 and BYTE PTR [ebx+8], 0
$L8591:
00060 5f pop edi
; 451 :
; 452 : //ObjExt->MemoryBase[0x1C64]++; //debug
; 453 :
; 454 : }
; 455 : }
; 456 :
; 457 : return ReturnLink;
00061 8b c3 mov eax, ebx
00063 5e pop esi
00064 5b pop ebx
; 458 : }
00065 5d pop ebp
00066 c2 04 00 ret 4
_GetFreeEntry@4 ENDP
_TEXT ENDS
PUBLIC _InsertEntry@8
; COMDAT _InsertEntry@8
_TEXT SEGMENT
_ObjExt$ = 8
_Entry$ = 12
_InsertEntry@8 PROC NEAR ; COMDAT
; 461 : BOOLEAN InsertEntry(PPCIDP_EXTENSION ObjExt, PLINKED_LIST Entry){
00000 53 push ebx
00001 56 push esi
; 462 :
; 463 : BOOLEAN Status = TRUE;
; 464 : PLINKED_LIST CurrentLink;
; 465 : KIRQL LListIrql;
; 466 :
; 467 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00002 8b 74 24 0c mov esi, DWORD PTR _ObjExt$[esp+4]
00006 57 push edi
00007 b3 01 mov bl, 1
00009 8d 7e 74 lea edi, DWORD PTR [esi+116]
0000c 8b cf mov ecx, edi
0000e ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 468 : if(Entry->Status == LL_NEW){
00014 8b 4c 24 14 mov ecx, DWORD PTR _Entry$[esp+8]
00018 8a d0 mov dl, al
0001a 8a 41 08 mov al, BYTE PTR [ecx+8]
0001d 84 c0 test al, al
0001f 75 31 jne SHORT $L8600
; 469 : Entry->Status = LL_INSERTED;
00021 c6 41 08 02 mov BYTE PTR [ecx+8], 2
; 470 : ObjExt->LLData.FreeMax++;
00025 66 ff 46 6c inc WORD PTR [esi+108]
; 471 : ObjExt->LLData.InsertedCount++;
00029 66 ff 46 6a inc WORD PTR [esi+106]
; 472 : if(ObjExt->LLData.IsEmpty == TRUE) {
0002d 38 5e 68 cmp BYTE PTR [esi+104], bl
00030 75 0d jne SHORT $L8601
; 473 : Entry->Prev = Entry;
00032 89 49 04 mov DWORD PTR [ecx+4], ecx
; 474 : Entry->Next = Entry;
00035 89 09 mov DWORD PTR [ecx], ecx
; 475 : ObjExt->LLData.CurrentLink = Entry;
; 476 : ObjExt->LLData.IsEmpty = FALSE;
00037 20 46 68 and BYTE PTR [esi+104], al
0003a 89 4e 70 mov DWORD PTR [esi+112], ecx
; 477 :
; 478 : //ObjExt->MemoryBase[0x1C66]++; //debug
; 479 : }
; 480 : else {
0003d eb 23 jmp SHORT $L8605
$L8601:
; 481 : CurrentLink = ObjExt->LLData.CurrentLink;
0003f 8b 76 70 mov esi, DWORD PTR [esi+112]
; 482 : Entry->Prev = CurrentLink;
00042 89 71 04 mov DWORD PTR [ecx+4], esi
; 483 : Entry->Next = CurrentLink->Next;
00045 8b 06 mov eax, DWORD PTR [esi]
00047 89 01 mov DWORD PTR [ecx], eax
; 484 :
; 485 : CurrentLink->Next->Prev = Entry;
00049 8b 06 mov eax, DWORD PTR [esi]
0004b 89 48 04 mov DWORD PTR [eax+4], ecx
; 486 : CurrentLink->Next = Entry;
0004e 89 0e mov DWORD PTR [esi], ecx
; 487 :
; 488 : //ObjExt->MemoryBase[0x1C67]++; //debug
; 489 : }
; 490 : }
; 491 : else if(Entry->Status == LL_ACQUIRED){
00050 eb 10 jmp SHORT $L8605
$L8600:
00052 3c 01 cmp al, 1
00054 75 0a jne SHORT $L8604
; 492 : Entry->Status = LL_INSERTED;
00056 c6 41 08 02 mov BYTE PTR [ecx+8], 2
; 493 : ObjExt->LLData.InsertedCount++;
0005a 66 ff 46 6a inc WORD PTR [esi+106]
; 494 :
; 495 : //ObjExt->MemoryBase[0x1C68]++; //debug
; 496 : }
; 497 : else
0005e eb 02 jmp SHORT $L8605
$L8604:
; 498 : Status = FALSE;
00060 32 db xor bl, bl
$L8605:
; 499 :
; 500 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
00062 8b cf mov ecx, edi
00064 ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
0006a 5f pop edi
; 501 : //ObjExt->MemoryBase[0x1C5A] = ObjExt->LLData.FreeMax;//debug
; 502 : //ObjExt->MemoryBase[0x1C57] = ObjExt->LLData.InsertedCount;//debug
; 503 :
; 504 : return Status;
0006b 8a c3 mov al, bl
0006d 5e pop esi
0006e 5b pop ebx
; 505 : }
0006f c2 08 00 ret 8
_InsertEntry@8 ENDP
_TEXT ENDS
EXTRN __imp__ExFreePool@4:NEAR
; COMDAT _DeleteAllEntries@4
_TEXT SEGMENT
_ObjExt$ = 8
_DeleteAllEntries@4 PROC NEAR ; COMDAT
; 508 : BOOLEAN DeleteAllEntries(PPCIDP_EXTENSION ObjExt){
00000 56 push esi
; 509 :
; 510 : PLINKED_LIST CurrentLink = ObjExt->LLData.CurrentLink;
00001 8b 74 24 08 mov esi, DWORD PTR _ObjExt$[esp]
00005 57 push edi
00006 8b 7e 70 mov edi, DWORD PTR [esi+112]
$L8709:
; 511 :
; 512 : while(ObjExt->LLData.IsEmpty == FALSE) {
00009 80 7e 68 00 cmp BYTE PTR [esi+104], 0
0000d 75 35 jne SHORT $L8612
; 513 :
; 514 : if(CurrentLink->Status == LL_INSERTED)
0000f 80 7f 08 02 cmp BYTE PTR [edi+8], 2
00013 75 04 jne SHORT $L8613
; 515 : ObjExt->LLData.InsertedCount--;
00015 66 ff 4e 6a dec WORD PTR [esi+106]
$L8613:
; 516 :
; 517 : if(CurrentLink->Next == CurrentLink) {
00019 8b 07 mov eax, DWORD PTR [edi]
0001b 3b c7 cmp eax, edi
0001d 75 06 jne SHORT $L8614
; 518 : ObjExt->LLData.IsEmpty = TRUE;
0001f c6 46 68 01 mov BYTE PTR [esi+104], 1
; 519 : }
; 520 : else {
00023 eb 10 jmp SHORT $L8615
$L8614:
; 521 : CurrentLink->Prev->Next = CurrentLink->Next;
00025 8b 4f 04 mov ecx, DWORD PTR [edi+4]
00028 89 01 mov DWORD PTR [ecx], eax
; 522 : CurrentLink->Next->Prev = CurrentLink->Prev;
0002a 8b 07 mov eax, DWORD PTR [edi]
0002c 8b 4f 04 mov ecx, DWORD PTR [edi+4]
0002f 89 48 04 mov DWORD PTR [eax+4], ecx
; 523 : CurrentLink = CurrentLink->Prev;
00032 8b 7f 04 mov edi, DWORD PTR [edi+4]
$L8615:
; 524 : }
; 525 : ObjExt->LLData.FreeMax--;
; 526 : //ObjExt->MemoryBase[0x1C5A] = ObjExt->LLData.FreeMax;//debug
; 527 : //ObjExt->MemoryBase[0x1C57] = ObjExt->LLData.InsertedCount;//debug
; 528 :
; 529 : ExFreePool(ObjExt->LLData.CurrentLink);
00035 ff 76 70 push DWORD PTR [esi+112]
00038 66 ff 4e 6c dec WORD PTR [esi+108]
0003c ff 15 00 00 00
00 call DWORD PTR __imp__ExFreePool@4
00042 eb c5 jmp SHORT $L8709
$L8612:
; 530 : }
; 531 :
; 532 : return(!ObjExt->LLData.IsEmpty);
00044 33 c0 xor eax, eax
00046 5f pop edi
00047 38 46 68 cmp BYTE PTR [esi+104], al
0004a 5e pop esi
0004b 0f 94 c0 sete al
; 533 : }
0004e c2 04 00 ret 4
_DeleteAllEntries@4 ENDP
_TEXT ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -