- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在回答我的问题之前,我将回顾一下我目前正在使用的东西,以便您对我已经做过/尝试过的事情有一个很好的了解。
我有一个多线程用户模式 Windows 桌面应用程序,它向 KMDF 驱动程序发出 DeviceIOControl 调用(纯软件,无硬件)。有 5 个单独的线程,它们都不断地对驱动程序进行相同的自定义 IOCTL 调用。此请求包括:
驱动程序目前正在连续执行此操作,而我的用户模式应用程序中的主要瓶颈是等待内存读取完成,一切都需要完成才能“渲染”场景。
我已经尽可能地减少了 DeviceIOControl 请求的数量,所以现在我一直在研究重叠 IO 并允许每个线程异步发送请求。我的问题是这是否值得尝试,因为我不知道我是否可以在我的驱动程序中使用多个线程同时从不同地址读取数据。
最佳答案
好的,看来您问题中最重要的部分在这里:
I've been searching far and wide trying to find out what exactly opening a file as overlapped actually changes with respect to how the WDF handles IOCTL requests [...]
它不会改变任何东西;所有对设备驱动程序的请求都是异步的。
当您在同步句柄上执行 I/O 时,Windows 会代表您向驱动程序发出异步 I/O 请求并等待它完成。
据我所知,驱动程序甚至无法判断原始请求是同步的还是重叠的。
[编辑:这不是真的。正如 RbMm 在评论中指出的那样,内核实际上确实区分了同步和异步 I/O,但从实际的角度来看,这对您来说无关紧要。]
无论如何,如果驱动程序当前仅在单个线程上运行,使用重叠 I/O 将无济于事。您将不得不修改驱动程序。相反,修改驱动程序就足够了;您可能不需要更改应用程序。 (异常(exception):我不确定从多个线程同时使用同一个同步句柄是否合法,所以我建议每个线程打开自己的设备句柄,至少在您确定驱动程序正常工作之前根据需要。)
我不熟悉 WDF,但是 MSDN 条目 Dispatching Methods for I/O Requests看起来很相关。
关于c++ - KMDF 的多线程 DeviceIOControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42080855/
我们在用户模式下有 OverLapped 结构。例如我们可以调用 DeviceIoControl与重叠的成员在完成此调用时引发事件。但是什么内核模式?如何通过回调在内核中发送异步 DeviceIoCo
我在使用 DeviceIOControl 时遇到一些问题。我正在尝试从物理驱动器读取磁盘几何结构,但从未设置输出缓冲区。 这是我的代码示例,一个简单的函数,应该获取磁盘几何形状并返回磁盘是否可移动:
我正在尝试将 INOUT_PARAM 发送到我的内核驱动程序,看来我已经成功了。当我尝试编辑它并将其发送回应用程序时,我收到以下错误: 这是应用程序代码: typedef struct _INOUT_
我正在尝试在我的硬盘上进行分区偏移。我这样做: PDRIVE_LAYOUT_INFORMATION_EX partitions; DWORD partitionsSize = sizeof(DRIVE
当我运行以下代码时,我对内存位置的访问无效 WIN32_FIND_DATAW FD; WCHAR cPath[MAX_PATH], cFindPath[MAX_PATH]; if (!GetCurre
我正在为它写一个 Windows CE 服务和一个 API 库,它包装了 DeviceIoControl与图书馆沟通所需的电话。我可以确定,传递给 DeviceIoControl 函数的内存缓冲区编码
我正在尝试将一些数据从我的内核驱动程序传递到用户应用程序。 我已经在驱动程序和应用程序共享的头文件中定义了结构: typedef struct _CallBack { HANDLE
我使用 DeviceIoControl 返回物理磁盘扇区的大小。它总是返回 512 个字节,直到最近它开始返回 4096 个字节。检查生成的 STORAGE_ACCESS_ALIGNMENT_DESC
我正在尝试与用于创建 TUN 接口(interface) (WinTun) 的驱动程序交互,但为了从它们发送和接收数据,我需要注册一个环形缓冲区。我正在使用的代码看起来像这样(我省略了使用 Setup
我正在尝试理解和使用 win32file。我需要获取 USN 期刊,并且很难理解我在网上找到的代码片段。这是我找到的代码片段 - format = 'qqqqqLLLLqqqqq' length =
我正在尝试调用 DeviceIoControl(IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS) API,作为 shown here ,但我需要它首先“告诉我”它需要多少内存
我可以向应用程序发送数据驱动程序。 在应用中: DeviceIoControl(dHandle, IOCTL_TEST, (PVOID)InputBuffer, sizeof(InputBuffer)
在回答我的问题之前,我将回顾一下我目前正在使用的东西,以便您对我已经做过/尝试过的事情有一个很好的了解。 我有一个多线程用户模式 Windows 桌面应用程序,它向 KMDF 驱动程序发出 Dev
我正在使用 DeviceIoControl 开发 C# 项目.我咨询过相关Pinvoke.net page我的签名: [DllImport("Kernel32.dll", SetLastError =
根据我的理解,DeviceIOControl和ioctl是相同的功能。它们都向硬件发送控制代码并返回响应。为了重用代码,我尝试创建一个能够以跨平台方式工作的函数。因此,我决定使用 DeviceIOCo
我尝试使用 DeviceIoControl 函数(Win32 API 函数)弹出我的 CDROM 驱动器,当我的 CDROM 驱动器没有磁盘时它工作正常,但是在插入磁盘后,Marshal .GetLa
我的操作系统是 Win7 64 位。我正在尝试通过 DeviceIoControl 将变量的值而不是它的地址(进程 ID,DWORD)传递给我的驱动程序。试了好几次,都是蓝屏或者错误码998。 在用户
我在使用 DeviceIOControl 将 128 字节缓冲区放入我的驱动程序时遇到问题,我使用此代码: int Initialize(unsigned char* public_signature
此代码在 Windows 7 上启动时完全没问题: HANDLE hVol = CreateFile(L"\\\\.\\c:", GENERIC_WRITE | GENERIC_READ,
我正在尝试通过 DeviceIOControl 初始化磁盘并创建 NTFS 分区,而不使用 DiskPart 或 WMI。 使用下面的代码我可以初始化磁盘并创建一个 RAW 分区,但我无法调整参数以使
我是一名优秀的程序员,十分优秀!