【发布时间】:2012-11-07 11:01:13
【问题描述】:
我对 WDK 很陌生,我正在尝试创建一个虚拟打印机驱动程序,它将使用命名管道将数据发送到用户应用程序。我使用“XPSDrv 驱动程序和过滤器示例”作为开始。我在最后添加了新的过滤器,我把这个客户端代码放在了:
HANDLE hPipe;
LPTSTR lpvMessage=TEXT("Message from UMDF!");
BOOL fSuccess = FALSE;
DWORD cbToWrite, cbWritten, dwMode;
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
hPipe = CreateFile(
lpszPipename,
//GENERIC_READ |
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
dwMode = PIPE_READMODE_MESSAGE;
fSuccess = SetNamedPipeHandleState(
hPipe,
&dwMode,
NULL,
NULL);
if (fSuccess)
{
cbToWrite = (lstrlen(lpvMessage)+1)*sizeof(TCHAR);
fSuccess = WriteFile(
hPipe,
lpvMessage,
cbToWrite,
&cbWritten,
NULL);
}
代码适用于控制台应用程序项目,但不适用于 UMDF 打印机驱动程序。服务器也是一个始终启动的控制台应用程序。有人知道为什么吗?或者您知道如何调试打印机驱动程序的简单方法?
一切顺利, 丹尼尔
【问题讨论】:
-
您将此代码放在打印驱动程序的什么位置?
-
您好,感谢您的重播!我已将此代码放入 IPrintPipelineFilter 接口的 StartOperation() 方法中。我还调试了代码,并且在调用 CreateFile 时出现“访问被拒绝”。我认为这是模拟的问题,因为驱动程序和我的命名管道服务器正在使用不同的帐户,但我不知道如何模拟我的驱动程序以便它可以访问我帐户上的进程?我已经尝试实现 IImpersonateCallback,但我不知道应该从哪个类派生,以及何时以及谁将调用 IImpersonateCallback::OnImpersonate 方法?
-
是否可以在 UMDF 和用户应用程序或服务之间使用远程命名管道?
-
是的,当然可以在打印驱动程序和应用程序或服务之间使用管道。我自己也这样做过。我建议在应用程序而不是驱动程序中创建管道,然后在驱动程序中打开它。
-
感谢您的回复!我已经按照您的建议编写了我的驱动程序和应用程序,但是驱动程序正在使用的帐户缺少一些发送消息的权限。您可能知道,我可以在哪里以及如何更改此帐户的权限?如果来自我的驱动程序和服务器的客户端代码在同一个帐户上,一切都可以正常工作,但在帐户之间却不行:(
标签: driver named-pipes wdk umdf