OpenGlobalizationUserSettingsKey_ForMua
INT64 __fastcall OpenGlobalizationUserSettingsKey_ForMua(INT64 a1, INT64 a2, HANDLE *a3, _DWORD *a4){
__int64 v4;
int v7;
UINT64 v8;
__int64 *Memory;
int InformationToken;
unsigned __int8 v11;
__int64 v12;
wchar_t *v13;
wchar_t *v14;
UINT64 v16;
ULONG ReturnLength[2];
struct _UNICODE_STRING Destination;
struct _UNICODE_STRING UnicodeString;
struct _OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR Source[264];
v4 = 0i64;
v7 = 0;
UnicodeString = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
Memory = (__int64 *)AllocateMemory((UINT16 *)0x54);
if( Memory )
{
ReturnLength[0] = 0;
InformationToken = ZwQueryInformationToken((HANDLE)0xFFFFFFFFFFFFFFFAi64, TokenUser, Memory, 0x54u, ReturnLength);
if( InformationToken < 0 )
goto LABEL_26;
v4 = *Memory;
}
else
{
InformationToken = -1073741801;
}
if( InformationToken >= 0 )
{
v11 = *(_BYTE *)(v4 + 1);
if( v11 < 2u || v11 == 5 && *(_DWORD *)(v4 + 8) == 21 && *(_DWORD *)(v4 + 24) == 503 )
{
*a4 = 0;
InformationToken = -1073741514;
v7 = 1;
}
if( InformationToken >= 0 )
{
InformationToken = RtlConvertSidToUnicodeString(&UnicodeString, (PVOID)v4, 1u);
if( InformationToken >= 0 )
{
ReturnLength[0] = 0;
LODWORD(v16) = 520;
InformationToken = RtlGetPersistedStateLocation(
(WCHAR *)L"GlobalizationUserSettings",
L"TargetNtPath",
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\International",
0i64,
Source,
v16,
(UINT64 *)ReturnLength);
if( InformationToken >= 0 )
{
v12 = (unsigned __int16)(LOWORD(ReturnLength[0]) + UnicodeString.Length + 4);
v13 = (wchar_t *)AllocateMemory((UINT16 *)(unsigned __int16)v12);
v14 = v13;
if( v13 )
{
*(_QWORD *)&Destination.Length = 0i64;
Destination.MaximumLength = v12;
Destination.Buffer = v13;
InformationToken = RtlAppendUnicodeToString(&Destination, Source);
if( InformationToken >= 0 )
{
InformationToken = RtlAppendUnicodeToString(&Destination, (PWCHAR)L"\\");
if( InformationToken >= 0 )
{
InformationToken = RtlAppendUnicodeStringToString(&Destination, &UnicodeString);
if( InformationToken >= 0 )
{
ObjectAttributes.RootDirectory = 0i64;
*(_QWORD *)ReturnLength = 0i64;
ObjectAttributes.ObjectName = &Destination;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( ZwOpenKey((PHANDLE)ReturnLength, 0x20019u, &ObjectAttributes) < 0 )
{
v7 = 1;
*a4 = 1;
}
else
{
ZwClose(*(HANDLE *)ReturnLength);
*a4 = 2;
InformationToken = ZwOpenKey(a3, 8u, &ObjectAttributes);
}
}
}
}
ExFreeHeapPool(v14);
}
else
{
InformationToken = -1073741801;
}
}
RtlFreeAnsiString(&UnicodeString);
}
}
if( v7 )
InformationToken = OpenGlobalizationUserSettingsKey_ForSingleUserModel(v8, a3);
}
LABEL_26:
if( Memory )
ExFreeHeapPool(Memory);
return(unsigned int)InformationToken;
}Referenced by:
OpenGlobalizationUserSettingsKey