【问题标题】:named pipe from UMDF printer driver to user-mode application从 UMDF 打印机驱动程序到用户模式应用程序的命名管道
【发布时间】: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


【解决方案1】:

原因可以找here:

空的和不存在的有一个重要的区别 DACL。当 DACL 为空时,它不包含访问控制条目 (ACE);因此,没有明确授予访问权限。作为一个 结果,对对象的访问被隐式拒绝。

当一个对象没有 DACL 时(当 pDacl 参数为 NULL 时),没有 保护被分配给对象,并且所有访问请求都是 授予。

您正在传递一个空 pDacl,因此您正在使每个人都可以访问管道。

【讨论】:

  • 非常感谢您的解释和帮助。
【解决方案2】:

我已在 CreateNamedPipe 之前将这些行添加到我的服务器,现在它可以工作了,不知道为什么,但它可以工作。如果有人知道为什么我很想知道。在此之前,尽管 m_pSecAttrib 作为最后一个 CreateNamedPipe 参数,但我还是传递了 NULL。

SECURITY_ATTRIBUTES m_pSecAttrib;
SECURITY_DESCRIPTOR* m_pSecDesc;

  m_pSecDesc = (SECURITY_DESCRIPTOR*)LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);
  InitializeSecurityDescriptor(m_pSecDesc,SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDacl(m_pSecDesc,TRUE,(PACL)NULL,FALSE);

  m_pSecAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
  m_pSecAttrib.bInheritHandle = TRUE;
  m_pSecAttrib.lpSecurityDescriptor = m_pSecDesc;

  Pipe[i].oOverlap.hEvent = hEvents[i]; 

  Pipe[i].hPipeInst = CreateNamedPipe(
     lpszPipename,
     PIPE_ACCESS_DUPLEX |
     FILE_FLAG_OVERLAPPED,
     PIPE_TYPE_MESSAGE |
     PIPE_READMODE_MESSAGE |
     PIPE_ACCEPT_REMOTE_CLIENTS |
     PIPE_WAIT,
     INSTANCES,
     BUFSIZE*sizeof(TCHAR),
     BUFSIZE*sizeof(TCHAR),
     PIPE_TIMEOUT,
     &m_pSecAttrib);

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2011-10-02
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多