Windows驱动程序与进程的关系
驱动:通过一定的方式加载到内存模式地址空间,通过某个进程调用驱动的入口函数,是通过微软提供的接口间接的调用dll的函数。
查看DriverEntry是由那个进程调用的。
#include <ntddk.h>
//获取进程的主模块路径
PCHAR PsGetProcessImageFileName(IN PEPROCESS Process);
VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
//PsGetProcessImageFileName:获取当前调用驱动的进程的EPROCESS结构
KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
KdPrint(("驱动卸载\n"));
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
KdPrint(("驱动加载\n"));
DriverObject->DriverUnload = Unload;
KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
return STATUS_SUCCESS;
}
PsGetCurrentProcess:获取当前调用驱动的进程的EPROCESS结构
可以看到进程由system进程: 调用 初始化 卸载
分页与非分页内存
分页指的是拟内存可以交换到磁盘上,非分页内存代表拟内存不可交换到磁盘上。
Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存
#pragma code_seg(“PAGE”)//分页内存
#pragma code_seg() //非分页的
#pragma code_seg(“INIT”) 加载到 INIT 内存区域中
分配内核内存
ExAllocatePoolWithTag | ExFreePoolWithTag |
ExAllocateWithQuota | ExFreePool |
ExAllocateWithQuotaTag | ExFreePoolWithTag |
#include <ntddk.h>
//获取进程的主模块路径
//PCHAR PsGetProcessImageFileName(IN PEPROCESS Process);
VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
//PsGetProcessImageFileName:获取当前调用驱动的进程的EPROCESS结构
//KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
KdPrint(("驱动卸载\n"));
}
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
PCHAR pcstr;
KdPrint(("驱动加载\n"));
DriverObject->DriverUnload = Unload;
//PagedPool 分页 NonPagedPool非分页
pcstr = (PCHAR)ExAllocatePoolWithTag(PagedPool, 1024,'abc');
if (pcstr==NULL)
{
KdPrint(("内存分配失败\n"));
return STATUS_INSUFFICIENT_RESOURCES;
}
KdPrint(("内存分配成功\n"));
//清空内存
RtlZeroMemory(pcstr, 1024);
strcpy(pcstr, "内存分配strcpy测试");
KdPrint(("%s\n", pcstr));
ExFreePoolWithTag(pcstr,'abc');
return STATUS_SUCCESS;
}