PiSwDispatch

NTSTATUS __stdcall PiSwDispatch(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
  _IO_STACK_LOCATION *CurrentStackLocation; 
  unsigned int Status; 
  unsigned __int8 MajorFunction; 
  _IRP *v8; 
  _PI_SWD_OBJECT *FsContext2; 
  _PI_SWD_OBJECT *v10; 

  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  Status = Irp->IoStatus.Status;
  MajorFunction = CurrentStackLocation->MajorFunction;
  if( !CurrentStackLocation->MajorFunction )
  {
    CurrentStackLocation->FileObject->FsContext2 = 0i64;
    Status = PiAuDoesClientHaveAccess(0x80ui64) == 0 ? 0xC0000022 : 0;
    Irp->IoStatus.Status = Status;
LABEL_12:
    v8 = Irp;
    goto LABEL_13;
  }
  if( MajorFunction != 14 )
  {
    if( MajorFunction == 2 )
    {
      FsContext2 = (_PI_SWD_OBJECT *)CurrentStackLocation->FileObject->FsContext2;
      if( FsContext2 )
      {
        PiSwDeviceDereference(FsContext2);
        CurrentStackLocation->FileObject->FsContext2 = 0i64;
      }
    }
    else
    {
      if( MajorFunction != 18 )
        return Status;
      v10 = (_PI_SWD_OBJECT *)CurrentStackLocation->FileObject->FsContext2;
      if( v10 )
        PiSwIrpCleanup(v10);
    }
    Status = 0;
    Irp->IoStatus.Status = 0;
    goto LABEL_12;
  }
  switch( *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes )
  {
    case 0x470400:
      return PiSwIrpStartCreate(Irp);
    case 0x470404:
      return PiSwIrpPropertySet(Irp);
    case 0x470408:
      return PiSwIrpInterfaceRegister(Irp);
    case 0x47040C:
      return PiSwIrpInterfaceSetState(Irp);
  }
  if( *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes != 4654096 )
  {
    if( *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes == 4654100 )
      return PiSwIrpSetLifetime(Irp);
    v8 = Irp;
    if( *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes == 4654104 )
      return PiSwIrpGetLifetime(Irp);
    Status = -1073741637;
    Irp->IoStatus.Status = -1073741637;
LABEL_13:
    IofCompleteRequest(v8, 0);
    return Status;
  }
  return PiSwIrpInterfacePropertySet(Irp);
}

Referenced by:

No references.