summaryrefslogtreecommitdiffhomepage
path: root/src/string/ntapi_tt_uintptr_to_hex_utf16.c
blob: 85909b7f33b23a4fbb2f3f50c37e7b7a3743635d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/********************************************************/
/*  ntapi: Native API core library                      */
/*  Copyright (C) 2013--2017  Z. Gilboa                 */
/*  Released under GPLv2 and GPLv3; see COPYING.NTAPI.  */
/********************************************************/

#include <psxtypes/psxtypes.h>

static void __fastcall __ntapi_tt_uint_to_hex_utf16(
	__in	const uint64_t	key,
	__out	wchar16_t *	buffer,
	__in	unsigned	bits)
{
	unsigned	i;
	uint32_t	hex_buf[4];
	unsigned char *	hex_chars;
	unsigned char *	uch;
	unsigned	offset;
	unsigned	bytes;

	hex_buf[0] = ('3' << 24) | ('2' << 16) | ('1' << 8) | '0';
	hex_buf[1] = ('7' << 24) | ('6' << 16) | ('5' << 8) | '4';
	hex_buf[2] = ('b' << 24) | ('a' << 16) | ('9' << 8) | '8';
	hex_buf[3] = ('f' << 24) | ('e' << 16) | ('d' << 8) | 'c';

	uch = (unsigned char *)&key;
	hex_chars = (unsigned char *)&hex_buf;

	bytes  = bits / 8;
	offset = bits / 4;

	for (i = 0; i < bytes; i++) {
		buffer[offset - 1 - (i*2)] =	hex_chars[uch[i] % 16];
		buffer[offset - 2 - (i*2)] =	hex_chars[uch[i] / 16];
	}
}


__attr_protected__
void __fastcall __ntapi_tt_uint16_to_hex_utf16(
	__in	const uint32_t	key,
	__out	wchar16_t *	formatted_key)
{
	__ntapi_tt_uint_to_hex_utf16(
		key,
		formatted_key,
		16);
}


__attr_protected__
void __fastcall __ntapi_tt_uint32_to_hex_utf16(
	__in	const uint32_t	key,
	__out	wchar16_t *	formatted_key)
{
	__ntapi_tt_uint_to_hex_utf16(
		key,
		formatted_key,
		32);
}


__attr_protected__
void __fastcall __ntapi_tt_uint64_to_hex_utf16(
	__in	const uint64_t	key,
	__out	wchar16_t *	formatted_key)
{
	__ntapi_tt_uint_to_hex_utf16(
		key,
		formatted_key,
		64);
}


__attr_protected__
void __fastcall __ntapi_tt_uintptr_to_hex_utf16(
	__in	const uintptr_t	key,
	__out	wchar16_t *	formatted_key)
{
	#if (__SIZEOF_POINTER__ == 4)
		__ntapi_tt_uint_to_hex_utf16(
			key,
			formatted_key,
			32);
	#elif (__SIZEOF_POINTER__ == 8)
		__ntapi_tt_uint_to_hex_utf16(
			key,
			formatted_key,
			64);
	#endif
}