标签: device-driver

原始PDO将IOCTL发送到上层过滤器驱动程序(kbfiltr/moufiltr)以启用/禁用设备

我对驱动程序开发很新,并试图编写一个简单的过滤器驱动程序来启用或禁用键盘或鼠标设备.如果我可以使它工作,我想用它来插入鼠标插入我的笔记本电脑上的触摸板.我意识到可能有软件已经做到这一点,但我真的对设备驱动程序感兴趣,并希望自己学习如何做到这一点.

我正在使用随WDK一起提供的kbfiltrmoufiltr示例,作为上层过滤器驱动程序安装.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进行此类通信的文档.

winapi driver wdk device-driver kmdf

19
推荐指数
1
解决办法
5932
查看次数

我在哪里可以系统地学习如何编写Mac OS X设备驱动程序?

我正在寻找一本详尽的大学级书籍或学习指南,以便能够编写Mac OS X设备驱动程序.我对这个操作系统完全无知,但我已经熟练使用Linux了.

书籍"Linux设备驱动程序"是否有任何Mac OS X版本?

最佳指南也应该引入OS内部,明确内核空间和用户空间差异等.

提前致谢

documentation macos iokit device-driver

18
推荐指数
2
解决办法
1万
查看次数

虚拟网络摄像头驱动

我想开发一个虚拟网络摄像头驱动程序,从用户模式我将图像传递给它,它将显示为网络摄像头输出.

我不想使用DirectX过滤器和CSourceStream等.因为它们不适用于某些不使用DirectX捕获网络摄像头图像的程序.

我必须写一个内核模式设备驱动程序.

有任何想法吗?我尝试了DDK样本的testcap,但它没有处理来自用户模式的图像并且没有得到任何输入,只是它在网络摄像头中显示7种颜色...

任何帮助将不胜感激.谢谢


谢谢你们!

我从这里尝试了代码:http: //tmhare.mvps.org/downloads.htm (找到捕获源过滤器)

当我在雅虎,MSN编译它时,它运行良好,但它崩溃了AIM,Internet Explorer Flash网络摄像头,Firefox Flash网络摄像头和Skype ......在8次调用之后,我在QueryInterface中崩溃了,我发现它跟踪了它很多技巧..

现在我知道,它在第8次调用时崩溃了HRESULT CVCamStream :: QueryInterface(REFIID riid,void**ppv)

第8次调用,当它到达时,如果,我的意思是:返回CSourceStream :: QueryInterface(riid,ppv);

它位于Filters.cpp的第17行

为什么你认为我会崩溃?

谢谢大家指导我找到正确的解决方案,这是DirectShow,而不是驱动程序

c++ webcam directshow wdk device-driver

18
推荐指数
2
解决办法
2万
查看次数

缓存 - 刷新和无效操作

我对缓存同步操作有一些疑问.

无效:在cpu尝试读取设备更新的部分内存之前,需要使相应的内存无效.

刷新:在设备读取CPU更新的部分内存之前,CPU必须刷新(写回也是正确的?)从缓存到内存的内容,以便设备从内存中读取更新内容的内容.

如果不执行刷新,则它可以读取存储器中存在的垃圾数据,因为存储器仍未使用写入高速缓存的内容进行更新.

请确认我的上述理解是否正确?

您想什么时候将flush和invalidate结合起来?我听说在使用设备控制描述符时,我们需要通过组合flush和invalidate进行同步.为什么这样?

我们是否需要遵循像flush这样的序列然后无效?

是否有一个场景,其中有效的后续执行无效?

hardware caching driver device-driver dma

17
推荐指数
2
解决办法
3万
查看次数

linux驱动程序编程中devm_kzalloc()和kzalloc()之间有什么区别

我找到devm_kzalloc()kzalloc()在设备驱动程序programmong.但我不知道何时/何地使用这些功能.任何人都可以请说明这些功能的重要性及其用法.

device-driver linux-device-driver linux-kernel

16
推荐指数
1
解决办法
2万
查看次数

逆向工程Apple Kext - 重建课堂

问候!

我目前正在尝试扩展Magic Mouse的功能.为此,我希望编写一个截取来自多点触控驱动程序AppleMultitouchDriver.kext的事件的kext,解释它们,然后调度新事件或转发实际事件.这种方法类似于DoubleCommand使用的方法.

我已经创建了一个小的测试kext,它可以拦截鼠标事件(点击,动作等).

我现在遇到的问题是我无法拦截来自AppleMultitouchDevice和/或AppleMultitouchHIDEventDriver对象的事件,因为它们没有类定义.我需要能够像在鼠标拦截器中那样将指针重新分配给回调函数,就像在DoubleCommand中一样.据我所知,这意味着我需要重建AppleMultitouchDevice类.我已经能够获得对AppleMultitouchDevice对象实例的引用,所以我只需要能够转换它并使用它.

既然你有背景,这是我的直接问题:

  • 我需要使用哪些方法来对kext进行反向工程或重构有问题的类?
  • 哪些程序可以帮助我完成这项工作?
  • 是否有任何专注于您所知道的特定主题的教程或电子书?
  • 我是否有可能重新分配回调指针而不实际重构整个类?
  • 我可能错过的任何其他东西,因为我对此非常新.

提前感谢您的任何建议或帮助!!

c++ kernel reverse-engineering device-driver magic-mouse

14
推荐指数
1
解决办法
1957
查看次数

如何学习Linux无线驱动程序的结构(mac80211)?

Linux无线驱动程序mac80211中有如此多的结构.之类的东西struct net_device,struct ieee80211_hw,struct ieee80211_vifstruct ieee80211_local等.这么多结构我不明白它们包含什么信息以及何时初始化它们.

我如何了解它们以及无线驱动程序的整体架构?

linux wireless device-driver linux-device-driver 802.11

14
推荐指数
1
解决办法
2万
查看次数

便宜的Windows驱动程序签署64位Windows 7

我需要在Windows 7 64位计算机上安装libusb-win32驱动程序.这个驱动程序是开源的,因此没有数字签名所以我想自己这样做,但我想知道这是否可以完成而无需付出很多钱.是否可以使用未经VerisignGlobalSign签署的证书?也许是自签名或使用StartSSL代替?

如果是的话,我该怎么做?根据操作方法,关于x64内核驱动程序签名的实用真相,我必须使用"交叉证书"(Microsoft列表中只有六个可用,其中大部分都是针对不再有效的CA) .

我不在乎用户是否遇到警告信息.如果用户必须先安装特殊的CA证书,我甚至可以接受.我只需要在没有手动禁用每个Windows启动时的签名检查的情况下运行驱动程序.

windows code-signing certificate device-driver

13
推荐指数
2
解决办法
9771
查看次数

在Linux中,如何在现有类中使用device_create?

注意:我现在列出了这个问题,我反对改变实现(例如将类的创建移动到公共区域),如果它让事情变得更容易......我只是不确定怎么做.:结束注释

我有两个Linux内核模块,我正在尝试更新它们的/ sys条目.搜索谷歌和其他来源,我已经看到了许多代码:

static dev_t MyDev;
static struct class *c1;

static int __init start_func(void)
{
    ...
    MyDev = MKDEV(nMajor, MINOR_VERSION);
    register_chrdev_region(MyDev, 1, MODULE_NAME);
    c1 = class_create(THIS_MODULE, "chardrv");
    device_create(c1, NULL, MyDev, NULL, MODULE_NAME);
    ....
Run Code Online (Sandbox Code Playgroud)

我已经验证了我的第一个模块这个代码是否有效,并且它正确地创建了一个:

/sys/class/chardrv/<MODULE_NAME>
Run Code Online (Sandbox Code Playgroud)

条目.我想知道的是如何在现有类中创建设备.换句话说,我的一个模块创建了这个新的chardrv类,现在我希望我的其他模块能够在同一个类下注册它的设备.

我不能再次调用class_create()(在第二个模块中),因为"chardrv"类已经存在...

所以我可以运行一个检查来查看/ sys/class/chardrv是否存在,这可以帮助我决定是否需要调用class_create(),这不是问题.让我们在这里放一些伪代码来澄清:

if ( path "/sys/class/chardrv" does not exist)
    new_class = class_create("chardrv")
else
    new_class = some how get class "chardrv" handle, or properties, or whatever
device_create(new_class, ...)
Run Code Online (Sandbox Code Playgroud)

因此,根据这个例子,如果我的类已经存在,并且我只想从第二个模块添加我的新设备,我假设我需要创建一个类结构,并以某种方式使用正确的"chardrv类"属性填充它然后调用device_create和以前一样,但我不知道该怎么做.

c linux device-driver linux-kernel

13
推荐指数
2
解决办法
2万
查看次数

用于HTC OneVX的USB设备驱动程序(USB调试)

我有一台HTC One VX手机,我想为它开发一款应用程序.

我得到了SDK,IDE,JDK以及我需要的一切.http://developer.android.com/sdk/index.html我试图在我的手机上运行我的应用程序.但我的设备没有出现在Android设备选择器窗口中.我猜这是因为我没有手机的驱动程序,但我似乎无法找到它.

我的手机设置为" USB调试 ".

该网站 - > http://developer.android.com/tools/extras/oem-usb.html#Drivers

说是为我的电脑安装OEM USB驱动程序.我有一个戴尔,我已升级到Windows 7,服务标签BLZXLC1.因此我无法从网站上获取驱动程序,因为我已经升级了我的操作系统.

但我已经有了USB驱动程序吗?在设备管理器中,我在"其他设备"下面有一个"Android手机",它没有驱动程序.我需要做些什么来完成这项工作?

android device-driver

12
推荐指数
1
解决办法
2万
查看次数