PiCMRegisterDeviceInterface

INT64 __stdcall PiCMRegisterDeviceInterface(
        PVOID IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        PVOID IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  unsigned int v8; 
  WCHAR *v9; 
  int v10; 
  __int64 v11; 
  int v12; 
  UINT64 v13; 
  int v14; 
  _ETHREAD *CurrentThread; 
  INT8 v16; 
  WCHAR *v18; 
  WCHAR *v19; 
  int v20; 
  __int64 v21; 
  UINT64 BufferSize; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  WCHAR *SymbolicLinkName; 
  INT64 v26[2]; 
  WCHAR *DeviceInstanceName[2]; 
  WCHAR *ReferenceString[2]; 
  UINT64 v29; 
  UINT64 *v30; 
  v5 = v30;
  v6 = IoctlOutputBufferSize;
  SymbolicLinkName = 0i64;
  *(_DWORD *)v30 = 0;
  v8 = 0;
  *(_OWORD *)v26 = 0i64;
  v29 = 0i64;
  v9 = 0i64;
  *(_OWORD *)DeviceInstanceName = 0i64;
  *(_OWORD *)ReferenceString = 0i64;
  v10 = PiCMCaptureRegisterInterfaceInputData(
          (UINT64)IoctlInputBuffer,
          IoctlInputBufferSize,
          (unsigned int)BytesUsed,
          (INT64)v26);
  if( v10 < 0 )
    goto LABEL_8;
  if( !PiAuDoesClientHaveAccess(2ui64) )
  {
    v12 = -1073741790;
LABEL_4:
    v13 = 0i64;
LABEL_5:
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(ExpectedOutputSize) = HIDWORD(v29);
    LODWORD(BufferSize) = 0;
    v14 = PiCMReturnBufferResultData(
            (unsigned int)v12,
            v13,
            0i64,
            0i64,
            BufferSize,
            ExpectedOutputSize,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v30);
    goto LABEL_6;
  }
  v18 = DeviceInstanceName[1];
  if( !DeviceInstanceName[1] || HIDWORD(v26[0]) )
  {
    v12 = -1073741811;
  }
  else
  {
    v19 = ReferenceString[1];
    if( ReferenceString[1] && (unsigned int)v29 < 2 || !IoctlOutputBuffer || v6 < 0x14 )
    {
      v12 = -1073741811;
      goto LABEL_4;
    }
    if( v6 - 20 < 2 )
    {
      v12 = -1073741811;
      goto LABEL_4;
    }
    v12 = CmValidateDeviceName(v11, DeviceInstanceName[1]);
    if( v12 >= 0 )
    {
      v20 = IopRegisterDeviceInterface(v18, (GUID *)&v26[1], v19, 1u, &SymbolicLinkName, 0i64);
      v9 = SymbolicLinkName;
      v12 = v20;
      if( v20 >= 0 )
      {
        v21 = -1i64;
        do
          ++v21;
        while( SymbolicLinkName[v21] );
        v8 = v21 + 1;
        if( 2 * (unsigned __int64)v8 > v6 - 20 )
        {
          v12 = -1073741789;
          v13 = 2 * v8;
          goto LABEL_5;
        }
      }
    }
    v5 = v30;
  }
  v13 = 2 * v8;
  if( v12 < 0 )
    goto LABEL_5;
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = HIDWORD(v29);
  LODWORD(BufferSize) = 2 * v8;
  v14 = PiCMReturnBufferResultData(
          (unsigned int)v12,
          v13,
          0i64,
          (UINT8 *)v9,
          BufferSize,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v5);
LABEL_6:
  v10 = v14;
  if( v9 )
    ExFreePoolWithTag(v9, 0);
LABEL_8:
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v16 = *((_BYTE *)CurrentThread + 562);
  if( DeviceInstanceName[1] )
    PiControlFreeUserModeCallersBuffer(*((_BYTE *)CurrentThread + 562), DeviceInstanceName[1]);
  if( ReferenceString[1] )
    PiControlFreeUserModeCallersBuffer(v16, ReferenceString[1]);
  return(unsigned int)v10;
}

Referenced by:

No references.