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

📄 pcidpprivate.cod

📁 一个amccs5933芯片的驱动程序开发源程序和部分文档
💻 COD
📖 第 1 页 / 共 2 页
字号:
	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 + -