谢谢大佬分享
参考
https://www.bilibili.com/video/BV1sH4y1Z7PF/
https://www.paneldemo.cn/index.php/archives/31/
R0 代码
#include <ntifs.h>
#include <stdlib.h>
#define _DEVICE_NAME L"\\device\\mydevice"
#define _SYB_NAME L"\\??\\sysmblicname"
NTSTATUS DisPatchCreate(PDEVICE_OBJECT pDevice, PIRP pIrp)
{
DbgPrintEx(77,0,"创建成功\n");
IoCompleteRequest(pIrp, 0);
return STATUS_SUCCESS;
}
NTSTATUS DispatchWrite(PDEVICE_OBJECT pDevice, PIRP pIrp)
{
ULONG retlen = 0;
int pid = 0;
PVOID pMes = pIrp->AssociatedIrp.SystemBuffer;
pid = atol(pMes);
PEPROCESS pEprocess;
NTSTATUS status = STATUS_SUCCESS;
int id = 4;
status = PsLookupProcessByProcessId(pid, &pEprocess);
if (NT_SUCCESS(status))
{
RtlCopyMemory((PUCHAR)pEprocess + 0x440, &id, sizeof(int));
}
pIrp->IoStatus.Information = retlen;
pIrp->IoStatus.Status = STATUS_SUCCESS;
//表示调用者已经完成了给定I/O请求的所有处理,并将给定的IRP返回给I/O管理器
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
VOID UnloadDriver(PDRIVER_OBJECT pDriver)
{
DbgPrint("卸载成功\n");
if (pDriver->DeviceObject)
{
UNICODE_STRING uSymblicLinkname;
RtlInitUnicodeString(&uSymblicLinkname, _SYB_NAME);
IoDeleteSymbolicLink(&uSymblicLinkname);
IoDeleteDevice(pDriver->DeviceObject);
}
}
NTSTATUS DriverEntry(
IN OUT PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
DriverObject->DriverUnload = UnloadDriver;
UNICODE_STRING uDeviceName;
UNICODE_STRING uSymbliclinkname;
PDEVICE_OBJECT pDevice;
RtlInitUnicodeString(&uDeviceName, _DEVICE_NAME);
RtlInitUnicodeString(&uSymbliclinkname, _SYB_NAME);
IoCreateDevice(DriverObject, 0, &uDeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDevice);
IoCreateSymbolicLink(&uSymbliclinkname, &uDeviceName);
pDevice->Flags &= ~DO_DEVICE_INITIALIZING;
pDevice->Flags |= DO_BUFFERED_IO;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DisPatchCreate;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchWrite;
return STATUS_SUCCESS;
}
R3 代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#define _SYB_NAME "\\\\.\\sysmblicname"
int main()
{
HANDLE hDevice = CreateFile(_SYB_NAME, FILE_ALL_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (!hDevice)
{
printf("%x", GetLastError());
}
else
{
do
{
char buf[10] = { 0 };
printf("ID:");
scanf("%s", buf);
DWORD retlen = 0;
int ret = WriteFile(hDevice, buf, strlen(buf), &retlen, NULL);
if (ret)
{
printf("成功\n");
}
} while (1);
}
getchar();
}