/********************************************************/ /* ntapi: Native API core library */ /* Copyright (C) 2013--2018 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ /********************************************************/ #include #include #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 '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