RawUserFsCtrl

INT64 __fastcall RawUserFsCtrl(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  unsigned int FileSystemInformation; 
  _FILE_OBJECT *v5; 
  char v6; 
  int v10; 
  _FAST_MUTEX *v12; 
  int v13; 
  UINT64 v14; 
  UINT64 v15; 
  int v16; 
  BOOLEAN v17; 
  int v18; 
  int v19; 
  v3 = *(_DWORD *)(a2 + 24);
  FileSystemInformation = 0;
  v5 = *(_FILE_OBJECT **)(a2 + 48);
  v6 = 0;
  if( v3 == 589848 )
  {
    v15 = 3i64;
    goto LABEL_23;
  }
  if( *(_DWORD *)(a2 + 24) == 589856 )
  {
    v15 = 1i64;
LABEL_23:
    FsRtlNotifyVolumeEvent(v5, v15);
  }
  switch( v3 )
  {
    case 589824:
    case 589828:
    case 589836:
    case 589844:
      v17 = RawBeginOperation(a3, (INT64)v5);
      if( v17 )
      {
        FileSystemInformation = -1073741822;
LABEL_35:
        if( v17 )
          RawEndOperation(a3, (INT64)v5);
        goto LABEL_18;
      }
LABEL_40:
      FileSystemInformation = -1073741202;
      goto LABEL_12;
    case 589848:
      v17 = RawBeginOperation(a3, (INT64)v5);
      v18 = 0;
      if( !v17 )
        v18 = -1073741202;
      FileSystemInformation = v18;
      ExAcquireFastMutex((FAST_MUTEX *)(a3 + 224));
      v19 = *(_DWORD *)(a3 + 104);
      if( (v19 & 1) != 0 || *(_DWORD *)(a3 + 108) != 1 )
      {
        FileSystemInformation = -1073741790;
      }
      else
      {
        *(_QWORD *)(a3 + 208) = v5;
        *(_DWORD *)(a3 + 104) = v19 | 1;
      }
      KeReleaseGuardedMutex((_FAST_MUTEX *)(a3 + 224));
      goto LABEL_35;
    case 589852:
      v12 = (_FAST_MUTEX *)(a3 + 224);
      ExAcquireFastMutex((FAST_MUTEX *)(a3 + 224));
      v13 = *(_DWORD *)(a3 + 104);
      if( (v13 & 1) != 0 )
      {
        *(_QWORD *)(a3 + 208) = 0i64;
        *(_DWORD *)(a3 + 104) = v13 & 0xFFFFFFFE;
      }
      else
      {
        FileSystemInformation = -1073741782;
      }
      goto LABEL_17;
  }
  if( v3 != 589856 )
  {
    if( v3 != 590412 )
    {
      FileSystemInformation = -1073741811;
      goto LABEL_12;
    }
    v17 = RawBeginOperation(a3, (INT64)v5);
    if( v17 )
    {
      FileSystemInformation = RawQueryFileSystemInformation(a1, a2, a3);
      goto LABEL_35;
    }
    goto LABEL_40;
  }
  v12 = (_FAST_MUTEX *)(a3 + 224);
  ExAcquireFastMutex((FAST_MUTEX *)(a3 + 224));
  v16 = *(_DWORD *)(a3 + 104);
  if( (v16 & 2) != 0 )
  {
    FileSystemInformation = -1073741202;
  }
  else
  {
    v6 = 1;
    *(_DWORD *)(a3 + 104) = v16 | 2;
  }
  KeReleaseGuardedMutex((_FAST_MUTEX *)(a3 + 224));
  if( v6 )
  {
    ExWaitForRundownProtectionReleaseCacheAware(*(PEX_RUNDOWN_REF_CACHE_AWARE *)(a3 + 216));
    ExAcquireFastMutex((FAST_MUTEX *)(a3 + 224));
    *(_QWORD *)(a3 + 200) = v5;
LABEL_17:
    KeReleaseGuardedMutex(v12);
  }
LABEL_18:
  if( (FileSystemInformation & 0x80000000) == 0 )
  {
    if( v3 != 589852 )
      return FileSystemInformation;
    v14 = 5i64;
LABEL_21:
    FsRtlNotifyVolumeEvent(v5, v14);
    return FileSystemInformation;
  }
LABEL_12:
  v10 = v3 - 589848;
  if( !v10 )
  {
    v14 = 4i64;
    goto LABEL_21;
  }
  if( v10 == 8 )
  {
    v14 = 2i64;
    goto LABEL_21;
  }
  return FileSystemInformation;
}

Referenced by:

RawFileSystemControl