📄 pcidpprivate.cod
字号:
TITLE I:\PCI-DP\KERNEL\KERNELNT\pcidpprivate.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
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT _RtlConvertLongToLargeInteger@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _GetNextEntry@16
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _PutBackEntry@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _FreeEntry@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _GetFreeEntry@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _InsertEntry@8
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _DeleteAllEntries@4
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC _GetNextEntry@16
EXTRN __imp_@KfAcquireSpinLock@4:NEAR
EXTRN __imp_@KfReleaseSpinLock@8:NEAR
; COMDAT _GetNextEntry@16
_TEXT SEGMENT
_ObjExt$ = 8
_FirstLink$ = 12
_CurrentLink$ = 16
_Entry$ = 20
_Status$ = -1
_LListIrql$ = 11
_GetNextEntry@16 PROC NEAR ; COMDAT
; 32 : ){
00000 55 push ebp
00001 8b ec mov ebp, esp
00003 51 push ecx
00004 53 push ebx
; 33 :
; 34 : BOOLEAN Status = FALSE;
00005 80 65 ff 00 and BYTE PTR _Status$[ebp], 0
00009 56 push esi
; 35 : KIRQL LListIrql;
; 36 : pLINKED_LIST CurrentLnk;
; 37 :
; 38 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
0000a 8b 75 08 mov esi, DWORD PTR _ObjExt$[ebp]
0000d 57 push edi
0000e 8d 9e 80 00 00
00 lea ebx, DWORD PTR [esi+128]
00014 8b cb mov ecx, ebx
00016 ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 39 :
; 40 : if(*FirstLink == NULL){
0001c 8b 7d 0c mov edi, DWORD PTR _FirstLink$[ebp]
0001f 88 45 0b mov BYTE PTR _LListIrql$[ebp], al
00022 8b 45 10 mov eax, DWORD PTR _CurrentLink$[ebp]
00025 83 3f 00 cmp DWORD PTR [edi], 0
00028 75 2a jne SHORT $L5909
; 41 : if(ObjExt->LLData.InsertedCount > 0){
0002a 66 83 7e 76 00 cmp WORD PTR [esi+118], 0
0002f 76 23 jbe SHORT $L5909
; 42 : *FirstLink = ObjExt->LLData.CurrentLink;
00031 8b 4e 7c mov ecx, DWORD PTR [esi+124]
00034 89 0f mov DWORD PTR [edi], ecx
; 43 : *CurrentLink = *FirstLink;
00036 89 08 mov DWORD PTR [eax], ecx
; 44 : CurrentLnk = *CurrentLink;
; 45 : if(CurrentLnk->Status == LL_INSERTED){
00038 80 79 08 02 cmp BYTE PTR [ecx+8], 2
0003c 75 16 jne SHORT $L5909
; 46 : CurrentLnk->Status = LL_CHECKEDOUT;
; 47 : ObjExt->LLData.InsertedCount--;
; 48 : *Entry = &(CurrentLnk->RegisteredInterrupt);
0003e 8b 45 14 mov eax, DWORD PTR _Entry$[ebp]
00041 c6 41 08 04 mov BYTE PTR [ecx+8], 4
00045 66 ff 4e 76 dec WORD PTR [esi+118]
00049 83 c1 0c add ecx, 12 ; 0000000cH
0004c 89 08 mov DWORD PTR [eax], ecx
; 49 : Status = TRUE;
0004e c6 45 ff 01 mov BYTE PTR _Status$[ebp], 1
; 50 : goto GetNextExit;
00052 eb 2a jmp SHORT $GetNextExit$5910
$L5909:
; 51 : }
; 52 : }
; 53 : }
; 54 :
; 55 : if(*FirstLink != NULL){
00054 8b 3f mov edi, DWORD PTR [edi]
00056 85 ff test edi, edi
00058 74 24 je SHORT $GetNextExit$5910
; 56 : CurrentLnk = *CurrentLink;
0005a 8b 08 mov ecx, DWORD PTR [eax]
$L5997:
; 57 : CurrentLnk = CurrentLnk->Next;
0005c 8b 09 mov ecx, DWORD PTR [ecx]
; 58 : while(CurrentLnk != *FirstLink){
0005e 3b cf cmp ecx, edi
00060 74 1a je SHORT $L5915
; 59 : if(CurrentLnk->Status == LL_INSERTED){
00062 80 79 08 02 cmp BYTE PTR [ecx+8], 2
00066 75 f4 jne SHORT $L5997
; 60 : CurrentLnk->Status = LL_CHECKEDOUT;
00068 c6 41 08 04 mov BYTE PTR [ecx+8], 4
; 61 : ObjExt->LLData.InsertedCount--;
0006c 66 ff 4e 76 dec WORD PTR [esi+118]
; 62 : *Entry = &(CurrentLnk->RegisteredInterrupt);
00070 8b 75 14 mov esi, DWORD PTR _Entry$[ebp]
00073 8d 51 0c lea edx, DWORD PTR [ecx+12]
; 63 : Status = TRUE;
00076 c6 45 ff 01 mov BYTE PTR _Status$[ebp], 1
0007a 89 16 mov DWORD PTR [esi], edx
$L5915:
; 64 : break;
; 65 : }
; 66 : CurrentLnk = CurrentLnk->Next;
; 67 : }
; 68 : *CurrentLink = CurrentLnk;
0007c 89 08 mov DWORD PTR [eax], ecx
$GetNextExit$5910:
; 69 : }
; 70 :
; 71 : GetNextExit:
; 72 : //ObjExt->MemoryBase[0x1C57] = ObjExt->LLData.InsertedCount; //debug
; 73 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
0007e 8a 55 0b mov dl, BYTE PTR _LListIrql$[ebp]
00081 8b cb mov ecx, ebx
00083 ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
; 74 :
; 75 : return Status;
00089 8a 45 ff mov al, BYTE PTR _Status$[ebp]
0008c 5f pop edi
0008d 5e pop esi
0008e 5b pop ebx
; 76 : }
0008f c9 leave
00090 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
; 79 : BOOLEAN PutBackEntry(pPCIDP_EXTENSION ObjExt, pLINKED_LIST CurrentLink){
00000 53 push ebx
00001 56 push esi
; 80 :
; 81 : BOOLEAN Status;
; 82 : KIRQL LListIrql;
; 83 :
; 84 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00002 8b 74 24 0c mov esi, DWORD PTR _ObjExt$[esp+4]
00006 57 push edi
00007 8d be 80 00 00
00 lea edi, DWORD PTR [esi+128]
0000d 8b cf mov ecx, edi
0000f ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 85 : if(CurrentLink->Status == LL_CHECKEDOUT){
00015 8b 4c 24 14 mov ecx, DWORD PTR _CurrentLink$[esp+8]
00019 80 79 08 04 cmp BYTE PTR [ecx+8], 4
0001d 75 0c jne SHORT $L5924
; 86 : CurrentLink->Status = LL_INSERTED;
0001f c6 41 08 02 mov BYTE PTR [ecx+8], 2
; 87 : ObjExt->LLData.InsertedCount++;
00023 66 ff 46 76 inc WORD PTR [esi+118]
; 88 : Status = TRUE;
00027 b3 01 mov bl, 1
; 89 : }
; 90 : else
00029 eb 02 jmp SHORT $L5925
$L5924:
; 91 : Status = FALSE;
0002b 32 db xor bl, bl
$L5925:
; 92 :
; 93 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
0002d 8a d0 mov dl, al
0002f 8b cf mov ecx, edi
00031 ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
00037 5f pop edi
; 94 : //ObjExt->MemoryBase[0x1C57] = ObjExt->LLData.InsertedCount;//debug
; 95 : //ObjExt->MemoryBase[0x1C58]++;//debug
; 96 : return Status;
00038 8a c3 mov al, bl
0003a 5e pop esi
0003b 5b pop ebx
; 97 : }
0003c 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
; 100 : BOOLEAN FreeEntry(pPCIDP_EXTENSION ObjExt, pLINKED_LIST CurrentLink){
00000 53 push ebx
00001 56 push esi
; 101 :
; 102 : BOOLEAN Status;
; 103 : KIRQL LListIrql;
; 104 :
; 105 : KeAcquireSpinLock(&ObjExt->LListSpin, &LListIrql);
00002 8b 74 24 0c mov esi, DWORD PTR _ObjExt$[esp+4]
00006 57 push edi
00007 8d be 80 00 00
00 lea edi, DWORD PTR [esi+128]
0000d 8b cf mov ecx, edi
0000f ff 15 00 00 00
00 call DWORD PTR __imp_@KfAcquireSpinLock@4
; 106 : if(CurrentLink->Status == LL_CHECKEDOUT || CurrentLink->Status == LL_ACQUIRED){
00015 8b 4c 24 14 mov ecx, DWORD PTR _CurrentLink$[esp+8]
00019 8a 59 08 mov bl, BYTE PTR [ecx+8]
0001c 80 fb 04 cmp bl, 4
0001f 74 09 je SHORT $L5934
00021 80 fb 01 cmp bl, 1
00024 74 04 je SHORT $L5934
; 110 : }
; 111 : else
; 112 : Status = FALSE;
00026 32 db xor bl, bl
00028 eb 0c jmp SHORT $L5935
$L5934:
; 107 : CurrentLink->Status = LL_AVAILABLE;
0002a c6 41 08 03 mov BYTE PTR [ecx+8], 3
; 108 : ObjExt->LLData.CurrentLink = CurrentLink->Prev;
0002e 8b 49 04 mov ecx, DWORD PTR [ecx+4]
00031 89 4e 7c mov DWORD PTR [esi+124], ecx
; 109 : Status = TRUE;
00034 b3 01 mov bl, 1
$L5935:
; 113 :
; 114 : KeReleaseSpinLock(&ObjExt->LListSpin, LListIrql);
00036 8a d0 mov dl, al
00038 8b cf mov ecx, edi
0003a ff 15 00 00 00
00 call DWORD PTR __imp_@KfReleaseSpinLock@8
00040 5f pop edi
; 115 : //ObjExt->MemoryBase[0x1C59]++;//debug
; 116 :
; 117 : return Status;
00041 8a c3 mov al, bl
00043 5e pop esi
00044 5b pop ebx
; 118 : }
00045 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
; 121 : pLINKED_LIST GetFreeEntry(pPCIDP_EXTENSION ObjExt){
00000 55 push ebp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -