#include <ntdddisk.h>
#ifdef __cplusplus
void* operator new(size_t size, POOL_TYPE PoolType = PagedPool) {
KdPrint(("new%Iu\n", size));
return ExAllocatePool(PoolType, size);
}
void* operator new[](size_t size, POOL_TYPE PoolType = PagedPool) {
KdPrint(("new[]%Iu\n", size));
return ExAllocatePool(PoolType, size);
}
void operator delete(void *pointer) {
KdPrint(("delete\n"));
ExFreePool(pointer);
}
void operator delete[](void* pointer) {
KdPrint(("delete[]\n"));
ExFreePool(pointer);
}
#endif
typedef struct _MYDATASTRUCT {
CHAR buffer[];
}MYDATASTRUCT, *PMYDATASTRUCT;
NTSTATUS Fun1(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
{
#define BUFFER_SIZE (100)
PUCHAR pBuffer_ch[100] = { 0 };
PUCHAR pBuffer1 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);
if (!pBuffer1) {
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(pBuffer1, BUFFER_SIZE);
PUCHAR pBuffer2 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);
if (!pBuffer2) {
ExFreePool(pBuffer1);
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlFillMemory(pBuffer2, BUFFER_SIZE, 0xAA);
RtlCopyMemory(pBuffer1, pBuffer2, BUFFER_SIZE);
RtlCopyMemory(pBuffer2, pBuffer_ch, BUFFER_SIZE);
ULONG ulRet = RtlCompareMemory(pBuffer1, pBuffer2, BUFFER_SIZE);
if (BUFFER_SIZE == ulRet) {
DbgPrint("SFilter!: same1\n");
}
ulRet = RtlCompareMemory(pBuffer_ch, pBuffer2, BUFFER_SIZE);
if (BUFFER_SIZE == ulRet) {
DbgPrint("SFilter!: same2\n");
}
ExFreePool(pBuffer1);
ExFreePool(pBuffer2);
PUCHAR pBuffer3 = (PUCHAR)ExAllocatePoolWithTag(PagedPool, BUFFER_SIZE, 'Tag1');
if (!pBuffer3) {
return STATUS_INSUFFICIENT_RESOURCES;
}
ExFreePoolWithTag(pBuffer3, 'Tag1');
PUCHAR pBuffer4 = (PUCHAR)ExAllocatePool2(POOL_FLAG_PAGED, BUFFER_SIZE, 'Tag1');
if (!pBuffer4) {
return STATUS_INSUFFICIENT_RESOURCES;
}
ExFreePoolWithTag(pBuffer4, 'Tag1');
#undef BUFFER_SIZE
}
{
#define ARRAY_NUMBER 5
PAGED_LOOKASIDE_LIST pageList;
ExInitializePagedLookasideList(&pageList, NULL, NULL, 0, sizeof(MYDATASTRUCT), '1234', 0);
PMYDATASTRUCT MyObjectArray[ARRAY_NUMBER];
for (int i = 0; i < ARRAY_NUMBER; i++) {
KdPrint(("ExAllocateFromPagedLookasideList\n"));
MyObjectArray[i] = (PMYDATASTRUCT)ExAllocateFromPagedLookasideList(&pageList);
}
for (int i = 0; i < ARRAY_NUMBER; i++) {
KdPrint(("ExFreeToPagedLookasideList\n"));
ExFreeToPagedLookasideList(&pageList, MyObjectArray[i]);
MyObjectArray[i] = NULL;
}
ExDeletePagedLookasideList(&pageList);
#undef ARRAY_NUMBER
}
{
#ifdef __cplusplus
int* a = new(PagedPool) int;
operator delete(a);
a = nullptr;
a = new(PagedPool) int[100];
operator delete[](a);
a = nullptr;
#endif
}
return STATUS_SUCCESS;
}
#ifdef __cplusplus
extern "C"
#endif
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("SFilter!:DriverEntry\n");
status =Fun1(DriverObject, RegistryPath);
return status;
}