驱动开发之三:常用API简介

来源:互联网 发布:c语言中数组的定义 编辑:程序博客网 时间:2024/05/21 08:43

1.DRIVER_OBJECT的结构体如下

typedef struct _DRIVER_OBJECT

{

        CSHORT      Type;

        CSHORT      Size;

        PDEVICE_OBJECT  DeviceObject;

        ULONG  Flags;

        PVOID DriverStart;

        ULONG DriverSize;

        PVOID DriverSection;

        PDRIVER_EXTENSION DriverExtension;

        UNICODE_STRING DriverName;

        PUNICODE_STRING HardwareDataBase;

        PFAST_IO_DISPATCH FastIoDispatch;

        PDRIVER_INITIALIZE DriverInit;

        PDRIVER_STARTIO DriverStartIo;

        PDRIVER_UNLOAD DriverUnload;

      PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION];

} DRIVER_OBJECT;


驱动对象使用DRIVER_OBJECT数据结构表示,作为驱动的一个实例被内核加载,并且内核读一个驱动只加载一次一个驱动可能对应多个设备,这些设备组成设备链,其中第一个设备则是在驱动对象的DeviceObject中进行设定的。

2.设备对象
typedef struct _DEVICE_OBJECT {
   CSHORT  Type;
   USHORT  Size;
   LONG  ReferenceCount;
   PDRIVER_OBJECT  DriverObject;
   PDEVICE_OBJECT  NextDevice;
   PDEVICE_OBJECT  AttachedDevice;
   PIRP  CurrentIrp;
   PIO_TIMER  Timer;
   ULONG  Flags;
   ULONG  Characteristics;
   __volatile PVPB  Vpb;
   PVOID  DeviceExtension;
   DEVICE_TYPE  DeviceType;
   CCHAR  StackSize;
   union {
     LIST_ENTRY   ListEntry;
     WAIT_CONTEXT_BLOCK   Wcb;
   } Queue;
   ULONG  AlignmentRequirement;
   KDEVICE_QUEUE  DeviceQueue;
   KDPC  Dpc;
   ULONG  ActiveThreadCount;
   PSECURITY_DESCRIPTOR  SecurityDescriptor;
   KEVENT  DeviceLock;
   USHORT  SectorSize;
   USHORT  Spare1;
   PDEVOBJ_EXTENSION  DeviceObjectExtension;
   PVOID  Reserved;

} DEVICE_OBJECT, *PDEVICE_OBJECT;

设备对象中指明了其驱动对象(DRIVER_OBJECT),和在设备链中的下一个设备(NextObject),以及想要为该设备对象记录的其他信息设备扩展DeviceObjectExtension,

还有一个就是AttachedDevice;他是该设备在设备链中的上层设备,

3.我们在进行过滤驱动时要进行设备绑定,但是如何进行设备绑定呢?这时候就要使用IoAttachDevice了,该函数

PDEVICE_OBJECT IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceObject,IN TargetObject)

SourceObject:将要附加在另一个设备之上的设备,

TargetObject则是被附加的设备,

返回值则是SourceObject设备的下一层设备如果中间没有过滤设备,则直接返回的是TargetObject,当通过IoAttachDeviceObject时,SourceObject中的AttachedDevice会记录

下其上层设备,但是下层去无法知道所以可以使用设备扩展进行记录

4.摘除设备

在进行驱动卸载时,我们要将绑定的设备从设备脸上摘除,这时候利用IoDetachDevice

VOID IoDetachDevice(  _Inout_  PDEVICE_OBJECT TargetDevice);
该函数则是将目标设备的上层设备从设备连上进行摘除

5.最后说明下设备名称和符号链接:

其实设备名称是只能使用在核心进程中的名字,如果想要在用户程序中使用,则要使用符号链接,现在说下设备名称和符号链接的限制,一般设备名称是"\Device\DeviceName"

符号链接一般是"\??\SymbolicName"或者"\DosDevice\SymbolicName"通过建立符号链接,我们就可以在用户程序中访问该程序了,但是还是不能直接使用该符号链接

而是"\\\\.\\SymbolicName"

5.NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING pReg)
{
    
}

该函数参数第一项指向了被创建的驱动对象的指针,第二项则是指向设备服务键的名字字符串指针,该字符串的内容一般是"\REGISTRAY\MACHINE\SYSTEM\ControlSet

\Services\[服务名称]"


0 0
原创粉丝点击