[Windows驱动开发](四)内存管理
1. 物理内存概念(Physical Memory Address)
- //
- #define PAGEDCODE code_seg("PAGE")
- #define LOCKEDCODE code_seg()
- #define INITCODE code_seg("INIT")
- #define PAGEDDATA code_seg("PAGE")
- #define LOCKEDDATA code_seg()
- #define INITDATA code_seg("INIT")
- //
- //
- #pragma PAGEDCODE
- VOID SomeFunction()
- {
- PAGED_CODE();
- // Do any other things ....
- }
- //
- //
- #pragma LOCKEDCODE
- VOID SomeFunction()
- {
- // Do any other things ....
- }
- //
- //
- #pragma INITCODE
- extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
- {
- // Do any other things ....
- }
- //
- //
- NTKERNELAPI
- PVOID
- ExAllocatePool(
- __drv_strictTypeMatch(__drv_typeExpr) __in POOL_TYPE PoolType,
- __in SIZE_T NumberOfBytes
- );
- NTKERNELAPI
- PVOID
- NTAPI
- ExAllocatePoolWithTag(
- __in __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
- __in SIZE_T NumberOfBytes,
- __in ULONG Tag
- );
- NTKERNELAPI
- PVOID
- ExAllocatePoolWithQuota(
- __drv_strictTypeMatch(__drv_typeExpr) __in POOL_TYPE PoolType,
- __in SIZE_T NumberOfBytes
- );
- NTKERNELAPI
- PVOID
- ExAllocatePoolWithQuotaTag(
- __in __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
- __in SIZE_T NumberOfBytes,
- __in ULONG Tag
- );
- //
- //
- NTKERNELAPI
- VOID
- ExFreePoolWithTag(
- __in __drv_freesMem(Mem) PVOID P, // 要释放的地址
- __in ULONG Tag
- );
- #define ExFreePool(a) ExFreePoolWithTag(a,0)
- //
- // WDK中定义的双向链表数据结构
- //
- // Doubly linked list structure. Can be used as either a list head, or
- // as link words.
- //
- typedef struct _LIST_ENTRY {
- struct _LIST_ENTRY *Flink;
- struct _LIST_ENTRY *Blink;
- } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
- //
- // Singly linked list structure. Can be used as either a list head, or
- // as link words.
- //
- typedef struct _SINGLE_LIST_ENTRY {
- struct _SINGLE_LIST_ENTRY *Next;
- } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
- //
- //
- typedef struct _MYDATASTRUCT{
- // List Entry要作为_MYDATASTRUCT结构体的一部分
- LIST_ENTRY ListEntry;
- // 自己定义的数据
- ULONG x;
- ULONG y;
- };
- //
- //
- InsertHeadList(&head, &mydata->ListEntry);
- //
- //
- InsertTailList(&head, &mydata->ListEntry);
- //
- //
- PLIST_ENTRY pEntry = RemoveHeadList(&head);
- PLIST_ENTRY pEntry = RemoveTailList(&tail);
- //
- //
- PLIST_ENTRY pEntry = RemoveHeadList(&head);
- PIRP pIrp = CONTAINING_RECORD(pEntry, MYDATASTRUCT, ListEntry);
- //
三、 Lookaside结构
- // WDK提供的Lookaside初始化函数
- VOID ExInitializeNPagedLookasideList(
- IN PNPAGED_LOOKASIDE_LIST Lookaside,
- IN PALLOCATE_FUNCTION Allocate OPTIONAL,
- IN PFREE_FUNCTION Free OPTIONAL,
- IN ULONG Flags,
- IN SIZE_T Size,
- IN ULONG Tag,
- IN USHORT Depth);
- VOID ExInitializePagedLookasideList(
- IN PPAGED_LOOKASIDE_LIST Lookaside,
- IN PALLOCATE_FUNCTION Allocate OPTIONAL,
- IN PFREE_FUNCTION Free OPTIONAL,
- IN ULONG Flags,
- IN SIZE_T Size,
- IN ULONG Tag,
- IN USHORT Depth);
- //
- //
- VOID
- ExFreeToNPagedLookasideList(
- IN PNPAGED_LOOKASIDE_LIST Lookaside,
- IN PVOID Entry);
- VOID
- ExFreeToPagedLookasideList(
- IN PPAGED_LOOKASIDE_LIST Lookaside,
- IN PVOID Entry);
- //
- //
- VOID ExDeleteNPagedLookasideList(IN PNPAGED_LOOKASIDE_LIST Lookaside);
- VOID ExDeletePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside);
- //
[Windows驱动开发](四)内存管理相关推荐
- Windows CE设备驱动开发之电源管理
4.7电源管理 电源管理模块管理设备电源,从而全面改进操作系统的电源使用效率:它所有设备的电源使用,同时能与不支持电源管理的应用程序及驱动程序共存. 使用电源管理可以有效的减少目标设备的电源消耗,同时 ...
- 电源管理 第二部分 ---- Windows CE设备驱动开发之电源管理
Windows CE设备驱动开发之电源管理 第二部分 4.7.2.电源状态 电源管理器期望所有被管理的设备能支持一个或多个设备电源状态.设备电源状态的数量是有限的.设备必须通知电源管理器其功 ...
- Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)
Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...
- 《Windows驱动开发技术详解》学习笔记
Abstract 如果推荐 Windows 驱动开发的入门书,我强烈推荐<Windows驱动开发技术详解>.但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文 ...
- Windows驱动开发书籍简介
分享到 一键分享 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 首页 我的主页 相册 广 ...
- c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]
Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...
- Windows驱动开发入门系列教程
从事驱动开发也有一段时间了,从最初的无头苍蝇到懵懵懂懂,到入门,直至今天,感觉一路走来,走了不少的弯路,只因为没有人引导.前几天,一个朋友问到我怎么学习Windows驱动开发,我就想到把我学习Wind ...
- Windows驱动开发学习笔记(三)—— 内核空间内核模块
Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...
- Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础
Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...
- Windows驱动开发WDM (1) - 基本结构
陆陆续续做过一些驱动的开发,但是一直以来都没有系统的学习过.这次重新阅读<windows驱动开发技术详解>(张帆,史彩成等编著),写博客记录一下,用以加深自己对驱动的理解. 驱动对象(DR ...
最新文章
- 【2016-09-27-DP小练】
- 基于redis 内存数据库简单使用
- 双11成交多少和我无关,但这个魔性MV真的让我笑喷!
- 星露谷物语json_《星露谷物语》1.5版本更新细节公开 已上线PC
- Spring AOP 前置通知
- Golang 并发编程之Context
- 理解vue中if和for指令不能同时使用
- 输出毫秒_毫秒级网络监控(网络示波器)
- 最新!中科院分区发布2021年期刊重大调整
- GIS+区块链,地理空间数据新型应用场景未来可期
- 近远场转换算法matlab,计算电磁学之FDTD算法的MATLAB语言实现解析.doc
- 2019程序员好书盘点:这些畅销新书的时间轴你对上没?
- ROS2节点通信实现零拷贝
- 2016 server win 假死_Windows 7假死的几个常见情况以及解决方法
- android Codec-specific data
- 华为Ascend昇腾计算产业介绍
- 基于单片机的条形码扫描系统设计
- SEM测试线扫与面扫
- 货郎担问题java算法_经典算法(1)---货郎担问题
- 网络基础知识——交换机路由器
热门文章
- Ant Design入门之开始使用
- indexzero/http-server-2-使用
- ElasticSearch6.5.0 【安装IK分词器】
- 从构建分布式秒杀系统聊聊WebSocket推送通知
- 被遗忘的图灵:计算机、神经网络、人工智能……他是这一切之父
- expect 普通用户自动输入密码到root下,执行命令
- varnish缓存服务器构建疑问
- Veeam Backup Replication试用(三):配置备份(Backup Job)与恢复(Restore)
- docker基础用法
- TYVJ P1051 选课 Label:多叉转二叉树形dp(虐心♥)