LocalpConvertStringSidToSid
INT64 __fastcall LocalpConvertStringSidToSid(const WCHAR *StringSid, VOID **Sid, const WCHAR **End){
int v4;
unsigned int v5;
const WCHAR *v6;
wchar_t *v7;
WCHAR *v8;
INT64 v9;
UINT64 v10;
UINT64 v11;
UINT8 *p_dst;
unsigned __int8 v13;
wchar_t *v14;
unsigned __int64 v15;
__int64 v16;
const WCHAR *v17;
bool v18;
bool v19;
unsigned __int8 v20;
wchar_t *v21;
void *v22;
unsigned int v23;
_DWORD *v24;
INT64 v25;
unsigned __int64 v26;
_BYTE *v27;
UINT8 *v28;
wchar_t *v30;
__int64 v31;
UINT64 v32;
void *v33;
int v34;
INT64 flags;
int v36;
__int16 v37;
wchar_t *EndPtr;
unsigned int v39;
INT64 error;
void *Src;
PVOID P;
VOID **v43;
UINT8 dst;
v43 = Sid;
Src = 0i64;
EndPtr = 0i64;
P = 0i64;
v4 = 0;
v5 = 10;
v39 = 10;
if( !StringSid || !Sid || !End )
return 3221225485i64;
if( ((*StringSid - 83) & 0xFFDF) != 0 || StringSid[1] != 45 )
return 3221225592i64;
v6 = StringSid + 2;
if( StringSid[2] == 48 )
{
if( ((StringSid[3] - 88) & 0xFFDF) == 0 )
v5 = 16;
v39 = v5;
}
HIDWORD(error) = wcstoul(v6, &EndPtr, v5);
if( HIDWORD(error) > 0xFF )
return 3221225592i64;
if( EndPtr == v6 )
return 3221225592i64;
if( *EndPtr != 45 )
return 3221225592i64;
v7 = EndPtr + 1;
if( !EndPtr[1] )
return 3221225592i64;
v8 = wcschr(EndPtr + 1, 0x2Du);
if( !v8 || v8 == v7 )
return 3221225592i64;
if( *v7 != 48 || (v9 = 16i64, ((v7[1] - 88) & 0xFFDF) != 0) )
v9 = v5;
LODWORD(error) = 0;
LODWORD(flags) = 1;
v11 = wcstoxq(0i64, v7, &EndPtr, v9, flags, &error);
if( v11 > 0xFFFFFFFFFFFFi64 )
return 3221225592i64;
p_dst = (UINT8 *)EndPtr;
if( EndPtr == v7 || *EndPtr != 45 || !EndPtr[1] )
return 3221225592i64;
HIBYTE(v37) = v11;
v13 = 0;
LOBYTE(v37) = BYTE1(v11);
v14 = EndPtr;
HIBYTE(v36) = BYTE2(v11);
BYTE2(v36) = BYTE3(v11);
LOBYTE(v36) = BYTE5(v11);
BYTE1(v36) = BYTE4(v11);
while( 1 )
{
if( v13 == 0xFF )
{
v4 = -1073741675;
goto LABEL_86;
}
v15 = *v14;
if( (_WORD)v15 != 45 )
break;
if( *(v14 - 1) != 45 )
{
++v13;
if( v14[1] == 48 && ((v14[2] - 88) & 0xFFDF) == 0 )
v14 += 2;
goto LABEL_28;
}
LABEL_24:
v10 = v14[1];
if( (_WORD)v10 == 58 && (((_WORD)v15 - 71) & 0xFFF3) == 0 && (_DWORD)v15 != 75 )
goto LABEL_34;
if( (unsigned __int16)(v15 - 48) > 0x36u
|| (v16 = 0x7E0000007E03FFi64, !_bittest64(&v16, (unsigned int)(v15 - 48))) )
{
v4 = -1073741704;
LABEL_86:
*End = v14;
return(unsigned int)v4;
}
if( (_DWORD)v15 == 68 && (_WORD)v10 == 58 )
{
v30 = EndPtr;
v31 = v14 - EndPtr;
v32 = 2 * v31;
if( v31 >= 256 )
{
SddlpAlloc(v32 + 2, v10);
P = v33;
if( !v33 )
return(unsigned int)-1073741801;
p_dst = (UINT8 *)v33;
}
else
{
p_dst = &dst;
}
memmove(p_dst, (UINT8 *)v30, v32);
v5 = v39;
*(_WORD *)&p_dst[v32] = 0;
++v13;
*End = v14;
goto LABEL_41;
}
LABEL_28:
if( !++v14 )
goto LABEL_40;
}
if( (unsigned int)v15 > 0x3B )
goto LABEL_24;
v10 = 0x800120100000001i64;
if( !_bittest64((const __int64 *)&v10, v15) )
goto LABEL_24;
LABEL_34:
v17 = v14 - 1;
v4 = -1073741704;
v18 = *(v14 - 1) == 45;
if( *(v14 - 1) != 45 )
v17 = v14;
if( *(v14 - 1) != 45 )
v4 = 0;
*End = v17;
if( !v18 )
++v13;
LABEL_40:
v19 = v4 < 0;
if( !v4 )
{
LABEL_41:
v20 = v13 - 1;
if( !v13 )
v20 = 0;
if( !v20 )
goto LABEL_82;
v21 = (wchar_t *)(p_dst + 2);
SddlpAlloc(4 * v20, v10);
Src = v22;
if( v22 )
{
v23 = 0;
v24 = v22;
while( 1 )
{
if( *v21 != 48 || (v25 = 16i64, ((v21[1] - 88) & 0xFFDF) != 0) )
v25 = v5;
*v24 = wcstoul(v21, &EndPtr, v25);
if( EndPtr )
{
v26 = *EndPtr;
if( (unsigned int)v26 > 0x3B || (v10 = 0x800320000000001i64, !_bittest64((const __int64 *)&v10, v26)) )
{
if( EndPtr[1] != 58 )
break;
LOWORD(v26) = v26 - 68;
if( (unsigned __int16)v26 > 0xFu )
break;
v34 = 34825;
if( !_bittest(&v34, v26) )
break;
}
}
v21 = EndPtr + 1;
++v23;
++v24;
if( v23 >= v20 )
goto LABEL_52;
}
LABEL_82:
v4 = -1073741704;
}
else
{
v4 = -1073741801;
}
LABEL_52:
v13 = v20;
v19 = v4 < 0;
}
if( !v19 )
{
SddlpAlloc(4 * v13 + 12, v10);
*v43 = v27;
if( v27 )
{
v28 = (UINT8 *)Src;
*v27 = BYTE4(error);
*(_DWORD *)(v27 + 2) = v36;
*((_WORD *)v27 + 3) = v37;
v27[1] = v13;
memmove(v27 + 8, v28, 4i64 * v13);
}
else
{
v4 = -1073741801;
}
}
if( Src )
ExFreePoolWithTag(Src, 0);
if( P )
ExFreePoolWithTag(P, 0);
return(unsigned int)v4;
}Referenced by:
LocalGetSidForString
SeConvertStringSidToSid