experiment : 封装 xxPagedLookasideList API
来源:互联网 发布:pyenv 切换python版本 编辑:程序博客网 时间:2024/05/17 04:25
LookasideList 分为分页和非分页操作, 下面列出. API都不同, 用起来不方便, 不方便记忆, 看着眼晕~
分页API
ExInitializePagedLookasideList
ExAllocateFromPagedLookasideList
ExFreeToPagedLookasideList
ExDeletePagedLookasideList
非分页API
ExInitializeNPagedLookasideList
ExAllocateFromNPagedLookasideList
ExFreeToNPagedLookasideList
ExDeleteNPagedLookasideList
封装了4个API, 看着清爽.
/// @fn LookasideListInit/// @brief 初始化LookAsideList/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param size_t nBufSize, 每次从LookAsideList中可以分配的内存大小/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListInit(BOOLEAN bpage, void ** ppLookAsideList, size_t nBufSize);/// @fn LookasideListAllocate/// @param 从LookAsideList中分配一块内存/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param void ** ppNodeOut, 传出分配后的内存2级指针/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListAllocate(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut);/// @fn LookasideListFree/// @param 从LookAsideList中释放一块内存/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param void ** ppNodeOut, 曾经分配好的的内存2级指针/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListFree(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut);/// @fn LookasideListDelete/// @brief 释放LookasideList/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListDelete(BOOLEAN bpage, void ** ppLookAsideList);
测试输出
>> DriverEntry on DriverEntry, KeGetCurrentIrql() = 0 >> testLookasideListPage, KeGetCurrentIrql() = 0 testTag[0] testTag[1] testTag[2] << testLookasideListPage >> testLookasideListNPage, KeGetCurrentIrql() = 0 testTag[0] testTag[1] testTag[2] << testLookasideListNPage << DriverEntry
测试程序
/// the code on DriverEntry testLookasideListPage(); testLookasideListNPage();
void testLookasideListPage(){ size_t nPos = 0; PTEST testTag[NMAX]; PAGED_LOOKASIDE_LIST PageLookasideList; PAGED_LOOKASIDE_LIST * pPageLookasideList = &PageLookasideList; DbgPrint(">> testLookasideListPage, KeGetCurrentIrql() = %d\r\n", KeGetCurrentIrql()); PAGED_CODE(); /// 初始化 LookasideList LookasideListInit(TRUE, &pPageLookasideList, sizeof(TEST)); /// 从 exp_LookasideList 请求内存 for (nPos = 0; nPos < NMAX; nPos++) { testTag[nPos] = NULL; if (!NT_SUCCESS(LookasideListAllocate(TRUE, pPageLookasideList, &testTag[nPos]))) { DbgPrint("LookasideListAllocate(TRUE) error, nPos = %d\r\n", nPos); } } /// use testTag do something ... for (nPos = 0; nPos < NMAX; nPos++) { if (NULL != testTag[nPos]) { RtlStringCchPrintfW(testTag[nPos]->cMsg, sizeof(testTag[nPos]->cMsg) / sizeof(wchar_t), L"testTag[%d]", (ULONG)nPos); DbgPrint("%ws\r\n", testTag[nPos]->cMsg); } } /// 释放 exp_LookasideList 先前分配好的内存 for (nPos = 0; nPos < NMAX; nPos++) { if (!NT_SUCCESS(LookasideListFree(TRUE, pPageLookasideList, &testTag[nPos]))) { DbgPrint("LookasideListFree(TRUE) error, nPos = %d\r\n", nPos); } testTag[nPos] = NULL; } /// 反初始化 LookasideList LookasideListDelete(TRUE, &pPageLookasideList); DbgPrint("<< testLookasideListPage\r\n");}VOID ThreadTestLookasideListPage(IN PVOID pContext){}void testLookasideListNPage(){ size_t nPos = 0; PTEST testTag[NMAX]; NPAGED_LOOKASIDE_LIST NPageLookasideList; NPAGED_LOOKASIDE_LIST * pNPageLookasideList = &NPageLookasideList; DbgPrint(">> testLookasideListNPage, KeGetCurrentIrql() = %d\r\n", KeGetCurrentIrql()); /// 初始化 LookasideList LookasideListInit(FALSE, &pNPageLookasideList, sizeof(TEST)); /// 从 exp_LookasideList 请求内存 for (nPos = 0; nPos < NMAX; nPos++) { testTag[nPos] = NULL; if (!NT_SUCCESS(LookasideListAllocate(FALSE, pNPageLookasideList, &testTag[nPos]))) { DbgPrint("LookasideListAllocate(TRUE) error, nPos = %d\r\n", nPos); } } /// use testTag do something ... for (nPos = 0; nPos < NMAX; nPos++) { if (NULL != testTag[nPos]) { RtlStringCchPrintfW(testTag[nPos]->cMsg, sizeof(testTag[nPos]->cMsg) / sizeof(wchar_t), L"testTag[%d]", (ULONG)nPos); DbgPrint("%ws\r\n", testTag[nPos]->cMsg); } } /// 释放 exp_LookasideList 先前分配好的内存 for (nPos = 0; nPos < NMAX; nPos++) { if (!NT_SUCCESS(LookasideListFree( FALSE, pNPageLookasideList, &testTag[nPos]))) { DbgPrint("LookasideListFree(TRUE) error, nPos = %d\r\n", nPos); } testTag[nPos] = NULL; } /// 反初始化 LookasideList LookasideListDelete(FALSE, &pNPageLookasideList); DbgPrint("<< testLookasideListNPage\r\n");}
/// @file LookasideListOpt.h/// @brief LookasideList 封装#ifndef __LOOK_A_SIDE_LIST_OPT_H__#define __LOOK_A_SIDE_LIST_OPT_H__#include <ntddk.h>#include <WINDEF.H>/// operate LookasideList#define LOOK_A_SIDE_LIST_POOL_TAG_NAME 'lasl' ///< 内存分配标记/// @fn LookasideListInit/// @brief 初始化LookAsideList/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param size_t nBufSize, 每次从LookAsideList中可以分配的内存大小/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListInit(BOOLEAN bpage, void ** ppLookAsideList, size_t nBufSize);/// @fn LookasideListAllocate/// @param 从LookAsideList中分配一块内存/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param void ** ppNodeOut, 传出分配后的内存2级指针/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListAllocate(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut);/// @fn LookasideListFree/// @param 从LookAsideList中释放一块内存/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @param void ** ppLookAsideList, ppLookAsideList2级指针, 函数内部用到的/// 时候强转类型/// @param void ** ppNodeOut, 曾经分配好的的内存2级指针/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListFree(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut);/// @fn LookasideListDelete/// @brief 释放LookasideList/// @param BOOLEAN bpage, TRUE = 分页内存, FALSE = 非分页内存/// @return NTSTATUS, 调用方使用 NT_SUCCESS 宏来判断是否成功NTSTATUS LookasideListDelete(BOOLEAN bpage, void ** ppLookAsideList);/// 内部函数NTSTATUS LookasideListInit_Page(void ** ppLookAsideList, size_t nBufSize);NTSTATUS LookasideListInit_NPage(void ** ppLookAsideList, size_t nBufSize);NTSTATUS LookasideListAllocate_Page(void * pLookAsideList, void ** ppNodeOut);NTSTATUS LookasideListAllocate_NPage(void * pLookAsideList, void ** ppNodeOut);NTSTATUS LookasideListFree_Page(void * pLookAsideList, void ** ppNodeOut);NTSTATUS LookasideListFree_NPage(void * pLookAsideList, void ** ppNodeOut);NTSTATUS LookasideListDelete_Page(void ** ppLookAsideList);NTSTATUS LookasideListDelete_NPage(void ** ppLookAsideList);#endif // #ifndef __LOOK_A_SIDE_LIST_OPT_H__
/// @file LookasideListOpt.c/// @brief ...#include "LookasideListOpt.h"NTSTATUS LookasideListInit(BOOLEAN bpage, void ** ppLookAsideList, size_t nBufSize){ if (NULL == ppLookAsideList) return STATUS_INVALID_PARAMETER; if (bpage) return LookasideListInit_Page(ppLookAsideList, nBufSize); else return LookasideListInit_NPage(ppLookAsideList, nBufSize);}NTSTATUS LookasideListAllocate(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut){ if ((NULL == pLookAsideList) || (NULL == ppNodeOut)) return STATUS_INVALID_PARAMETER; if (bpage) return LookasideListAllocate_Page(pLookAsideList, ppNodeOut); else return LookasideListAllocate_NPage(pLookAsideList, ppNodeOut);}NTSTATUS LookasideListFree(BOOLEAN bpage, void * pLookAsideList, void ** ppNodeOut){ if ((NULL == pLookAsideList) || (NULL == ppNodeOut) || (NULL == *ppNodeOut)) return STATUS_INVALID_PARAMETER; if (bpage) return LookasideListFree_Page(pLookAsideList, ppNodeOut); else return LookasideListFree_NPage(pLookAsideList, ppNodeOut);}NTSTATUS LookasideListDelete(BOOLEAN bpage, void ** ppLookAsideList){ if ((NULL == ppLookAsideList) || (NULL == *ppLookAsideList)) return STATUS_INVALID_PARAMETER; if (bpage) return LookasideListDelete_Page(ppLookAsideList); else return LookasideListDelete_NPage(ppLookAsideList);}///////////////////////////////////////////////////////////////////////////// 内部函数//////////////////////////////////////////////////////////////////////////NTSTATUS LookasideListInit_Page(void ** ppLookAsideList, size_t nBufSize){ PPAGED_LOOKASIDE_LIST pLookaside = NULL;; NT_ASSERT(NULL != ppLookAsideList); NT_ASSERT(NULL != *ppLookAsideList); PAGED_CODE(); pLookaside = *((PAGED_LOOKASIDE_LIST **)ppLookAsideList); ExInitializePagedLookasideList(pLookaside, NULL, NULL, 0, nBufSize, LOOK_A_SIDE_LIST_POOL_TAG_NAME, 0 ); *ppLookAsideList = pLookaside; return (NULL != pLookaside) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;}NTSTATUS LookasideListInit_NPage(void ** ppLookAsideList, size_t nBufSize){ PNPAGED_LOOKASIDE_LIST pLookaside = NULL; NT_ASSERT(NULL != ppLookAsideList); NT_ASSERT(NULL != *ppLookAsideList); pLookaside = *((NPAGED_LOOKASIDE_LIST **)ppLookAsideList); ExInitializeNPagedLookasideList(pLookaside, NULL, NULL, 0, nBufSize, LOOK_A_SIDE_LIST_POOL_TAG_NAME, 0 ); *ppLookAsideList = pLookaside; return (NULL != pLookaside) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;}NTSTATUS LookasideListAllocate_Page(void * pLookAsideList, void ** ppNodeOut){ PAGED_CODE(); *ppNodeOut = ExAllocateFromPagedLookasideList( (PPAGED_LOOKASIDE_LIST)pLookAsideList); return (NULL != *ppNodeOut) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;}NTSTATUS LookasideListAllocate_NPage(void * pLookAsideList, void ** ppNodeOut){ *ppNodeOut = ExAllocateFromNPagedLookasideList( (PNPAGED_LOOKASIDE_LIST)pLookAsideList); return (NULL != *ppNodeOut) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;}NTSTATUS LookasideListFree_Page(void * pLookAsideList, void ** ppNodeOut){ PAGED_CODE(); ExFreeToPagedLookasideList((PPAGED_LOOKASIDE_LIST)pLookAsideList, *ppNodeOut); *ppNodeOut = NULL; return STATUS_SUCCESS;}NTSTATUS LookasideListFree_NPage(void * pLookAsideList, void ** ppNodeOut){ ExFreeToNPagedLookasideList((PNPAGED_LOOKASIDE_LIST)pLookAsideList, *ppNodeOut); *ppNodeOut = NULL; return STATUS_SUCCESS;}NTSTATUS LookasideListDelete_Page(void ** ppLookAsideList){ PPAGED_LOOKASIDE_LIST pLookAsideList = *ppLookAsideList; PAGED_CODE(); ExDeletePagedLookasideList(pLookAsideList); *ppLookAsideList = NULL; return STATUS_SUCCESS;}NTSTATUS LookasideListDelete_NPage(void ** ppLookAsideList){ PNPAGED_LOOKASIDE_LIST pLookAsideList = *ppLookAsideList; ExDeleteNPagedLookasideList(pLookAsideList); *ppLookAsideList = NULL; return STATUS_SUCCESS;}
- experiment : 封装 xxPagedLookasideList API
- experiment
- Experiment
- experiment
- experiment: view ssdt's api on windbg
- WinSocket API封装
- 封装delphi Hook Api
- API常用函数封装
- 数据库API的封装
- C# API 封装类
- C++ API封装
- WinSocket API封装
- windows socket api 封装
- MFC封装API
- Robotium API 二次封装
- Robotium API 二次封装
- web api封装分页
- windows API 封装
- MacOSX WebView 对 iframe 设置cookie 有可能失败
- Hibernate3注解
- BZOJ 2322: [BeiJing2011]梦想封印
- 简单手机Wifi连接聊天
- 有关.net 开发程序第一次慢再运行快的问题及解决办法
- experiment : 封装 xxPagedLookasideList API
- MFCC研究(一)之语音信号的同态解卷积【已补全,20130602】
- 设计抽象类并派生新类
- 从黑名单中剔除白名单
- BUAA_倒排字典
- 一个问题阻止WINDOWS正确检查此机器的许可证,错误代码为0x8007000
- 第一课,开篇
- hdu 2156 分数矩阵
- Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 7