今年的经济形势不太好,目前很多公司都受其影响了!看来,需要冬眠了,正好抓住这个时间,好好总结总结,冲冲电,梳理梳理!
我们知道,在内核模式,使用内存要非常小心,搞不好,会让系统崩溃。直接蓝屏重启!如果是驱动的问题,那就麻烦了。如果在接触硬件之前,出问题,那只有重新装系统了。如果不是必须的驱动,我们可以进入安全模式。或者在另外的系统里,删除这个驱动文件。
在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
);
我们对于输入和输出空间的处