首页
社区
课程
招聘
[旧帖] [原创]驱动学习心得,高手飘过,菜鸟交流 0.00雪花
发表于: 2009-10-25 13:55 3379

[旧帖] [原创]驱动学习心得,高手飘过,菜鸟交流 0.00雪花

2009-10-25 13:55
3379
 
[LEFT][FONT=Times][SIZE=3][COLOR=#000000]NTSTATUS[/COLOR][/SIZE][/FONT]
[FONT=新宋体][COLOR=#000000]DriverEntry([/COLOR][/FONT]
 [FONT=新宋体][COLOR=#000000]    IN PDRIVER_OBJECT DriverObject,[/COLOR][/FONT] 

[FONT=新宋体][COLOR=#000000]     IN PUNICODE_STRING RegistryPath[/COLOR][/FONT]
[LEFT][FONT=新宋体][COLOR=#000000])[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]{[/COLOR][/FONT]
[COLOR=#000000][FONT=Times][SIZE=3]       [/SIZE][/FONT][FONT=新宋体]NTSTATUS                Status = STATUS_SUCCESS;    [/FONT][/COLOR]
[FONT=新宋体][COLOR=#000000]    UNICODE_STRING          ntDeviceName;               [/COLOR][COLOR=green]// [/COLOR][/FONT][COLOR=green][FONT=新宋体]驱动名称[/FONT][/COLOR]
[FONT=新宋体][COLOR=#000000]    UNICODE_STRING          dosDeviceName;              [/COLOR][COLOR=green]//[/COLOR][/FONT][COLOR=green][FONT=新宋体]符号链接名[/FONT][/COLOR][/LEFT]


[FONT=新宋体][COLOR=#000000]    PDEVICE_EXTENSION       deviceExtension;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]    PDEVICE_OBJECT         deviceObject = NULL;[/COLOR][/FONT]
 

[FONT=新宋体][COLOR=#000000]    KdPrint(([/COLOR][COLOR=maroon]"[NTddkDriver] DriverEntry: %wZ\n"[/COLOR][COLOR=#000000], RegistryPath));[/COLOR][/FONT]

[FONT=新宋体][COLOR=#000000]    [/COLOR][COLOR=green]//[/COLOR][/FONT][COLOR=green][FONT=新宋体]创建设备对象[/FONT][/COLOR]
[COLOR=#000000][FONT=新宋体]    RtlInitUnicodeString(&ntDeviceName, L[/FONT][FONT=新宋体][FONT=Times]”[/FONT][/FONT][/COLOR][COLOR=maroon][FONT=新宋体]\\\\.\\Ntddk[/FONT][/COLOR][COLOR=#000000][FONT=新宋体][FONT=Times]”[/FONT][/FONT][FONT=新宋体]);[/FONT][/COLOR]
[FONT=新宋体][COLOR=#000000]    Status = IoCreateDevice([/COLOR][/FONT][FONT=新宋体][COLOR=#000000]DriverObject,[/COLOR][/FONT]

[FONT=新宋体][COLOR=#000000]                            [/COLOR][COLOR=blue]sizeof[/COLOR][COLOR=#000000](DEVICE_EXTENSION),[/COLOR][COLOR=green]// DeviceExtension[/COLOR][/FONT][COLOR=green][FONT=新宋体]大小[/FONT][/COLOR]

                           [FONT=新宋体][COLOR=#000000]         &ntDeviceName,[/COLOR][COLOR=green]// [/COLOR][/FONT][COLOR=green][FONT=新宋体]驱动名称[/FONT][/COLOR]

[FONT=新宋体][COLOR=#000000]                            FILE_DEVICE_UNKNOWN,[/COLOR][COLOR=green]// [/COLOR][/FONT][COLOR=green][FONT=新宋体]类型[/FONT][/COLOR]
[LEFT][FONT=新宋体][COLOR=#000000]                            0,                                   [/COLOR][/FONT][/LEFT]


[FONT=新宋体][COLOR=#000000][FONT=Verdana][COLOR=#333333]                          [/COLOR][/FONT]         TRUE,                                [/COLOR][/FONT]

[FONT=新宋体][COLOR=#000000]                            &deviceObject[/COLOR][/FONT][FONT=新宋体][COLOR=#000000]);[/COLOR][/FONT]
[LEFT][FONT=新宋体][COLOR=#000000]     [/COLOR][COLOR=blue]if[/COLOR][COLOR=#000000](!NT_SUCCESS(Status))[/COLOR][/FONT][/LEFT]


[FONT=新宋体][COLOR=#000000]     {[/COLOR][/FONT]

[FONT=新宋体][COLOR=#000000]         KdPrint(([/COLOR][COLOR=maroon]"[NTddkDriver] IoCreateDevice Error Code = 0x%X\n"[/COLOR][COLOR=#000000], Status));[/COLOR][/FONT]
[LEFT][FONT=新宋体][COLOR=#000000]         [/COLOR][COLOR=blue]return[/COLOR][COLOR=#000000] Status;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     }[/COLOR][/FONT][/LEFT]


 [FONT=新宋体][COLOR=#000000]    deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;[/COLOR][/FONT]

[FONT=新宋体][COLOR=#000000]     [/COLOR][COLOR=green]//[/COLOR][/FONT][COLOR=green][FONT=新宋体]创建符号链接,以便win32应用程序调用驱动[/FONT][/COLOR]
[LEFT][COLOR=#000000][FONT=新宋体]     RtlInitUnicodeString(&dosDeviceName, L[/FONT][FONT=新宋体][FONT=Times]”[/FONT][/FONT][/COLOR][COLOR=maroon][FONT=新宋体] \\DosDevices\\Ntddk[/FONT][/COLOR][COLOR=#000000][FONT=新宋体][FONT=Times]”[/FONT][/FONT][FONT=新宋体]);[/FONT][/COLOR][/LEFT]


[FONT=新宋体][COLOR=#000000]     Status = IoCreateSymbolicLink(&dosDeviceName, &ntDeviceName);[/COLOR][/FONT]
 

[FONT=新宋体][COLOR=#000000]     [/COLOR][COLOR=blue]if[/COLOR][COLOR=#000000](!NT_SUCCESS(Status))[/COLOR][/FONT]
[LEFT][FONT=新宋体][COLOR=#000000]     {[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]         KdPrint(([/COLOR][COLOR=maroon]"[NTddkDriver] IoCreateSymbolicLink Error Code = 0x%X\n"[/COLOR][COLOR=#000000], Status));[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]         IoDeleteDevice(deviceObject);       [/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]         [/COLOR][COLOR=blue]return[/COLOR][COLOR=#000000] Status;[/COLOR][/FONT]
[FONT=Times][SIZE=3][COLOR=#000000]         }[/COLOR][/SIZE][/FONT][/LEFT]


 

[FONT=新宋体][COLOR=#000000]     [/COLOR][COLOR=green]//[/COLOR][/FONT][COLOR=green][FONT=新宋体]关联派遣函数[/FONT][/COLOR]
[LEFT][FONT=新宋体][COLOR=#000000]     DriverObject->MajorFunction[IRP_MJ_CREATE]              = NtddkDispatchCreate;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     DriverObject->MajorFunction[IRP_MJ_CLOSE]               = NtddkDispatchClose;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]      = NtddkDispatchDeviceControl;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     DriverObject->DriverUnload                              = NtddkUnload;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     [/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     [/COLOR][COLOR=blue]return[/COLOR][COLOR=#000000] Status;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]}[/COLOR][/FONT][/LEFT]
[/LEFT]

 
[LEFT][FONT=宋体][FONT=宋体][FONT=新宋体][COLOR=#000000]VOID[/COLOR][/FONT][/FONT][/FONT][FONT=宋体][FONT=宋体][/LEFT]
[FONT=新宋体][COLOR=#000000]NtddkUnload([/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     IN PDRIVER_OBJECT      DriverObject[/COLOR][/FONT]
[LEFT][FONT=新宋体][COLOR=#000000])[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]{[/COLOR][/FONT][/LEFT]
 
[LEFT][FONT=新宋体][COLOR=#000000]     UNICODE_STRING dosDeviceName;[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]     [/COLOR][/FONT][COLOR=green][FONT=新宋体]// [/FONT][/COLOR][COLOR=green][FONT=新宋体]释放其他资源[/FONT][/COLOR][/LEFT]
 
[LEFT][COLOR=green][FONT=新宋体]     //[/FONT][/COLOR][COLOR=green][FONT=新宋体]删除符号链接[/FONT][/COLOR]
[COLOR=#000000][FONT=新宋体]     RtlInitUnicodeString(&dosDeviceName, L[/FONT][FONT=新宋体][FONT=Times]”[/FONT][/FONT][/COLOR][COLOR=maroon][FONT=新宋体] [URL="file://\\DosDevices\\Ntddk"]\\DosDevices\\Ntddk[/URL][/FONT][/COLOR][COLOR=#000000][FONT=新宋体][FONT=Times]”[/FONT][/FONT][FONT=新宋体]);[/FONT][/COLOR]
[FONT=新宋体][COLOR=#000000]     IoDeleteSymbolicLink(&dosDeviceName);[/COLOR][/FONT][/LEFT]
 
[COLOR=green][FONT=新宋体]     //[/FONT][/COLOR][COLOR=green][FONT=新宋体]删除设备对象[/FONT][/COLOR]
[LEFT][FONT=新宋体][COLOR=#000000]     IoDeleteDevice(DriverObject->DeviceObject);[/COLOR][/FONT][/LEFT]
 
[LEFT][FONT=新宋体][COLOR=#000000]     KdPrint(([/COLOR][COLOR=maroon]"[NTddkDriver] Unloaded"[/COLOR][COLOR=#000000]));[/COLOR][/FONT]
[FONT=新宋体][COLOR=#000000]}[/COLOR][/FONT][/LEFT]
[/FONT][/FONT]

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 8
支持
分享
最新回复 (19)
雪    币: 133
活跃值: (113)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
问:DriverEntry例程在驱动加载后便可退出内存。是全部内容都不存在了?加载后由I/O管理器来管理派遣例程?反编译sys文件后好像DriverEntry例程也不存在。
2009-10-25 14:50
0
雪    币: 250
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
就我的理解来看,INIT段中的代码执行完毕后,该段即被卸载掉了。而把DriverEntry这类初始化例程放到INIT段中,当函数返回后,系统将释放掉它以节约内存。DriverEntry函数只是一个驱动的入口点,负责初始化一些信息,并向I/O管理器注册派遣例程。所以就是像你说的那样,在驱动加载后,DriverEntry就可退出内存,然后由I/O管理器来管理派遣例程。
2009-10-25 17:18
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错……虚心学习下……
2009-11-5 18:27
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习一下。 顶起。
2009-11-6 09:39
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很有进步.继续.
2009-11-7 22:18
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害,多多向楼主学习。。谢谢
2009-11-11 12:43
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我来学习学习。。。
2009-11-11 13:38
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主果断高手。。。
2009-11-13 17:03
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不知楼主学了多少年C了,O(∩_∩)O~
2009-11-13 21:37
0
雪    币: 1099
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了!这段程序是用C++编写的吗?
2009-11-13 21:39
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
高手呀
,,想学习学习
2009-11-14 01:26
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
高手,学习学习,谢谢分享
2009-11-14 09:01
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错……虚心学习下…… ,你的心得很强大!
2009-11-15 15:23
0
雪    币: 129
活跃值: (333)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xed
15
没看明白你写的什么驱动
用来做什么的
2009-11-15 15:44
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
编程  高手!
2009-11-15 18:57
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
高手,学习学习,谢谢分享
2009-11-16 10:03
0
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
唉,意思明白,但有些定义自己还是看不懂!
路漫漫。。。。。。
2009-11-16 12:21
0
雪    币: 39
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习一下。 。。
2009-11-17 11:03
0
雪    币: 76
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
呵呵,还没准备踏入驱动之门,先膜拜一下!~~~
2009-11-17 14:28
0
游客
登录 | 注册 方可回帖
返回
//