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