WDF驱动中的内存管理

本文详细介绍了在Windows Driver Frameworks (WDF)中如何管理内存,包括WdfMemoryCreate函数用于创建内存对象,POOL_TYPE定义的不同内存类型,以及如何使用WdfMemoryCopyFromBuffer和WdfMemoryCopyToBuffer进行数据复制。此外,还提到了WdfMemoryCreateFromLookaside用于多次申请内存的情况,并展示了同步和异步请求中如何使用内存对象。
摘要由CSDN通过智能技术生成

               今年的经济形势不太好,目前很多公司都受其影响了!看来,需要冬眠了,正好抓住这个时间,好好总结总结,冲冲电,梳理梳理!

              我们知道,在内核模式,使用内存要非常小心,搞不好,会让系统崩溃。直接蓝屏重启!如果是驱动的问题,那就麻烦了。如果在接触硬件之前,出问题,那只有重新装系统了。如果不是必须的驱动,我们可以进入安全模式。或者在另外的系统里,删除这个驱动文件。

             在WDM时期,我们分配内存,一般用如下,这些函数:ExAllocateXXXXXX,这些函数,而在WDF中,我们变成了WdfMemoryXXXXXX这样的函数。我们主要来看下,WDF这些函数的使用。

              我们先来看WdfMemoryCreate:

              NTSTATUS    WdfMemoryCreate(
                            IN OPTIONAL PWDF_OBJECT_ATTRIBUTES  Attributes,
                            IN POOL_TYPE  PoolType,
                            IN OPTIONAL ULONG  PoolTag,
                            IN size_t  BufferSize,
                            OUT WDFMEMORY*  Memory,
                           OUT OPTIONAL PVOID*  Buffer
                );

            我们使用它来创建一个内存对象,PWDF_OBJECT_ATTRIBUTES 这个是对象都有的,PoolType的定义如下:

            typedef enum _POOL_TYPE {
                           NonPagedPool,
                           PagedPool,
                           NonPagedPoolMustSucceed,
                           DontUseThisType,
                           NonPagedPoolCacheAligned,
                           PagedPoolCacheAligned,
                           NonPagedPoolCacheAlignedMustS
             } POOL_TYPE;

            具体的意思不用解释,看字面也可以猜出来。PoolTag,这个是记号,便于对于你分配的内存,做个记号,我们可以使用DriverPoolTag设置一个默认的,也可以设置为0.

            例子代码:

          

                   NTSTATUS  status;
                   WDF_OBJECT_ATTRIBUTES  attributes;
                   DFMEMORY  writeBufferMemHandle;
                   PVOID  writeBufferPointer;

                   WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
                   attributes.ParentObject = requestHandle;
                    status = WdfMemoryCreate(
                                                                    &attributes,
                                                                    NonPagedPool,
                                                                    0,
                                                                    WRITE_BUFFER_SIZE,
                                                                   &writeBufferMemHandle,
                                                                    &writeBufferPointer
                         );

 

                 我们对于输入和输出空间的处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值