天天看點

驅動開發(4)核心中的記憶體配置設定和錯誤碼

本博文由CSDN部落客zuishikonghuan所作,版權歸zuishikonghuan所有,轉載請注明出處:http://blog.csdn.net/zuishikonghuan/article/details/49717679

在驅動開發中,我們不應該使用C/C++運作時函數中的malloc或者calloc函數配置設定記憶體,更不應該使用new關鍵字,因為核心中的記憶體配置設定需要特殊處理。

在應用程式中,每個應用都有2G的虛拟記憶體,是以記憶體并不緊張,而所有的驅動程式共用核心模式的2G虛拟記憶體,是以核心中的資源非常寶貴,應該盡量節省。

更可怕的是記憶體洩露,應用程式即使發生了記憶體洩露,在其結束時作業系統可以通過程序上下文中的虛拟記憶體頁面映射關系,釋放這一部分虛拟記憶體對應的實體記憶體,但是驅動程式如果申請虛拟記憶體後不釋放,結果就是在系統重新啟動之前這一部分位址所在的記憶體頁面一直處于“被申請未釋放”的狀态,想想那種情景吧。如果驅動程式申請的虛拟記憶體位于非頁記憶體池,那麼是不能交換到磁盤檔案中的,是以這一部分虛拟記憶體對應的實體記憶體也一直無法空閑出來,後果更加嚴重。

核心中申請虛拟記憶體的函數一般有這麼幾個:ExAllocatePool(WithTag)、ExAllocatePoolWithQuota(Tag)、ExFreePool(WithTag),我們來看看這兩個ExAllocatePool(申請核心虛拟記憶體)和ExFreePool(釋放核心虛拟記憶體),其他的都差不多,具體可以看MSDN。

PVOID ExAllocatePool(
  _In_ POOL_TYPE PoolType,
  _In_ SIZE_T    NumberOfBytes
);
           

PoolType:指定的池記憶體配置設定的類型。請參閱 POOL_TYPE。

常用的有: 

NonPagedPool:從非分頁記憶體池中配置設定虛拟記憶體 

PagedPool:從分頁記憶體池中配置設定虛拟記憶體 

NumberOfBytes:指定要配置設定的位元組數。

傳回值:成功傳回配置設定的記憶體指針,失敗傳回NULL。

VOID ExFreePool(
  _In_ PVOID P
);
           

P:指定要釋放的記憶體塊的位址。

還有一點時間,說說核心中的錯誤碼NTSTATUS吧

32位系統下,NTSTATUS是unsigned long類型,核心中的函數的傳回值以及我們以後處理派遣函數等等都會用到。

其中,STATUS_SUCCESS表示成功 ,可以用NT_SUCCESS宏判斷是否是STATUS_SUCCESS 。

自然還有很多其他的錯誤碼,比如

STATUS_UNSUCCESS(不成功)

STATUS_ACCESS_DENIED(通路被拒絕)

STATUS_IN_PAGE_ERROR(頁故障)

等等