PiCMGetDeviceInterfaceList

NTSTATUS __stdcall PiCMGetDeviceInterfaceList(
        PVOID IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        PVOID IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  unsigned int v6; 
  UINT8 *v7; 
  unsigned int v8; 
  INT64 v9; 
  INT64 v10; 
  NTSTATUS v11; 
  INT64 v12; 
  int v13; 
  WCHAR *v14; 
  INT64 v15; 
  int inited; 
  unsigned int v17; 
  NTSTATUS v18; 
  WCHAR **SymbolicLinkList; 
  UINT64 *SymbolicLinkListSize; 
  UINT64 IoctlOutputBufferSizea; 
  UINT64 RequiredSize; 
  PVOID P; 
  UINT64 *v25; 
  struct _UNICODE_STRING DestinationString; 
  INT64 v27[2]; 
  PCWSTR SourceString[2]; 
  UINT64 ExpectedOutputSize; 
  UINT64 *v30; 
  v25 = v30;
  ExpectedOutputSize = 0i64;
  v6 = IoctlOutputBufferSize;
  *(_DWORD *)v30 = 0;
  v7 = 0i64;
  v8 = 0;
  P = 0i64;
  DestinationString = 0i64;
  LODWORD(RequiredSize) = 0;
  *(_OWORD *)v27 = 0i64;
  *(_OWORD *)SourceString = 0i64;
  v11 = PiCMCaptureInterfaceListInputData(
          (UINT64)IoctlInputBuffer,
          IoctlInputBufferSize,
          (unsigned int)BytesUsed,
          (INT64)v27);
  if( v11 < 0 )
    goto LABEL_17;
  v13 = HIDWORD(v27[0]);
  v14 = (WCHAR *)SourceString[1];
  if( (byte_140C130BB & 2) != 0 )
    McTemplateK0jzt_EtwWriteTransfer(
      HIWORD(HIDWORD(v27[0])) & 1,
      v9,
      v12,
      (INT64)&v27[1],
      SourceString[1],
      BYTE6(v27[0]) & 1);
  if( IoctlOutputBuffer && v6 >= 0x14 )
  {
    v15 = 3221225485i64;
    if( (v13 & 0xFFFE0000) != 0 )
      goto LABEL_22;
    if( (_WORD)v13 )
      v11 = -1073741811;
    v15 = (unsigned int)v11;
    if( v11 < 0 )
      goto LABEL_22;
    inited = RtlInitUnicodeStringEx(&DestinationString, v14);
    v15 = (unsigned int)inited;
    if( inited < 0 )
      goto LABEL_22;
    IopGetDeviceInterfaces(
      (const _GUID *)&v27[1],
      (_UNICODE_STRING *)((unsigned __int64)&DestinationString & -(__int64)(DestinationString.Length != 0)),
      (v13 & 0x10000) == 0,
      1u,
      (WCHAR **)&P,
      &RequiredSize);
    v8 = RequiredSize;
    v15 = v17;
    v7 = (UINT8 *)P;
    if( v6 - 20 < (unsigned int)RequiredSize )
      v15 = 3221225507i64;
  }
  else
  {
    v15 = 3221225485i64;
  }
  if( (int)v15 >= 0 )
  {
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(SymbolicLinkListSize) = HIDWORD(ExpectedOutputSize);
    LODWORD(SymbolicLinkList) = v8;
    v18 = PiCMReturnBufferResultData(
            v15,
            v8,
            0i64,
            v7,
            (UINT64)SymbolicLinkList,
            (UINT64)SymbolicLinkListSize,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v25);
    goto LABEL_15;
  }
LABEL_22:
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(SymbolicLinkListSize) = HIDWORD(ExpectedOutputSize);
  LODWORD(SymbolicLinkList) = 0;
  v18 = PiCMReturnBufferResultData(
          v15,
          v8,
          0i64,
          0i64,
          (UINT64)SymbolicLinkList,
          (UINT64)SymbolicLinkListSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v25);
LABEL_15:
  v11 = v18;
  if( v7 )
    ExFreePoolWithTag(v7, 0);
LABEL_17:
  if( SourceString[1] )
    PiControlFreeUserModeCallersBuffer(*((_BYTE *)KeGetCurrentThread() + 562), (PVOID)SourceString[1]);
  if( (byte_140C130BB & 2) != 0 )
    McTemplateK0d_EtwWriteTransfer(v10, &KMPnPEvt_CfgMgr_DeviceInterfaceList_Stop, v12, (unsigned int)v11);
  return v11;
}

Referenced by:

No references.