How to get a handle to a device driver returned by device manager?

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Q:
Hi, all.

I have a question that is if a driver was loaded by calling ActivateDevice() 
in device manager, and then I want to unload it in my app by calling 
DeActivateDevice(), how to get the handle needed by DeActivateDevice()?

Because DeActivateDevice() needs a handle as it's parameter, but it is 
device manager not me who loaded that driver, I do not know how to get that 
handle.

Anyone can hlep me? Thanks very much!
Lee
A1:
There is no documented and supported way to do that.  If the device manager 
loaded the driver, then it is the device manager who should unload it.

Why do you want to do this?  Maybe you should leave it to your app to call 
ActivateDeviceEx() instead of having the device manager do it for your app.

-- 
Bruce Eitman (eMVP)
Senior Engineer
beitman AT applieddata DOT net

Applied Data Systems
 www.applieddata.net
An ISO 9001:2000 Registered Company
Microsoft WEP Gold-level Member
A2:
have a look at the FindFirstDevice and FindNextDevice.
You should be able to enumerate the loaded device drivers and find the one 
you look after

HTH

-- 
----------------------------------------------------------------
Anthony Pellerin
ADENEO (ADESET)
Windows Embedded Consultant
<apellerin AT adeneo DOT adetelgroup DOT com>
http://www.adeneo.adetelgroup.com
Tél  : +33 (0)4.72.18.57.77
Fax : +33 (0)4.72.18.57.78
A3:
As Bruce told you there is no documented and supported way to do that.

PB help states "Only Device Manager should access the Active key 
for read or write access. You can indirectly access the Active key through a 
parameter to a device driver's initialization function"

The Device Manager stores the handle returned by ActivateDevice
under the HKEY_LOCAL_MACHINE/Drivers/Active/nn registry key corresponding 
to your driver; you can retrieve such a key calling OpenDeviceKey in your 
XXX_Init driver funcion. 

Anyway you should not do it...
A4:
Actually in V5.0 there IS a documented way to do that. However, it's still 
dangerous to do in MOST (but not all) situations. If you loaded the driver 
with an application that is no longer running then you can deactivate it 
safely. This is useful in debugging the driver that will otherwise be loaded 
from the "built-in" key. However, if the driver was loaded by a bus 
driver/enumerator then the bus driver needs to do the unload; otherwise 
there will, at best, be a memory leak in the bus driver as it maintains 
resources for all the drivers it loads.

How about explaining a bit about WHY you think you need to do this?

-- 
Steve Maillet
EmbeddedFusion
www.EmbeddedFusion.com
smaillet at EmbeddedFusion dot com
A5:
"So I want to unload the usb function driver in my oempoweroff() and load it
in my OemPowerOn() to solve this problem. Does this make sense?"

Uhm, no. If you'd just said that from the beginning we'd have saved some 
time. You can't load/unload the drivers in the OEMPowerOff() handler 
(There's no such thing as OEMPowerOn() unless your BSP created one for some 
reason.)

You can have a driver that receives the power manager notifications and 
unloads and reloads the USB function driver on resume - but honestly that's 
a hack - fix your function driver to work correctly and the whole issue is 
moot.

-- 
Steve Maillet
EmbeddedFusion
www.EmbeddedFusion.com
smaillet at EmbeddedFusion dot com
A6:
Because the OS is effectively shut down by the time it gets there. The 
scheduler is already stopped and the only thing you can do there is return 
or turn off power and suspend the hardware. You cannot call ANY of the WIN32 
APIs in that context.

-- 
Steve Maillet
EmbeddedFusion
www.EmbeddedFusion.com
smaillet at EmbeddedFusion dot com
android-5.0 sensor工作原理—sensorservice的启动(一) sensorservice的启动: 1. systemserver.java的run函数: private void run() { …… // Initialize native services. System.loadLibrary("android_servers"); nativeInit(); …… }     And 阅读详情

相关推荐

LS1046A DPAA架构与USDPAA应用开发实战指南

在现代嵌入式网络与计算领域,硬件加速技术是提升系统性能、实现确定性低延迟的关键。其核心原理在于将特定的、计算密集型的任务(如网络数据包处理、加解密)从通用CPU核心卸载到专用的硬件加速单元,从而释放CPU资源,专注于控制平面等复杂逻辑。这种软硬件协同的设计思想,为高性能网络设备、安全网关和边缘计算节点带来了巨大的技术价值。LS1046A处理器内置的**数据路径加速架构**正是这一理念的杰出代表,它通过队列管理器、缓冲区管理器和帧管理器等核心组件,构建了一套完整的数据平面卸载体系。而**USDPAA**技术则

cique2620的博客 373

第三章:GEM分析:3.1 GEM设计目标和核心概念

GEM内存管理框架的设计与实现 摘要:GEM(Graphics Execution Manager)是针对现代GPU内存管理挑战设计的DRM子系统。它通过统一的drm_gem_object抽象解决了传统方案的碎片化问题,采用32位handle机制替代文件描述符,克服了进程fd限制。GEM包含核心对象管理、独立handle命名空间、虚拟地址空间分配等组件,在保持简洁性的同时提供了灵活性,允许驱动扩展。相比TTM方案,GEM更轻量级,已成为Linux图形栈的标准内存管理框架,满足了从图形渲染到AI训练推理到应用

图形/计算GPU的驱动与虚拟化技术分享园地 2403

深入解析Linux FMD字符设备接口:从ioctl编程到DPAA网络加速实践

在嵌入式Linux开发中,字符设备是用户空间与内核硬件驱动交互的核心机制,它通过文件操作接口(如open、ioctl)提供对硬件的精细控制。其原理在于内核将设备抽象为文件,用户程序通过系统调用访问,驱动则负责将请求转换为硬件操作。这一机制的技术价值在于实现了硬件资源的标准化、安全访问,并支持复杂的配置与控制逻辑。在嵌入式网络加速场景中,如NXP的DPAA架构,Frame Manager Driver(FMD)正是通过字符设备(如/dev/fm*)暴露接口,允许用户程序直接配置数据包分类、端口带宽等硬件加速功

ozzzzzz的专栏 351

第二章:DRM 框架概述:2.2 GEM显存管理概述

本文深入分析了Linux DRM子系统中GEM(Graphics Execution Manager)的显存管理机制。GEM通过核心数据结构drm_gem_object抽象显存buffer,结合drm_vma_offset_manager和drm_mm实现高效的地址空间分配与管理。该系统支持显存动态分配/回收、用户空间mmap映射、多进程访问隔离和跨设备共享等关键功能,并通过引用计数和同步机制确保并发安全。

图形/计算GPU的驱动与虚拟化技术分享园地 2394

Sensor框架理解

在这个系列的文章我们只是为了讲清楚Sensor框架的设计和工作原理基于4.0,4.0以下的代码有所区别,尤其是2.2以下根本就没有Binder架构,不讲驱动,也不讲具体的某一个应用该怎么处理Sensor的数据。 一、整体的架构: 从这个图来看Sensor的架构还是非常的清淅, 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,把驱动注册到Kernel的Input Subsyst

cs_lht的专栏 3万+

Android 平台是消息驱动之Handler

首先我们先来普及一下知识点: Android 平台是消息驱动的,主要有如下几个要素实现。 Message MessageQueue Looper (读取消息,相互传输) Handler 用来实现 handler可以在子线程中传递,也可以在主线程中使用 可以配合线程使用,也可以使用异步任务类 可以在doinbackground中调用 异步任务类中onPressUpdate在主线程中运

栀未央的博客 449

Handler机制(深入篇)

Handler机制(深入篇) 反思 通过上一节 “handler驱动模型",我们已经明白。Android系统,任何事件(小到滑动,大到 界面绘制)等,都是基于Looper 不停的循环来完成的。那么问题来了: 当MessageQueue中,没有待处理的Message时,Looper还是一直进行着循环,那是不是很消耗cpu资源呢?同理,主线程也存在MainLooper,为什么UI线程并不会卡死呢?...

BoyiKia的博客 338

附录 A:mm→hmm进化专栏术语表

本文档是Linux内存管理(MM)和异构内存管理(HMM)的术语速查表,主要包含四部分内容:1)地址空间与VMA,解释虚拟地址、物理地址等概念;2)page、folio与PFN,介绍内存页管理相关术语;3)页表与PTE编码,说明页表结构和特殊PTE类型;4)缺页、回收与迁移,涵盖内存异常处理和页面管理机制。文档可作为阅读MM/HMM专栏时的快速参考工具,特别建议在理解HMM、迁移等章节时重点查阅相关术语。

图形/计算GPU的驱动与虚拟化技术分享园地 662

3.2 fake offset 的创建:BO 创建路径中的 vma_node

本文摘要主要探讨了用户态中BO(Buffer Object)的fake offset存储位置、管理方式及生成流程。关键点包括: fake offset存储在drm_gem_object基类的vma_node字段中,用于支持mmap操作而非描述真实物理位置。

图形/计算GPU的驱动与虚拟化技术分享园地 1076

解决PyTorch多GPU训练中CUDA设备编号错乱问题

在深度学习模型训练中,GPU资源管理是核心环节。CUDA作为NVIDIA的并行计算平台,其设备编号机制直接影响多卡训练的效率与稳定性。当操作系统通过nvidia-smi显示的GPU顺序与PyTorch通过CUDA运行时识别的设备顺序不一致时,会导致模型无法正确分配计算资源,甚至引发运行时错误。这一问题的根源在于硬件枚举、驱动管理和运行时环境三套编号体系的不匹配。通过设置CUDA_DEVICE_ORDER环境变量为PCI_BUS_ID,可以强制CUDA运行时按照PCI总线ID顺序对齐设备编号,从而确保多卡并行

weixin_34341229的博客 370

Python Selenium 4环境搭建:从零配置到自动化测试实战

Web自动化测试是软件工程中的重要环节,它通过模拟用户操作来验证Web应用的功能与稳定性。其核心原理是利用浏览器驱动协议(如W3C WebDriver标准)作为桥梁,让测试脚本能够与真实浏览器进行交互。这项技术的价值在于提升测试效率、确保跨浏览器兼容性,并支持持续集成流程。在爬虫开发、表单自动填写、UI回归测试等场景中,自动化测试工具发挥着关键作用。Selenium作为主流的Web自动化框架,其最新版本Selenium 4在协议标准化和API设计上进行了重要优化。本文聚焦于Python环境下Selenium

weixin_30263277的博客 382

3.4 从 fake offset 到 CPU VA:drm_gem_mmap() 路径

本文分析了DRM子系统中用户态mmap调用如何通过fake offset映射显存对象的核心流程。当用户态调用mmap(fd, fake_offset)后,DRM核心通过以下步骤处理: 内核将字节偏移fake_offset转换为页偏移vma->vm_pgoff drm_gem_mmap()使用drm_vma_offset_manager精确查找匹配的vma_node 通过container_of从vma_node找回对应的drm_gem_object 检查当前进程是否有权限访问该对象。

图形/计算GPU的驱动与虚拟化技术分享园地 2093

juju reactive charm (by quqi99)

sudo snap install charm --classic mkdir -p /bak/work/charms/layers export JUJU_REPOSITORY=/bak/work/charms export LAYER_PATH=$JUJU_REPOSITORY/layers cd $LAYER_PATH charm create simple cd simple sudo ...

技术并艺术着 8478

手撕ARM64启动栈(一):QEMU + TF-A → OP-TEE → U-Boot → Linux 全链路总览

ARM 官方提供的参考固件实现,本文用作 BL1/BL2/BL31:开源 TEE 实现,本仓库用作 BL32,运行在 S-EL1,通过 opteed(SPD)与 BL31 交互,提供 TA 运行环境U-Boot:本仓库用作 BL33/Normal World bootloader,通过 ARM semihosting(,非网络/非fw_cfg)从宿主机文件系统读取内核与 initrd,bootm跳转内核。

Fifty的博客 443

CANN/hcomm HCCL-VM常见问题解答

> This document is used to test the FAQ HTML generation framework. --- ## Module: CANN Package Installation and WSL Environment Configuration --- #### FAQ-C001 **Title:** WSL Environment Configur

gitblog_00189的博客 893

LS1046A BSP驱动实战:IEEE 1588、LPUART与PCIe配置与调试指南

在嵌入式Linux系统开发中,设备驱动是连接硬件与操作系统的核心组件,其配置与调试直接决定了系统的功能与性能。理解驱动的工作原理,从内核配置、设备树绑定到功能验证,是嵌入式工程师的必备技能。这些技术为构建高可靠、高性能的嵌入式应用提供了基础支撑,尤其在工业控制、网络通信等对实时性和稳定性要求严苛的场景中价值显著。本文聚焦于NXP LS1046A处理器,深入剖析其BSP(Board Support Package)中三个关键驱动模块:IEEE 1588精密时钟同步、LPUART低功耗串口以及PCIe高速总线。

cuyi7076的博客 588

第三章:GEM分析:3.2 drm_gem_object—GPU 内存对象的核心抽象(静态字段视角)

本文分析了drm_gem_object作为统一GPU内存对象抽象的设计实现。它通过提取公共字段和逻辑解决了驱动间代码碎片化问题,主要包括: 核心功能: 双层引用计数管理(内核refcount和用户空间handle_count) 支持两种存储模式(shmem-backed和private) 提供用户空间映射支持(vma_node) 实现跨进程共享(name/dma-buf)。

图形/计算GPU的驱动与虚拟化技术分享园地 804

进程监控

  转:http://lib.csdn.net/article/computernetworks/16862   驱动层PsSetCreateProcessNotifyRoutine监视进程 ,返回应用层   1、驱动程序调用函数PsSetCreateProcessNotifyRoutine  设置监视进程的回调函数ProcessMonitorCallback  ,当应用层有进程创建时,...

huanongying131的博客 767

Webots+ROS 2机器人仿真:从零搭建可落地的数字孪生骨架

机器人仿真不是图形动画,而是物理行为、传感器模型与控制逻辑的精确映射。理解Webots的物理引擎原理(基于ODE封装)、ROS 2节点与仿真器的实时通信机制(共享内存+step循环),是构建高保真仿真的基础。其技术价值在于实现‘仿真即开发’——Python/C++插件接口与实机驱动高度一致,支持PID闭环、激光雷达集成、编码器反馈等工业级功能,无缝支撑SLAM、导航与行为决策验证。典型应用场景包括高校教学调试、AGV算法预验证、NASA级火星车方案推演。本文聚焦Webots与ROS 2 Humble协同下的

xpp02的专栏 504
下一篇: WinCE 5.0 内核启动过程
ln2002
博客等级 码龄24年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值