1

名前付きパイプを使用してユーザー アプリケーションにデータを送信する仮想プリンター ドライバーを作成しようとしています。「XPSDrv Driver and Filter Sample」を最初に使用しています。このクライアント コードを配置した最後に新しいフィルターを追加しました。

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 プリンター ドライバー内では機能しません。サーバーは、常に開始されるコンソール アプリケーションでもあります。誰かが理由を知っていますか?または、プリンタードライバーをデバッグする簡単な方法を知っていますか?

万歳、ダニエル

4

2 に答える 2

2

理由はここで見つけることができます:

空のDACLと存在しないDACLには重要な違いがあります。DACLが空の場合、アクセス制御エントリ(ACE)は含まれません。したがって、アクセス権は明示的に付与されません。その結果、オブジェクトへのアクセスは暗黙的に拒否されます。

オブジェクトにDACLがない場合(pDaclパラメーターがNULLの場合)、オブジェクトには保護が割り当てられず、すべてのアクセス要求が許可されます。

nullのpDaclを渡すので、誰もがパイプにアクセスできるようになります。

于 2012-11-12T18:23:34.963 に答える
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);
于 2012-11-12T14:34:30.927 に答える