text: #ifndef _SWENUM_
  #define _SWENUM_
  
  #define IOCTL_SWENUM_INSTALL_INTERFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x000, METHOD_BUFFERED, FILE_ANY_ACCESS)
  #define IOCTL_SWENUM_REMOVE_INTERFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x001, METHOD_BUFFERED, FILE_ANY_ACCESS)
  #define IOCTL_SWENUM_GET_BUS_ID CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x002, METHOD_NEITHER, FILE_READ_ACCESS)
  
  typedef struct _SWENUM_INSTALL_INTERFACE {
    GUID   DeviceId;
    GUID   InterfaceId;
    WCHAR  ReferenceString[1];
  } SWENUM_INSTALL_INTERFACE, *PSWENUM_INSTALL_INTERFACE;
  
  #if defined(_KS_)
  #define STATIC_BUSID_SoftwareDeviceEnumerator STATIC_KSMEDIUMSETID_Standard
  #define BUSID_SoftwareDeviceEnumerator KSMEDIUMSETID_Standard
  #else
  #define STATIC_BUSID_SoftwareDeviceEnumerator \
      0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  #endif /* _KS_ */
  
  #if defined(_NTDDK_)
  
  #if !defined(_KS_)
  typedef VOID (NTAPI *PFNREFERENCEDEVICEOBJECT)(PVOID Context);
  typedef VOID (NTAPI *PFNDEREFERENCEDEVICEOBJECT)(PVOID Context);
  typedef NTSTATUS (NTAPI *PFNQUERYREFERENCESTRING)(PVOID Context, PWCHAR *String);
  #endif /* _KS_ */
  
  #define BUS_INTERFACE_SWENUM_VERSION    0x100
  
  typedef struct _BUS_INTERFACE_SWENUM {
    INTERFACE Interface;
    PFNREFERENCEDEVICEOBJECT ReferenceDeviceObject;
    PFNDEREFERENCEDEVICEOBJECT DereferenceDeviceObject;
    PFNQUERYREFERENCESTRING QueryReferenceString;
  } BUS_INTERFACE_SWENUM, *PBUS_INTERFACE_SWENUM;
  
  #if defined(__cplusplus)
  extern "C" {
  #endif
  
  #if defined(_KS_)
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsQuerySoftwareBusInterface(
      IN PDEVICE_OBJECT PnpDeviceObject,
      OUT PBUS_INTERFACE_SWENUM BusInterface
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsReferenceSoftwareBusObject(
      IN KSDEVICE_HEADER Header
  );
  
  KSDDKAPI
  VOID
  NTAPI
  KsDereferenceSoftwareBusObject(
      IN KSDEVICE_HEADER  Header
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsCreateBusEnumObject(
      IN PWSTR BusIdentifier,
      IN PDEVICE_OBJECT BusDeviceObject,
      IN PDEVICE_OBJECT PhysicalDeviceObject,
      IN PDEVICE_OBJECT PnpDeviceObject,
      IN REFGUID InterfaceGuid,
      IN PWSTR ServiceRelativePath
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsGetBusEnumIdentifier(
      IN OUT PIRP Irp
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsGetBusEnumPnpDeviceObject(
      IN PDEVICE_OBJECT DeviceObject,
      OUT PDEVICE_OBJECT *PnpDeviceObject
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsInstallBusEnumInterface(
      IN PIRP Irp
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsIsBusEnumChildDevice(
      IN PDEVICE_OBJECT DeviceObject,
      OUT PBOOLEAN ChildDevice
  );
  
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsRemoveBusEnumInterface(
      IN PIRP Irp
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsServiceBusEnumPnpRequest(
      IN PDEVICE_OBJECT DeviceObject,
      IN OUT PIRP Irp
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsServiceBusEnumCreateRequest(
      IN PDEVICE_OBJECT DeviceObject,
      IN OUT PIRP Irp
  );
  
  KSDDKAPI
  NTSTATUS
  NTAPI
  KsGetBusEnumParentFDOFromChildPDO(
      IN PDEVICE_OBJECT DeviceObject,
      OUT PDEVICE_OBJECT *FunctionalDeviceObject
  );
  
  #endif /* _KS_ */
  
  #if defined(__cplusplus)
  }
  #endif
  
  #endif /* _NTDDK_ */
  
  #endif /* _SWENUM_ */
  
  