RaspGetXExtent

NTSTATUS __stdcall RaspGetXExtent(
        WCHAR Character,
        _TEXT_ATTRIBUTES *TextAttributes,
        UINT64 *XExtent,
        _CHARACTER_CACHE *Workspace,
        UINT8 ForceBitmapToCallerCache,
        _BG_RASTERIZER_WORKSPACE *a9){
  _BG_RASTERIZER_WORKSPACE *v8; 
  int v9; 
  _GRAPHICS_RECTANGLE *v10; 
  int v11; 
  __int64 v12; 
  UINT64 v13; 
  UINT64 v14; 
  _GRAPHICS_RECTANGLE **v15; 
  char *Memory; 
  __int64 v18; 
  _BG_RASTERIZER_WORKSPACE *v19; 
  _BG_RASTERIZER_WORKSPACE v20; 
  UINT64 *FontHandle; 
  _CACHED_BITMAP *Match; 
  _BG_RASTERIZER_WORKSPACE v23[4]; 
  __int64 v24; 
  char v25[128]; 
  _GRAPHICS_RECTANGLE *MaxRow; 

  memset(v25, 0i64, 0x46u);
  v8 = a9;
  v9 = 0;
  Match = 0i64;
  v10 = 0i64;
  v11 = 0;
  MaxRow = 0i64;
  v12 = *(_QWORD *)a9;
  *(_DWORD *)&ForceBitmapToCallerCache = 0;
  v24 = 0i64;
  *(_OWORD *)v23 = 0i64;
  if( Character >= 0x20u )
  {
    v13 = (unsigned int)TextAttributes[4];
    a9 = (_BG_RASTERIZER_WORKSPACE *)*((_QWORD *)TextAttributes + 1);
    RaspGetCacheEntry((_BITMAP_CACHE *)&SbiVmbusArrivalEvent + 16, Character, v13, (unsigned int)a9[10], a9, &Match);
    Memory = (char *)Match;
    if( Match )
    {
LABEL_3:
      v11 = *((_DWORD *)Memory + 11);
      *((_QWORD *)v8 + 2) = *(_QWORD *)(Memory + 62);
      goto LABEL_4;
    }
    LODWORD(FontHandle) = 0;
    v9 = RaspRasterize(
           TextAttributes,
           Character,
           v14,
           v15,
           FontHandle,
           (INT64 *)&MaxRow,
           (_BG_RASTERIZER_WORKSPACE *)&ForceBitmapToCallerCache);
    if( v9 >= 0 )
    {
      if( v12 )
      {
        Memory = v25;
LABEL_10:
        v18 = *((_QWORD *)v8 + 2);
        v19 = a9;
        v10 = MaxRow;
        v20 = a9[10];
        *((_DWORD *)Memory + 10) = TextAttributes[4];
        *((_DWORD *)Memory + 11) = ForceBitmapToCallerCache;
        *((_DWORD *)Memory + 12) = 0;
        *((_DWORD *)Memory + 13) = 4;
        *((_DWORD *)Memory + 14) = 4;
        *((_WORD *)Memory + 30) = Character;
        *((_DWORD *)Memory + 9) = v20;
        *((_QWORD *)Memory + 3) = v19;
        *((_QWORD *)Memory + 2) = v10;
        *(_QWORD *)(Memory + 62) = v18;
        if( !v12 )
          RaspAddCacheEntry((_BITMAP_CACHE *)&SbiVmbusArrivalEvent + 16, (_CACHED_BITMAP *)Memory);
        goto LABEL_3;
      }
      Memory = (char *)RaspAllocateMemory(0x46ui64, v23);
      if( Memory )
        goto LABEL_10;
      v9 = -1073741801;
    }
    v10 = MaxRow;
    v11 = ForceBitmapToCallerCache;
  }
LABEL_4:
  *(_DWORD *)XExtent = v11;
  if( v12 || v9 < 0 )
  {
    if( v10 )
      RaspFreeMemory(v10, v8);
  }
  return v9;
}

Referenced by:

BcpGetCharacterMaxResourceProfile
BgpRasGetGlyphAdvanceWidth