驱动笔记

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
);

你可能感兴趣的:(驱动笔记)