Blob Blame History Raw
/********************************************************/
/*  ntapi: Native API core library                      */
/*  Copyright (C) 2013--2021  Z. Gilboa                 */
/*  Released under GPLv2 and GPLv3; see COPYING.NTAPI.  */
/********************************************************/

#include <psxtypes/psxtypes.h>
#include <ntapi/nt_status.h>
#include "ntapi_impl.h"

static int32_t __tt_dec_utf16_to_uint64(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uint64_t *		key)
{
	int32_t			status;
	uint64_t		lkey;
	uint64_t		hkey;
	const wchar16_t *	wch;

	if (wch_cap <= wch_arg)
		return NT_STATUS_INVALID_PARAMETER;

	else if (wch_cap - wch_arg > 20)
		return NT_STATUS_INVALID_PARAMETER;

	lkey = 0;
	hkey = 0;

	if (wch_cap - wch_arg == 20) {
		if ((status = __tt_dec_utf16_to_uint64(
				&wch_arg[6],wch_cap,
				&hkey)))
			return status;

		if (hkey > 18446744073709)
			return NT_STATUS_INTEGER_OVERFLOW;

		hkey   *= 1000000;
		wch_cap = &wch_arg[6];
	}

	for (wch=wch_arg; wch<wch_cap; wch++) {
		if ((*wch < '0') || (*wch > '9'))
			return NT_STATUS_INVALID_PARAMETER;

		lkey *= 10;
		lkey += *wch - '0';
	}

	*key = lkey + hkey;

	return NT_STATUS_SUCCESS;
}

int32_t __stdcall __ntapi_tt_dec_utf16_to_uint16(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uint16_t *		key)
{
	int32_t		status;
	uint64_t	skey;
	uint16_t	rkey;

	if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey)))
		return status;

	if ((rkey = skey) < skey)
		return NT_STATUS_INTEGER_OVERFLOW;

	*key = rkey;

	return NT_STATUS_SUCCESS;
}

int32_t __stdcall __ntapi_tt_dec_utf16_to_uint32(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uint32_t *		key)
{
	int32_t		status;
	uint64_t	skey;
	uint32_t	rkey;

	if ((status = __tt_dec_utf16_to_uint64(wch_arg,wch_cap,&skey)))
		return status;

	if ((rkey = skey) < skey)
		return NT_STATUS_INTEGER_OVERFLOW;

	*key = rkey;

	return NT_STATUS_SUCCESS;
}



int32_t __stdcall __ntapi_tt_dec_utf16_to_uint64(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uint64_t *		key)
{
	return __tt_dec_utf16_to_uint64(
		wch_arg,wch_cap,key);
}

#ifdef __NT32
int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uintptr_t *		key)
{
	return __ntapi_tt_dec_utf16_to_uint32(
		wch_arg,wch_cap,key);
}
#endif

#ifdef __NT64
int32_t __stdcall __ntapi_tt_dec_utf16_to_uintptr(
	__in	const wchar16_t *	wch_arg,
	__in	const wchar16_t *	wch_cap,
	__out	uintptr_t *		key)
{
	return __tt_dec_utf16_to_uint64(
		wch_arg,wch_cap,key);
}
#endif