2012-11-07 36 views
1

我對WDK很陌生,我試圖創建一個虛擬打印機驅動程序,它將使用命名管道將數據發送到用戶應用程序。我使用'XPSDrv Driver and Filter Sample'作爲開始。我已經在我已經把這個客戶端代碼末尾添加新的過濾器:從UMDF打印機驅動程序到用戶模式應用程序的命名管道

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

你的打印驅動程序在哪裏放這個代碼? –

+0

你好,感謝你的重播!我從IPrintPipelineFilter接口將此代碼放入StartOperation()方法內。我也調試了代碼,並且在調用CreateFile時遇到了「訪問被拒絕」。我認爲它的模擬問題,因爲驅動程序和我的命名管道服務器正在使用不同的帳戶,但我不知道如何模擬我的驅動程序,以便它可以訪問我的帳戶上的進程?我試過實現IImpersonateCallback,但我不知道應該從哪個類派生出來,以及何時和誰將調用IImpersonateCallback :: OnImpersonate方法? – user1214919

+0

是否可以在UMDF和用戶應用程序或服務之間使用遠程命名管道? – user1214919

回答

1

的原因,可以發現here

有一個空的,不存在的 DACL之間的一個重要區別。當DACL爲空時,它不包含訪問控制條目 (ACE);因此,沒有明確授予訪問權限。作爲 的結果,對對象的訪問被隱式拒絕。

當一個對象沒有DACL時(當pDacl參數爲NULL時),沒有 保護被分配給該對象,並且所有訪問請求被授予 。

您正在傳遞一個空pDacl,因此您正在使每個人都可以訪問該管道。

+1

非常感謝您的解釋和幫助。 – user1214919

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); 
相關問題