内部重载
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;
}