NTSTATUS LwRtlWC16StringAllocateFromCString( OUT PWSTR* ppszNewString, IN PCSTR pszOriginalString ) { NTSTATUS status = 0; PWSTR pszNewString = NULL; if (pszOriginalString) { pszNewString = ambstowc16s(pszOriginalString); if (!pszNewString) { if (errno == EILSEQ) { status = LW_STATUS_UNMAPPABLE_CHARACTER; } else { status = STATUS_INSUFFICIENT_RESOURCES; } GOTO_CLEANUP(); } } cleanup: if (status) { free(pszNewString); pszNewString = NULL; } *ppszNewString = pszNewString; return status; }
static void CheckCharToWchar16(const char *input) { size_t inputlen = mbstrlen(input); if(input[0] != '\0') MU_ASSERT(inputlen != 0); wchar16_t *allocated = malloc((inputlen + 1) * sizeof(wchar16_t)); MU_ASSERT(allocated != NULL); size_t converted = mbstowc16s(allocated, input, inputlen + 1); MU_ASSERT(converted == inputlen); MU_ASSERT(wc16slen(allocated) == inputlen); free(allocated); allocated = ambstowc16s(input); MU_ASSERT(allocated != NULL); MU_ASSERT(wc16slen(allocated) == inputlen); char *convertedback = awc16stombs(allocated); MU_ASSERT(convertedback != NULL); MU_ASSERT(!strcmp(input, convertedback)); free(convertedback); free(allocated); }
enum param_err fetch_value( PPARAMETER pParams, int count, const char *key, enum param_type type, void *val, const void *def ) { const char *value; NTSTATUS status; char **valstr, **defstr; char *valchar, *defchar; wchar16_t **valw16str; wchar16_t ***valw16str_list; int *valint, *defint; unsigned int *valuint, *defuint; PSID* valsid = NULL; PSID** valsid_list = NULL; char **strlist = NULL; enum param_err ret = perr_success; int i = 0; if (pParams && !key) return perr_nullptr_passed; if (!val) return perr_invalid_out_param; value = find_value(pParams, count, key); if (!value && !def) return perr_not_found; switch (type) { case pt_string: valstr = (char**)val; defstr = (char**)def; *valstr = (value) ? strdup(value) : strdup(*defstr); break; case pt_w16string: valw16str = (wchar16_t**)val; defstr = (char**)def; *valw16str = (value) ? ambstowc16s(value) : ambstowc16s(*defstr); break; case pt_w16string_list: valw16str_list = (wchar16_t***)val; defstr = (char**)def; strlist = (value) ? get_value_list(value) : get_value_list(*defstr); *valw16str_list = create_wc16str_list(strlist); if (*valw16str_list == NULL) ret = perr_invalid_out_param; break; case pt_char: valchar = (char*)val; defchar = (char*)def; *valchar = (value) ? value[0] : *defchar; break; case pt_int32: valint = (int*)val; defint = (int*)def; *valint = (value) ? atoi(value) : *defint; break; case pt_uint32: valuint = (unsigned int*)val; defuint = (unsigned int*)def; *valuint = (unsigned int)((value) ? atol(value) : *defuint); break; case pt_sid: valsid = (PSID*)val; defstr = (char**)def; status = RtlAllocateSidFromCString(valsid, ((value) ? (const char*)value : *defstr)); if (status != STATUS_SUCCESS) ret = perr_invalid_out_param; break; case pt_sid_list: valsid_list = (PSID**)val; defstr = (char**)def; strlist = get_value_list((value) ? (const char*)value : *defstr); *valsid_list = create_sid_list(strlist); if (*valsid_list == NULL) ret = perr_invalid_out_param; break; default: ret = perr_unknown_type; break; } if (strlist) { i = 0; while (strlist[i]) { free(strlist[i++]); } free(strlist); } return ret; }