win10驱动开发8——内核重载new/delete关键字

内部重载

new 和delete 关键字在驱动里面是不可以使用,通过重载的方式即可在内核中使用

#include <ntddk.h>   

class Myclass
{
public:
	Myclass() 
	{
		KdPrint(("构造函数\n"));
	}
	~Myclass() 
	{
		KdPrint(("析构函数\n"));
	}

	void * _cdecl operator new (size_t size,POOL_TYPE poolType= PagedPool)
	{
		KdPrint(("进入new\n"));
		return ExAllocatePoolWithTag(poolType,size,'a');
	};

	void _cdecl operator delete(void *p) 
	{
		KdPrint(("进入delete\n"));
		if (p!=NULL) 
		{
			ExFreePoolWithTag(p, 'a');
		}
	};
};

VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//驱动卸载的时候显示
	KdPrint(("Goodbye driver\n"));
}

extern "C" NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
)
{
	DriverObject->DriverUnload = Unload;
	//驱动启动的时候显示
	KdPrint(("Hello driver\n"));
	//调用的局部重载

	Myclass *pMyclass = new Myclass();
	delete pMyclass;
 	return STATUS_SUCCESS;
}

全局重载

#include <ntddk.h>   

void * _cdecl operator new (size_t size )
{
	KdPrint(("进入全局的new\n"));
	return ExAllocatePoolWithTag(PagedPool, size, 'a');
};

void _cdecl operator delete(void *p, unsigned int d)
{
	KdPrint(("进入全局的delete\n"));
	if (p != NULL)
	{
		ExFreePoolWithTag(p, 'a');
	}
};


VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//驱动卸载的时候显示
	KdPrint(("Goodbye driver\n"));
}

extern "C" NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
)
{
	DriverObject->DriverUnload = Unload;
	//驱动启动的时候显示
	KdPrint(("Hello driver\n"));
	//调用的全局重载
	PCHAR pstr = new char;
	delete pstr;
 	return STATUS_SUCCESS;
}

数组重载

在这里插入图片描述

#include <ntddk.h>   

void * _cdecl operator new (size_t size )
{
	KdPrint(("进入new\n"));
	return ExAllocatePoolWithTag(PagedPool, size, 'a');
};

void _cdecl operator delete(void *p, unsigned int d)
{
	KdPrint(("进入delete\n"));
	if (p != NULL)
	{
		ExFreePoolWithTag(p, 'a');
	}
};

void * __cdecl operator new[](unsigned int size)
{
	KdPrint(("进入new[]\n"));
	//此处是并未填写的,请参照第七章,可以写出
	return NULL;
}

void __cdecl operator delete[](void *p)
{
	KdPrint(("进入delete[]\n"));
	//此处是并未填写的,请参照第七章,可以写出
}

VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//驱动卸载的时候显示
	KdPrint(("Goodbye driver\n"));
}

extern "C" NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
)
{
	DriverObject->DriverUnload = Unload;
	//驱动启动的时候显示
	KdPrint(("Hello driver\n"));
	//调用的全局重载
	PCHAR pstr = new char[100];
	delete[] pstr;
 	return STATUS_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值