FsRtlSetKernelEaFile

NTSTATUS __stdcall FsRtlSetKernelEaFile(_FILE_OBJECT *FileObject, PVOID EaBuffer, UINT64 a3){
  int v3; 
  _IRP *v6; 
  _IRP *v7; 
  __int64 *v8; 
  __int64 v9; 
  __int64 v10; 
  NTSTATUS v11; 
  void *v12; 
  void *v13; 
  void *v14; 
  struct _MDL *v15; 
  PIRP Irp; 
  PVOID ObjectArray; 
  _KEVENT Object; 
  _DEVICE_OBJECT *DeviceObject; 
  v3 = a3;
  v6 = 0i64;
  memset(&Object, 0, sizeof(Object));
  KeInitializeEvent(&Object, NotificationEvent, 0);
  if( (FileObject->Flags & 0x800) != 0 )
  {
    v11 = -1073741808;
  }
  else
  {
    DeviceObject = IoGetRelatedDeviceObject(FileObject);
    v7 = IoAllocateIrpEx(DeviceObject, *((_BYTE *)DeviceObject + 76), 0);
    v6 = v7;
    Irp = v7;
    if( v7 )
    {
      v8 = (__int64 *)((char *)v7 + 184);
      v9 = *((_QWORD *)v7 + 23);
      *(_WORD *)(v9 - 72) = 1032;
      *(_QWORD *)(v9 - 24) = FileObject;
      *((_QWORD *)v6 + 14) = EaBuffer;
      *(_DWORD *)(v9 - 64) = v3;
      v6 = Irp;
      *((_QWORD *)Irp + 19) = KeGetCurrentThread();
      *((_DWORD *)Irp + 4) = 4;
      *((_BYTE *)Irp + 64) = 0;
      v10 = *v8;
      *(_QWORD *)(v10 - 16) = SmKmGenericCompletion;
      *(_QWORD *)(v10 - 8) = &Object;
      *(_BYTE *)(v10 - 69) = 0;
      *(_BYTE *)(v10 - 69) = 64;
      *(_BYTE *)(v10 - 69) = -64;
      *(_BYTE *)(v10 - 69) = -32;
      if( IofCallDriver(DeviceObject, Irp) == 259 )
      {
        ObjectArray = &Object;
        if( (unsigned int)FsRtlCancellableWaitForMultipleObjects(1ui64, &ObjectArray, WaitAll, 0i64, 0i64, 0i64) == -1073741749 )
        {
          IoCancelIrp((KDPC *)Irp, v12, v13, v14);
          KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
        }
      }
      v11 = *((_DWORD *)Irp + 12);
    }
    else
    {
      v11 = -1073741670;
    }
  }
  if( v6 )
  {
    v15 = (struct _MDL *)*((_QWORD *)v6 + 1);
    if( v15 )
    {
      FsRtlpFreeMdlChain(v15);
      *((_QWORD *)v6 + 1) = 0i64;
    }
    IoFreeIrp(v6);
  }
  return v11;
}

Referenced by:

SPCallServerHandleFileIntegrityUpdate