/创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
//创建设备
status = IoCreateDevice(pDriverObject,//驱动对象
sizeof(DEVICE_EXTENSION),//自定义的扩展结构的大小
&(UNICODE_STRING)devName,//设备的名字
FILE_DEVICE_UNKNOWN,//设备类型
0, //设备对象的特征
TRUE,//设置对象是否为内核模式下使用,一般为TRUE
&pDevObj);//IO管理器负责创建这个设备对象,并返回设备对象的地址
//创建符号链接
UNICODE_STRINGsymLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");//在内核模式下符号链接都是以\??\或\DosDevices\开头的,而在用户模式下是用\\.\开头的
pDevExt->ustrSymLinkName= symLinkName;
status= IoCreateSymbolicLink( &symLinkName,&devName );
if(!NT_SUCCESS(status))
{
IoDeleteDevice(pDevObj );
returnstatus;
}
//这个是一个未用符号链接访问设备
TDIAttachFilterToDevice(theDriverObject,&g_tcpfltobj, &g_tcpoldobj, L"\\Device\\Tcp",TCP_FILTER_DEVICE_NAME,&g_TCPTargetDeviceObject,&g_TCPTargetFileObject);
应用层上的调用:
R3下C语言
而在用户模式下是用\\.\开头的,因为C语言的\要求双写,所以就成了\\\\.\\开头
R3下ASM语言
.const
szError db '文件打开失败',0
szFileNamedb '\\.\KAI',0
.data
jiehe FileInfo<<>,>
.code
start:
invokeCreateFile,addr szFileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
.if eax == INVALID_HANDLE_VALUE
invokeMessageBox,0,addr szFileName,addr szError,NULL
ret
.endif
invokeExitProcess,0
end start