NtGetCachedSigningLevel

NTSTATUS __stdcall NtGetCachedSigningLevel(
        VOID *File,
        UINT64 *Flags,
        UINT8 *SigningLevel,
        UINT8 *Thumbprint,
        UINT64 *ThumbprintSize,
        UINT64 *ThumbprintAlgorithm){
  _ADAPTER_OBJECT *v10; 
  char PreviousMode; 
  int v12; 
  NTSTATUS CachedSigningLevel; 
  _DWORD *v15; 
  char v16; 
  size_t v17; 
  VOID *v18; 
  _DWORD *v19; 
  char SigningLevela[4]; 
  UINT64 Flagsa; 
  int v22; 
  PVOID Object; 
  int v24; 
  VOID *Address; 
  UINT64 v26; 
  _HANDLE Handle[2]; 
  UINT64 v28; 
  UINT64 v29; 
  PVOID v30; 
  char Src[64]; 

  v28 = (UINT64)Thumbprint;
  v26 = (UINT64)SigningLevel;
  Address = Flags;
  *(_QWORD *)Handle = File;
  v29 = (UINT64)ThumbprintAlgorithm;
  v10 = 0i64;
  memset(Src, 0i64, sizeof(Src));
  v22 = 0;
  Flagsa = 0x4000000000i64;
  SigningLevela[0] = 0;
  if( File && Flags && SigningLevel )
  {
    PreviousMode = KeGetCurrentThread()->PreviousMode;
    Object = 0i64;
    v12 = ObReferenceObjectByHandle(
            *(VOID **)Handle,
            1ui64,
            (_OBJECT_TYPE *)IoFileObjectType,
            PreviousMode,
            &Object,
            0i64);
    v10 = (_ADAPTER_OBJECT *)Object;
    v30 = Object;
    if( v12 >= 0 )
    {
      CachedSigningLevel = SeGetCachedSigningLevel(
                             (_FILE_OBJECT *)Object,
                             &Flagsa,
                             (UINT8 *)SigningLevela,
                             (UINT8 *)((unsigned __int64)Src & -(__int64)(Thumbprint != 0i64)),
                             (UINT64 *)(((unsigned __int64)&Flagsa + 4) & -(__int64)(Thumbprint != 0i64)),
                             (UINT64 *)((unsigned __int64)&v22 & ((unsigned __int128)-(__int128)(unsigned __int64)Thumbprint >> 64)));
      LODWORD(Object) = CachedSigningLevel;
      v12 = CachedSigningLevel;
      if( CachedSigningLevel >= 0 )
      {
        v15 = Address;
        if( PreviousMode == 1 )
        {
          ProbeForWrite((UINT64)Address, 4i64, 4i64);
          ProbeForWrite(v26, 1i64, 1i64);
        }
        v16 = Flagsa;
        *v15 = Flagsa;
        *(_BYTE *)v26 = SigningLevela[0];
        v12 = CachedSigningLevel;
        if( ThumbprintSize )
        {
          if( PreviousMode == 1 )
          {
            ProbeForWrite((UINT64)ThumbprintSize, 4i64, 4i64);
            v16 = Flagsa;
          }
          if( (v16 & 2) != 0 )
          {
            v17 = HIDWORD(Flagsa);
            if( *(_DWORD *)ThumbprintSize >= HIDWORD(Flagsa) && (v18 = (VOID *)v28) != 0i64 )
            {
              if( PreviousMode == 1 )
              {
                ProbeForWrite(v28, HIDWORD(Flagsa), 1i64);
                v17 = HIDWORD(Flagsa);
              }
              memmove(v18, Src, v17);
              v12 = (int)Object;
            }
            else
            {
              v12 = -1073741789;
              v24 = -1073741789;
            }
            *(_DWORD *)ThumbprintSize = v17;
            v19 = (_DWORD *)v29;
            if( v29 )
            {
              if( PreviousMode == 1 )
                ProbeForWrite(v29, 4i64, 4i64);
              *v19 = v22;
            }
          }
          else
          {
            *(_DWORD *)ThumbprintSize = 0;
            v12 = CachedSigningLevel;
          }
        }
      }
    }
  }
  else
  {
    v12 = -1073741811;
  }
  if( v10 )
    HalPutDmaAdapter(v10);
  return v12;
}

Referenced by:

No references.