PiCMGetDeviceInterfaceAlias

NTSTATUS __stdcall PiCMGetDeviceInterfaceAlias(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  unsigned int v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  unsigned __int64 v9; 
  NTSTATUS inited; 
  UINT64 v11; 
  NTSTATUS v12; 
  UINT64 BufferSize; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  _UNICODE_STRING AliasSymbolicLinkName; 
  _UNICODE_STRING DestinationString; 
  _GUID AliasInterfaceClassGuid; 
  PCWSTR SourceString[2]; 
  UINT64 v21; 
  UINT64 *v22; 

  v5 = 0;
  v6 = IoctlOutputBufferSize;
  *(_DWORD *)v22 = 0;
  AliasSymbolicLinkName = 0i64;
  v21 = 0i64;
  PoolWithTag = 0i64;
  AliasInterfaceClassGuid = 0i64;
  LODWORD(v9) = 0;
  *(_OWORD *)SourceString = 0i64;
  DestinationString = 0i64;
  inited = PiCMCaptureInterfaceAliasInputData(
             (unsigned __int64)IoctlInputBuffer,
             IoctlInputBufferSize,
             (int)BytesUsed,
             (__int64)&AliasInterfaceClassGuid);
  if( inited < 0 )
    goto LABEL_23;
  if( !SourceString[1] || *(_DWORD *)&AliasInterfaceClassGuid.Data2 )
  {
    inited = -1073741811;
  }
  else
  {
    if( !IoctlOutputBuffer || v6 < 0x14 )
    {
      inited = -1073741811;
      v11 = 0i64;
      goto LABEL_28;
    }
    if( v6 - 20 >= 2 )
      v5 = v6 - 20;
    if( v5 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, 879783504i64);
      if( !PoolWithTag )
        inited = -1073741670;
    }
    if( inited >= 0 )
    {
      if( v5 >= 2 )
        *(_WORD *)PoolWithTag = 0;
      inited = RtlInitUnicodeStringEx(&DestinationString, (WCHAR *)SourceString[1]);
      if( inited >= 0 )
      {
        inited = IoGetDeviceInterfaceAlias(
                   &DestinationString,
                   (_GUID *)AliasInterfaceClassGuid.Data4,
                   &AliasSymbolicLinkName);
        if( inited >= 0 )
        {
          v9 = ((unsigned __int64)AliasSymbolicLinkName.Length + 2) >> 1;
          if( 2 * (unsigned __int64)(unsigned int)v9 > v5 )
          {
            inited = -1073741789;
          }
          else
          {
            memmove(PoolWithTag, AliasSymbolicLinkName.Buffer, AliasSymbolicLinkName.Length);
            *((_WORD *)PoolWithTag + (unsigned int)(v9 - 1)) = 0;
          }
          ExFreePoolWithTag(AliasSymbolicLinkName.Buffer, 0);
        }
      }
    }
  }
  v11 = (unsigned int)(2 * v9);
  if( inited >= 0 )
  {
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(ExpectedOutputSize) = HIDWORD(v21);
    LODWORD(BufferSize) = 2 * v9;
    v12 = PiCMReturnBufferResultData(
            (unsigned int)inited,
            v11,
            0i64,
            PoolWithTag,
            BufferSize,
            ExpectedOutputSize,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v22);
    goto LABEL_21;
  }
LABEL_28:
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = HIDWORD(v21);
  LODWORD(BufferSize) = 0;
  v12 = PiCMReturnBufferResultData(
          (unsigned int)inited,
          v11,
          0i64,
          0i64,
          BufferSize,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v22);
LABEL_21:
  inited = v12;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_23:
  if( SourceString[1] )
    PiControlFreeUserModeCallersBuffer(KeGetCurrentThread()->PreviousMode, (PVOID)SourceString[1]);
  return inited;
}

Referenced by:

PiCMHandleIoctl