/********************************************************/
/* ntapi: Native API core library */
/* Copyright (C) 2013--2018 Z. Gilboa */
/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
/********************************************************/
#include <psxtypes/psxtypes.h>
#include <ntapi/nt_status.h>
#include "ntapi_impl.h"
static void __tt_uintptr_to_mirrored_dec_utf8(
uintptr_t key,
unsigned char * buf,
ssize_t * arrlen)
{
unsigned i;
buf[0] = '0' + (key % 10);
key /= 10;
for (i=1; key; i++) {
buf[i] = '0' + (key % 10);
key /= 10;
}
*arrlen = i;
}
static int32_t __tt_uintptr_to_dec_utf16(
uintptr_t key,
wchar16_t * wstrbuf,
size_t buflen,
ssize_t * arrlen)
{
ssize_t i;
ssize_t slen;
unsigned char buf[24];
__tt_uintptr_to_mirrored_dec_utf8(
key,buf,arrlen);
if ((i = *arrlen) > (slen = buflen))
return NT_STATUS_BUFFER_TOO_SMALL;
for (--i; i>=0; i--)
*wstrbuf++ = buf[i];
return NT_STATUS_SUCCESS;
}
static int32_t __tt_uintptr_to_dec_utf8(
uintptr_t key,
unsigned char * strbuf,
size_t buflen,
ssize_t * arrlen)
{
ssize_t i;
ssize_t slen;
unsigned char buf[24];
__tt_uintptr_to_mirrored_dec_utf8(
key,buf,arrlen);
if ((i = *arrlen) > (slen = buflen))
return NT_STATUS_BUFFER_TOO_SMALL;
for (--i; i>=0; i--)
*strbuf++ = buf[i];
return NT_STATUS_SUCCESS;
}
int32_t __stdcall __ntapi_tt_uintptr_to_dec_utf16(
__in uintptr_t key,
__out wchar16_t * wstrbuf,
__in size_t buflen,
__out ssize_t * length)
{
int32_t status;
ssize_t arrlen;
buflen /= sizeof(wchar16_t);
status = __tt_uintptr_to_dec_utf16(
key,wstrbuf,
buflen,&arrlen);
*length = arrlen * sizeof(wchar16_t);
return status;
}
int32_t __stdcall __ntapi_tt_uintptr_to_dec_utf8(
__in uintptr_t key,
__out unsigned char * strbuf,
__in size_t buflen,
__out ssize_t * length)
{
return __tt_uintptr_to_dec_utf8(
key,strbuf,
buflen,length);
}
int32_t __stdcall __ntapi_tt_uintptr_to_dec_null_utf16(
__in uintptr_t key,
__out wchar16_t * wstrbuf,
__in size_t buflen,
__out ssize_t * length)
{
int32_t status;
ssize_t arrlen;
buflen -= sizeof(wchar16_t);
buflen /= sizeof(wchar16_t);
status = __tt_uintptr_to_dec_utf16(
key,wstrbuf,
buflen,&arrlen);
if (status == NT_STATUS_SUCCESS)
wstrbuf[arrlen] = 0;
*length = ++arrlen * sizeof(wchar16_t);
return status;
}
int32_t __stdcall __ntapi_tt_uintptr_to_dec_null_utf8(
__in uintptr_t key,
__out unsigned char * strbuf,
__in size_t buflen,
__out ssize_t * length)
{
int32_t status;
ssize_t arrlen;
status = __tt_uintptr_to_dec_utf8(
key,strbuf,
--buflen,&arrlen);
if (status == NT_STATUS_SUCCESS)
strbuf[arrlen] = 0;
*length = ++arrlen;
return status;
}