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