#include"ntddk.h"
#pragma pack(1) //写这个内存以一字节对齐 如果不写是以4字节的对齐的
typedef struct ServiceDescriptorEntry {//这个结构就是为了管理这个数组而来的 内核api所在的数组 才有这个结构的 这个是ssdt
unsigned int *ServiceTableBase;//就是ServiceTable ssdt数组
unsigned int *ServiceCounterTableBase; //仅适用于checked build版本 无用
unsigned int NumberOfServices;//(ServiceTableBase)数组中有多少个元素 有多少个项
unsigned char *ParamTableBase;//参数表基址 我们层传过来的api的参数 占用多少字节 多大
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack(1)
_declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;//(名字不要写错)
VOID xiezai1(PDRIVER_OBJECT qudongduixiang)
{
KdPrint(("已经执行到了 驱动卸载历程\n"));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang, PUNICODE_STRING zhucebiao1)
{
int j = KeServiceDescriptorTable.NumberOfServices;
for ( int i = 0; i <j ;i++)
{
KdPrint(("%d %x", i, KeServiceDescriptorTable.ServiceTableBase[i]));
}
qudongduixiang->DriverUnload = xiezai1;
return STATUS_SUCCESS;
}