/********************************************************/ /* ntapi: Native API core library */ /* Copyright (C) 2013--2017 Z. Gilboa */ /* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ /********************************************************/ #include #include #include #include "ntapi_impl.h" void __fastcall __ntapi_tt_guid_copy( __out nt_guid * pguid_dst, __in const nt_guid * pguid_src) { uint64_t * dst; uint64_t * src; dst = (uint64_t *)pguid_dst; src = (uint64_t *)pguid_src; *dst = *src; src++; dst++; *dst = *src; } void __fastcall __ntapi_tt_guid_to_string_utf16( __in const nt_guid * guid, __out nt_guid_str_utf16 * guid_str) { uint16_t key; wchar16_t * wch; wch = &(guid_str->group5[0]); __ntapi_tt_uint32_to_hex_utf16( guid->data1, &guid_str->group1[0]); __ntapi_tt_uint16_to_hex_utf16( guid->data2, &guid_str->group2[0]); __ntapi_tt_uint16_to_hex_utf16( guid->data3, &guid_str->group3[0]); key = guid->data4[0] * 0x100 + guid->data4[1]; __ntapi_tt_uint16_to_hex_utf16( key, &guid_str->group4[0]); key = guid->data4[2] * 0x100 + guid->data4[3]; __ntapi_tt_uint16_to_hex_utf16( key, &guid_str->group5[0]); key = guid->data4[4] * 0x100 + guid->data4[5]; __ntapi_tt_uint16_to_hex_utf16( key, &(wch[4])); key = guid->data4[6] * 0x100 + guid->data4[7]; __ntapi_tt_uint16_to_hex_utf16( key, &(wch[8])); guid_str->lbrace = '{'; guid_str->rbrace = '}'; guid_str->dash1 = '-'; guid_str->dash2 = '-'; guid_str->dash3 = '-'; guid_str->dash4 = '-'; return; } int32_t __fastcall __ntapi_tt_guid_compare( __in const nt_guid * pguid_dst, __in const nt_guid * pguid_src) { uint64_t * dst; uint64_t * src; dst = (uint64_t *)pguid_dst; src = (uint64_t *)pguid_src; if ((*dst != *src) || (*(++dst) != *(++src))) return NT_STATUS_OBJECT_TYPE_MISMATCH; return NT_STATUS_SUCCESS; } int32_t __fastcall __ntapi_tt_string_to_guid_utf16( __in const nt_guid_str_utf16 * guid_str, __out nt_guid * guid) { int32_t status; const wchar16_t * wch; uint16_t key; /* outer braces / outer underscores / outer dashes */ if ((guid_str->lbrace == '{') && (guid_str->rbrace == '}')) (void)0; else if ((guid_str->lbrace == '_') && (guid_str->rbrace == '_')) (void)0; else if ((guid_str->lbrace == '-') && (guid_str->rbrace == '-')) (void)0; else return NT_STATUS_INVALID_PARAMETER; /* inner dashes */ if ((guid_str->dash1 != '-') || (guid_str->dash2 != '-') || (guid_str->dash3 != '-') || (guid_str->dash4 != '-')) return NT_STATUS_INVALID_PARAMETER; wch = &(guid_str->group5[0]); status = __ntapi_tt_hex_utf16_to_uint32( guid_str->group1, &guid->data1); if (status != NT_STATUS_SUCCESS) return status; status = __ntapi_tt_hex_utf16_to_uint16( guid_str->group2, &guid->data2); if (status != NT_STATUS_SUCCESS) return status; status = __ntapi_tt_hex_utf16_to_uint16( guid_str->group3, &guid->data3); if (status != NT_STATUS_SUCCESS) return status; status = __ntapi_tt_hex_utf16_to_uint16( guid_str->group4, &key); if (status != NT_STATUS_SUCCESS) return status; guid->data4[0] = key >> 8; guid->data4[1] = key % 0x100; status = __ntapi_tt_hex_utf16_to_uint16( &(wch[0]), &key); if (status != NT_STATUS_SUCCESS) return status; guid->data4[2] = key >> 8; guid->data4[3] = key % 0x100; status = __ntapi_tt_hex_utf16_to_uint16( &(wch[4]), &key); if (status != NT_STATUS_SUCCESS) return status; guid->data4[4] = key >> 8; guid->data4[5] = key % 0x100; status = __ntapi_tt_hex_utf16_to_uint16( &(wch[8]), &key); if (status != NT_STATUS_SUCCESS) return status; guid->data4[6] = key >> 8; guid->data4[7] = key % 0x100; return NT_STATUS_SUCCESS; } int32_t __fastcall __ntapi_tt_string_to_guid_utf8( __in const char * guid_str, __out nt_guid * guid) { const char * ch; const char * cap; wchar16_t * wch; nt_guid_str_utf16 guid_str_utf16; ch = guid_str; cap = &ch[sizeof(guid_str_utf16) / sizeof(wchar16_t)]; wch = &guid_str_utf16.lbrace; for (; *ch && (ch