SdbQueryDataExTagID

NTSTATUS __fastcall SdbQueryDataExTagID(
        _DB *pdb,
        UINT64 tiExe,
        const WCHAR *lpszDataName,
        UINT64 *lpdwDataType,
        VOID *lpBuffer,
        UINT64 *lpcbBufferSize,
        UINT64 *ptiData){
  int DWORDTag; 
  WORD *v8; 
  unsigned int v9; 
  __int64 v11; 
  int v12; 
  UINT64 v13; 
  WCHAR *v14; 
  WCHAR *pszName; 
  WORD *v16; 
  WORD *v17; 
  unsigned int FirstNamedTag; 
  unsigned int FirstTag; 
  unsigned int TagDataSize; 
  __int64 *StringTagPtr; 
  UINT16 v22; 
  unsigned int v23; 
  NTSTATUS v24; 
  __int64 v26; 
  INT8 *v27; 
  UINT64 v28; 
  __int64 v29; 
  WCHAR *P; 
  __int64 QWORDTag; 
  int Src; 
  int v33; 
  UINT64 *v34; 

  v34 = lpdwDataType;
  v33 = HIDWORD(lpszDataName);
  DWORDTag = 0;
  v8 = (WORD *)L"Policy";
  v9 = tiExe;
  Src = 0;
  QWORDTag = 0i64;
  if( __PAIR128__((unsigned __int64)lpcbBufferSize, (unsigned __int64)lpBuffer) == 0 )
  {
    AslLogCallPrintf(
      1ui64,
      (INT8 *)"SdbQueryDataExTagID",
      0x1546ui64,
      (INT8 *)"One of lpBuffer or lpcbBufferSize should not be null");
    return 87;
  }
  v11 = -1i64;
  do
    ++v11;
  while( aPolicy[v11] );
  v12 = v11 + 1;
  v13 = v12;
  v14 = (WCHAR *)AslAlloc(pdb, 2 * v12, (INT64)lpszDataName);
  P = v14;
  if( !v14 )
  {
    AslLogCallPrintf(
      1ui64,
      (INT8 *)"SdbQueryDataExTagID",
      0x1552ui64,
      (INT8 *)"Cannot allocate temporary buffer for parsing the name \"%ws\"");
    return 8;
  }
  pszName = v14;
  while( 1 )
  {
    v16 = wcschr(v8, 92);
    v17 = v16;
    if( v16 )
    {
      v26 = v16 - v8;
      if( RtlStringCchCopyNW(P, v13, v8, v26) < 0 )
      {
LABEL_62:
        v24 = 122;
        goto LABEL_33;
      }
      P[v26] = 0;
      v8 = v17 + 1;
      pszName = P;
    }
    else
    {
      if( RtlStringCchCopyW(pszName, v13, v8) < 0 )
        goto LABEL_62;
      v8 = 0i64;
    }
    FirstNamedTag = SdbFindFirstNamedTag(pdb, v9, 0x700Fu, 0x6001u, pszName);
    v9 = FirstNamedTag;
    if( !v8 || !*v8 )
      break;
    if( !FirstNamedTag )
      goto LABEL_45;
  }
  if( !FirstNamedTag )
  {
LABEL_45:
    v24 = 1168;
    goto LABEL_33;
  }
  FirstTag = SdbFindFirstTag(pdb, FirstNamedTag, 0x4018u);
  if( FirstTag )
    DWORDTag = SdbReadDWORDTag(pdb, FirstTag, 0);
  else
    AslLogCallPrintf(
      1ui64,
      (INT8 *)"SdbQueryDataExTagID",
      0x1583ui64,
      (INT8 *)"The entry 0x%x does not have valuetype information");
  TagDataSize = 0;
  StringTagPtr = 0i64;
  switch( DWORDTag )
  {
    case 0:
      goto LABEL_54;
    case 1:
      v22 = 24606;
      break;
    case 3:
      v22 = -28667;
      break;
    case 4:
      v22 = 16409;
      break;
    case 11:
      v22 = 20487;
      break;
    default:
      AslLogCallPrintf(
        1ui64,
        (INT8 *)"SdbQueryDataExTagID",
        0x15A8ui64,
        (INT8 *)"The entry 0x%x contains bad valuetype information 0x%x");
      v24 = 1358;
      goto LABEL_33;
  }
  v23 = SdbFindFirstTag(pdb, v9, v22);
  if( !v23 )
  {
    AslLogCallPrintf(1ui64, (INT8 *)"SdbQueryDataExTagID", 0x15B4ui64, (INT8 *)"The entry 0x%x contains no value");
    goto LABEL_45;
  }
  switch( DWORDTag )
  {
    case 1:
      StringTagPtr = (__int64 *)SdbGetStringTagPtr(pdb, v23);
      if( StringTagPtr )
      {
        v29 = -1i64;
        do
          ++v29;
        while( *((_WORD *)StringTagPtr + v29) );
        TagDataSize = 2 * v29 + 2;
        goto LABEL_54;
      }
      v27 = (INT8 *)"The entry 0x%x contains bad string value 0x%x";
      v28 = 5572i64;
      goto LABEL_44;
    case 3:
      TagDataSize = SdbGetTagDataSize(pdb, v23);
      StringTagPtr = (__int64 *)SdbpGetMappedTagData(pdb, v23);
      if( StringTagPtr )
        goto LABEL_54;
      v27 = "The entry 0x%x contains bad binary value 0x%x";
      v28 = 5586i64;
LABEL_44:
      AslLogCallPrintf(1ui64, (INT8 *)"SdbQueryDataExTagID", v28, v27);
      goto LABEL_45;
    case 4:
      Src = SdbReadDWORDTag(pdb, v23, 0);
      StringTagPtr = (__int64 *)&Src;
      TagDataSize = 4;
      goto LABEL_23;
  }
  QWORDTag = SdbReadQWORDTag(pdb, v23, 0i64);
  StringTagPtr = &QWORDTag;
  TagDataSize = 8;
LABEL_54:
  v24 = 0;
  if( TagDataSize )
  {
LABEL_23:
    if( lpBuffer && lpcbBufferSize && *(_DWORD *)lpcbBufferSize >= TagDataSize )
    {
      memmove(lpBuffer, StringTagPtr, *(_DWORD *)lpcbBufferSize);
      v24 = 0;
    }
    else
    {
      v24 = 122;
    }
  }
  if( lpcbBufferSize )
    *(_DWORD *)lpcbBufferSize = TagDataSize;
  if( v34 )
    *(_DWORD *)v34 = DWORDTag;
  if( ptiData )
    *(_DWORD *)ptiData = v9;
LABEL_33:
  ExFreePoolWithTag(P, 0x74705041u);
  return v24;
}

Referenced by:

PiIsDriverBlocked