本帖最后由 wl1383838438 于 2020-2-27 12:14 编辑
#include //驱动的头文件
//-------------------------------------------------------------------该代码测试在x86平台,x64未经测试,,,,,,,,
//只是入门 入门 而已
#pragma pack(1)//内存按1字节对齐
//typedef 是为一个复杂的申明定义一个简单的 (名称)定义
游客,如果您要查看本帖隐藏内容请回复
//__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式
//dllimport导入一个函数 目的是将后面 KeServiceDescriptorTable导入,
// KeServiceDescriptorTable是Serivce_t的引用,
__declspec(dllimport)Serivce_t KeServiceDescriptorTable;//导出函数, 导出的函数不可自定义并且结构体的中参数类型不能变,必须和导出函数一样的
//卸载例程
void UnloadDriver(PDRIVER_OBJECT pdriver)//该函数必须显式写出,否则驱动无法卸载
{
KdPrint(("卸载成功"));//函数内部什么都不干
}
/*在进入DriverEntry函数之前IO管理器会调用ioInvalid_Derver_Object地址填满MajorFuntion数组,
该数组在Driver_Object的函数指针数组里面的每一个地址相对应的IRP消息,我们可以通过简单的设置这个数组将其与IRP派遣函数相关联(详情IRP了解)
*/// PDRIVER_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 + 1];
} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
-------------------------------------------------------PDRIVER_EXTENSION DriverExtension; 参数的结构体
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo; //功能层设备对象
PDEVICE_OBJECT NextStackDevice; //底层设备对象
UNICODE_STRING interfaceName; //设备接口
UNICODE_STRING devName; //设备名
PKINTERRUPT InterruptObject; // address of interrupt object
BOOLEAN mappedport; //如果为真需要做IO端口映射
PVOID MemBar0; //内存基地址0
ULONG nMem0; //基地址BAR0占用字节数
ULONG DmaChannel; //DMA通道
PDMA_ADAPTER DmaAdapter; //DMA Adapter 对象
PALLOCATE_COMMON_BUFFER allocateCommonBuffer; //分配连续的物理内存
//DMA函数
PFREE_COMMON_BUFFER freeCommonBuffer; //释放连续的物理内存DMA函数
PPUT_DMA_ADAPTER putDmaAdapter; //释放DMA Adapter对象
PHYSICAL_ADDRESS RegsPhyBase; //寄存器物理地址首地址
PVOID RegsBase; //寄存器虚拟地址首地址
PHBA_REGS pHBARegs;
ULONG DmaPort; //设备DMA物理端口
…
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
注:该设备扩展的定义针对了PCI驱动
----------------------------------------------------以上结构只需了解目前暂时用不上,可以不记,知道就行-------------------------------------------*/
NTSTATUS DriverEntry(PDRIVER_OBJECT pdriver, PUNICODE_STRING str)//动态库入口
{
LONG*SSDT_ADR, SSDT_ADDR, SSDT_Process;//创建了3个参数其中一个是指针 这三个变量将在后面的函数中被调用
SSDT_ADDR = (LONG)KeServiceDescriptorTable.ServiceTableBase;//取出服务描述表的基地址并且将其转为long赋值给SSDT_ADDR
KdPrint(("当前服务描述表的地址是=%x", SSDT_ADDR)); //打印出当前的服务描述表基地址
//关键的一步
SSDT_ADR = (PLONG)(SSDT_ADDR + 0x7a * 4);//0x表示16进制,16进制的7a的十进制是122,利用Kernel Detective工具能看到该函数NtProcess的编号,指针的地址是4所以这乘以4
//才能获取当前的地址
KdPrint(("当前的SSDT_ADR=%x", SSDT_ADR));//打印当前的地址
SSDT_Process = *SSDT_ADR;//将当前的地址赋给 SSDT-process
KdPrint(("ssdt_process=%x", SSDT_Process));//打印出该值
pdriver->DriverUnload = UnloadDriver;//卸载例程--该函数就是在PDRIVER_OBJECT结构的倒数2个参数 PDRIVER_UNLOAD DriverUnload;// 卸载函数指向
}
1.png (169.12 KB, 下载次数: 0)
2020-2-27 11:52 上传