一个驱动程序头文件Driver.h

/*********************
*文件名:Driver.h
**********************/

#pragma once
#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif

 

#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

 

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

 

typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName;//设备名称
UNICODE_STRING ustrSymLinkName;//符号链接名
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

//函数声明
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine (IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);

 

 

 

具体解释

#pragma once:  #pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作,#pragma once是能够保证头文件被编译一次。

#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif

上面这段代码是为了包含NTDDK.h头文件,但是由于我们的源文件是用C++语言编写,如果直接包含NTDDK.h,函数的符号表会导入错误,因此需要加入extern "C"。

#define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")

#define PAGEDDATA data_seg("PAGE")
#define LOCKEDDATA data_seg()
#define INITDATA data_seg("INIT")

上述的代码解释:定义分页标记、非分页标记和初始化内存块。在windows驱动开发中,所有程序的函数和变量要被指明被加载到分页内存中还是非分页内存中。程序代码在这里加入了定义的宏,就会被指明函数和变量是位于分页内存还是非分页内存。另外,INIT标志指明该函数只是在加载的时候需要载入内存,当驱动程序加载成功后,该函数可以从内存中卸载掉。

内核模式内存分为分页内存和非分页内存两种,用户模式全是分页内存,是没权限访问非分页内存的。非分页内存区域永远在内存里,不会被倒到磁盘上去,所以它是一种很宝贵的资源。编译指令有data_seg(“PAGE”),指明让变量存放在分页内存里;code_seg(“PAGE”),指明让程序段运行在分页内存里。

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

typedef struct _DEVICE_EXTENSION{
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName;//设备名称
UNICODE_STRING ustrSymLinkName;//符号链接名
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;

上述代码定义了一个设备扩展结构体,这个结构体广泛应用于驱动开发中。

NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS HelloDDKDispatchRoutine (IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);

上述代码是函数的声明

这句代码的解释:arraysize是一个宏,它返回数组中的元素个数。至于为什么要定义这个宏,我想可能以后编程的方便吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值