SepRmGlobalSaclSetWrkr

void __fastcall SepRmGlobalSaclSetWrkr(__int64 a1, __int64 a2){
  UINT64 v2; 
  UINT8 *v3; 
  char v5; 
  int GlobalSacl; 
  _ETHREAD *CurrentThread; 
  _QWORD *v8; 
  void *v9; 
  void *v10; 
  void *v11; 
  _QWORD *PoolWithTag; 
  UINT8 *v13; 
  UINT8 *v14; 
  unsigned __int16 MaximumLength; 
  PVOID v16; 
  _UNICODE_STRING ObjectType; 
  UINT64 AclSize; 
  PVOID P; 
  PVOID v20; 
  __int64 *v21; 
  v2 = *(unsigned __int16 *)(a1 + 44);
  v3 = (UINT8 *)(a1 + 46);
  v20 = 0i64;
  v21 = 0i64;
  LODWORD(AclSize) = 0;
  P = 0i64;
  *(_DWORD *)(&ObjectType.MaximumLength + 1) = 0;
  ObjectType.MaximumLength = v2;
  ObjectType.Length = v2;
  v5 = 0;
  ObjectType.Buffer = (wchar_t *)(a1 + 46);
  GlobalSacl = SepRmFetchGlobalSacl(&ObjectType, &AclSize, (UINT8 **)&P);
  if( GlobalSacl >= 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    v5 = 1;
    ExAcquireResourceExclusiveLite(&SepRmGlobalSaclLock, 1u);
    GlobalSacl = SepRmGlobalSaclFind((__int64 *)&v20, &v21, &ObjectType, 0);
    if( GlobalSacl < 0 )
    {
      if( !(_DWORD)AclSize )
        goto LABEL_2;
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x20ui64, 0x6C635347ui64);
      if( PoolWithTag )
      {
        v13 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v2, 0x6C635347ui64);
        PoolWithTag[2] = v13;
        v14 = v13;
        if( v13 )
        {
          MaximumLength = ObjectType.MaximumLength;
          *((_WORD *)PoolWithTag + 5) = ObjectType.MaximumLength;
          *((_WORD *)PoolWithTag + 4) = MaximumLength;
          memmove(v14, v3, v2);
          v16 = P;
          P = 0i64;
          PoolWithTag[3] = v16;
          *PoolWithTag = SepRmGlobalSaclHead;
          SepRmGlobalSaclHead = (__int64)PoolWithTag;
          goto LABEL_2;
        }
        ExFreePoolWithTag(PoolWithTag, 0);
      }
      GlobalSacl = -1073741801;
      goto LABEL_2;
    }
    v8 = v20;
    if( (_DWORD)AclSize )
    {
      v9 = (void *)*((_QWORD *)v20 + 3);
      if( v9 )
        ExFreePoolWithTag(v9, 0);
      v8[3] = P;
      goto LABEL_11;
    }
    if( v21 )
      *v21 = *(_QWORD *)v20;
    else
      SepRmGlobalSaclHead = *(_QWORD *)v20;
    v10 = (void *)v8[2];
    if( v10 )
    {
      ExFreePoolWithTag(v10, 0);
      v8[2] = 0i64;
    }
    v11 = (void *)v8[3];
    if( v11 )
    {
      ExFreePoolWithTag(v11, 0);
      v8[3] = 0i64;
    }
    ExFreePoolWithTag(v8, 0);
  }
LABEL_2:
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v5 )
  {
LABEL_11:
    ExReleaseResourceLite(&SepRmGlobalSaclLock);
    KeLeaveCriticalRegion();
  }
  *(_DWORD *)(a2 + 40) = GlobalSacl;
}

Referenced by:

No references.