如何获取传递给 DrvEnablePDEV 的属于 GDI 引擎的“逻辑设备句柄”HDEV?

Posted

技术标签:

【中文标题】如何获取传递给 DrvEnablePDEV 的属于 GDI 引擎的“逻辑设备句柄”HDEV?【英文标题】:How to obtain the "handle to the logical device" HDEV belonging to the GDI engine as passed to DrvEnablePDEV? 【发布时间】:2017-05-02 03:39:24 【问题描述】:

我有兴趣为任意打印机调用DrvEnablePDEV,以便检查设备信息。为此,我需要(除了很多其他事情之外)HDEV,它在documentation 中描述为

GDI 提供的设备句柄。此句柄必须用作某些 GDI 回调的输入,例如 EngGetDriverName。

我是否有可能以某种方式获得引擎使用的这个句柄?或者我可以用它代替其他手柄吗? (虽然我猜这充其量是有风险的)

【问题讨论】:

您知道 DrvEnablePDEV 是打印机驱动程序提供给 Windows 调用的函数吗? (你是如何获得指向它的指针的?) 是的,我知道。指向什么?我只是从打印机驱动程序 dll 中获取该功能。获取功能根本不是问题。 (这是一个导出的函数,引擎就是这样获取的) 哦,对了,打印机驱动程序被加载到应用程序的地址空间中,所以我想您可以调用 GetProcAddress。但是,进行这样的调用总是很危险的,因为打印机驱动程序不会期待它。鉴于此警告,捕获句柄的最明显方法是挂钩 DrvEnablePDEV 函数。 (虽然我想如果你这样做,你不妨简单地捕获挂钩中的设备信息。) 我想你不明白,我在问如何为不同的打印机获取引擎的 hdev。我不能依赖引擎调用驱动程序,我就是这样做的人。不过谢谢你的想法。 好的。如果没有其他人有更好的想法,您大概可以通过调用适当的 API 函数来强制引擎调用驱动程序。我希望 CreateDC() 能做到。 【参考方案1】:

事实证明,有一种很好的方法可以伪造打印驱动程序的 DLL。在注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments 下有一些值指向二进制名称。通过将我自己的驱动程序复制到打印驱动程序 v3 目录并模拟注册表中的名称,我可以获得函数及其所有参数,因为它们通过并对应于正确的驱动程序。所以我可以在打印驱动程序上调用CreateDC 或其他东西来访问驱动程序的入口点。

要使注册表更改生效,必须重新启动打印后台处理程序服务。

感谢 Harry Johnston 提出挂钩驱动程序 DLL 的想法,这让我走上了正轨。

【讨论】:

以上是关于如何获取传递给 DrvEnablePDEV 的属于 GDI 引擎的“逻辑设备句柄”HDEV?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sanctum Laravel 中通过 Token 获取用户

如何将 UI Dispatcher 传递给 ViewModel

如何获取python的多处理数组'指针并将其传递给Cpp程序?

反应如何将变量传递给获取请求

如何获取传递给 django CBV 的 URL 参数?

如何获取邮递员环境和邮递员全局 URL 以传递给纽曼?