WbValidateEncryptionSegmentArguments

NTSTATUS __stdcall WbValidateEncryptionSegmentArguments(INT64 a1, UINT64 a2, _OWORD *a3, INT64 a4){
  struct wil_details_FeatureReportingCache *v7; 
  int v8; 
  __int64 v9; 
  __int64 v10; 
  _OWORD *v11; 
  _OWORD *v12; 
  int v13; 
  _OWORD *v15; 
  _OWORD *v16; 
  __int128 P; 
  int v18; 

  P = 0i64;
  if( (unsigned int)a2 < 0x10 )
    goto LABEL_16;
  v8 = WbAlloc(244);
  if( v8 < 0 )
    goto LABEL_11;
  v11 = *(_OWORD **)(a1 + 8);
  if( (unsigned __int64)v11 + 244 > 0x7FFFFFFF0000i64 || (_OWORD *)((char *)v11 + 244) < v11 )
  {
    MEMORY[0x7FFFFFFF0000] = 0;
    v11 = *(_OWORD **)(a1 + 8);
  }
  MEMORY[0] = *v11;
  MEMORY[0x10] = v11[1];
  MEMORY[0x20] = v11[2];
  MEMORY[0x30] = v11[3];
  MEMORY[0x40] = v11[4];
  MEMORY[0x50] = v11[5];
  MEMORY[0x60] = v11[6];
  MEMORY[0x70] = v11[7];
  v12 = v11 + 8;
  MEMORY[0x80] = *v12;
  MEMORY[0x90] = v12[1];
  MEMORY[0xA0] = v12[2];
  MEMORY[0xB0] = v12[3];
  MEMORY[0xC0] = v12[4];
  MEMORY[0xD0] = v12[5];
  MEMORY[0xE0] = v12[6];
  MEMORY[0xF0] = *((_DWORD *)v12 + 28);
  v13 = MEMORY[0x24] & 0xF;
  LODWORD(P) = v13;
  DWORD1(P) = MEMORY[0x24] >> 4;
  if( v13 != 1 )
  {
    v18 = 3;
    if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
                         0i64,
                         v7,
                         v9,
                         v10,
                         wil_details_ServiceReportingKind_PotentialDeviceUsage)
      && g_wil_details_pfnFeatureLoggingHook )
    {
      g_wil_details_pfnFeatureLoggingHook(
        0xE67B5Au,
        &Feature_PdttSupport_logged_traits,
        0i64,
        0,
        (const enum wil_ReportingKind *)&v18,
        0i64,
        0,
        1ui64);
    }
    if( !v13 )
      goto LABEL_9;
LABEL_16:
    v8 = -1073741811;
    goto LABEL_11;
  }
  ExFreePoolWithTag(0i64, 0x42524157u);
  *((_QWORD *)&P + 1) = 0i64;
  v8 = WbAlloc(248);
  if( v8 < 0 )
    goto LABEL_11;
  v15 = *(_OWORD **)(a1 + 8);
  if( (unsigned __int64)v15 + 248 > 0x7FFFFFFF0000i64 || (_OWORD *)((char *)v15 + 248) < v15 )
  {
    MEMORY[0x7FFFFFFF0000] = 0;
    v15 = *(_OWORD **)(a1 + 8);
  }
  MEMORY[0] = *v15;
  MEMORY[0x10] = v15[1];
  MEMORY[0x20] = v15[2];
  MEMORY[0x30] = v15[3];
  MEMORY[0x40] = v15[4];
  MEMORY[0x50] = v15[5];
  MEMORY[0x60] = v15[6];
  MEMORY[0x70] = v15[7];
  v16 = v15 + 8;
  MEMORY[0x80] = *v16;
  MEMORY[0x90] = v16[1];
  MEMORY[0xA0] = v16[2];
  MEMORY[0xB0] = v16[3];
  MEMORY[0xC0] = v16[4];
  MEMORY[0xD0] = v16[5];
  MEMORY[0xE0] = v16[6];
  MEMORY[0xF0] = *((_QWORD *)v16 + 14);
LABEL_9:
  *(_DWORD *)(a4 + 8) = *(_DWORD *)(*((_QWORD *)&P + 1) + 64i64);
  *(_QWORD *)a4 = *(_QWORD *)(a1 + 8) - (*(_DWORD *)(*((_QWORD *)&P + 1) + 40i64) & 0xFFFFFFF);
  if( a3 )
  {
    *a3 = P;
    *((_QWORD *)&P + 1) = 0i64;
  }
LABEL_11:
  if( *((_QWORD *)&P + 1) )
    ExFreePoolWithTag(*((PVOID *)&P + 1), 0x42524157u);
  return v8;
}

Referenced by:

WbGetInitializedEncryptionSegment