PiCMCaptureCreateDeviceInputData

NTSTATUS __stdcall PiCMCaptureCreateDeviceInputData(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        _CMAPI_INPUT_CREATE_DEVICE_DATA *CreateDeviceData){
  __int64 v3; 
  __int64 v4; 
  char CallerMode; 
  int UserModeCallersCopy; 
  char *v7; 
  char *v8; 
  _QWORD *v9; 
  VOID *v10; 
  UINT64 v11; 
  _QWORD *v12; 
  VOID *v13; 
  UINT64 v14; 
  UINT64 AllocateDestination; 
  int v17; 
  int v18; 

  v4 = v3;
  v17 = 0;
  v18 = 0;
  CallerMode = KeGetCurrentThread()->PreviousMode;
  UserModeCallersCopy = 0;
  if( !IoctlInputBuffer || !(_DWORD)IoctlInputBufferSize )
  {
    UserModeCallersCopy = -1073741811;
    goto LABEL_44;
  }
  if( (_DWORD)CreateDeviceData )
  {
    if( ((unsigned __int8)IoctlInputBuffer & 3) != 0 )
      ExRaiseDatatypeMisalignment();
    v7 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
    if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < IoctlInputBuffer )
      MEMORY[0x7FFFFFFF0000] = 0;
    if( (unsigned int)IoctlInputBufferSize >= 0x1C && *(_DWORD *)IoctlInputBuffer == 28 )
    {
      *(_DWORD *)v3 = 40;
      *(_DWORD *)(v3 + 4) = *((_DWORD *)IoctlInputBuffer + 1);
      *(_QWORD *)(v3 + 8) = *((unsigned int *)IoctlInputBuffer + 2);
      *(_DWORD *)(v3 + 16) = *((_DWORD *)IoctlInputBuffer + 3);
      *(_QWORD *)(v3 + 24) = *((unsigned int *)IoctlInputBuffer + 4);
      *(_DWORD *)(v3 + 32) = *((_DWORD *)IoctlInputBuffer + 5);
      *(_DWORD *)(v3 + 36) = *((_DWORD *)IoctlInputBuffer + 6);
    }
    else
    {
      UserModeCallersCopy = -1073741811;
    }
  }
  else
  {
    if( ((unsigned __int8)IoctlInputBuffer & 7) != 0 )
      ExRaiseDatatypeMisalignment();
    v8 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
    if( (unsigned __int64)v8 > 0x7FFFFFFF0000i64 || v8 < IoctlInputBuffer )
      MEMORY[0x7FFFFFFF0000] = 0;
    if( (unsigned int)IoctlInputBufferSize >= 0x28 )
    {
      *(_OWORD *)v3 = *(_OWORD *)IoctlInputBuffer;
      *(_OWORD *)(v3 + 16) = *((_OWORD *)IoctlInputBuffer + 1);
      *(_QWORD *)(v3 + 32) = *((_QWORD *)IoctlInputBuffer + 4);
      if( *(_DWORD *)v3 != 40 )
        UserModeCallersCopy = -1073741811;
    }
    else
    {
      UserModeCallersCopy = -1073741811;
    }
  }
  if( UserModeCallersCopy >= 0 )
  {
    v9 = (_QWORD *)(v3 + 8);
    v10 = *(VOID **)(v3 + 8);
    *(_QWORD *)(v3 + 8) = 0i64;
    if( v10 )
    {
      v11 = *(unsigned int *)(v3 + 16);
      if( (unsigned int)v11 >= 2 )
      {
        LODWORD(AllocateDestination) = 1;
        UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
                                (VOID **)(v3 + 8),
                                v10,
                                v11,
                                2ui64,
                                CallerMode,
                                AllocateDestination);
        if( UserModeCallersCopy < 0 )
        {
          *v9 = 0i64;
          *(_DWORD *)(v4 + 16) = 0;
        }
        else
        {
          v17 = 1;
          *(_WORD *)(*v9 + 2 * ((unsigned __int64)*(unsigned int *)(v4 + 16) >> 1) - 2) = 0;
        }
LABEL_27:
        v12 = (_QWORD *)(v4 + 24);
        v13 = *(VOID **)(v4 + 24);
        *(_QWORD *)(v4 + 24) = 0i64;
        if( v13 )
        {
          v14 = *(unsigned int *)(v4 + 32);
          if( (unsigned int)v14 >= 2 )
          {
            LODWORD(AllocateDestination) = 1;
            UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
                                    (VOID **)(v4 + 24),
                                    v13,
                                    v14,
                                    2ui64,
                                    CallerMode,
                                    AllocateDestination);
            if( UserModeCallersCopy < 0 )
            {
              *v12 = 0i64;
              *(_DWORD *)(v4 + 32) = 0;
            }
            else
            {
              v18 = 1;
              *(_WORD *)(*v12 + 2 * ((unsigned __int64)*(unsigned int *)(v4 + 32) >> 1) - 2) = 0;
            }
LABEL_44:
            if( UserModeCallersCopy >= 0 )
              return UserModeCallersCopy;
            goto LABEL_45;
          }
          if( *(_DWORD *)(v4 + 32) >= 2u )
            goto LABEL_44;
        }
        else if( !*(_DWORD *)(v4 + 32) )
        {
          goto LABEL_44;
        }
        goto LABEL_36;
      }
      if( *(_DWORD *)(v3 + 16) >= 2u )
        goto LABEL_27;
    }
    else if( !*(_DWORD *)(v3 + 16) )
    {
      goto LABEL_27;
    }
LABEL_36:
    UserModeCallersCopy = -1073741811;
  }
LABEL_45:
  if( v17 )
    PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 8));
  if( v18 )
    PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 24));
  *(_OWORD *)v4 = 0i64;
  *(_OWORD *)(v4 + 16) = 0i64;
  *(_QWORD *)(v4 + 32) = 0i64;
  return UserModeCallersCopy;
}

Referenced by:

PiCMCreateDevice