RawDispatch

NTSTATUS __stdcall RawDispatch(_VOLUME_DEVICE_OBJECT *VolumeDeviceObject, _IRP *Irp){
  _IRP *v2; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  _ETHREAD *CurrentThread; 
  _FAST_MUTEX *v5; 
  unsigned int MajorFunction; 
  NTSTATUS VolumeInformation; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  _CCHAR v11; 
  _CCHAR v12; 
  unsigned __int8 v14; 
  int v15; 
  NTSTATUS v16; 

  v2 = Irp;
  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  if( *((_WORD *)VolumeDeviceObject + 1) != 336
    || (v14 = CurrentStackLocation->MajorFunction, CurrentStackLocation->MajorFunction == 13)
    && CurrentStackLocation->MinorFunction == 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v5 = (_FAST_MUTEX *)(VolumeDeviceObject + 84);
    MajorFunction = CurrentStackLocation->MajorFunction;
    if( MajorFunction > 9 )
    {
      v8 = MajorFunction - 10;
      if( !v8 )
      {
        VolumeInformation = RawQueryVolumeInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
        goto LABEL_9;
      }
      v9 = v8 - 3;
      if( !v9 )
      {
        VolumeInformation = RawFileSystemControl(VolumeDeviceObject + 84, v2, CurrentStackLocation);
        goto LABEL_9;
      }
      v10 = v9 - 1;
      if( !v10 )
        goto LABEL_8;
      v11 = v10 - 4;
      if( !v11 )
      {
        VolumeInformation = RawCleanup(VolumeDeviceObject + 84, v2, CurrentStackLocation);
        goto LABEL_9;
      }
      if( v11 == 9 )
      {
        if( CurrentStackLocation->MinorFunction == 1 )
        {
          v16 = -2147483631;
          v2->IoStatus.Status = -2147483631;
          LOBYTE(v11) = 1;
          IofCompleteRequest(v2, v11);
          goto LABEL_30;
        }
        ExAcquireFastMutex((PFAST_MUTEX)VolumeDeviceObject + 10);
        if( (v5[1].OldIrql & 2) != 0 )
        {
          v16 = -1073741202;
          v2->IoStatus.Status = -1073741202;
          LOBYTE(v12) = 1;
          IofCompleteRequest(v2, v12);
          KeReleaseGuardedMutex(v5 + 4);
          goto LABEL_30;
        }
        ++v5[2].Count;
        KeReleaseGuardedMutex(v5 + 4);
        goto LABEL_8;
      }
    }
    else
    {
      if( MajorFunction == 9 )
      {
LABEL_8:
        VolumeInformation = RawReadWriteDeviceControl(&v5->Count, v2, CurrentStackLocation);
LABEL_9:
        v16 = VolumeInformation;
LABEL_30:
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        return v16;
      }
      if( !CurrentStackLocation->MajorFunction )
      {
        VolumeInformation = RawCreate(VolumeDeviceObject + 84, v2, CurrentStackLocation);
        goto LABEL_9;
      }
      if( MajorFunction == 2 )
      {
        VolumeInformation = RawClose(VolumeDeviceObject + 84, v2, CurrentStackLocation);
        goto LABEL_9;
      }
      if( MajorFunction > 2 )
      {
        if( MajorFunction <= 4 )
          goto LABEL_8;
        if( MajorFunction == 5 )
        {
          VolumeInformation = RawQueryInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
          goto LABEL_9;
        }
        if( MajorFunction == 6 )
        {
          VolumeInformation = RawSetInformation(VolumeDeviceObject + 84, v2, CurrentStackLocation);
          goto LABEL_9;
        }
      }
    }
    KeBugCheckEx(0x22u, 0i64, 0i64, 0i64, 0i64);
  }
  if( (v14 & 0xED) != 0 || v14 == 16 )
    v15 = -1073741808;
  else
    v15 = 0;
  Irp->IoStatus.Status = v15;
  LOBYTE(Irp) = 1;
  IofCompleteRequest(v2, (_CCHAR)Irp);
  return v15;
}

Referenced by:

No references.