RawDispatch

INT64 __fastcall RawDispatch(INT64 a1, IRP *a2){
  IO_STACK_LOCATION *v3; 
  _ETHREAD *CurrentThread; 
  INT64 v5; 
  unsigned int v6; 
  unsigned int VolumeInformation; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  char v13; 
  unsigned int v14; 
  unsigned int v15; 
  v3 = (IO_STACK_LOCATION *)*((_QWORD *)a2 + 23);
  if( *(_WORD *)(a1 + 2) != 336 || (v13 = *(_BYTE *)v3, *(_BYTE *)v3 == 13) && *((_BYTE *)v3 + 1) == 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    v5 = a1 + 336;
    v6 = *(_BYTE *)v3;
    if( v6 > 9 )
    {
      v8 = v6 - 10;
      if( !v8 )
      {
        VolumeInformation = RawQueryVolumeInformation(a1 + 336, a2, (INT64)v3);
        goto LABEL_9;
      }
      v9 = v8 - 3;
      if( !v9 )
      {
        VolumeInformation = RawFileSystemControl(a1 + 336, a2, v3);
        goto LABEL_9;
      }
      v10 = v9 - 1;
      if( !v10 )
        goto LABEL_8;
      v11 = v10 - 4;
      if( !v11 )
      {
        VolumeInformation = RawCleanup((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2, (__int64)v3);
        goto LABEL_9;
      }
      if( v11 == 9 )
      {
        if( *((_BYTE *)v3 + 1) == 1 )
        {
          v15 = -2147483631;
          *((_DWORD *)a2 + 12) = -2147483631;
          IofCompleteRequest(a2, 1);
          goto LABEL_30;
        }
        ExAcquireFastMutex((FAST_MUTEX *)(a1 + 560));
        if( (*(_DWORD *)(v5 + 104) & 2) != 0 )
        {
          v15 = -1073741202;
          *((_DWORD *)a2 + 12) = -1073741202;
          IofCompleteRequest(a2, 1);
          KeReleaseGuardedMutex((_FAST_MUTEX *)(v5 + 224));
          goto LABEL_30;
        }
        ++*(_DWORD *)(v5 + 112);
        KeReleaseGuardedMutex((_FAST_MUTEX *)(v5 + 224));
        goto LABEL_8;
      }
    }
    else
    {
      if( v6 == 9 )
      {
LABEL_8:
        VolumeInformation = RawReadWriteDeviceControl((PFSRTL_ADVANCED_FCB_HEADER)v5, (INT64)a2, (PSTR)v3);
LABEL_9:
        v15 = VolumeInformation;
LABEL_30:
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        return v15;
      }
      if( !*(_BYTE *)v3 )
      {
        VolumeInformation = RawCreate((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2);
        goto LABEL_9;
      }
      if( v6 == 2 )
      {
        VolumeInformation = RawClose((PFSRTL_ADVANCED_FCB_HEADER)(a1 + 336), a2, (__int64)v3);
        goto LABEL_9;
      }
      if( v6 > 2 )
      {
        if( v6 <= 4 )
          goto LABEL_8;
        if( v6 == 5 )
        {
          VolumeInformation = RawQueryInformation(a1 + 336, (INT64)a2, (INT64)v3);
          goto LABEL_9;
        }
        if( v6 == 6 )
        {
          VolumeInformation = RawSetInformation(a1 + 336, a2, (INT64)v3);
          goto LABEL_9;
        }
      }
    }
    KeBugCheckEx(0x22u, 0i64, 0i64, 0i64, 0i64);
  }
  if( (v13 & 0xED) != 0 || v13 == 16 )
    v14 = -1073741808;
  else
    v14 = 0;
  *((_DWORD *)a2 + 12) = v14;
  IofCompleteRequest(a2, 1);
  return v14;
}

Referenced by:

No references.