CmUnRegisterCallback

NTSTATUS __stdcall CmUnRegisterCallback(LARGE_INTEGER Cookie){
  NTSTATUS v2; 
  _ETHREAD *CurrentThread; 
  char *v4; 
  char *v5; 
  int v6; 
  _ETHREAD *v7; 
  _QWORD *v8; 
  void **v9; 
  _QWORD *v10; 
  void **v11; 
  char v12; 
  _ETHREAD *v13; 
  _QWORD *v14; 
  _QWORD *v15; 
  _QWORD *v16; 
  _QWORD *v17; 
  _QWORD *v18; 
  __int64 v19; 
  _QWORD *v20; 
  __int64 v21; 
  _QWORD *v22; 
  _QWORD *v23; 
  __int64 v24; 
  __int64 v25; 
  PADAPTER_OBJECT *v26; 
  _ETHREAD *v27; 
  __int64 v28; 
  _QWORD *v29; 
  _QWORD *v30; 
  void *v31; 
  void *v32; 
  _QWORD *v34; 
  LIST_ENTRY *ListIterator[4]; 
  __int128 v36; 
  __int128 v37; 
  __int64 v38; 
  int CompareAddress; 
  int v40; 

  v2 = -1073741811;
  v40 = -1073741811;
  v37 = 0i64;
  v38 = 0i64;
  v36 = 0i64;
  ListIterator[0] = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 251, 0i64);
  do
  {
    do
    {
      LODWORD(v4) = CmListGetNextElement((LIST_ENTRY *)&CmpDummyThreadEvent + 126, ListIterator, 0i64);
      v5 = v4;
      ListIterator[1] = (LIST_ENTRY *)v4;
      if( !v4 )
        goto LABEL_12;
    }
    while( *((_QWORD *)v4 + 3) != Cookie.QuadPart );
    v6 = *((_DWORD *)v4 + 4);
    CompareAddress = v6;
    if( !v6 )
    {
      v10 = *(_QWORD **)v5;
      v11 = (void **)*((_QWORD *)v5 + 1);
      if( *(char **)(*(_QWORD *)v5 + 8i64) == v5 && *v11 == v5 )
      {
        *v11 = v10;
        v10[1] = v11;
        ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        v2 = 0;
        v40 = 0;
        goto LABEL_17;
      }
LABEL_33:
      __fastfail(3u);
    }
  }
  while( (v6 & 0x80000000) != 0 );
  _InterlockedOr((volatile signed __int32 *)v5 + 4, 0x80000000);
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  while( 1 )
  {
    CompareAddress = *((_DWORD *)v5 + 4);
    if( CompareAddress == 0x80000000 )
      break;
    ExBlockOnAddressPushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 255, v5 + 16, &CompareAddress, 4ui64, 0i64);
  }
  v7 = (_ETHREAD *)KeGetCurrentThread();
  --v7->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 251, 0i64);
  v8 = *(_QWORD **)v5;
  v9 = (void **)*((_QWORD *)v5 + 1);
  if( *(char **)(*(_QWORD *)v5 + 8i64) != v5 || *v9 != v5 )
    goto LABEL_33;
  *v9 = v8;
  v8[1] = v9;
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  v2 = 0;
  v40 = 0;
LABEL_12:
  if( v2 < 0 )
  {
    ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    return v2;
  }
LABEL_17:
  *((_QWORD *)&v36 + 1) = &v36;
  *(_QWORD *)&v36 = &v36;
  v12 = 0;
  v13 = (_ETHREAD *)KeGetCurrentThread();
  --v13->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
  v14 = v5 + 64;
  v15 = (_QWORD *)*((_QWORD *)v5 + 8);
  v16 = v15;
  ListIterator[3] = (LIST_ENTRY *)(v5 + 64);
  while( 1 )
  {
    v34 = v15;
    if( v16 == v14 )
      break;
    v17 = (_QWORD *)*v15;
    v18 = v15 - 2;
    if( ObReferenceObjectSafe(v15[4]) )
    {
      v19 = v18[2];
      v20 = (_QWORD *)v18[3];
      if( *(_QWORD **)(v19 + 8) != v18 + 2 )
        goto LABEL_33;
      if( (_QWORD *)*v20 != v18 + 2 )
        goto LABEL_33;
      *v20 = v19;
      *(_QWORD *)(v19 + 8) = v20;
      v21 = *v18;
      v22 = (_QWORD *)v18[1];
      if( *(_QWORD **)(*v18 + 8i64) != v18 )
        goto LABEL_33;
      if( (_QWORD *)*v22 != v18 )
        goto LABEL_33;
      *v22 = v21;
      *(_QWORD *)(v21 + 8) = v22;
      v23 = (_QWORD *)*((_QWORD *)&v36 + 1);
      if( **((__int128 ***)&v36 + 1) != &v36 )
        goto LABEL_33;
      *v16 = &v36;
      v16[1] = v23;
      *v23 = v16;
      *((_QWORD *)&v36 + 1) = v16;
    }
    else
    {
      v12 = 1;
    }
    v15 = v17;
    v16 = v17;
    v14 = v5 + 64;
  }
  ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  while( 1 )
  {
    v24 = v36;
    if( (__int128 *)v36 == &v36 )
      break;
    v25 = *(_QWORD *)v36;
    if( *(__int128 **)(v36 + 8) != &v36 || *(_QWORD *)(v25 + 8) != (_QWORD)v36 )
      goto LABEL_33;
    *(_QWORD *)&v36 = *(_QWORD *)v36;
    *(_QWORD *)(v25 + 8) = &v36;
    v26 = (PADAPTER_OBJECT *)(v24 - 16);
    ListIterator[2] = (LIST_ENTRY *)(v24 - 16);
    v37 = *(_OWORD *)(v24 - 16 + 48);
    (*((void(__fastcall **)(_QWORD, __int64, __int128 *))v5 + 5))(*((_QWORD *)v5 + 4), 40i64, &v37);
    HalPutDmaAdapter(v26[6]);
    ExFreePoolWithTag(v26, 0x63634D43u);
  }
  while( v12 )
  {
    v27 = (_ETHREAD *)KeGetCurrentThread();
    --v27->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
    v34 = (_QWORD *)*((_QWORD *)v5 + 8);
    v28 = (__int64)v34;
    ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    if( (_QWORD *)v28 == v14 )
      v12 = 0;
    else
      ExBlockOnAddressPushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 255, v5 + 64, &v34, 8ui64, 0i64);
  }
  if( _InterlockedExchangeAdd(&dword_140C5083C, 0xFFFFFFFF) == 1 )
  {
    RtlpInterlockedFlushSList();
    v30 = v29;
    while( v30 )
    {
      v31 = v30;
      v30 = (_QWORD *)*v30;
      ExFreePoolWithTag(v31, 0);
    }
  }
  v32 = (void *)*((_QWORD *)v5 + 7);
  if( v32 )
    ExFreePoolWithTag(v32, 0);
  ExFreePoolWithTag(v5, 0);
  return v2;
}

Referenced by:

EtwpRegTraceEnableCallback
VrpDecrementSiloCount