#include"ntddk.h"
NTSTATUS
ZwAllocateVirtualMemory(
IN HANDLE ProcessHandle,//在这里进程里分配内存的 进程句柄
IN OUT PVOID *BaseAddress,//分好内存的地址
IN ULONG ZeroBits,//一般写0
IN OUT PSIZE_T RegionSize,//要分配内存的大小 //注意这里用小写
IN ULONG AllocationType,//分配的内存是否可用
IN ULONG Protect//分配的内存属性
);
VOID xiezai1(PDRIVER_OBJECT qudongduixiang1)
{
KdPrint(("驱动卸载历程 已经执行\n"));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang1, PUNICODE_STRING zhucebiao1)
{
HANDLE jubing1;//存放进程句柄
OBJECT_ATTRIBUTES shuxing_duixiang;
CLIENT_ID iphao;
NTSTATUS zhuangtai1;
PVOID dizhi1;//分配好的内存地址
SIZE_T diqudaxiao ;//分配好的内存尺寸
iphao.UniqueProcess = (HANDLE)3276;
iphao.UniqueThread = 0;
diqudaxiao = 0x88;
dizhi1 = 0;//注意要赋值
memset(&shuxing_duixiang, 0, sizeof(OBJECT_ATTRIBUTES));
zhuangtai1 = ZwOpenProcess(&jubing1, GENERIC_ALL, &shuxing_duixiang, &iphao);//PROCESS_ALL_ACCESS
if (!NT_SUCCESS(zhuangtai1))
{
KdPrint(("进程打开失败\n"));
}
else
{
KdPrint(("打开进程成功 pid==%d 进程句柄%x\n", iphao.UniqueProcess, jubing1));
}
zhuangtai1 = ZwAllocateVirtualMemory(jubing1, &dizhi1, 0, &diqudaxiao, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//在进程中分配一块可用内存
if (!NT_SUCCESS(zhuangtai1))
{
KdPrint(("内存分配失败\n"));
}
else
{
KdPrint(("分配好的内存地址%X 分配内存的大小%d\n", dizhi1, diqudaxiao));
}
ZwClose(jubing1);
qudongduixiang1->DriverUnload = xiezai1;
return STATUS_SUCCESS;
}
//mfc------------------------------------
读写_驱动申请的一个进程的内存
void CMFCApplication1Dlg::OnBnClickedButton2()//读内存
{
// TODO: 在此添加控件通知处理程序代码
ULONG dizhi1 = 0;//驱动开辟一个进程的内存的地址
dizhi1 = GetDlgItemInt(IDC_EDIT1);
SetDlgItemText(IDC_EDIT2, (LPCTSTR)dizhi1);
}
void CMFCApplication1Dlg::OnBnClickedButton1()//写内存
{
// TODO: 在此添加控件通知处理程序代码
ULONG dizhi1;//驱动开辟一个进程的内存的地址
WCHAR zifuchuan[0xf0] = L"dfgdfgdfgdfgdfg";
dizhi1 = GetDlgItemInt(IDC_EDIT1);
memcpy((PVOID)dizhi1, zifuchuan, 0xf0);
}