| |
| |
| |
| |
| |
| |
| #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 __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 |