Как предотвратить ошибку CreateNamedPipe () 1314? - PullRequest
0 голосов
/ 06 ноября 2018

Мой клиент использует устаревшее программное обеспечение, написанное на c++, работающее в нескольких версиях Windows. Это программное обеспечение ограничено API, доступными с Windows XP, и использует именованный канал.

Например, Windows 10 Home: целостность канала установлена ​​как ненадежная, что позволяет произвольным пользователям получать доступ к именованному каналу. CreateNamedPipe() возвращает ошибку 1314.

 SECURITY_DESCRIPTOR sd;
 SECURITY_ATTRIBUTES sa;
 SECURITY_ATTRIBUTES *psa = NULL;
 OSVERSIONINFO ovi = {0};
 ovi.dwOSVersionInfoSize = sizeof(ovi);
 GetVersionEx(&ovi);
 if (ovi.dwMajorVersion > 5) {
   // create SID S-1-16-0 (= untrusted)
   int sl = 12;
   char x[] = {1, 1, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0};
   PSID UntrustedLabelSid = x;
   PACL Sacl = (PACL)alloca(sl += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
   InitializeAcl(Sacl, sl, ACL_REVISION);
   if (AddAccessAllowedAce(Sacl, ACL_REVISION, 0, UntrustedLabelSid)) {
     InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
     SetSecurityDescriptorDacl(&sd, true, NULL, false);
     SetSecurityDescriptorSacl(&sd, true, Sacl, false);
     sa.nLength = sizeof(sa);
     sa.lpSecurityDescriptor = &sd;
     sa.bInheritHandle = false;
     psa = &sa;
   }
 }
 Pipe = CreateNamedPipe(TEXT(PipeName), PIPE_ACCESS_DUPLEX,
   PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
   1, PipeLength, PipeLength, 10, psa);
...