static NTSTATUS SrvShareRegWriteToShareInfo( IN REG_DATA_TYPE regDataType, IN PWSTR pwszShareName, IN PBYTE pData, IN ULONG ulDataLen, IN REG_DATA_TYPE regSecDataType, IN PBYTE pSecData, IN ULONG ulSecDataLen, OUT PSRV_SHARE_INFO* ppShareInfo ) { NTSTATUS ntStatus = STATUS_SUCCESS; PSRV_SHARE_INFO pShareInfo = NULL; PWSTR* ppwszValues = NULL; PSTR pszFlags = NULL; ntStatus = SrvAllocateMemory(sizeof(*pShareInfo), (PVOID*)&pShareInfo); BAIL_ON_NT_STATUS(ntStatus); pShareInfo->refcount = 1; pthread_rwlock_init(&pShareInfo->mutex, NULL); pShareInfo->pMutex = &pShareInfo->mutex; ntStatus = SrvAllocateStringW(pwszShareName, &pShareInfo->pwszName); BAIL_ON_NT_STATUS(ntStatus); if (pData) { ULONG iValue = 0; wchar16_t wszCommentPrefix[] = REG_KEY_COMMENT_PREFIX_W; ULONG ulCommentPrefixLen = (sizeof(wszCommentPrefix)/sizeof(wchar16_t)) - 1; wchar16_t wszPathPrefix[] = REG_KEY_PATH_PREFIX_W; ULONG ulPathPrefixLen = (sizeof(wszPathPrefix)/sizeof(wchar16_t)) - 1; wchar16_t wszServicePrefix[] = REG_KEY_SERVICE_PREFIX_W; ULONG ulServicePrefixLen = (sizeof(wszServicePrefix)/sizeof(wchar16_t)) - 1; wchar16_t wszFlagsPrefix[] = REG_KEY_FLAGS_PREFIX_W; ULONG ulFlagsPrefixLen = (sizeof(wszFlagsPrefix)/sizeof(wchar16_t)) - 1; ntStatus = NtRegByteArrayToMultiStrs(pData, ulDataLen, &ppwszValues); BAIL_ON_NT_STATUS(ntStatus); for (; ppwszValues[iValue]; iValue++) { PWSTR pwszValue = &ppwszValues[iValue][0]; if (!wc16sncmp(&wszPathPrefix[0], pwszValue, ulPathPrefixLen)) { SRV_SAFE_FREE_MEMORY(pShareInfo->pwszPath); ntStatus = SrvAllocateStringW( &pwszValue[ulPathPrefixLen], &pShareInfo->pwszPath); BAIL_ON_NT_STATUS(ntStatus); } else if (!wc16sncmp(&wszCommentPrefix[0], pwszValue, ulCommentPrefixLen)) { SRV_SAFE_FREE_MEMORY(pShareInfo->pwszComment); ntStatus = SrvAllocateStringW( &pwszValue[ulCommentPrefixLen], &pShareInfo->pwszComment); BAIL_ON_NT_STATUS(ntStatus); } else if (!wc16sncmp(&wszServicePrefix[0], pwszValue, ulServicePrefixLen)) { ntStatus = SrvShareMapServiceStringToIdW( &pwszValue[ulServicePrefixLen], &pShareInfo->service); BAIL_ON_NT_STATUS(ntStatus); } else if (!wc16sncmp(&wszFlagsPrefix[0], pwszValue, ulFlagsPrefixLen)) { ntStatus = RtlCStringAllocateFromWC16String( &pszFlags, &pwszValue[ulFlagsPrefixLen]); BAIL_ON_NT_STATUS(ntStatus); pShareInfo->ulFlags = strtol(pszFlags, NULL, 16); } else { ntStatus = STATUS_INVALID_PARAMETER_3; BAIL_ON_NT_STATUS(ntStatus); } } } if (!pShareInfo->pwszComment) { wchar16_t wszComment[] = {0}; ntStatus = SrvAllocateStringW( &wszComment[0], &pShareInfo->pwszComment); BAIL_ON_NT_STATUS(ntStatus); } if (ulSecDataLen) { ntStatus = SrvShareSetSecurity( pShareInfo, (PSECURITY_DESCRIPTOR_RELATIVE)pSecData, ulSecDataLen); BAIL_ON_NT_STATUS(ntStatus); } else { ntStatus = SrvShareSetDefaultSecurity(pShareInfo); BAIL_ON_NT_STATUS(ntStatus); } *ppShareInfo = pShareInfo; cleanup: if (ppwszValues) { RegFreeMultiStrsW(ppwszValues); } RTL_FREE(&pszFlags); return ntStatus; error: if (pShareInfo) { SrvShareReleaseInfo(pShareInfo); } goto cleanup; }
DWORD LwLdapConvertDNToDomain( PCSTR pszDN, PSTR* ppszDomainName ) { DWORD dwError = LW_ERROR_SUCCESS; PSTR pszDomainName = NULL; PSTR pszCurrent = NULL; PWSTR pwszDNCopy = NULL; // Do not free PWSTR pwszDcLocation = NULL; PSTR pszDcLocation = NULL; PCSTR pszDelim = ","; PSTR pszDomainPart = NULL; PSTR pszStrTokSav = NULL; const wchar16_t pwszDcPrefix[] = { 'd', 'c', '=', 0 }; LW_BAIL_ON_INVALID_STRING(pszDN); dwError = LwMbsToWc16s(pszDN, &pwszDNCopy); BAIL_ON_LW_ERROR(dwError); LwWc16sToLower(pwszDNCopy); pwszDcLocation = pwszDNCopy; while (wc16sncmp(pwszDcLocation, pwszDcPrefix, sizeof(pwszDcPrefix)/2 - 1)) { if (pwszDcLocation[0] == '\\') { // Skip one extra character and make sure the next one is not null pwszDcLocation++; } if (!pwszDcLocation[0]) { dwError = LW_ERROR_INVALID_LDAP_DN; BAIL_ON_LW_ERROR(dwError); } pwszDcLocation++; } dwError = LwWc16sToMbs(pwszDcLocation, &pszDcLocation); BAIL_ON_LW_ERROR(dwError); dwError = LwAllocateMemory(strlen(pszDcLocation)*sizeof(CHAR), OUT_PPVOID(&pszDomainName)); BAIL_ON_LW_ERROR(dwError); pszCurrent = pszDomainName; pszDomainPart = strtok_r (pszDcLocation, pszDelim, &pszStrTokSav); while (pszDomainPart != NULL){ DWORD dwLen = 0; if (strncmp(pszDomainPart, DC_PREFIX, sizeof(DC_PREFIX)-1)) { dwError = LW_ERROR_INVALID_LDAP_DN; BAIL_ON_LW_ERROR(dwError); } pszDomainPart += sizeof(DC_PREFIX) -1; dwLen = strlen(pszDomainPart); if (*pszDomainName) { *pszCurrent++ = '.'; } memcpy(pszCurrent, pszDomainPart, dwLen); pszCurrent += dwLen; pszDomainPart = strtok_r (NULL, pszDelim, &pszStrTokSav); } *ppszDomainName = pszDomainName; cleanup: LW_SAFE_FREE_MEMORY(pwszDNCopy); LW_SAFE_FREE_STRING(pszDcLocation); return dwError; error: *ppszDomainName = NULL; LW_SAFE_FREE_STRING(pszDomainName); goto cleanup; }