从UMDF打印机驱动程序到用户模式应用程序的命名管道

时间:2012-11-07 11:01:14

标签: driver named-pipes wdk umdf

我是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打印机驱动程序中不起作用。服务器也是一个始终启动的控制台应用程序。有人知道为什么吗?或者您可以轻松地了解如何调试打印机驱动程序?

一切顺利, 丹尼尔

2 个答案:

答案 0 :(得分:1)

可以找到原因here

  

空和不存在之间存在重要差异   DACL。当DACL为空时,它不包含访问控制条目   (ACES);因此,没有明确授予访问权限。作为一个   结果,隐含地拒绝访问该对象。

     

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

您正在传递一个空的pDacl,因此您可以让所有人都可以访问该管道。

答案 1 :(得分:0)

我已经在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);