标签: wdf

我想创建一个minifilter驱动程序来透明地重定向磁盘i/o,但我开始时遇到了麻烦

我目前正在开发的一个项目需要实现一个w-m复制机制,该机制将用于在Windows XP上以与Deep Freeze或Sandboxie类似的方式重定向磁盘i/o.如果我可以,我也希望能够"装载"用户的修改文件,类似于VirtualCloneDrive如何模拟磁盘驱动器并在其上透明地安装ISO映像.

据我所知,这些程序使用minifilter驱动程序来重定向i/o请求.标准流程将任何已修改的数据复制到辅助位置,然后读取/修改该存储以便随后访问该数据; 所以我想我明白我需要做什么.当谈到模拟CD/DVD驱动器并在其上安装图像时,我完全迷失了.

我一直在网上寻找(谷歌,MSDN,代码项目等)和书籍,如使用Windows驱动程序基础Windows NT文件系统内部开发驱动程序:开发人员指南,但查找具体信息和示例(关于监视,拦截)并且重定向请求和创建环回设备)证明是困难的.我对所涉及的技术还很陌生,所以也许我很难看到森林里的树木.

我想知道是否有人遇到类似的情况,并发现了任何有用的资源,或者可以指出我正确的方向,所以我可以实现类似的功能.

编辑:我发现这个问题似乎是一个有用的资源(虽然不适用于我的特定用例),所以我在这里将它链接到任何即将发布的响应中.

一些澄清:

我正在尝试创建一个程序,允许用户在不需要管理权限的情况下安装和使用应用程序.该程序将通过将任何文件系统/注册表修改保存到单独的存储区域(例如,笔式驱动器或网络存储上的文件),然后允许将它们集成到运行主机程序的任何桌面上,即可运行.使用USB笔将桌面随身携带,将其插入,然后应用您的设置.

要重定向I/O,我可以:

  1. 修补进程'导入地址表(IAT)以在应用程序级别插入自定义代码.
  2. 编写用户模式筛选器驱动程序以动态修改请求.
  3. 为了增强(实际上是真的)安全性,实现内核模式驱动程序以与AV软件类似的方式修补系统服务描述符表(SSDT).

每种方法都有好处和缺点.例如,方法三比接近方法困难得多.它提供了更多的安全性,但即使这样它也可以被打败(理论攻击自96年以来一直存在,自07年以来的实际攻击.)

我最初考虑了特定的安全功能(而不仅仅是类似于WoW64兼容性设置的i/o重定向); 但是自从开始看这个以来,我记得你无法永远保护用户免于自己,而且无论我做多少工作都是为了保护主机系统免受恶意进程或愚蠢用户的攻击,它都可能被殴打(或者我更有可能犯错误.)我还决定避免重新发明沙盒和防病毒轮,只需专注于创建一些有用的功能."工具应该做好一件事,做得好"的理念赢得了胜利.

简而言之,我想要做的就是实现类似于VM快照的功能,并将更改重定向到我自己的存储区域.下面的图表有点过时了,但在沟通我的意图方面可能比我现在更好:-)

早期应用设计

c++ driver io-redirection wdf minifilter

15
推荐指数
1
解决办法
3513
查看次数

WDM驱动程序,KMDF驱动程序和UMDF驱动程序有什么区别?

在Visual Studio 2012中创建Windows驱动程序项目时,您有许多不同的选项可供选择.

MSDN上有一个页面可帮助您为设备选择正确的驱动程序模型.但是,它没有清楚地解释WDM,KMDF和UMDF驱动程序类型之间的确切差异,以及何时选择哪个模型.

我正在寻找有关WDM,KMDF和UMDF驱动程序模型之间差异的解释,因此开始Windows驱动程序开发人员很容易选择正确的模型.

windows kmdf wdf wdm umdf

9
推荐指数
2
解决办法
8932
查看次数

是否可以检索创建WDFREQUEST的CPU?

我试图将CompleteRequest的完成关联到最初发出请求的CPU.有没有办法检索在FdoDeviceControl期间发出请求的CPU或任何另一种方式来查看请求进入调度队列之前的来源?

c windows wdk device-driver wdf

7
推荐指数
1
解决办法
195
查看次数

从IRQL发送IOCTL = DISPATCH_LEVEL(KbFilter/KMDF)

我在WDK中使用KbFilter示例,尝试在由KbFilter_ServiceCallback调用的函数中发送IOCTL,因此在DISPATCH_LEVEL处执行.该函数只需发送一个IOCTL并返回,不等待输出缓冲区被填充,因此它可以是异步,触发和忘记.

我目前正在使用WDF函数WdfIoTargetFormatRequestForIoctlWdfRequestSend尝试在DISPATCH_LEVEL发送并且什么都没得到.对WdfRequestSend的调用是成功的,但似乎没有收到IOCTL.

使用WdfIoTargetSendIoctlSynchronously或WDM模式IoBuildDeviceIoControlRequest()和IoCallDriver()需要PASSIVE_LEVEL,我知道在PASSIVE_LEVEL调用它们的唯一方法是创建一个在PASSIVE_LEVEL上运行的单独线程,并通过缓冲区或队列传递指令,同步用螺旋锁和信号量.

有人能告诉我是否有更简单的方法将IOCTL传递给我的过滤器下面的驱动程序,或者当你需要在更高的IRQL上做事时,线程/队列是否接近正常模式?在什么情况下我可以使用KeRaiseIrql,这是我应该使用的吗?谢谢.

c c++ driver kmdf wdf

6
推荐指数
1
解决办法
2960
查看次数

编译使用 WinUsb 的应用程序

我正在编写一个应用程序来使用 WinUsb.dll 与 USB 设备进行通信。这是一个用户模式库,允许通过作为驱动程序安装在内核中的 winusb.sys 与设备进行通信。

我正在使用 Visual Studio 2008 用 C++ 编写此应用程序。

标头 WinUsb.h 在 Windows DDK 中找到,因此我添加了包含路径“D:\WinDDK\7100.0.0\inc\ddk”。然后我得到一个错误,指出 WinUsb.h 包含的 Usb.h 找不到,Usb.h 也在 ddk 中,但在不同的目录中,所以我添加“D:\WinDDK\7100.0.0\inc\api”作为包含目录。

一旦我添加了该路径,那么一切都会进入厕所,并且我开始在 stdio.h 和其他一些奇怪的地方出现编译错误。

我真的不想使用 DDK 构建系统和编译器来简单地使用这个 DLL,这是我使用 WinUsb 而不是编写适当的驱动程序的主要原因之一。

有人使用 WinUsb.dll 和 Visual Studio 构建过应用程序吗?

c++ winusb wdf

5
推荐指数
1
解决办法
6447
查看次数

如何启动一个自编的驱动程序

我在Visual Studio 2013中编写了一个驱动程序.该构建过程是成功的.然后我准备了一个traget-computer并将驱动程序文件复制到它.然后我安装了驱动程序:

C:\Windows\system32>pnputil -a "E:\driverZeug\KmdfHelloWorldPackage\KmdfHelloWorld.inf"
Microsoft-PnP-Dienstprogramm

Verarbeitungsinf.:            KmdfHelloWorld.inf
Das Treiberpaket wurde erfolgreich hinzugefügt.
Veröffentlichter Name:            oem42.inf


Versuche gesamt:              1
Anzahl erfolgreicher Importe: 1
Run Code Online (Sandbox Code Playgroud)

看起来它很成功.我在PC上运行DebugView但现在我不知道如何启动驱动程序,以便我可以看到调试输出.我的源代码中有一个DbgPrintEx() - Statement.

有人能告诉我如何启动这个驱动程序,以便我可以看到输出.

这是驱动程序的源代码:

#include <ntddk.h>
#include <wdf.h>
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;

NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT  DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
    NTSTATUS status;
    WDF_DRIVER_CONFIG config;

    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n");
    KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n"));
    WDF_DRIVER_CONFIG_INIT(&config, KmdfHelloWorldEvtDeviceAdd);
    status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
    return status;
}

NTSTATUS KmdfHelloWorldEvtDeviceAdd(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit)
{
    NTSTATUS status;
    WDFDEVICE …
Run Code Online (Sandbox Code Playgroud)

c windows driver wdf

5
推荐指数
1
解决办法
259
查看次数

WDK远程用户密码?

我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码吗?

windbg wdf

3
推荐指数
1
解决办法
5448
查看次数

带有或不带有 INF 文件的 Windows 驱动程序

我见过两种安装 Windows 驱动程序的方法。
一种。使用 SYS 文件和 INF 文件。(如 NDIS 驱动程序)
b.仅使用 SYS 文件,驱动程序将由服务加载。(例如 C:\Windows\System32\drivers 中的驱动程序)

所以,我的问题是:
1. 什么样的驱动程序或情况需要 INF 文件?
2. 这种差异的根本原因是什么?

windows driver wdk kmdf wdf

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

安装wdk后WDF模板在哪里?

视觉工作室社区2017 + wdk 10.0.15063.0 + sdk 10.0.15063.137

我首先安装了vs2017,然后安装了wdk.但是当我尝试创建KMDF时,我找不到WDF模板.

感谢任何帮助.

wdf visual-studio-2017

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