我对驱动程序开发很新,并试图编写一个简单的过滤器驱动程序来启用或禁用键盘或鼠标设备.如果我可以使它工作,我想用它来插入鼠标插入我的笔记本电脑上的触摸板.我意识到可能有软件已经做到这一点,但我真的对设备驱动程序感兴趣,并希望自己学习如何做到这一点.
我正在使用随WDK一起提供的kbfiltr和moufiltr示例,作为上层过滤器驱动程序安装.kbfiltr示例创建一个pdo,可以通过usermode程序枚举和连接.这允许我将IOCTL发送到由KbFilter_EvtIoDeviceControlForRawPdo处理的PDO .但是,当我尝试做任何与过滤器驱动程序相关的事情时,比如调用KbFilter_EvtIoInternalDeviceControl所以我可以做类似的事情
VOID
KbFilter_EvtIoInternalDeviceControl(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength,
IN ULONG IoControlCode
)
...
hDevice = WdfIoQueueGetDevice(Queue);
devExt = FilterGetData(hDevice);
switch (IoControlCode) {
...
case IOCTL_INTERNAL_KEYBOARD_DISCONNECT:
//
// Clear the connection parameters in the device extension.
//
devExt->UpperConnectData.ClassService = NULL;
break;
...
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个BSOD.它不是上面的代码,在vanilla示例中,set to null被注释掉,只是调用Kbfilter会导致BSOD.我试图直接在PDO中设置设备扩展,但这也会导致BSOD,可能是因为它是PDO devExt,而不是kbfiltr?
(相关:什么是从BSOD获取堆栈跟踪的好方法?我使用Virtual PC作为我的测试环境和未经检查的XPSP3版本)
我不能直接向驱动程序堆栈发送IOCTL_INTERNAL_KEYBOARD_DISCONNECT(我知道输入设备一次只接受一个连接?)因此需要原始PDO.我真的只需要发送两个IOCTL(启用和禁用),我想我会使用键盘断开连接,因为这些已经定义.
如果我对这些假设有任何错误,请告诉我,我知道我真的是一个菜鸟,但我没有找到很多关于通过PDO进行此类通信的文档.
我正在写一个更新一些驱动程序的应用程序.但是,驱动程序"正在使用",除非重新启动计算机,否则无法删除.
那么如何在不重新启动PC的情况下编写应用程序来删除这些锁定的驱动程序.如果重新启动必须重新启动,那么当计算机重新启动并删除这些文件时,如何自动重新启动应用程序?
我们的系统通过通过 USB 连接到 PC 的设备进行连接。在某些情况下,两者之间有一个适配器,因此它是 RS-232 到 USB 的转换。是否可以告诉设备管理器删除端口然后将其添加回来?我想这样做,以便各种设备的驱动程序(在某些情况下超过 1 个,例如通过 USB 串行适配器的设备)全部重置。似乎删除端口然后将其添加回来将确保所有驱动程序重新连接。这很重要,因为某些第三方驱动程序可能会“卡住”,并且由于线程的原因,无法再使用它。这意味着需要物理删除连接或完全重置系统。
所以我希望有人知道是否有一种简单的方法可以连接到设备管理器找到端口删除它们然后重新连接它们。像这样的东西:
public class DeviceManagerWrapper
{
public void ResetAllPorts()
{
using(var deviceManager = new System....DeviceManager()
{
foreach(var port in deviceManager.GetPorts())
{
port.Disconnect();
port.Reconnect();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然这是行不通的。只是希望有人能指出我正确的方向。
如何在 Windows 下以编程方式禁用附加或内置网络摄像头?
通过禁用它们,我的意思是任何尝试访问相机的程序都应该:
为什么我想这样做:
我有一台带网络摄像头的笔记本电脑。没有简单的方法可以通过软件禁用它。我想创建一个应用程序,其中包含一个禁用网络摄像头的按钮,以便任何想要使用它的应用程序都无法使用它,并创建一个按钮来重新启用它。我不想在摄像头上放置任何东西,否则我不会在这里问这个问题。
在C#中,有没有办法以编程方式禁用和重新启用设备?我正在寻找与您进入设备管理器并右键单击设备并禁用或启用它时发生的功能相同的功能。如何在C#中做到这一点?
我有以下问题:
从服务我需要在用户会话中启动应用程序.没有人类用户登录该计算机,因为它是服务器.启动的应用程序必须有会话!= 0.
当前"解决方案"
我在机器启动时使用了一个计划任务,即在任务启动时(当然在会话0中)一个应用程序在同一台机器上启动远程桌面登录:这会创建一个> 0的用户会话,而在用户启动时,这是最终的应用程序到发射.它有效,但太棘手了.
有一些最聪明的方法吗?因为可能没有用户登录,所以我可以重用已经存在的用户会话,这一点至关重要.
主要更新
经过大量的研究和部分成功,以及一些SysAdmin关于为特定目的创建用户的不灵活性,我决定使用OpenGL而不是WPF来渲染会话0中的3d部分.令人惊讶的是,它花费的时间少于预期.我认为将此问题作为参考可能对其他想要尝试从服务渲染Viewport3D的人有用.
我的应用程序必须在另一个应用程序之后工作.第二个应用程序有一个错误,导致COM端口在特定情况下不能关闭.
我想在我的应用程序中以编程方式关闭所有COM端口,以确保报告的关闭端口没有错误.如果我没有打开COM端口的对象,是否可能?
我需要一个关于.NET Framework,C#的解决方案.
我知道如何使用Setup API来启用和禁用设备.我需要知道的是,我可以使用相同的API来确定设备是否已启用/禁用?我认为真正的问题是如何使用它因为Microsoft的devcon使用Setup API来操作硬件,该程序将告诉您设备是启用还是禁用(与设备管理器一样).这是怎么做到的?到目前为止,我对Setup API方法的研究并没有给出明确的答案.
安迪