Native API -> Ntdll.dll
Native API从用户模式穿越进内核模式, 调用系统服务. 利用软中断的方式进入.
在WindowsXP中式通过"sysenter"指令完成.
头文件
#include <ntddk.h>
驱动入口函数
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
}
驱动卸载函数
void DriverUnload(PDRIVER_OBJECT DriverObject)
{
}
创建设备对象
IoCreateDevice函数用于创建常规的设备对象.
NTSTATUS IoCreateDevice (
IN PDRIVER_OBJECT DriverObject, // 指向驱动对象
IN ULONG DeviceExtensionSize, // 设备的设备扩展大小
IN PUNICODE_STRING DeviceName OPTIONAL, // 这个设备的名称
IN DEVICE_TYPE DeviceType, // 设备类型
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive, // 是否独占
OUT PDEVICE_OBJECT *DeviceObject // 用来接收DEVICE结构的指针
);
参数:
DriverObject
一个指向调用该函数的驱动程序对象.每一个驱动程序在它的DriverEntry过程里接收一个指向它的驱动程序对象.
WDM功能和过滤驱动程序也在他们的AddDevice过程接受一个驱动程序对象的指针.
DeviceExtensionSize
指定驱动程序为设备扩展对象而定义的结构体的大小.
DeviceName
(可选的参数)指向一个以零结尾的包含Unicode字符串的缓冲区,那是这个设备的名称,该字符串必须是一个完整的
设备路径名.
WDM功能驱动程序和过滤驱动程序它们的设备对象没有名字.
注意:如果设备名未提供(即这个参数是NULL),IoCreateDevice创建的设备对象将不会有一个DACL与之相关联.
DeviceType
指定一个由一个系统定义的FILE_DEVICE_XXX常量,表明了这个设备的类型
(如FILE_DEVICE_DISK,FILE_DEVICE_KEYBOARD等),或供应商定义的一种新型设备的类型.
DeviceCharacteristics
指定一个或多个系统定义的常量,连接在一起,提供有关驱动程序的设备其他信息.对于可能的设备特征信息,
见DEVICE_OBJECT结构体.
Exclusive
如果指定设备是独占的, 大部分驱动程序设置这个值为FALSE, 如果不是独占的话设置为TRUE.
DeviceObject
一个指向DEVICE_OBJECT结构体指针的指针,这是一个指针的指针,指向的指针用来接收DEVICE_OBJECT结构体的指针.
返回值:
IoCreateDevice函数成功时返回STATUS_SUCCESS,失败时返回适当的NTSTATUS错误代码.这时这个函数返回的部分代码列表包括:
STATUS_INSUFFICIENT_RESOURCES
STATUS_OBJECT_NAME_EXISTS
STATUS_OBJECT_NAME_COLLISION
调用要求:
包含文件:wdm.h,ntddk.h
删除设备对象
VOID IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject
);
创建符号链接 (符号链接类似于快捷方式)
NTSTATUS IoCreateSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName ,
IN PUNICODE_STRING DeviceName
);
参数:
SymbolicLinkName
输入参数, 符号链接的字符串, 用UNICODE字符串表示.
DeviceName
输入参数, 设备对象的字符串, 用UNICODE字符串表示.
返回值:
返回创建符号链接是否成功.
在内核模式下, 符号链接是以"\??\"开头的(或者是"\DosDevices\"开头的),
如C盘就是"\??\\C:" (或者"\DosDevices\C:"). 而在用户模式下, 则是以"\\.\"
开头的, 如C盘就是"\\.\C".
删除符号链接
IoDeleteSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName
);