#include"ntddk.h"
NTSTATUS
ObReferenceObjectByName(
__in PUNICODE_STRING ObjectName,
__in ULONG Attributes,
__in_opt PACCESS_STATE AccessState,
__in_opt ACCESS_MASK DesiredAccess,
__in POBJECT_TYPE ObjectType,
__in KPROCESSOR_MODE AccessMode,
__inout_opt PVOID ParseContext,
__out PVOID *Object
);
extern POBJECT_TYPE *IoDriverObjectType;
PDRIVER_DISPATCH m_laolichengdizhi;//历程类型
PDRIVER_OBJECT m_dedaokanxuequdongduixiang;//获得的看雪驱动对象
VOID xiezai1(_In_ struct _DRIVER_OBJECT *qudongduixiang1)
{
KdPrint(("驱动卸载历程已经执行\n"));
if (MmIsAddressValid(m_dedaokanxuequdongduixiang))//判断是否是有效的地址
{
m_dedaokanxuequdongduixiang->MajorFunction[IRP_MJ_DEVICE_CONTROL] = m_laolichengdizhi;//卸载自己的历程(还原看雪的历程)
}
}
NTSTATUS guolvqudong1(_In_ struct _DEVICE_OBJECT *DeviceObject, _Inout_ struct _IRP *Irp)
{
KdPrint(("我自己写的驱动历程 运行看雪软件的时候 进入到它的sys 我过滤到了 欧耶\n"));
return m_laolichengdizhi(DeviceObject, Irp);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang1,PUNICODE_STRING zhucebiao1)
{
KdPrint(("通过IO管理器生成驱动对象 进入驱动入口\n"));
KdPrint(("注册表路径%wZ\n", zhucebiao1));
KdPrint(("驱动对象名%wZ\n", &qudongduixiang1->DriverName));
UNICODE_STRING m_kanxuequdongmingzi1;
RtlInitUnicodeString(&m_kanxuequdongmingzi1, L"\\Driver\\PCHunter32al");
ObReferenceObjectByName(&m_kanxuequdongmingzi1, OBJ_CASE_INSENSITIVE,//不区分大小写 驱动名可以写大写或小写 调用了这个函数打开了一次这个对象 对象管理器的计数加1
NULL, //结构比较复杂设计对象特性的东西access state
0, // 访问权限可以写0 写0完全访问不受控制 access mask
*IoDriverObjectType,//对象类型 注意加*号
KernelMode,//内核模式 有三种模式 enum 类型
NULL, //不知道 parse context
(PVOID*)&m_dedaokanxuequdongduixiang);//输出对象 我们要得到的驱动对象 )//注意类型转换 这个是重点出错的地方
KdPrint(("看雪驱动对象名%wZ\n", &m_dedaokanxuequdongduixiang->DriverName));
m_laolichengdizhi = m_dedaokanxuequdongduixiang->MajorFunction[IRP_MJ_DEVICE_CONTROL];//主函数有28 个不同的历程
m_dedaokanxuequdongduixiang->MajorFunction[IRP_MJ_DEVICE_CONTROL] = guolvqudong1;//设备控制历程 所有的应用程序和驱动通信 都会用这个
ObDereferenceObject(m_dedaokanxuequdongduixiang);//关闭对象管理器的计数 千万别忘记了
qudongduixiang1->DriverUnload = xiezai1;
return STATUS_SUCCESS;
}
02-27
11-02
04-10