DO_DEVICE_INITIALIZING 到底有什么用

      当设备驱动程序通过调用 IoCreateDevice 创建设备对象时,I/O 管理器在 DEVICE_OBJECT 结构的 Flags 字段中设置 DO_DEVICE_INITIALIZING。DO_DEVICE_INITIALIZING 的目的是防止其它组件在驱动程序完成初始化设备对象之前向设备发送 I/O。

      每次打开设备的一个句柄时,以及任何时候驱动程序试图附加到一个设备堆栈时(检查堆栈顶部设备对象的这个标志),I/O 管理器都检查 DO_DEVICE_INITIALIZING。如果设置 DO_DEVICE_INITIALIZING,那么 I/O 管理器将不允许另一个组件使用诸如 CreateFileOpenFileIoGetDeviceObjectPointer 之类的函数通过名称打开设备。DO_DEVICE_INITIALIZING 不会阻止驱动程序接收即插即用请求或来自堆栈中高层驱动程序的请求,它仅仅防止组件打开设备。

      对于驱动程序在其 DriverEntry 例程中创建的任何设备对象,由 I/O 管理器负责清除 DO_DEVICE_INITIALIZING。对于除 DriverEntry 之外的任何例程中创建的任何设备对象,由驱动程序负责清除 DO_DEVICE_INITIALIZING。

      传统驱动程序(例如为 Windows NT 4 编写的非即插即用驱动程序)在 DriverEntry 中创建它们的设备对象。即插即用驱动程序通常在 AddDevice 中创建它们的设备对象,但是即插即用驱动程序可能在 DriverEntry 中创建控制设备对象(例如,公开自己的设备接口或者支持某个应用程序可以打开的独占堆栈中的设备)。(驱动程序不把控制设备对象报告给即插即用或者将它们附加到设备堆栈。)

驱动程序负责从例程(驱动程序在其中创建设备对象)返回之前准备接收 I/O 请求。对于不同类型的驱动程序,涉及的步骤有所不同;对于即插即用驱动程序,步骤通常包括将设备的 PDO 指针存储到设备扩展中、定义标志来跟踪设备的即插即用状态、设置电源管理标志以及创建或初始化软件资源(例如驱动程序用来管理其设备的事件和自旋锁)。驱动程序还可以注册设备接口或创建一个或多个到其设备的符号链接。

      对于在 DriverEntry 中创建的设备对象,I/O 管理器允许 DriverEntry 一返回就打开设备。对于即插即用驱动程序,驱动程序堆栈必须在 I/O 管理器允许打开设备之前成功完成一个启动请求 (IRP_MN_START_DEVICE)。虽然即插即用驱动程序可能需要在 AddDevice 和启动请求之间处理一些来自堆栈中其它驱动程序的请求(例如,存储端口驱动程序必须在此时间间隔内处理 SRB_FUNCTION_CLAIM_DEVICE),但是驱动程序在设备被启动之前不接收任何创建请求或基于文件对象的 I/O 请求。从驱动程序清除此标志到即插即用管理器启动设备的时间,驱动程序不需要针对 IRP_MJ_CREATE 或基于文件句柄传入的 I/O 请求进行同步。

      下列代码是一个简化的 AddDevice 例程的例子(基于 Windows DDK 中的 Toaster 示例)。(已经从这个例子中删除错误检查和初始化设备扩展的代码。完整的代码请参见 %winddk%/src/general/toaster/func/featured1/ 上的 Toaster 功能驱动程序示例)。

NTSTATUS ToasterAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ) { NTSTATUS                status = STATUS_SUCCESS; PDEVICE_OBJECT          deviceObject = NULL; PFDO_DATA               fdoData; POWER_STATE             powerState;

PAGED_CODE();

// Create a function device object. status = IoCreateDevice (DriverObject, sizeof (FDO_DATA), NULL,  // No Name FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &deviceObject);

// Code to initialize the device extension.

// Attach driver to the device stack. fdoData->NextLowerDriver = IoAttachDeviceToDeviceStack (deviceObject, PhysicalDeviceObject);

// Clear the DO_DEVICE_INITIALIZING flag.// Note:Do not clear this flag until the driver has set the // device power state and the power DO flags. //

deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

return status; }
			
			

您应该做什么?

清除驱动程序在除 DriverEntry 之外的例程(例如即插即用驱动程序的 AddDevice 例程)中创建的任何设备对象的 DO_DEVICE_INITIALIZING 标志。

在初始化设备对象之后到从例程返回之前清除 DO_DEVICE_INITIALIZING。

 

引自:  http://www.microsoft.com/china/whdc/driver/tips/DevInit.mspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个错误通常是由于视频播放器无法初始化所选的视频输出设备引起的。可能的原因包括: 1. 缺少相应的视频输出驱动程序或库。 2. 所选的视频输出设备不存在或已损坏。 3. 您没有足够的权限来访问所选的视频输出设备。 您可以尝试以下解决方案: 1. 确认您的系统上已安装所需的视频输出驱动程序或库。您可以检查您的操作系统的文档或访问您的视频输出设备制造商的网站以获取更多信息。 2. 确认您选择的视频输出设备存在且正常运行。您可以尝试使用其他视频播放器来确认是否存在问题。 3. 如果您没有足够的权限,请尝试以管理员身份运行视频播放器。 如果这些解决方案无法解决问题,请尝试在互联网上搜索该错误消息以获取更多信息或联系视频播放器制造商的技术支持部门。 ### 回答2: 错误打开/初始化所选的视频输出(--vo)设备。 这个错误通常出现在使用播放器软件时,尝试打开或初始化所选的视频输出设备时遇到问题。造成这个错误的原因可能有几种,比如缺少所需的驱动程序、配置文件存在错误或者设备不可用等。 解决这个问题的方法可能因每个具体情况而异。首先,请确保您的计算机上已安装了正确的驱动程序。可以通过更新或重新安装显卡驱动程序来解决这个问题。此外,确保您的操作系统处于最新状态,以便获取所有相关的更新。 如果问题仍然存在,您可以尝试更改或恢复播放器软件的默认配置。这可能涉及到修改配置文件或在软件设置中进行调整。请参考播放器软件的文档或支持页面,以获取有关如何进行配置更改的详细说明。 最后,如果上述方法都无法解决问题,那么可能是您选择的视频输出设备不可用。您可以尝试将其更改为其他可用的选项,或者考虑更换或修复设备本身。 总之,Error opening/initializing the selected video_out (--vo) device.是一个与打开或初始化视频输出设备相关的错误。通过确保安装正确的驱动程序、调整配置或更改设备选项等方法,您应该能够解决这个问题。 ### 回答3: 出现"Error opening/initializing the selected video_out (--vo) device"错误通常表示无法打开或初始化所选择的视频输出设备。 这个错误可能有多种原因。一种可能性是所选择的视频输出设备驱动程序未正确安装或已过时。在这种情况下,我们可以尝试更新或重新安装相关的驱动程序来解决问题。 另一种可能性是所选择的视频输出设备与操作系统或软件不兼容。在这种情况下,我们可以尝试使用其他合适的视频输出设备或使用与操作系统和软件兼容的版本。 有时,该错误可能是由于视频输出设备与其他正在运行的程序之间的冲突引起的。我们可以尝试关闭其他可能干扰视频输出设备的程序,然后重新尝试打开或初始化所选择的设备。 此外,检查电脑硬件是否与所选择的视频输出设备兼容也是一个重要的因素。如果他们不兼容,我们将无法正常打开或初始化所选择的设备。在这种情况下,我们需要更换兼容的设备以解决问题。 总之,“Error opening/initializing the selected video_out (--vo) device”错误是由于无法打开或初始化所选择的视频输出设备引起的。我们可以尝试更新或重新安装驱动程序,检查兼容性问题,并关闭其他可能干扰设备的程序来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值