PopGetWakeSource

INT64 __fastcall PopGetWakeSource(_DWORD *a1, UINT64 *a2){
  UINT64 *v2; 
  unsigned __int64 v3; 
  _DWORD *v4; 
  unsigned int CurrentWakeInfos; 
  INT64 v6; 
  CHAR *v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  CHAR *v10; 
  __int64 v11; 
  __int64 *v12; 
  __int64 v13; 
  unsigned int v14; 
  __int64 v16; 
  __int64 v17; 
  CHAR *v18; 
  _DWORD *v19; 
  __int64 v20; 
  _DWORD *v21; 
  _QWORD *v22; 
  __int64 v23; 
  __int64 *v24; 
  _DWORD *v25; 
  _QWORD *v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  int v29; 
  unsigned int v31; 
  CHAR *v32; 
  v29 = (int)a1;
  v32 = 0i64;
  v2 = a2;
  v3 = *(unsigned int *)a2;
  v4 = a1;
  if( (_DWORD)v3 && !a1 )
    return 3221225485i64;
  KeWaitForSingleObject(&PopWakeSourceAvailable, Executive, 0, 0, 0i64);
  CurrentWakeInfos = PopGetCurrentWakeInfos(&v32);
  v7 = v32;
  v8 = CurrentWakeInfos;
  v31 = CurrentWakeInfos;
  v9 = (int)(4 * CurrentWakeInfos + 4);
  if( CurrentWakeInfos )
  {
    v10 = v32;
    v11 = CurrentWakeInfos;
    do
    {
      v6 = *(_QWORD *)v10;
      v12 = (__int64 *)(*(_QWORD *)v10 + 24i64);
      v13 = *v12;
      v9 = 4 * *(_DWORD *)(*(_QWORD *)v10 + 40i64) + 4 + ((v9 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
      while( (__int64 *)v13 != v12 )
      {
        v23 = PopWakeSourceSize(v13);
        v13 = *v24;
        v9 = v23 + ((v9 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
      }
      v10 += 8;
      --v11;
    }
    while( v11 );
  }
  if( v9 <= v3 )
  {
    *v4 = v8;
    v28 = v8;
    v16 = (__int64)&v4[v8 + 1];
    v17 = v8;
    if( (_DWORD)v8 )
    {
      v18 = v7;
      v19 = v4 + 1;
      do
      {
        v20 = *(_QWORD *)v18;
        v21 = (_DWORD *)((v16 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
        *v21 = *(_DWORD *)(*(_QWORD *)v18 + 40i64);
        *v19 = ((v16 + 7) & 0xFFFFFFF8) - (_DWORD)v4;
        v16 = (__int64)&v21[*(unsigned int *)(v20 + 40) + 1];
        v22 = *(_QWORD **)(v20 + 24);
        if( v22 != (_QWORD *)(v20 + 24) )
        {
          v25 = v21 + 1;
          v26 = (_QWORD *)(v20 + 24);
          do
          {
            v27 = (v16 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
            *v25++ = v27 - (_DWORD)v21;
            PopCopyWakeSource(v27, v6, (INT64)v22);
            v22 = (_QWORD *)*v22;
            v16 = *(unsigned int *)(v27 + 4) + v27;
          }
          while( v22 != v26 );
          LODWORD(v4) = v29;
          v17 = v28;
        }
        v18 += 8;
        ++v19;
        v28 = --v17;
      }
      while( v17 );
      LODWORD(v8) = v31;
      v7 = v32;
    }
    v2 = a2;
    v14 = 0;
  }
  else
  {
    v14 = -1073741789;
  }
  if( (_DWORD)v8 )
    PopDereferenceWakeInfos((unsigned int)v8, (INT64 *)v7);
  *(_DWORD *)v2 = v9;
  return v14;
}

Referenced by:

No references.