DWORD LsaPstorepBackendGetJoinedDomainsW( IN PLSA_PSTORE_BACKEND_STATE State, OUT PWSTR** DnsDomainNames, OUT PDWORD Count ) { DWORD dwError = 0; int EE = 0; PWSTR* dnsDomainNames = NULL; DWORD count = 0; PSTR* internalDnsDomainNames = NULL; DWORD internalCount = 0; dwError = LwpsLegacyGetJoinedDomains( State->OldStoreHandle, &internalDnsDomainNames, &internalCount); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); if (!internalCount) { GOTO_CLEANUP_EE(EE); } dwError = LwNtStatusToWin32Error(LW_RTL_ALLOCATE( &dnsDomainNames, VOID, internalCount * sizeof(dnsDomainNames[0]))); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); for (count = 0; count < internalCount; count++) { dwError = LwNtStatusToWin32Error(LwRtlWC16StringAllocateFromCString( &dnsDomainNames[count], internalDnsDomainNames[count])); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); } cleanup: if (dwError) { if (dnsDomainNames) { LsaPstoreFreeStringArrayW(dnsDomainNames, count); dnsDomainNames = NULL; } count = 0; } if (internalDnsDomainNames) { LwpsLegacyFreeStringArray(internalDnsDomainNames, internalCount); } *DnsDomainNames = dnsDomainNames; *Count = count; LSA_PSTORE_LOG_LEAVE_ERROR_EE(dwError, EE); return dwError; }
DWORD LwpsLegacyGetJoinedDomains( IN PLWPS_LEGACY_STATE pContext, OUT PSTR** pppszDomainList, OUT PDWORD pdwDomainCount ) { DWORD dwError = 0; int EE = 0; PWSTR* ppwszSubKeys = NULL; PSTR pszSubKey = NULL; PSTR pszSubKeyPtr = NULL; PSTR* ppszDomainList = NULL; DWORD dwSubKeysLen = 0; DWORD dwIndexKeys = 0; DWORD dwIndexDomains = 0; DWORD dwDomainCount = 0; dwError = RegUtilIsValidKey( pContext->hReg, HKEY_THIS_MACHINE, PSTOREDB_REGISTRY_AD_KEY); if (dwError) { dwError = 0; GOTO_CLEANUP_EE(EE); } dwError = RegUtilGetKeys( pContext->hReg, HKEY_THIS_MACHINE, PSTOREDB_REGISTRY_AD_KEY, NULL, &ppwszSubKeys, &dwSubKeysLen); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); if (dwSubKeysLen) { dwError = LwAllocateMemory( sizeof(*ppszDomainList) * dwSubKeysLen, (PVOID*)&ppszDomainList); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); for (dwIndexKeys = 0, dwIndexDomains = 0 ; dwIndexKeys < dwSubKeysLen; dwIndexKeys++) { dwError = LwWc16sToMbs(ppwszSubKeys[dwIndexKeys], &pszSubKey); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); pszSubKeyPtr = strrchr(pszSubKey, '\\'); if (pszSubKeyPtr) { dwError = LwAllocateString( ++pszSubKeyPtr, &ppszDomainList[dwIndexDomains]); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); LW_SAFE_FREE_STRING(pszSubKey); } else { ppszDomainList[dwIndexDomains] = pszSubKey; pszSubKey = NULL; } dwError = LwpsLegacyReadPassword( pContext, ppszDomainList[dwIndexDomains], NULL); if (dwError == NERR_SetupNotJoined) { // The domain is not joined. dwError = 0; LW_SAFE_FREE_STRING(ppszDomainList[dwIndexDomains]); } else { dwIndexDomains++; } } } dwDomainCount = dwIndexDomains; cleanup: if (dwError) { if (ppszDomainList) { LwpsLegacyFreeStringArray(ppszDomainList, dwSubKeysLen); ppszDomainList = NULL; } dwDomainCount = 0; } for (dwIndexKeys = 0; dwIndexKeys < dwSubKeysLen; dwIndexKeys++) { LW_SAFE_FREE_MEMORY(ppwszSubKeys[dwIndexKeys]); } LW_SAFE_FREE_MEMORY(ppwszSubKeys); LW_SAFE_FREE_STRING(pszSubKey); *pppszDomainList = ppszDomainList; *pdwDomainCount = dwDomainCount; LSA_PSTORE_LOG_LEAVE_ERROR_EE(dwError, EE); return dwError; }