ReactOS  0.4.14-dev-552-g2fad488
sspi.c
Go to the documentation of this file.
1 /* Copyright (C) 2004 Juan Lang
2  *
3  * This file implements loading of SSP DLLs.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include "precomp.h"
21 
22 #include <assert.h>
23 #include <lsass/lsass.h>
24 
25 #include <wine/debug.h>
27 
28 #define UNLEN 256
29 
30 typedef struct _SecurePackageTable
31 {
34  struct list table;
36 
37 typedef struct _SecureProviderTable
38 {
41  struct list table;
43 
44 static void SECUR32_initializeProviders(void);
45 /* static */ void SECUR32_freeProviders(void);
46 
49 {
50  0, 0, &cs,
52  0, 0, { (DWORD_PTR)(__FILE__ ": cs") }
53 };
54 static CRITICAL_SECTION cs = { &cs_debug, -1, 0, 0, 0, 0 };
57 
64  NULL, /* Reserved2 */
77  EncryptMessage, /* Reserved3 */
78  DecryptMessage, /* Reserved4 */
82  NULL, /* Reserved8 */
86  NULL
87 };
88 
95  NULL, /* Reserved2 */
108  EncryptMessage, /* Reserved3 */
109  DecryptMessage, /* Reserved4 */
113  NULL, /* Reserved8 */
117  NULL
118 };
119 
120 /***********************************************************************
121  * InitSecurityInterfaceA (SECUR32.@)
122  */
124 {
125  TRACE("InitSecurityInterfaceA() called\n");
126  return &securityFunctionTableA;
127 }
128 
129 /***********************************************************************
130  * InitSecurityInterfaceW (SECUR32.@)
131  */
133 {
134  TRACE("InitSecurityInterfaceW() called\n");
135  return &securityFunctionTableW;
136 }
137 
139 {
140  PWSTR ret;
141 
142  if (str)
143  {
144  ret = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(str) + 1) * sizeof(WCHAR));
145  if (ret)
146  lstrcpyW(ret, str);
147  }
148  else
149  ret = NULL;
150  return ret;
151 }
152 
154 {
155  PWSTR ret;
156 
157  if (str)
158  {
159  int charsNeeded = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
160 
161  if (charsNeeded)
162  {
163  ret = HeapAlloc(GetProcessHeap(), 0, charsNeeded * sizeof(WCHAR));
164  if (ret)
165  MultiByteToWideChar(CP_ACP, 0, str, -1, ret, charsNeeded);
166  }
167  else
168  ret = NULL;
169  }
170  else
171  ret = NULL;
172  return ret;
173 }
174 
176 {
177  PSTR ret;
178 
179  if (str)
180  {
181  int charsNeeded = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0,
182  NULL, NULL);
183 
184  if (charsNeeded)
185  {
186  ret = HeapAlloc(GetProcessHeap(), 0, charsNeeded);
187  if (ret)
188  WideCharToMultiByte(CP_ACP, 0, str, -1, ret, charsNeeded,
189  NULL, NULL);
190  }
191  else
192  ret = NULL;
193  }
194  else
195  ret = NULL;
196  return ret;
197 }
198 
200  const SecurityFunctionTableA *inFnTableA,
201  const SecurityFunctionTableW *inFnTableW)
202 {
203  if (fnTableA)
204  {
205  if (inFnTableA)
206  {
207  /* The size of the version 1 table is based on platform sdk's
208  * sspi.h, though the sample ssp also provided with platform sdk
209  * implies only functions through QuerySecurityPackageInfoA are
210  * implemented (yikes)
211  */
212  size_t tableSize = inFnTableA->dwVersion == 1 ?
213  (const BYTE *)&inFnTableA->SetContextAttributesA -
214  (const BYTE *)inFnTableA : sizeof(SecurityFunctionTableA);
215 
216  memcpy(fnTableA, inFnTableA, tableSize);
217  /* override this, since we can do it internally anyway */
218  fnTableA->QuerySecurityPackageInfoA =
220  }
221  else if (inFnTableW)
222  {
223  /* functions with thunks */
224  if (inFnTableW->AcquireCredentialsHandleW)
225  fnTableA->AcquireCredentialsHandleA =
227  if (inFnTableW->InitializeSecurityContextW)
228  fnTableA->InitializeSecurityContextA =
230  if (inFnTableW->ImportSecurityContextW)
231  fnTableA->ImportSecurityContextA =
233  if (inFnTableW->AddCredentialsW)
234  fnTableA->AddCredentialsA =
236  if (inFnTableW->QueryCredentialsAttributesW)
237  fnTableA->QueryCredentialsAttributesA =
239  if (inFnTableW->QueryContextAttributesW)
240  fnTableA->QueryContextAttributesA =
242  if (inFnTableW->SetContextAttributesW)
243  fnTableA->SetContextAttributesA =
245  /* this can't be thunked, there's no extra param to know which
246  * package to forward to */
247  fnTableA->EnumerateSecurityPackagesA = NULL;
248  /* functions with no thunks needed */
249  fnTableA->AcceptSecurityContext = inFnTableW->AcceptSecurityContext;
250  fnTableA->CompleteAuthToken = inFnTableW->CompleteAuthToken;
251  fnTableA->DeleteSecurityContext = inFnTableW->DeleteSecurityContext;
252  fnTableA->ImpersonateSecurityContext =
253  inFnTableW->ImpersonateSecurityContext;
254  fnTableA->RevertSecurityContext = inFnTableW->RevertSecurityContext;
255  fnTableA->MakeSignature = inFnTableW->MakeSignature;
256  fnTableA->VerifySignature = inFnTableW->VerifySignature;
257  fnTableA->FreeContextBuffer = inFnTableW->FreeContextBuffer;
258  fnTableA->QuerySecurityPackageInfoA =
260  fnTableA->ExportSecurityContext =
261  inFnTableW->ExportSecurityContext;
262  fnTableA->QuerySecurityContextToken =
263  inFnTableW->QuerySecurityContextToken;
264  fnTableA->EncryptMessage = inFnTableW->EncryptMessage;
265  fnTableA->DecryptMessage = inFnTableW->DecryptMessage;
266  }
267  }
268 }
269 
271  const SecurityFunctionTableA *inFnTableA,
272  const SecurityFunctionTableW *inFnTableW)
273 {
274  if (fnTableW)
275  {
276  if (inFnTableW)
277  {
278  /* The size of the version 1 table is based on platform sdk's
279  * sspi.h, though the sample ssp also provided with platform sdk
280  * implies only functions through QuerySecurityPackageInfoA are
281  * implemented (yikes)
282  */
283  size_t tableSize = inFnTableW->dwVersion == 1 ?
284  (const BYTE *)&inFnTableW->SetContextAttributesW -
285  (const BYTE *)inFnTableW : sizeof(SecurityFunctionTableW);
286 
287  memcpy(fnTableW, inFnTableW, tableSize);
288  /* override this, since we can do it internally anyway */
289  fnTableW->QuerySecurityPackageInfoW =
291  }
292  else if (inFnTableA)
293  {
294  /* functions with thunks */
295  if (inFnTableA->AcquireCredentialsHandleA)
296  fnTableW->AcquireCredentialsHandleW =
298  if (inFnTableA->InitializeSecurityContextA)
299  fnTableW->InitializeSecurityContextW =
301  if (inFnTableA->ImportSecurityContextA)
302  fnTableW->ImportSecurityContextW =
304  if (inFnTableA->AddCredentialsA)
305  fnTableW->AddCredentialsW =
307  if (inFnTableA->QueryCredentialsAttributesA)
308  fnTableW->QueryCredentialsAttributesW =
310  if (inFnTableA->QueryContextAttributesA)
311  fnTableW->QueryContextAttributesW =
313  if (inFnTableA->SetContextAttributesA)
314  fnTableW->SetContextAttributesW =
316  /* this can't be thunked, there's no extra param to know which
317  * package to forward to */
318  fnTableW->EnumerateSecurityPackagesW = NULL;
319  /* functions with no thunks needed */
320  fnTableW->AcceptSecurityContext = inFnTableA->AcceptSecurityContext;
321  fnTableW->CompleteAuthToken = inFnTableA->CompleteAuthToken;
322  fnTableW->DeleteSecurityContext = inFnTableA->DeleteSecurityContext;
323  fnTableW->ImpersonateSecurityContext =
324  inFnTableA->ImpersonateSecurityContext;
325  fnTableW->RevertSecurityContext = inFnTableA->RevertSecurityContext;
326  fnTableW->MakeSignature = inFnTableA->MakeSignature;
327  fnTableW->VerifySignature = inFnTableA->VerifySignature;
328  fnTableW->FreeContextBuffer = inFnTableA->FreeContextBuffer;
329  fnTableW->QuerySecurityPackageInfoW =
331  fnTableW->ExportSecurityContext =
332  inFnTableA->ExportSecurityContext;
333  fnTableW->QuerySecurityContextToken =
334  inFnTableA->QuerySecurityContextToken;
335  fnTableW->EncryptMessage = inFnTableA->EncryptMessage;
336  fnTableW->DecryptMessage = inFnTableA->DecryptMessage;
337  }
338  }
339 }
340 
341 static void _copyPackageInfo(PSecPkgInfoW info, const SecPkgInfoA *inInfoA,
342  const SecPkgInfoW *inInfoW)
343 {
344  if (info && (inInfoA || inInfoW))
345  {
346  /* odd, I know, but up until Name and Comment the structures are
347  * identical
348  */
349  memcpy(info, inInfoW ? inInfoW : (const SecPkgInfoW *)inInfoA, sizeof(*info));
350  if (inInfoW)
351  {
352  info->Name = SECUR32_strdupW(inInfoW->Name);
353  info->Comment = SECUR32_strdupW(inInfoW->Comment);
354  }
355  else
356  {
357  info->Name = SECUR32_AllocWideFromMultiByte(inInfoA->Name);
358  info->Comment = SECUR32_AllocWideFromMultiByte(inInfoA->Comment);
359  }
360  }
361 }
362 
363 // static
365  const SecurityFunctionTableW *fnTableW, PCWSTR moduleName)
366 {
368 
370 
371  if (!providerTable)
372  {
374  if (!providerTable)
375  {
377  return NULL;
378  }
379 
381  }
382 
383  ret = HeapAlloc(GetProcessHeap(), 0, sizeof(SecureProvider));
384  if (!ret)
385  {
387  return NULL;
388  }
389 
390  list_add_tail(&providerTable->table, &ret->entry);
391  ret->lib = NULL;
392 
393  if (fnTableA || fnTableW)
394  {
395  ret->moduleName = moduleName ? SECUR32_strdupW(moduleName) : NULL;
396  _makeFnTableA(&ret->fnTableA, fnTableA, fnTableW);
397  _makeFnTableW(&ret->fnTableW, fnTableA, fnTableW);
398  ret->loaded = !moduleName;
399  }
400  else
401  {
402  ret->moduleName = SECUR32_strdupW(moduleName);
403  ret->loaded = FALSE;
404  }
405 
407  return ret;
408 }
409 
410 // static
412  const SecPkgInfoA *infoA, const SecPkgInfoW *infoW)
413 {
414  ULONG i;
415 
416  assert(provider);
417  assert(infoA || infoW);
418 
420 
421  if (!packageTable)
422  {
424  if (!packageTable)
425  {
427  return;
428  }
429 
432  }
433 
434  for (i = 0; i < toAdd; i++)
435  {
436  SecurePackage *package = HeapAlloc(GetProcessHeap(), 0, sizeof(SecurePackage));
437  if (!package)
438  continue;
439 
440  list_add_tail(&packageTable->table, &package->entry);
441 
442  package->provider = provider;
443  _copyPackageInfo(&package->infoW,
444  infoA ? &infoA[i] : NULL,
445  infoW ? &infoW[i] : NULL);
446  }
447  packageTable->numPackages += toAdd;
448 
450 }
451 
452 static void _tryLoadProvider(PWSTR moduleName)
453 {
454  HMODULE lib = LoadLibraryW(moduleName);
455 
456  if (lib)
457  {
458  INIT_SECURITY_INTERFACE_W pInitSecurityInterfaceW =
461  INIT_SECURITY_INTERFACE_A pInitSecurityInterfaceA =
464 
465  TRACE("loaded %s, InitSecurityInterfaceA is %p, InitSecurityInterfaceW is %p\n",
466  debugstr_w(moduleName), pInitSecurityInterfaceA,
467  pInitSecurityInterfaceW);
468  if (pInitSecurityInterfaceW || pInitSecurityInterfaceA)
469  {
470  PSecurityFunctionTableA fnTableA = NULL;
471  PSecurityFunctionTableW fnTableW = NULL;
472  ULONG toAdd = 0;
476 
477  if (pInitSecurityInterfaceA)
478  fnTableA = pInitSecurityInterfaceA();
479  if (pInitSecurityInterfaceW)
480  fnTableW = pInitSecurityInterfaceW();
481  if (fnTableW && fnTableW->EnumerateSecurityPackagesW)
482  {
483  if (fnTableW != &securityFunctionTableW)
484  ret = fnTableW->EnumerateSecurityPackagesW(&toAdd, &infoW);
485  else
486  TRACE("%s has built-in providers, skip adding\n", debugstr_w(moduleName));
487  }
488  else if (fnTableA && fnTableA->EnumerateSecurityPackagesA)
489  {
490  if (fnTableA != &securityFunctionTableA)
491  ret = fnTableA->EnumerateSecurityPackagesA(&toAdd, &infoA);
492  else
493  TRACE("%s has built-in providers, skip adding\n", debugstr_w(moduleName));
494  }
495  if (ret == SEC_E_OK && toAdd > 0 && (infoW || infoA))
496  {
498  moduleName);
499 
500  if (provider)
501  SECUR32_addPackages(provider, toAdd, infoA, infoW);
502  if (infoW)
503  fnTableW->FreeContextBuffer(infoW);
504  else
505  fnTableA->FreeContextBuffer(infoA);
506  }
507  }
508  FreeLibrary(lib);
509  }
510  else
511  WARN("failed to load %s\n", debugstr_w(moduleName));
512 }
513 
514 static const WCHAR securityProvidersKeyW[] = {
515  'S','Y','S','T','E','M','\\','C','u','r','r','e','n','t','C','o','n','t','r',
516  'o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','S','e','c','u','r',
517  'i','t','y','P','r','o','v','i','d','e','r','s','\0'
518  };
519 static const WCHAR securityProvidersW[] = {
520  'S','e','c','u','r','i','t','y','P','r','o','v','i','d','e','r','s',0
521  };
522 
524 {
525  HKEY key;
526  LSTATUS apiRet;
527 
528  /* Now load providers from registry */
530  KEY_READ, &key);
531  if (apiRet == ERROR_SUCCESS)
532  {
533  WCHAR securityPkgNames[MAX_PATH]; /* arbitrary len */
534  DWORD size = sizeof(securityPkgNames), type;
535 
537  (PBYTE)securityPkgNames, &size);
538  if (apiRet == ERROR_SUCCESS && type == REG_SZ)
539  {
540  WCHAR *ptr;
541 
542  size = size / sizeof(WCHAR);
543  for (ptr = securityPkgNames;
544  ptr < securityPkgNames + size; )
545  {
546  WCHAR *comma;
547 
548  for (comma = ptr; *comma && *comma != ','; comma++)
549  ;
550  if (*comma == ',')
551  *comma = '\0';
552  for (; *ptr && isspace(*ptr) && ptr < securityPkgNames + size;
553  ptr++)
554  ;
555  if (*ptr)
557  ptr += lstrlenW(ptr) + 1;
558  }
559  }
560  RegCloseKey(key);
561  }
562 
563  /* Now load the built-in providers (in Wine, this is done before the registry loading) */
564 #ifdef __REACTOS__
565  /* First load built-in providers */
569  /* Load the Negotiate provider last so apps stumble over the working NTLM
570  * provider first. Attempting to fix bug #16905 while keeping the
571  * application reported on wine-users on 2006-09-12 working. */
573 #endif
574 
575 }
576 
578 {
580  BOOL matched = FALSE;
581 
582 #ifdef __REACTOS__
583  if (!packageTable)
585 #endif
586 
587  if (packageTable && packageName)
588  {
590  {
591  matched = !lstrcmpiW(ret->infoW.Name, packageName);
592  if (matched)
593  break;
594  }
595 
596  if (!matched)
597  return NULL;
598 
599  if (ret->provider && !ret->provider->loaded)
600  {
601  ret->provider->lib = LoadLibraryW(ret->provider->moduleName);
602  if (ret->provider->lib)
603  {
604  INIT_SECURITY_INTERFACE_W pInitSecurityInterfaceW =
607  INIT_SECURITY_INTERFACE_A pInitSecurityInterfaceA =
610  PSecurityFunctionTableA fnTableA = NULL;
611  PSecurityFunctionTableW fnTableW = NULL;
612 
613  if (pInitSecurityInterfaceA)
614  fnTableA = pInitSecurityInterfaceA();
615  if (pInitSecurityInterfaceW)
616  fnTableW = pInitSecurityInterfaceW();
617  /* don't update built-in SecurityFunctionTable */
618  if (fnTableA != &securityFunctionTableA)
619  _makeFnTableA(&ret->provider->fnTableA, fnTableA, fnTableW);
620  if (fnTableW != &securityFunctionTableW)
621  _makeFnTableW(&ret->provider->fnTableW, fnTableA, fnTableW);
622  ret->provider->loaded = TRUE;
623  }
624  else
625  ret = NULL;
626  }
627  }
628  return ret;
629 }
630 
632 {
634 
635  if (packageName)
636  {
637  UNICODE_STRING package;
638 
639  RtlCreateUnicodeStringFromAsciiz(&package, packageName);
640  ret = SECUR32_findPackageW(package.Buffer);
641  RtlFreeUnicodeString(&package);
642  }
643  else
644  ret = NULL;
645  return ret;
646 }
647 
648 /* static */ void SECUR32_freeProviders(void)
649 {
650  TRACE("\n");
652 
653 #ifndef __REACTOS__
655 #endif
656 
657  if (packageTable)
658  {
659  SecurePackage *package, *package_next;
660  LIST_FOR_EACH_ENTRY_SAFE(package, package_next, &packageTable->table,
662  {
663  HeapFree(GetProcessHeap(), 0, package->infoW.Name);
664  HeapFree(GetProcessHeap(), 0, package->infoW.Comment);
665  HeapFree(GetProcessHeap(), 0, package);
666  }
667 
669  packageTable = NULL;
670  }
671 
672  if (providerTable)
673  {
674  SecureProvider *provider, *provider_next;
675  LIST_FOR_EACH_ENTRY_SAFE(provider, provider_next, &providerTable->table,
677  {
678  HeapFree(GetProcessHeap(), 0, provider->moduleName);
679  if (provider->lib)
680  FreeLibrary(provider->lib);
681  HeapFree(GetProcessHeap(), 0, provider);
682  }
683 
686  }
687 
690 }
691 
692 /***********************************************************************
693  * FreeContextBuffer (SECUR32.@)
694  *
695  * Doh--if pv was allocated by a crypto package, this may not be correct.
696  * The sample ssp seems to use LocalAlloc/LocalFee, but there doesn't seem to
697  * be any guarantee, nor is there an alloc function in secur32.
698  */
700 {
701  HeapFree(GetProcessHeap(), 0, pv);
702 
703  return SEC_E_OK;
704 }
705 
706 /***********************************************************************
707  * EnumerateSecurityPackagesW (SECUR32.@)
708  */
710  PSecPkgInfoW *ppPackageInfo)
711 {
713 
714  TRACE("(%p, %p)\n", pcPackages, ppPackageInfo);
715 
716 #ifdef __REACTOS__
717  if (!packageTable)
719 #endif
720 
721  /* windows just crashes if pcPackages or ppPackageInfo is NULL, so will I */
722  *pcPackages = 0;
724  if (packageTable)
725  {
726  SecurePackage *package;
727  size_t bytesNeeded;
728 
729  bytesNeeded = packageTable->numPackages * sizeof(SecPkgInfoW);
731  {
732  if (package->infoW.Name)
733  bytesNeeded += (lstrlenW(package->infoW.Name) + 1) * sizeof(WCHAR);
734  if (package->infoW.Comment)
735  bytesNeeded += (lstrlenW(package->infoW.Comment) + 1) * sizeof(WCHAR);
736  }
737  if (bytesNeeded)
738  {
739  *ppPackageInfo = HeapAlloc(GetProcessHeap(), 0, bytesNeeded);
740  if (*ppPackageInfo)
741  {
742  ULONG i = 0;
743  PWSTR nextString;
744 
745  *pcPackages = packageTable->numPackages;
746  nextString = (PWSTR)((PBYTE)*ppPackageInfo +
749  {
750  PSecPkgInfoW pkgInfo = *ppPackageInfo + i++;
751 
752  *pkgInfo = package->infoW;
753  if (package->infoW.Name)
754  {
755  TRACE("Name[%d] = %s\n", i - 1, debugstr_w(package->infoW.Name));
756  pkgInfo->Name = nextString;
757  lstrcpyW(nextString, package->infoW.Name);
758  nextString += lstrlenW(nextString) + 1;
759  }
760  else
761  pkgInfo->Name = NULL;
762  if (package->infoW.Comment)
763  {
764  TRACE("Comment[%d] = %s\n", i - 1, debugstr_w(package->infoW.Comment));
765  pkgInfo->Comment = nextString;
766  lstrcpyW(nextString, package->infoW.Comment);
767  nextString += lstrlenW(nextString) + 1;
768  }
769  else
770  pkgInfo->Comment = NULL;
771  }
772  }
773  else
775  }
776  }
778  TRACE("<-- 0x%08x\n", ret);
779  return ret;
780 }
781 
782 /* Converts info (which is assumed to be an array of cPackages SecPkgInfoW
783  * structures) into an array of SecPkgInfoA structures, which it returns.
784  */
786  const SecPkgInfoW *info)
787 {
789 
790  if (info)
791  {
792  size_t bytesNeeded = cPackages * sizeof(SecPkgInfoA);
793  ULONG i;
794 
795  for (i = 0; i < cPackages; i++)
796  {
797  if (info[i].Name)
798  bytesNeeded += WideCharToMultiByte(CP_ACP, 0, info[i].Name,
799  -1, NULL, 0, NULL, NULL);
800  if (info[i].Comment)
801  bytesNeeded += WideCharToMultiByte(CP_ACP, 0, info[i].Comment,
802  -1, NULL, 0, NULL, NULL);
803  }
804  ret = HeapAlloc(GetProcessHeap(), 0, bytesNeeded);
805  if (ret)
806  {
807  PSTR nextString;
808 
809  nextString = (PSTR)((PBYTE)ret + cPackages * sizeof(SecPkgInfoA));
810  for (i = 0; i < cPackages; i++)
811  {
812  PSecPkgInfoA pkgInfo = ret + i;
813  int bytes;
814 
815  memcpy(pkgInfo, &info[i], sizeof(SecPkgInfoA));
816  if (info[i].Name)
817  {
818  pkgInfo->Name = nextString;
819  /* just repeat back to WideCharToMultiByte how many bytes
820  * it requires, since we asked it earlier
821  */
823  NULL, 0, NULL, NULL);
825  pkgInfo->Name, bytes, NULL, NULL);
826  nextString += lstrlenA(nextString) + 1;
827  }
828  else
829  pkgInfo->Name = NULL;
830  if (info[i].Comment)
831  {
832  pkgInfo->Comment = nextString;
833  /* just repeat back to WideCharToMultiByte how many bytes
834  * it requires, since we asked it earlier
835  */
836  bytes = WideCharToMultiByte(CP_ACP, 0, info[i].Comment, -1,
837  NULL, 0, NULL, NULL);
838  WideCharToMultiByte(CP_ACP, 0, info[i].Comment, -1,
839  pkgInfo->Comment, bytes, NULL, NULL);
840  nextString += lstrlenA(nextString) + 1;
841  }
842  else
843  pkgInfo->Comment = NULL;
844  }
845  }
846  }
847  else
848  ret = NULL;
849  return ret;
850 }
851 
852 /***********************************************************************
853  * EnumerateSecurityPackagesA (SECUR32.@)
854  */
856  PSecPkgInfoA *ppPackageInfo)
857 {
860 
861  ret = EnumerateSecurityPackagesW(pcPackages, &info);
862  if (ret == SEC_E_OK && *pcPackages && info)
863  {
864  *ppPackageInfo = thunk_PSecPkgInfoWToA(*pcPackages, info);
865  if (*pcPackages && !*ppPackageInfo)
866  {
867  *pcPackages = 0;
869  }
871  }
872  return ret;
873 }
874 
875 /***********************************************************************
876  * GetComputerObjectNameA (SECUR32.@)
877  *
878  * Get the local computer's name using the format specified.
879  *
880  * PARAMS
881  * NameFormat [I] The format for the name.
882  * lpNameBuffer [O] Pointer to buffer to receive the name.
883  * nSize [I/O] Size in characters of buffer.
884  *
885  * RETURNS
886  * TRUE If the name was written to lpNameBuffer.
887  * FALSE If the name couldn't be written.
888  *
889  * NOTES
890  * If lpNameBuffer is NULL, then the size of the buffer needed to hold the
891  * name will be returned in *nSize.
892  *
893  * nSize returns the number of characters written when lpNameBuffer is not
894  * NULL or the size of the buffer needed to hold the name when the buffer
895  * is too short or lpNameBuffer is NULL.
896  *
897  * It the buffer is too short, ERROR_INSUFFICIENT_BUFFER error will be set.
898  */
900  EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
901 {
902  BOOLEAN rc;
903  LPWSTR bufferW = NULL;
904  ULONG sizeW = *nSize;
905  TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
906  if (lpNameBuffer) {
907  bufferW = HeapAlloc(GetProcessHeap(), 0, sizeW * sizeof(WCHAR));
908  if (bufferW == NULL) {
910  return FALSE;
911  }
912  }
913  rc = GetComputerObjectNameW(NameFormat, bufferW, &sizeW);
914  if (rc && bufferW) {
915  ULONG len = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
916  WideCharToMultiByte(CP_ACP, 0, bufferW, -1, lpNameBuffer, *nSize, NULL, NULL);
917  *nSize = len;
918  }
919  else
920  *nSize = sizeW;
921  HeapFree(GetProcessHeap(), 0, bufferW);
922  return rc;
923 }
924 
925 /***********************************************************************
926  * GetComputerObjectNameW (SECUR32.@)
927  */
929  EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
930 {
931  LSA_HANDLE policyHandle;
932  LSA_OBJECT_ATTRIBUTES objectAttributes;
933  PPOLICY_DNS_DOMAIN_INFO domainInfo;
934  NTSTATUS ntStatus;
935  BOOLEAN status;
936  TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
937 
938  if (NameFormat == NameUnknown)
939  {
941  return FALSE;
942  }
943 
944  ZeroMemory(&objectAttributes, sizeof(objectAttributes));
945  objectAttributes.Length = sizeof(objectAttributes);
946 
947  ntStatus = LsaOpenPolicy(NULL, &objectAttributes,
949  &policyHandle);
950  if (ntStatus != STATUS_SUCCESS)
951  {
953  WARN("LsaOpenPolicy failed with NT status %u\n", GetLastError());
954  return FALSE;
955  }
956 
957  ntStatus = LsaQueryInformationPolicy(policyHandle,
959  (PVOID *)&domainInfo);
960  if (ntStatus != STATUS_SUCCESS)
961  {
963  WARN("LsaQueryInformationPolicy failed with NT status %u\n",
964  GetLastError());
965  LsaClose(policyHandle);
966  return FALSE;
967  }
968 
969  if (domainInfo->Sid)
970  {
971  switch (NameFormat)
972  {
973  case NameSamCompatible:
974  {
976  DWORD size = sizeof(name)/sizeof(name[0]);
977  if (GetComputerNameW(name, &size))
978  {
979  DWORD len = domainInfo->Name.Length + size + 3;
980  if (lpNameBuffer)
981  {
982  if (*nSize < len)
983  {
984  *nSize = len;
986  status = FALSE;
987  }
988  else
989  {
990  WCHAR bs[] = { '\\', 0 };
991  WCHAR ds[] = { '$', 0 };
992  lstrcpyW(lpNameBuffer, domainInfo->Name.Buffer);
996  status = TRUE;
997  }
998  }
999  else /* just requesting length required */
1000  {
1001  *nSize = len;
1002  status = TRUE;
1003  }
1004  }
1005  else
1006  {
1008  status = FALSE;
1009  }
1010  }
1011  break;
1012  case NameFullyQualifiedDN:
1013  case NameDisplay:
1014  case NameUniqueId:
1015  case NameCanonical:
1016  case NameUserPrincipal:
1017  case NameCanonicalEx:
1018  case NameServicePrincipal:
1019  case NameDnsDomain:
1020  FIXME("NameFormat %d not implemented\n", NameFormat);
1022  status = FALSE;
1023  break;
1024  default:
1026  status = FALSE;
1027  }
1028  }
1029  else
1030  {
1032  status = FALSE;
1033  }
1034 
1035  LsaFreeMemory(domainInfo);
1036  LsaClose(policyHandle);
1037 
1038  return status;
1039 }
1040 
1041 /***********************************************************************
1042  * GetUserNameExA (SECUR32.@)
1043  */
1045  EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
1046 {
1047  BOOLEAN rc;
1048  LPWSTR bufferW = NULL;
1049  ULONG sizeW = *nSize;
1050  TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
1051  if (lpNameBuffer) {
1052  bufferW = HeapAlloc(GetProcessHeap(), 0, sizeW * sizeof(WCHAR));
1053  if (bufferW == NULL) {
1055  return FALSE;
1056  }
1057  }
1058  rc = GetUserNameExW(NameFormat, bufferW, &sizeW);
1059  if (rc) {
1060  ULONG len = WideCharToMultiByte(CP_ACP, 0, bufferW, -1, NULL, 0, NULL, NULL);
1061  if (len <= *nSize)
1062  {
1063  WideCharToMultiByte(CP_ACP, 0, bufferW, -1, lpNameBuffer, *nSize, NULL, NULL);
1064  *nSize = len - 1;
1065  }
1066  else
1067  {
1068  *nSize = len;
1069  rc = FALSE;
1071  }
1072  }
1073  else
1074  *nSize = sizeW;
1075  HeapFree(GetProcessHeap(), 0, bufferW);
1076  return rc;
1077 }
1078 
1080  EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
1081 {
1082  TRACE("(%d %p %p)\n", NameFormat, lpNameBuffer, nSize);
1083 
1084  switch (NameFormat)
1085  {
1086  case NameSamCompatible:
1087  {
1088  WCHAR samname[UNLEN + 1 + MAX_COMPUTERNAME_LENGTH + 1];
1089  LPWSTR out;
1090  DWORD len;
1091 
1092  /* This assumes the current user is always a local account */
1094  if (GetComputerNameW(samname, &len))
1095  {
1096  out = samname + lstrlenW(samname);
1097  *out++ = '\\';
1098  len = UNLEN + 1;
1099  if (GetUserNameW(out, &len))
1100  {
1101  if (lstrlenW(samname) < *nSize)
1102  {
1103  lstrcpyW(lpNameBuffer, samname);
1104  *nSize = lstrlenW(samname);
1105  return TRUE;
1106  }
1107 
1109  *nSize = lstrlenW(samname) + 1;
1110  }
1111  }
1112  return FALSE;
1113  }
1114 
1115  case NameUnknown:
1116  case NameFullyQualifiedDN:
1117  case NameDisplay:
1118  case NameUniqueId:
1119  case NameCanonical:
1120  case NameUserPrincipal:
1121  case NameCanonicalEx:
1122  case NameServicePrincipal:
1123  case NameDnsDomain:
1125  return FALSE;
1126 
1127  default:
1129  return FALSE;
1130  }
1131 }
1132 
1134  LPCSTR lpAccountName, EXTENDED_NAME_FORMAT AccountNameFormat,
1135  EXTENDED_NAME_FORMAT DesiredNameFormat, LPSTR lpTranslatedName,
1136  PULONG nSize)
1137 {
1138  FIXME("%p %d %d %p %p\n", lpAccountName, AccountNameFormat,
1139  DesiredNameFormat, lpTranslatedName, nSize);
1140  return FALSE;
1141 }
1142 
1144  LPCWSTR lpAccountName, EXTENDED_NAME_FORMAT AccountNameFormat,
1145  EXTENDED_NAME_FORMAT DesiredNameFormat, LPWSTR lpTranslatedName,
1146  PULONG nSize)
1147 {
1148  FIXME("%p %d %d %p %p\n", lpAccountName, AccountNameFormat,
1149  DesiredNameFormat, lpTranslatedName, nSize);
1150  return FALSE;
1151 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
static SecureProviderTable * providerTable
Definition: sspi.c:56
DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext
Definition: sspi.h:951
DECRYPT_MESSAGE_FN DecryptMessage
Definition: sspi.h:968
const uint16_t * PCWSTR
Definition: typedefs.h:55
#define isspace(c)
Definition: acclib.h:69
QUERY_SECURITY_PACKAGE_INFO_FN_A QuerySecurityPackageInfoA
Definition: sspi.h:959
#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION
Definition: sspi.h:1010
SEC_WCHAR * Comment
Definition: sspi.h:106
#define TRUE
Definition: types.h:120
SECURITY_STATUS WINAPI QuerySecurityContextToken(PCtxtHandle phContext, HANDLE *phToken)
Definition: wrapper.c:976
void SECUR32_initNTLMSP(void)
Definition: ntlm.c:2026
#define ERROR_CANT_ACCESS_DOMAIN_INFO
Definition: winerror.h:832
struct _SecPkgInfoW SecPkgInfoW
#define ERROR_SUCCESS
Definition: deptool.c:10
ADD_CREDENTIALS_FN_A AddCredentialsA
Definition: sspi.h:964
#define DWORD_PTR
Definition: treelist.c:76
#define WideCharToMultiByte
Definition: compat.h:101
SECURITY_STATUS WINAPI AcquireCredentialsHandleW(SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialsUse, PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn, PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Definition: wrapper.c:105
#define ERROR_INTERNAL_ERROR
Definition: winerror.h:840
NTSTATUS WINAPI LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer)
Definition: lsa.c:1471
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
SECURITY_STATUS SEC_ENTRY thunk_ImportSecurityContextW(SEC_WCHAR *pszPackage, PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
Definition: thunks.c:880
#define SECURITY_ENTRYPOINT_ANSIA
Definition: sspi.h:936
SECURITY_STATUS WINAPI FreeContextBuffer(PVOID pv)
Definition: sspi.c:699
VERIFY_SIGNATURE_FN VerifySignature
Definition: sspi.h:992
#define KEY_READ
Definition: nt_native.h:1023
#define POLICY_VIEW_LOCAL_INFORMATION
Definition: ntsecapi.h:61
uint16_t * PWSTR
Definition: typedefs.h:54
#define CP_ACP
Definition: compat.h:99
REVERT_SECURITY_CONTEXT_FN RevertSecurityContext
Definition: sspi.h:990
static const SecPkgInfoA infoA
Definition: kerberos.c:302
#define WARN(fmt,...)
Definition: debug.h:111
#define ERROR_NONE_MAPPED
Definition: winerror.h:814
LONG NTSTATUS
Definition: precomp.h:26
*nSize LPSTR _Inout_ LPDWORD nSize
Definition: winbase.h:2031
BOOLEAN WINAPI TranslateNameW(LPCWSTR lpAccountName, EXTENDED_NAME_FORMAT AccountNameFormat, EXTENDED_NAME_FORMAT DesiredNameFormat, LPWSTR lpTranslatedName, PULONG nSize)
Definition: sspi.c:1143
SECURITY_STATUS WINAPI EnumerateSecurityPackagesA(PULONG pcPackages, PSecPkgInfoA *ppPackageInfo)
Definition: sspi.c:855
DECRYPT_MESSAGE_FN DecryptMessage
Definition: sspi.h:1003
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
Definition: lsa.c:192
SECURITY_STATUS SEC_ENTRY thunk_QueryCredentialsAttributesW(PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
Definition: thunks.c:136
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ds
Definition: i386-dis.c:434
#define assert(x)
Definition: debug.h:53
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1642
BOOLEAN WINAPI GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:1044
SECURITY_STATUS WINAPI FreeCredentialsHandle(PCredHandle phCredential)
Definition: wrapper.c:151
void SECUR32_addPackages(SecureProvider *provider, ULONG toAdd, const SecPkgInfoA *infoA, const SecPkgInfoW *infoW)
Definition: sspi.c:411
SECURITY_STATUS WINAPI EnumerateSecurityPackagesW(PULONG pcPackages, PSecPkgInfoW *ppPackageInfo)
Definition: sspi.c:709
IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext
Definition: sspi.h:954
SecurePackage * SECUR32_findPackageW(PCWSTR packageName)
Definition: sspi.c:577
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:440
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
char * LPSTR
Definition: xmlstorage.h:182
_In_ LPCSTR lpAccountName
Definition: winbase.h:2698
#define lstrlenW
Definition: compat.h:415
struct _SecureProviderTable SecureProviderTable
static void _makeFnTableA(PSecurityFunctionTableA fnTableA, const SecurityFunctionTableA *inFnTableA, const SecurityFunctionTableW *inFnTableW)
Definition: sspi.c:199
ACQUIRE_CREDENTIALS_HANDLE_FN_A AcquireCredentialsHandleA
Definition: sspi.h:945
ENCRYPT_MESSAGE_FN EncryptMessage
Definition: sspi.h:1002
static const WCHAR securityProvidersW[]
Definition: sspi.c:519
WINE_DEFAULT_DEBUG_CHANNEL(secur32)
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
struct _test_info info[]
Definition: SetCursorPos.c:19
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
Definition: list.h:102
SECURITY_STATUS SEC_ENTRY thunk_AddCredentialsW(PCredHandle hCredentials, SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialUse, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, PTimeStamp ptsExpiry)
Definition: thunks.c:308
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
Definition: lsa.c:1181
QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken
Definition: sspi.h:966
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
SECURITY_STATUS WINAPI QueryCredentialsAttributesA(PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
Definition: wrapper.c:177
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
SECURITY_STATUS WINAPI AddCredentialsA(PCredHandle hCredentials, SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialUse, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, PTimeStamp ptsExpiry)
Definition: wrapper.c:906
MAKE_SIGNATURE_FN MakeSignature
Definition: sspi.h:956
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define SEC_E_INSUFFICIENT_MEMORY
Definition: winerror.h:2909
SECURITY_STATUS SEC_ENTRY thunk_AddCredentialsA(PCredHandle hCredentials, SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialUse, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, PTimeStamp ptsExpiry)
Definition: thunks.c:268
#define SECURITY_ENTRYPOINT_ANSIW
Definition: sspi.h:937
unsigned int BOOL
Definition: ntddk_ex.h:94
QUERY_CONTEXT_ATTRIBUTES_FN_A QueryContextAttributesA
Definition: sspi.h:953
#define debugstr_w
Definition: kernel32.h:32
SECURITY_STATUS SEC_ENTRY thunk_ImportSecurityContextA(SEC_CHAR *pszPackage, PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
Definition: thunks.c:864
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW
Definition: sspi.h:978
SECURITY_STATUS WINAPI CompleteAuthToken(PCtxtHandle phContext, PSecBufferDesc pToken)
Definition: wrapper.c:420
ENUMERATE_SECURITY_PACKAGES_FN_A EnumerateSecurityPackagesA
Definition: sspi.h:943
SEC_WCHAR * Name
Definition: sspi.h:105
SECURITY_STATUS SEC_ENTRY thunk_QueryContextAttributesA(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer)
Definition: thunks.c:540
const WCHAR * str
unsigned char BOOLEAN
SECURITY_STATUS WINAPI VerifySignature(PCtxtHandle phContext, PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
Definition: wrapper.c:653
FREE_CONTEXT_BUFFER_FN FreeContextBuffer
Definition: sspi.h:958
PSecurityFunctionTableA(SEC_ENTRY * INIT_SECURITY_INTERFACE_A)(void)
Definition: sspi.h:1017
#define LoadLibraryW(x)
Definition: compat.h:412
smooth NULL
Definition: ftsmooth.c:416
SEC_CHAR * Comment
Definition: sspi.h:96
struct list table
Definition: secur32_wine.c:30
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
static SecurePackageTable * packageTable
Definition: sspi.c:55
static const WCHAR sizeW[]
Definition: editor.c:79
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
Definition: lsa.c:699
const char * LPCSTR
Definition: xmlstorage.h:183
SECURITY_STATUS WINAPI QueryCredentialsAttributesW(PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
Definition: wrapper.c:207
ENCRYPT_MESSAGE_FN EncryptMessage
Definition: sspi.h:967
PSTR SECUR32_AllocMultiByteFromWide(PCWSTR str)
Definition: sspi.c:175
LONG SECURITY_STATUS
Definition: sspi.h:34
void SECUR32_freeProviders(void)
Definition: sspi.c:648
PSecurityFunctionTableW(SEC_ENTRY * INIT_SECURITY_INTERFACE_W)(void)
Definition: sspi.h:1018
static LPSTR lpNameBuffer
Definition: secur32.c:50
SECURITY_STATUS SEC_ENTRY thunk_InitializeSecurityContextA(PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR *pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: thunks.c:189
VERIFY_SIGNATURE_FN VerifySignature
Definition: sspi.h:957
SECURITY_STATUS SEC_ENTRY thunk_AcquireCredentialsHandleW(SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialsUse, PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn, PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Definition: thunks.c:53
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
#define TRACE(s)
Definition: solgame.cpp:4
#define FreeLibrary(x)
Definition: compat.h:413
GLsizeiptr size
Definition: glext.h:5919
SECURITY_STATUS SEC_ENTRY thunk_QueryContextAttributesW(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer)
Definition: thunks.c:766
SECURITY_STATUS WINAPI InitializeSecurityContextW(PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR *pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: wrapper.c:301
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static const SecPkgInfoW infoW
Definition: kerberos.c:293
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
static PWSTR SECUR32_strdupW(PCWSTR str)
Definition: sspi.c:138
__wchar_t WCHAR
Definition: xmlstorage.h:180
SECURITY_STATUS WINAPI AcquireCredentialsHandleA(SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialsUse, PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn, PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Definition: wrapper.c:59
ULONG WINAPI LsaNtStatusToWinError(IN NTSTATUS Status)
Definition: lsa.c:1129
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
SECURITY_STATUS WINAPI AcceptSecurityContext(PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput, ULONG fContextReq, ULONG TargetDataRep, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: wrapper.c:365
IMPORT_SECURITY_CONTEXT_FN_A ImportSecurityContextA
Definition: sspi.h:963
SECURITY_STATUS WINAPI AddCredentialsW(PCredHandle hCredentials, SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialUse, void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument, PTimeStamp ptsExpiry)
Definition: wrapper.c:941
SECURITY_STATUS WINAPI ExportSecurityContext(PCtxtHandle phContext, ULONG fFlags, PSecBuffer pPackedContext, void **pToken)
Definition: wrapper.c:807
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
INITIALIZE_SECURITY_CONTEXT_FN_A InitializeSecurityContextA
Definition: sspi.h:948
SECURITY_STATUS WINAPI InitializeSecurityContextA(PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR *pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: wrapper.c:237
SECURITY_STATUS SEC_ENTRY thunk_SetContextAttributesA(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
Definition: thunks.c:798
static FILE * out
Definition: regtests2xml.c:44
BOOLEAN WINAPI TranslateNameA(LPCSTR lpAccountName, EXTENDED_NAME_FORMAT AccountNameFormat, EXTENDED_NAME_FORMAT DesiredNameFormat, LPSTR lpTranslatedName, PULONG nSize)
Definition: sspi.c:1133
DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext
Definition: sspi.h:986
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
INITIALIZE_SECURITY_CONTEXT_FN_W InitializeSecurityContextW
Definition: sspi.h:983
static SecurityFunctionTableA securityFunctionTableA
Definition: sspi.c:58
#define SetLastError(x)
Definition: compat.h:417
static const WCHAR securityProvidersKeyW[]
Definition: sspi.c:514
PWSTR SECUR32_AllocWideFromMultiByte(PCSTR str)
Definition: sspi.c:153
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
ADD_CREDENTIALS_FN_W AddCredentialsW
Definition: sspi.h:999
IMPORT_SECURITY_CONTEXT_FN_W ImportSecurityContextW
Definition: sspi.h:998
int ret
BOOLEAN WINAPI GetComputerObjectNameA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:899
struct _SECURITY_FUNCTION_TABLE_W SecurityFunctionTableW
HKEY key
Definition: reg.c:42
SECURITY_STATUS WINAPI QueryContextAttributesA(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer)
Definition: wrapper.c:505
uint32_t entry
Definition: isohybrid.c:63
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
static SecurityFunctionTableW securityFunctionTableW
Definition: sspi.c:89
static PSecPkgInfoA thunk_PSecPkgInfoWToA(ULONG cPackages, const SecPkgInfoW *info)
Definition: sspi.c:785
unsigned char BYTE
Definition: mem.h:68
Definition: _list.h:228
PSecurityFunctionTableA WINAPI InitSecurityInterfaceA(void)
Definition: sspi.c:123
PSecurityFunctionTableW WINAPI InitSecurityInterfaceW(void)
Definition: sspi.c:132
void SECUR32_initNegotiateSP(void)
Definition: negotiate.c:516
LIST_ENTRY ProcessLocksList
Definition: winbase.h:855
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define SEC_E_OK
Definition: winerror.h:2356
SECURITY_STATUS WINAPI QueryContextAttributesW(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer)
Definition: wrapper.c:535
EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext
Definition: sspi.h:997
QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA
Definition: sspi.h:944
SEC_CHAR * Name
Definition: sspi.h:95
static CRITICAL_SECTION_DEBUG cs_debug
Definition: sspi.c:48
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:240
SecureProvider * SECUR32_addProvider(const SecurityFunctionTableA *fnTableA, const SecurityFunctionTableW *fnTableW, PCWSTR moduleName)
Definition: sspi.c:364
SecureProvider * provider
Definition: schannel_priv.h:36
struct _SecPkgInfoA SecPkgInfoA
static CRITICAL_SECTION cs
Definition: sspi.c:47
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define lstrcpyW
Definition: compat.h:414
QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken
Definition: sspi.h:1001
SECURITY_STATUS WINAPI QuerySecurityPackageInfoA(SEC_CHAR *pszPackageName, PSecPkgInfoA *ppPackageInfo)
Definition: wrapper.c:683
SECURITY_STATUS SEC_ENTRY thunk_InitializeSecurityContextW(PCredHandle phCredential, PCtxtHandle phContext, SEC_WCHAR *pszTargetName, ULONG fContextReq, ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry)
Definition: thunks.c:229
COMPLETE_AUTH_TOKEN_FN CompleteAuthToken
Definition: sspi.h:985
#define UNLEN
Definition: sspi.c:28
SET_CONTEXT_ATTRIBUTES_FN_W SetContextAttributesW
Definition: sspi.h:1004
signed char * PSTR
Definition: retypes.h:7
SecurePackage * SECUR32_findPackageA(PCSTR packageName)
Definition: sspi.c:631
unsigned int * PULONG
Definition: retypes.h:1
SET_CONTEXT_ATTRIBUTES_FN_A SetContextAttributesA
Definition: sspi.h:969
struct _SECURITY_FUNCTION_TABLE_A SecurityFunctionTableA
SECURITY_STATUS WINAPI DecryptMessage(PCtxtHandle phContext, PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP)
Definition: wrapper.c:1036
BOOLEAN WINAPI GetComputerObjectNameW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:928
#define MultiByteToWideChar
Definition: compat.h:100
REVERT_SECURITY_CONTEXT_FN RevertSecurityContext
Definition: sspi.h:955
BOOLEAN WINAPI GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:1079
ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext
Definition: sspi.h:984
SECURITY_STATUS WINAPI ImportSecurityContextW(SEC_WCHAR *pszPackage, PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
Definition: wrapper.c:872
static void _makeFnTableW(PSecurityFunctionTableW fnTableW, const SecurityFunctionTableA *inFnTableA, const SecurityFunctionTableW *inFnTableW)
Definition: sspi.c:270
SECURITY_STATUS SEC_ENTRY thunk_AcquireCredentialsHandleA(SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialsUse, PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn, PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry)
Definition: thunks.c:26
SECURITY_STATUS SEC_ENTRY thunk_QueryCredentialsAttributesA(PCredHandle phCredential, ULONG ulAttribute, void *pBuffer)
Definition: thunks.c:83
Definition: name.c:38
static void _copyPackageInfo(PSecPkgInfoW info, const SecPkgInfoA *inInfoA, const SecPkgInfoW *inInfoW)
Definition: sspi.c:341
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW
Definition: sspi.h:980
unsigned int ULONG
Definition: retypes.h:1
QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW
Definition: sspi.h:988
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
SECURITY_STATUS WINAPI RevertSecurityContext(PCtxtHandle phContext)
Definition: wrapper.c:594
ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext
Definition: sspi.h:949
#define GetProcAddress(x, y)
Definition: compat.h:418
SecPkgInfoW infoW
Definition: schannel_priv.h:35
FREE_CONTEXT_BUFFER_FN FreeContextBuffer
Definition: sspi.h:993
const char * PCSTR
Definition: typedefs.h:51
void SECUR32_deinitSchannelSP(void)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
MAKE_SIGNATURE_FN MakeSignature
Definition: sspi.h:991
WCHAR * LPWSTR
Definition: xmlstorage.h:184
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
SECURITY_STATUS WINAPI ImpersonateSecurityContext(PCtxtHandle phContext)
Definition: wrapper.c:565
return STATUS_SUCCESS
Definition: btrfs.c:2938
EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext
Definition: sspi.h:962
struct _SecurePackageTable SecurePackageTable
COMPLETE_AUTH_TOKEN_FN CompleteAuthToken
Definition: sspi.h:950
IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext
Definition: sspi.h:989
static SERVICE_STATUS status
Definition: service.c:31
SECURITY_STATUS WINAPI MakeSignature(PCtxtHandle phContext, ULONG fQOP, PSecBufferDesc pMessage, ULONG MessageSeqNo)
Definition: wrapper.c:623
BYTE * PBYTE
Definition: pedump.c:66
static void _tryLoadProvider(PWSTR moduleName)
Definition: sspi.c:452
#define HeapFree(x, y, z)
Definition: compat.h:402
SECURITY_STATUS WINAPI EncryptMessage(PCtxtHandle phContext, ULONG fQOP, PSecBufferDesc pMessage, ULONG MessageSeqNo)
Definition: wrapper.c:1006
SECURITY_STATUS WINAPI ImportSecurityContextA(SEC_CHAR *pszPackage, PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext)
Definition: wrapper.c:837
static void SECUR32_initializeProviders(void)
Definition: sspi.c:523
SECURITY_STATUS WINAPI QuerySecurityPackageInfoW(SEC_WCHAR *pszPackageName, PSecPkgInfoW *ppPackageInfo)
Definition: wrapper.c:750
SECURITY_STATUS WINAPI DeleteSecurityContext(PCtxtHandle phContext)
Definition: wrapper.c:450
QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW
Definition: sspi.h:979
void SECUR32_initKerberosSP(void)
Definition: kerberos.c:311
Definition: path.c:42
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
QUERY_SECURITY_PACKAGE_INFO_FN_W QuerySecurityPackageInfoW
Definition: sspi.h:994
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define REG_SZ
Definition: layer.c:22
Definition: ps.c:97
SECURITY_STATUS SEC_ENTRY thunk_SetContextAttributesW(PCtxtHandle phContext, ULONG ulAttribute, void *pBuffer, ULONG cbBuffer)
Definition: thunks.c:831
GLuint const GLchar * name
Definition: glext.h:6031
SECURITY_STATUS WINAPI ApplyControlToken(PCtxtHandle phContext, PSecBufferDesc pInput)
Definition: wrapper.c:475