内存操作函数
该代码实现了一个Windows内核驱动,主要功能是获取并输出全局描述符表(GDT)的内容。驱动在加载时打印 驱动加载! 信息,卸载时打印 驱动卸载!。通过汇编指令sgdt获取GDT基地址和限制,分配非分页内存后复制GDT数据,以16字节为单位格式化输出各个描述符项。程序使用了内存分配(ExAllocatePool)、内存初始化(memset)、内存拷贝(memcpy)和内存释放(ExFreePool)等内核API,最后通过DbgPrint输出调试信息。
#include<ntifs.h>VOID DriverUnload(PDRIVER_OBJECT pDriver)
{DbgPrint("驱动卸载! \n");
}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{pDriver->DriverUnload = DriverUnload;DbgPrint("驱动加载! \n");//分配内存 ExAllocatepool//修改内存 memset//拷贝内存 memcpy//释放内存 ExFreePool//分页内存//非分页内存CHAR szGDT[6] = { 0 };ULONG ulGdtBase = 0;USHORT usGdtLimit = 0;PULONG pGdt = 0;DbgBreakPoint();//获取GDT.BASE && LIMIT__asm{sgdt [szGDT]}//GDT.BASEusGdtLimit = *(PSHORT)&szGDT[0];//GDT.LIMITulGdtBase = *(PULONG)&szGDT[2];//申请内存(非分页内存)pGdt = (PULONG)ExAllocatePool(NonPagedPool, usGdtLimit);if (!pGdt){return STATUS_SUCCESS;}//初始化内存memset(pGdt, 0, usGdtLimit);//拷贝GDT数据memcpy(pGdt, ulGdtBase, usGdtLimit);//输出GDT数据PULONG pTemp = pGdt;for (size_t i = 0; i < usGdtLimit; i+=16){DbgPrint("0x%08x 0x%08x`0x%08x 0x%08x`0x%08x", ulGdtBase + i, pTemp[1], pTemp[0], pTemp[3], pTemp[2]);pTemp += 4;}ExFreePool(pGdt);return STATUS_SUCCESS;
}
