驱动开发之 驱动设备名称,符号连接名,以及应用程序打开设备
2014-07-02 11:05
387 查看
驱动设备名:
驱动设备名是调用IoCreateDevice时设定的
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
);
_In_opt_ PUNICODE_STRING DeviceName是设备名。此函数可以是null,表示不为设备命名。若要为设备命名,首先应该创建一个UNICODE_STRING结构来存放对象名,然后把该串作为调用IoCreateDevice的参数。通常把对象名放在名称空间\Device分支中。
UNICODE_STRING devname;
RtlInitUnicodeString(&devname, L"\\Device\\MyDDKDevice");
IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &devname, ...);
设备的名称有两个用途。第一个用途,设备命名后,其它内核模式部件可以通过调用IoGetDeviceObjectPointer函数找到该设备,找到设备对象后,就可以向该设备的驱动程序发送IRP。另一个用途,允许应用程序打开命名设备的句柄,这样它们就可以向驱动程序发送IRP。应用程序可以使用标准的CreateFile API打开命名设备句柄,然后用ReadFile、WriteFile,和DeviceIoControl向驱动程序发出请求。应用程序打开设备句柄时使用\\.\路径前缀而不是标准的UNC(统一命名约定)名称,如C:\MYFILE.CPP或\\FRED\C-Drive\HISFILE.CPP。在内部,I/O管理器在执行名称搜索前自动把\\.\转换成\??\。为了把\??目录中的名字与名字在其它目录(例如,在\Device目录)中的对象相连接,对象管理器实现了一种称为符号连接(symbolic
link)的对象。
符号链接名:
可以为设备创建符号链接,相当于别名,有点像快捷方式。
创建符号链接方法:
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\TestSymbolLink");
status = IoCreateSymbolicLink( &symLinkName,&devName );
可以借助工具WINOBJ查看
应用程序通过CreateFile打开设备:
HANDLE hDevice =
CreateFile("\\\\.\\TestSymbolLink",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ,// share mode
NULL, // no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
// no template
应用程序打开的路径是\\\\.\\TestSymbolLink。
驱动设备名是调用IoCreateDevice时设定的
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
);
_In_opt_ PUNICODE_STRING DeviceName是设备名。此函数可以是null,表示不为设备命名。若要为设备命名,首先应该创建一个UNICODE_STRING结构来存放对象名,然后把该串作为调用IoCreateDevice的参数。通常把对象名放在名称空间\Device分支中。
UNICODE_STRING devname;
RtlInitUnicodeString(&devname, L"\\Device\\MyDDKDevice");
IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &devname, ...);
设备的名称有两个用途。第一个用途,设备命名后,其它内核模式部件可以通过调用IoGetDeviceObjectPointer函数找到该设备,找到设备对象后,就可以向该设备的驱动程序发送IRP。另一个用途,允许应用程序打开命名设备的句柄,这样它们就可以向驱动程序发送IRP。应用程序可以使用标准的CreateFile API打开命名设备句柄,然后用ReadFile、WriteFile,和DeviceIoControl向驱动程序发出请求。应用程序打开设备句柄时使用\\.\路径前缀而不是标准的UNC(统一命名约定)名称,如C:\MYFILE.CPP或\\FRED\C-Drive\HISFILE.CPP。在内部,I/O管理器在执行名称搜索前自动把\\.\转换成\??\。为了把\??目录中的名字与名字在其它目录(例如,在\Device目录)中的对象相连接,对象管理器实现了一种称为符号连接(symbolic
link)的对象。
符号链接名:
可以为设备创建符号链接,相当于别名,有点像快捷方式。
创建符号链接方法:
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\TestSymbolLink");
status = IoCreateSymbolicLink( &symLinkName,&devName );
可以借助工具WINOBJ查看
应用程序通过CreateFile打开设备:
HANDLE hDevice =
CreateFile("\\\\.\\TestSymbolLink",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ,// share mode
NULL, // no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
// no template
应用程序打开的路径是\\\\.\\TestSymbolLink。
相关文章推荐
- 驱动开发之符号链接和设备名称
- 驱动开发之 应用程序通过设备接口打开设备
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- 驱动开发之符号链接和设备名称
- Linux驱动程序开发(4) - 字符设备驱动(3)-LED设备驱动和应用程序
- Android开发之获取APP的应用程序名称以及版本名称信息java工具类
- 苹果设备连接Citrix XenApp服务器,打开应用程序慢的解决方法
- USB自定义设备驱动开发——修改驱动后应用程序无法使用
- 通过设备符号连接打开设备 句柄得到设备名_ZwOpenSymbolicLinkObject_ZwQuerySymbolicLinkObject
- IoCreateSymbolicLink函数的作用以及符号链接、设备名称之间的关系
- AT91SAM9263 WINCE 6.0 R2驱动开发-GPIO流驱动的实现以及应用程序的调用
- 解决内核驱动开发中设备名称显示不正确的问题
- 第18章 驱动开发之字符设备应用程序
- [置顶] Android开发之获取APP的应用程序名称以及版本名称信息java工具类
- wdk驱动开发中,不能连接umdf模式驱动建立的设备
- AT91SAM9263 WINCE 6.0 R2驱动开发-GPIO流驱动的实现以及应用程序的调用
- ios助手开发系列(三):打开设备连接,获取设备基本信息
- PCIe驱动开发-设备打开/关闭