SdbQueryDataExTagID

INT64 __fastcall SdbQueryDataExTagID(
        RTL_RUN_ONCE *a1,
        UINT64 a2,
        INT64 a3,
        INT64 *a4,
        VOID *dst,
        UINT64 *a6,
        UINT64 *a7){
  int DWORDTag; 
  WCHAR *v8; 
  unsigned int v9; 
  __int64 v11; 
  UINT64 v12; 
  WCHAR *v13; 
  WCHAR *v14; 
  WCHAR *v15; 
  WCHAR *v16; 
  unsigned int FirstNamedTag; 
  unsigned int FirstTag; 
  unsigned int TagDataSize; 
  UINT8 *StringTagPtr; 
  INT16 v21; 
  unsigned int v22; 
  unsigned int v23; 
  __int64 v25; 
  const CHAR *v26; 
  UINT64 v27; 
  __int64 v28; 
  wchar_t *Str1; 
  WCHAR *P; 
  INT64 QWORDTag; 
  int Src; 
  int v33; 
  INT64 *v34; 
  v34 = a4;
  v33 = HIDWORD(a3);
  DWORDTag = 0;
  v8 = (WCHAR *)L"Policy";
  v9 = a2;
  Src = 0;
  QWORDTag = 0i64;
  if( __PAIR128__((unsigned __int64)a6, (unsigned __int64)dst) == 0 )
  {
    AslLogCallPrintf(1ui64, "SdbQueryDataExTagID", 0x1546ui64, "One of lpBuffer or lpcbBufferSize should not be null");
    return 87;
  }
  v11 = -1i64;
  do
    ++v11;
  while( aPolicy[v11] );
  v12 = (int)v11 + 1;
  v13 = (WCHAR *)AslAlloc(a1, 2 * v12, a3);
  P = v13;
  if( !v13 )
  {
    AslLogCallPrintf(
      1ui64,
      "SdbQueryDataExTagID",
      0x1552ui64,
      "Cannot allocate temporary buffer for parsing the name \"%ws\"",
      L"Policy");
    return 8;
  }
  v14 = v13;
  while( 1 )
  {
    v15 = wcschr(v8, 0x5Cu);
    v16 = v15;
    if( v15 )
    {
      v25 = v15 - v8;
      if( (int)RtlStringCchCopyNW(P, v12, v8, v25) < 0 )
      {
LABEL_62:
        v23 = 122;
        goto LABEL_33;
      }
      P[v25] = 0;
      v8 = v16 + 1;
      v14 = P;
    }
    else
    {
      if( RtlStringCchCopyW(v14, v12, v8) < 0 )
        goto LABEL_62;
      v8 = 0i64;
    }
    FirstNamedTag = SdbFindFirstNamedTag(a1, v9, 28687, 24577, v14);
    v9 = FirstNamedTag;
    if( !v8 || !*v8 )
      break;
    if( !FirstNamedTag )
      goto LABEL_45;
  }
  if( !FirstNamedTag )
  {
LABEL_45:
    v23 = 1168;
    goto LABEL_33;
  }
  FirstTag = SdbFindFirstTag((INT64)a1, FirstNamedTag, 16408);
  if( FirstTag )
  {
    DWORDTag = SdbReadDWORDTag((INT64)a1, FirstTag, 0i64);
  }
  else
  {
    LODWORD(Str1) = v9;
    AslLogCallPrintf(
      1ui64,
      "SdbQueryDataExTagID",
      0x1583ui64,
      "The entry 0x%x does not have valuetype information",
      Str1);
  }
  TagDataSize = 0;
  StringTagPtr = 0i64;
  switch( DWORDTag )
  {
    case 0:
      goto LABEL_54;
    case 1:
      v21 = 24606;
      break;
    case 3:
      v21 = -28667;
      break;
    case 4:
      v21 = 16409;
      break;
    case 11:
      v21 = 20487;
      break;
    default:
      LODWORD(Str1) = v9;
      AslLogCallPrintf(
        1ui64,
        "SdbQueryDataExTagID",
        0x15A8ui64,
        "The entry 0x%x contains bad valuetype information 0x%x",
        Str1,
        DWORDTag);
      v23 = 1358;
      goto LABEL_33;
  }
  v22 = SdbFindFirstTag((INT64)a1, v9, v21);
  if( !v22 )
  {
    LODWORD(Str1) = v9;
    AslLogCallPrintf(1ui64, "SdbQueryDataExTagID", 0x15B4ui64, "The entry 0x%x contains no value", Str1);
    goto LABEL_45;
  }
  switch( DWORDTag )
  {
    case 1:
      StringTagPtr = (UINT8 *)SdbGetStringTagPtr(a1, v22);
      if( StringTagPtr )
      {
        v28 = -1i64;
        do
          ++v28;
        while( *(_WORD *)&StringTagPtr[2 * v28] );
        TagDataSize = 2 * v28 + 2;
        goto LABEL_54;
      }
      v26 = "The entry 0x%x contains bad string value 0x%x";
      v27 = 5572i64;
      goto LABEL_44;
    case 3:
      TagDataSize = SdbGetTagDataSize((INT64)a1, v22);
      StringTagPtr = (UINT8 *)SdbpGetMappedTagData((INT64)a1, v22);
      if( StringTagPtr )
        goto LABEL_54;
      v26 = "The entry 0x%x contains bad binary value 0x%x";
      v27 = 5586i64;
LABEL_44:
      LODWORD(Str1) = v9;
      AslLogCallPrintf(1ui64, "SdbQueryDataExTagID", v27, v26, Str1, v22);
      goto LABEL_45;
    case 4:
      Src = SdbReadDWORDTag((INT64)a1, v22, 0i64);
      StringTagPtr = (UINT8 *)&Src;
      TagDataSize = 4;
      goto LABEL_23;
  }
  QWORDTag = SdbReadQWORDTag((INT64)a1, v22, 0i64);
  StringTagPtr = (UINT8 *)&QWORDTag;
  TagDataSize = 8;
LABEL_54:
  v23 = 0;
  if( TagDataSize )
  {
LABEL_23:
    if( dst && a6 && *(_DWORD *)a6 >= TagDataSize )
    {
      memmove((UINT8 *)dst, StringTagPtr, *(unsigned int *)a6);
      v23 = 0;
    }
    else
    {
      v23 = 122;
    }
  }
  if( a6 )
    *(_DWORD *)a6 = TagDataSize;
  if( v34 )
    *(_DWORD *)v34 = DWORDTag;
  if( a7 )
    *(_DWORD *)a7 = v9;
LABEL_33:
  ExFreePoolWithTag(P, 0x74705041u);
  return v23;
}

Referenced by:

PiIsDriverBlocked