4478|9

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WDM驱动AddDevice例程中指定设备名的问题 [复制链接]

WDM模式的驱动程序,创建设备指定设备名有两种方式,一个是调用IoRegisterDeviceInterface,一个是在IoCreateDevice函数中指定设备名。我按照《windows驱动程序开发详解》中的HelloWDM的方式创建的驱动,编译可以通过,但是无法安装成功,安装后有个黄色叹号,并提示reboot。我知道开发中鼓励使用第一种方式,但是第二种方式为什么会出现这种问题呢?
代码如下:

status = IoCreateDevice(
                DriverObject,
                sizeof(DEVICE_EXTENSION),
                &(UNICODE_STRING)devname,
                FILE_DEVICE_DISK,
                0,
                FALSE,
                &fdo);
        if( !NT_SUCCESS(status))
        {
                return status;
        }
        PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
        pdx->devName=devName;
        KeInitializeEvent(&pdx->StoppingEvent,NotificationEvent,FALSE);
        pdx->bStopping=FALSE;
        pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);

最新回复

" 多谢,多看看DDK确实很有帮助。 PNP模式的驱动不鼓励指定设备名,但有的书中也是说是可以指定的,这本书《windows驱动程序开发详解》就是如此,我怀疑是字符串的问题,或者如DDK中所说zero-terminated Unicode string 。 IoCreateDevice can only be used to create an unnamed device object:这句话不太明白,NT模式的驱动使用这中方式,是可以指定设备名的,不明白为什么是only by used. " 我的理解:这是microsoft关于它IoCreateDevce API的约定。 你用它这段话里的另一个IoCreateDeviceSecure 试一下。   详情 回复 发表于 2009-11-26 09:21
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我来接分,呵呵
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
普通WINDOWS的驱动目前不太火呵呵。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
在设备管理器/属性的设备状态中可以得到一个错误码。能帮助你分析一下错误原因。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 beyondma 的回复:
普通WINDOWS的驱动目前不太火呵呵。

是相当不火啊,问个问题都少人问津
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
两段ddk里的关于IOCreateDeive()中关于device name 参数原文,以及microsoft 关于如何name a device driver, 相信看了你就释然了。
驱动开发还是很有qian途的。加油。

1. “DeviceName ()
Optionally points to a buffer containing a zero-terminated Unicode string that names the device object. The string must be a full path name.
Typically, only physical device objects (PDOs), which are created by PnP bus drivers, are named. PnP function drivers and filter drivers should not specify a DeviceName for a functional device object (FDO) or filter device object (filter DO). Naming an FDO or filter DO bypasses the PnP Manager's security. If a user-mode component needs a symbolic link to the device, the function or filter driver should register a device interface (see IoRegisterDeviceInterface ). If a kernel-mode component needs a legacy device name, the driver must name the FDO, but naming is not recommended. "

2."
IoCreateDevice can only be used to create an unnamed device object, or a named device object for which a security descriptor is set by an INF file. Otherwise, drivers must use IoCreateDeviceSecure to create named device objects.
"


 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
你好像没有导出符号连接名啊:

        UNICODE_STRING         deviceNameUnicodeString;
        RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);

        NTSTATUS status = STATUS_SUCCESS;

        status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION),
                &deviceNameUnicodeString,FILE_DEVICE_UNKNOWN,
                0, false, &FunctionDevice);

        if (!NT_SUCCESS(status))
        {
                DT("%s IoCreateDevice VMouse failed", FUN);
                return status;
        }

        UNICODE_STRING deviceLinkUnicodeString;
        RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
        status = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
        if (!NT_SUCCESS(status))
        {
                DT("%s IoCreateSymbolicLink VMouse failed", FUN);
                if (FunctionDevice)
                {
                        IoDeleteDevice(FunctionDevice);
                        return status;
                }
        }
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 figo_liu1008 的回复:
两段ddk里的关于IOCreateDeive()中关于device name 参数原文,以及microsoft 关于如何name a device driver, 相信看了你就释然了。
驱动开发还是很有qian途的。加油。

1. “DeviceName ()
Optionally points to a buffer containing a zero-terminated Unicode string that names the device object. The string must be a full path name.
Typically, only physical device objects (PDOs), which are created by PnP bus drivers, are named. PnP function drivers and filter drivers should not specify a DeviceName for a functional device object (FDO) or filter device object (filter DO). Naming an FDO or filter DO bypasses the PnP Manager's security. If a user-mode component needs a symbolic link to the device, the function or filter driver should register a device interface (see IoRegisterDeviceInterface ). If a kernel-mode component needs a legacy device name, the driver must name the FDO, but naming is not recommended. "

2."
IoCreateDevice can only be used to create an unnamed device object, or a named device object for which a security descriptor is set by an INF file. Otherwise, drivers must use IoCreateDeviceSecure to create named device objects.
"




多谢,多看看DDK确实很有帮助。
PNP模式的驱动不鼓励指定设备名,但有的书中也是说是可以指定的,这本书《windows驱动程序开发详解》就是如此,我怀疑是字符串的问题,或者如DDK中所说zero-terminated Unicode string 。
IoCreateDevice can only be used to create an unnamed device object:这句话不太明白,NT模式的驱动使用这中方式,是可以指定设备名的,不明白为什么是only by used.
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 jassonrose 的回复:
你好像没有导出符号连接名啊:

UNICODE_STRING? ? ? ? deviceNameUnicodeString;
RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);

NTSTATUS status = STATUS_SUCCESS;

status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION),
&deviceNameUnicodeString,FILE_DEVICE_UNKNOWN,
0, false, &FunctionDevice);

if (!NT_SUCCESS(status))
{
DT("%s IoCreateDevice VMouse failed", FUN);
return status;
}

UNICODE_STRING deviceLinkUnicodeString;
RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
status = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
if (!NT_SUCCESS(status))
{
DT("%s IoCreateSymbolicLink VMouse failed", FUN);
if (FunctionDevice)
{
IoDeleteDevice(FunctionDevice);
return status;
}
}


不导出连接名不会出现这种问题的。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
"
多谢,多看看DDK确实很有帮助。
PNP模式的驱动不鼓励指定设备名,但有的书中也是说是可以指定的,这本书《windows驱动程序开发详解》就是如此,我怀疑是字符串的问题,或者如DDK中所说zero-terminated Unicode string 。
IoCreateDevice can only be used to create an unnamed device object:这句话不太明白,NT模式的驱动使用这中方式,是可以指定设备名的,不明白为什么是only by used.

"
我的理解:这是microsoft关于它IoCreateDevce API的约定。
你用它这段话里的另一个IoCreateDeviceSecure 试一下。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表
  缈昏瘧锛