这是本人初入看雪的第一篇帖子哦,请大家多多支持!
初入驱动,发篇基础文章,一是为了给同样初入驱动的朋友一个参考,同时也算是我的一篇学习笔记。如果有错的话还请大家多多指教。谢谢!
本文主要讲解如何实现应用-内核之间的通信。
作用:在内核驱动程序中,没有窗口也没有控制台,无法让使用计算机的用户知道程序究竟做了什么。那么我们可以通过编写一个普通的用户程序,但某些功能用内核驱动来实现。这就涉及到如何让应用与内核进行通信,以便让内核驱动程序实现用户想要实现的功能。
为了让驱动和应用通信,首先需要在内核中生成一个设备对象。用户以操作文件的方式打开设备对象,通过特定的API发送irp请求给设备对象,驱动程序通过分发函数对这个请求进行处理。
NTSTATUS IoCreateDevice(
_In_ PDRIVER_OBJECT DriverObject,
_In_ ULONG DeviceExtensionSize,
_In_opt_ PUNICODE_STRING DeviceName,
_In_ DEVICE_TYPE DeviceType,
_In_ ULONG DeviceCharacteristics,
_In_ BOOLEAN Exclusive,
_Out_ PDEVICE_OBJECT *DeviceObject
);
NTSTATUS IoCreateDeviceSecure(
_In_ PDRIVER_OBJECT DriverObject,
_In_ ULONG DeviceExtensionSize,
_In_opt_ PUNICODE_STRING DeviceName,
_In_ DEVICE_TYPE DeviceType,
_In_ ULONG DeviceCharacteristics,
_In_ BOOLEAN Exclusive,
_In_ PCUNICODE_STRING DefaultSDDLString,
_In_opt_ LPCGUID DeviceClassGuid,
_Out_ PDEVICE_OBJECT *DeviceObject
);
//设备名称
#define KS_DEVICE_NAME L"\\Device\\KS_user->win"
......
//GUID
const GUID KS_GUID_CLASS= { 0x69EB3219 , 0x1863 , 0x9672 , {0xA0,0x04 ,0x1F,0x0F,0xAF,0xA9,0xC6,0xA6 } };
//安全属性
UNICODE_STRING sa = RTL_CONSTANT_STRING(L"D:P(A;;GA;;;WD)");
//设备名称
UNICODE_STRING device_name =RTL_CONSTANT_STRING(KS_DEVICE_NAME);
......
//创建设备
status = IoCreateDeviceSecure(driver,0,&device_name,FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,FALSE,
&sa,(LPCGUID)&KS_GUID_CLASS,&KS_Device);
//控制设备名
#define KS_SYB_LIC_NAME L"\\??\\KS_SYB_LIC_KUANGSAN_NAME"
//创建符号连接
status = IoCreateSymbolicLink(&device_syb, &device_name);
if (!NT_SUCCESS(status))
{
//失败了要删除设备
IoDeleteDevice(KS_Device);
DbgPrint("Create symbol lic link failed!\n");
return status;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)