首页
社区
课程
招聘
[原创]windows内核编程之[应用-内核通信]
发表于: 2016-9-10 16:03 18422

[原创]windows内核编程之[应用-内核通信]

2016-9-10 16:03
18422

这是本人初入看雪的第一篇帖子哦,请大家多多支持!

    初入驱动,发篇基础文章,一是为了给同样初入驱动的朋友一个参考,同时也算是我的一篇学习笔记。如果有错的话还请大家多多指教。谢谢!

    本文主要讲解如何实现应用-内核之间的通信。
    作用:在内核驱动程序中,没有窗口也没有控制台,无法让使用计算机的用户知道程序究竟做了什么。那么我们可以通过编写一个普通的用户程序,但某些功能用内核驱动来实现。这就涉及到如何让应用与内核进行通信,以便让内核驱动程序实现用户想要实现的功能。

    为了让驱动和应用通信,首先需要在内核中生成一个设备对象。用户以操作文件的方式打开设备对象,通过特定的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期)

上传的附件:
收藏
免费 4
支持
分享
最新回复 (14)
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
处贴。。  必须支持

不过一般在IO过程中会先测试一下用户层传递过来的指针是否可读或可写    不会直接用非0来判断
2016-9-10 16:11
0
雪    币: 31
活跃值: (87)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
谢谢,细节上做的还不够好,这是我学习之后编写的测试程序。
2016-9-10 16:14
0
雪    币: 0
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢lz能够发帖教导我们小白
2016-9-12 11:47
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢分享,我想知道你是看的书吗?能否告诉我一下。
2016-9-12 18:45
0
雪    币: 31
活跃值: (87)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
是的,我也是刚刚进入驱动大门,这里发帖的话主要还是为了写写自己看书的笔记,把自己的一些体会写出来,发表的话也是为了帮助更多的像我这样对内核不熟的小白,如果需要注明引用的话我下次会注意的,毕竟刚入看雪,虽然注册几个月了,也是这几天才发文
2016-9-12 22:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
SDDL的资料很全的,参考MSDN
https://msdn.microsoft.com/en-us/library/ff563667(v=vs.85).aspx
PS:
为何总觉得你的文字很熟悉,貌似和 那本《Windows内核安全与驱动开发》里的某些章节内容神似。
2016-9-13 03:22
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
学习驱动开发ing~
2016-9-13 17:20
0
雪    币: 76
活跃值: (28)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
很同意啊
2016-9-14 17:37
0
雪    币: 990
活跃值: (877)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
    很好,刚学驱动,都不理解符号链接等等这些基本概念。楼主的文章很好的帮我解决了一些问题。谢谢
2017-2-19 17:10
0
雪    币: 136
活跃值: (432)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
cvcvxk SDDL的资料很全的,参考MSDN https://msdn.microsoft.com/en-us/library/ff563667(v=vs.85).aspx PS: 为何总觉得你的文字很熟悉,貌 ...
我感觉就是...
2018-5-26 08:16
0
雪    币: 16
活跃值: (527)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那个创建的设备对象其实不用那样处理,直接修改他的安全描述符,就可以实现普通用户访问。库里面提供了设置安全描述符的函数
2018-6-5 14:48
0
雪    币: 249
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
太感谢了,近两天一直没有找到合适的中文资料。 msdn的文档看得头大
2019-8-20 22:10
0
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
感谢分享~ 现在推荐上层App通过使用GUID来获取设备路径吧~
CM_Get_Device_Interface_List_Size/CM_Get_Device_Interface_List
2019-9-5 14:13
0
游客
登录 | 注册 方可回帖
返回
//