PiSwDispatch

NTSTATUS __stdcall PiSwDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp){
  char *v2; 
  NTSTATUS v4; 
  char v5; 
  _IRP *v8; 
  void *v9; 
  __int64 v10; 
  v2 = (char *)*((_QWORD *)Irp + 23);
  v4 = *((_DWORD *)Irp + 12);
  v5 = *v2;
  if( !*v2 )
  {
    *(_QWORD *)(*((_QWORD *)v2 + 6) + 32i64) = 0i64;
    v4 = PiAuDoesClientHaveAccess(0x80ui64) == 0 ? 0xC0000022 : 0;
    *((_DWORD *)Irp + 12) = v4;
LABEL_12:
    v8 = Irp;
    goto LABEL_13;
  }
  if( v5 != 14 )
  {
    if( v5 == 2 )
    {
      v9 = *(void **)(*((_QWORD *)v2 + 6) + 32i64);
      if( v9 )
      {
        PiSwDeviceDereference(v9);
        *(_QWORD *)(*((_QWORD *)v2 + 6) + 32i64) = 0i64;
      }
    }
    else
    {
      if( v5 != 18 )
        return v4;
      v10 = *(_QWORD *)(*((_QWORD *)v2 + 6) + 32i64);
      if( v10 )
        PiSwIrpCleanup(v10);
    }
    v4 = 0;
    *((_DWORD *)Irp + 12) = 0;
    goto LABEL_12;
  }
  switch( *((_DWORD *)v2 + 6) )
  {
    case 0x470400:
      return PiSwIrpStartCreate(Irp);
    case 0x470404:
      return PiSwIrpPropertySet(Irp);
    case 0x470408:
      return PiSwIrpInterfaceRegister(Irp);
    case 0x47040C:
      return PiSwIrpInterfaceSetState(Irp);
  }
  if( *((_DWORD *)v2 + 6) != 4654096 )
  {
    if( *((_DWORD *)v2 + 6) == 4654100 )
      return PiSwIrpSetLifetime(Irp);
    v8 = Irp;
    if( *((_DWORD *)v2 + 6) == 4654104 )
      return PiSwIrpGetLifetime(Irp);
    v4 = -1073741637;
    *((_DWORD *)Irp + 12) = -1073741637;
LABEL_13:
    IofCompleteRequest(v8, 0);
    return v4;
  }
  return PiSwIrpInterfacePropertySet(Irp);
}

Referenced by:

No references.