PiCMCaptureRegistryPropertyInputData

NTSTATUS __stdcall PiCMCaptureRegistryPropertyInputData(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        INT64 Is32BitProcess,
        _CMAPI_INPUT_REGISTRY_PROPERTY_DATA *RegistryPropertyData){
  char CallerMode; 
  int UserModeCallersCopy; 
  char *v7; 
  _CMAPI_INPUT_REGISTRY_PROPERTY_DATA *v8; 
  VOID *v9; 
  UINT64 v10; 
  VOID *v11; 
  char *v13; 
  UINT64 v14; 
  UINT64 AllocateDestination; 
  int v16; 
  int v17; 

  v16 = 0;
  v17 = 0;
  CallerMode = KeGetCurrentThread()->PreviousMode;
  UserModeCallersCopy = 0;
  if( !IoctlInputBuffer || !(_DWORD)IoctlInputBufferSize )
  {
    UserModeCallersCopy = -1073741811;
    goto LABEL_21;
  }
  if( (_DWORD)Is32BitProcess )
  {
    if( ((unsigned __int8)IoctlInputBuffer & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    v13 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
    if( (unsigned __int64)v13 > 0x7FFFFFFF0000i64 || v13 < IoctlInputBuffer )
      MEMORY[0x7FFFFFFF0000] = 0;
    if( (unsigned int)IoctlInputBufferSize >= 0x28 && *(_DWORD *)IoctlInputBuffer == 40 )
    {
      *RegistryPropertyData = 56;
      RegistryPropertyData[1] = *((_DWORD *)IoctlInputBuffer + 1);
      RegistryPropertyData[2] = *((_DWORD *)IoctlInputBuffer + 2);
      *((_QWORD *)RegistryPropertyData + 2) = *((unsigned int *)IoctlInputBuffer + 3);
      RegistryPropertyData[6] = *((_DWORD *)IoctlInputBuffer + 4);
      RegistryPropertyData[7] = *((_DWORD *)IoctlInputBuffer + 5);
      RegistryPropertyData[8] = *((_DWORD *)IoctlInputBuffer + 6);
      *((_QWORD *)RegistryPropertyData + 5) = *((unsigned int *)IoctlInputBuffer + 7);
      RegistryPropertyData[12] = *((_DWORD *)IoctlInputBuffer + 8);
      RegistryPropertyData[13] = *((_DWORD *)IoctlInputBuffer + 9);
    }
    else
    {
      UserModeCallersCopy = -1073741811;
    }
  }
  else
  {
    if( ((unsigned __int8)IoctlInputBuffer & 7) != 0 )
      ExRaiseDatatypeMisalignment();
    v7 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
    if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < IoctlInputBuffer )
      MEMORY[0x7FFFFFFF0000] = 0;
    if( (unsigned int)IoctlInputBufferSize < 0x38 )
    {
      UserModeCallersCopy = -1073741811;
    }
    else
    {
      *(_OWORD *)RegistryPropertyData = *(_OWORD *)IoctlInputBuffer;
      *((_OWORD *)RegistryPropertyData + 1) = *((_OWORD *)IoctlInputBuffer + 1);
      *((_OWORD *)RegistryPropertyData + 2) = *((_OWORD *)IoctlInputBuffer + 2);
      *((_QWORD *)RegistryPropertyData + 6) = *((_QWORD *)IoctlInputBuffer + 6);
      if( *RegistryPropertyData != 56 )
        UserModeCallersCopy = -1073741811;
    }
  }
  if( UserModeCallersCopy < 0 )
    goto LABEL_45;
  v8 = RegistryPropertyData + 4;
  v9 = (VOID *)*((_QWORD *)RegistryPropertyData + 2);
  *((_QWORD *)RegistryPropertyData + 2) = 0i64;
  if( v9 )
  {
    v10 = (unsigned int)RegistryPropertyData[6];
    if( (unsigned int)v10 < 2 )
    {
      if( (unsigned int)RegistryPropertyData[6] < 2 )
        goto LABEL_24;
    }
    else
    {
      LODWORD(AllocateDestination) = 1;
      UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
                              (VOID **)RegistryPropertyData + 2,
                              v9,
                              v10,
                              2ui64,
                              CallerMode,
                              AllocateDestination);
      if( UserModeCallersCopy < 0 )
      {
        *(_QWORD *)v8 = 0i64;
        RegistryPropertyData[6] = 0;
      }
      else
      {
        v16 = 1;
        *(_WORD *)(*(_QWORD *)v8 + 2 * ((unsigned __int64)(unsigned int)RegistryPropertyData[6] >> 1) - 2) = 0;
      }
    }
  }
  else if( RegistryPropertyData[6] )
  {
    goto LABEL_24;
  }
  v11 = (VOID *)*((_QWORD *)RegistryPropertyData + 5);
  *((_QWORD *)RegistryPropertyData + 5) = 0i64;
  if( !v11 )
  {
    if( !RegistryPropertyData[12] )
      goto LABEL_21;
    goto LABEL_24;
  }
  v14 = (unsigned int)RegistryPropertyData[12];
  if( (_DWORD)v14 )
  {
    LODWORD(AllocateDestination) = 1;
    UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
                            (VOID **)RegistryPropertyData + 5,
                            v11,
                            v14,
                            1ui64,
                            CallerMode,
                            AllocateDestination);
    if( UserModeCallersCopy < 0 )
    {
      *((_QWORD *)RegistryPropertyData + 5) = 0i64;
      RegistryPropertyData[12] = 0;
    }
    else
    {
      v17 = 1;
    }
LABEL_21:
    if( UserModeCallersCopy >= 0 )
      return UserModeCallersCopy;
    goto LABEL_45;
  }
LABEL_24:
  UserModeCallersCopy = -1073741811;
LABEL_45:
  if( v16 )
    PiControlFreeUserModeCallersBuffer(CallerMode, *((PVOID *)RegistryPropertyData + 2));
  if( v17 )
    PiControlFreeUserModeCallersBuffer(CallerMode, *((PVOID *)RegistryPropertyData + 5));
  *(_OWORD *)RegistryPropertyData = 0i64;
  *((_OWORD *)RegistryPropertyData + 1) = 0i64;
  *((_OWORD *)RegistryPropertyData + 2) = 0i64;
  *((_QWORD *)RegistryPropertyData + 6) = 0i64;
  return UserModeCallersCopy;
}

Referenced by:

PiCMGetRegistryProperty
PiCMSetRegistryProperty