IoRegisterDeviceInterface

NTSTATUS __stdcall IoRegisterDeviceInterface(
        _DEVICE_OBJECT *PhysicalDeviceObject,
        _GUID *InterfaceClassGuid,
        _UNICODE_STRING *ReferenceString,
        _UNICODE_STRING *SymbolicLinkName){
  WCHAR *v4; 
  WCHAR *v5; 
  void *DeviceNode; 
  WCHAR *v10; 
  NTSTATUS v11; 
  int inited; 
  WCHAR *v13; 
  int v15; 
  UINT64 PdoFlags; 
  WCHAR *SymbolicLinkNamea; 
  UINT64 ReturnLength; 
  _GUID *InterfaceClassGuida; 

  InterfaceClassGuida = InterfaceClassGuid;
  LODWORD(ReturnLength) = 0;
  v4 = 0i64;
  v5 = 0i64;
  SymbolicLinkNamea = 0i64;
  PdoFlags = 0i64;
  *SymbolicLinkName = 0i64;
  if( !PhysicalDeviceObject
    || (DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode) == 0i64
    || (*((_DWORD *)DeviceNode + 99) & 0x20000) != 0 )
  {
    inited = -1073741808;
LABEL_15:
    if( v4 )
      ExFreePoolWithTag(v4, 0);
    goto LABEL_9;
  }
  if( !*((_QWORD *)DeviceNode + 6) )
    goto LABEL_13;
  ObQueryNameStringMode(PhysicalDeviceObject, 0i64, 0i64, &ReturnLength, 0);
  if( (unsigned int)ReturnLength <= 0x10 )
    goto LABEL_13;
  if( ReferenceString && ReferenceString->Length >= 2u )
  {
    v15 = PnpUnicodeStringToWstr((__int16 **)&PdoFlags, 0i64, &ReferenceString->Length);
    v5 = (WCHAR *)PdoFlags;
    inited = v15;
    if( v15 < 0 )
      goto LABEL_9;
    if( wcspbrk((WCHAR *)PdoFlags, (WCHAR *)L"\\/") )
    {
LABEL_13:
      inited = -1073741808;
      goto LABEL_9;
    }
  }
  v10 = (WCHAR *)*((_QWORD *)DeviceNode + 6);
  LODWORD(PdoFlags) = 0;
  v11 = IopRegisterDeviceInterface(v10, InterfaceClassGuida, v5, 0, &SymbolicLinkNamea, &PdoFlags);
  v4 = SymbolicLinkNamea;
  inited = v11;
  if( v11 < 0 )
    goto LABEL_15;
  v13 = SymbolicLinkNamea;
  PhysicalDeviceObject->Flags |= PdoFlags;
  inited = RtlInitUnicodeStringEx(SymbolicLinkName, v13);
  if( inited < 0 )
    goto LABEL_15;
LABEL_9:
  PnpUnicodeStringToWstrFree(v5, (__int64)ReferenceString);
  return inited;
}

Referenced by:

PiSwCompleteCreate