如果一个内核要与应用层通信,首先应该先生成一个设备对象(Device Object).在内核中,
设备对象可以暴露出来给应用层,应用层可以像操作文件一样操作它。通常来说,用于和
应用层通信的设备往往用来“控制”这个内核驱动。往往称之为“控制设备对象”。
生成设备对象可以使用IoCreateDevice
第一个参数可以直接从DriverEntry中获得。最后一个参数就是输出结果,如果函数执行成功,
则最后一个参数就是指向设备对象的指针。另外,这个函数生成的设备对象具有默认安全属性
,必须用管理员权限才能打开。
设备对象是可以没有名字的,但是控制设备必须有名字,这样他才会暴露出来供其他程序打开,
并与之通信。这个名字可以在调用IoCreateDevice时候指定,但是应用层无法直接通过名字
来打开对象,需要指定一个暴露给应用层的符号链接。符号链接就是一个字符串到另一个字符串
的简单结构。
NTSTATUE DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING RegistryPath)
{
UNICODE_STRING cdo_name=RTL_CONSTANT_STRING(L"\Device\ssssssss");
UNICODE_STRING cdo_syb=RTL_CONSTANT_STRING(L"\??\HELLO");
//生成符号链接
IoDeleteSymolicLink(&cdo_syb); //防止重名
status=IoCreateSymbolicLink(&cdo_syb,&cdo_name);
if(!NT_SUCCESS(status))
{
//如果失败,要删除生成的设备对象
IoDeleteDevice(g_cdo);
return status;
}
.
.
.
}
既然生成了控制设备和符号链接,那么在不需要用的时候就需要把他们删除。
现在DriverEntry中设置卸载函数。
driver->DriverUnload= Unload;
在Unload中调用IoDeleteSymbolicLink(&cdo_syb)和IoDeleteDevice(g_cdo)
来分别卸载符号链接和设备对象。