DbgkLkmdRegisterCallback

NTSTATUS __stdcall DbgkLkmdRegisterCallback(
        INT64 *CallbackRoutine,
        INT64 *a2,
        VOID *a3,
        VOID *a4,
        UINT64 a5,
        UINT8 *a6,
        VOID *a7,
        VOID *a8,
        UINT64 a9,
        VOID *a10,
        VOID *a11,
        VOID *a12,
        VOID *CallbackContext,
        UINT64 Flags){
  int v14; 
  unsigned int i; 
  INT64 *v18; 
  _EX_RUNDOWN_REF *v19; 
  VOID *v20; 
  VOID *v21; 
  _EX_RUNDOWN_REF *v22; 
  unsigned int j; 
  NTSTATUS result; 
  VOID *v25; 
  VOID *v26; 

  v14 = (int)a3;
  if( ((unsigned __int8)a3 & 3) == 3 )
    return -1073741811;
  for( i = 0; i < 8; ++i )
  {
    v18 = (INT64 *)(&stru_140C53C70 + 4 * i);
    v19 = ExReferenceCallBackBlock(v18);
    if( v19 )
    {
      if( CallbackRoutine == (INT64 *)v19[1].Count )
      {
        ExDereferenceCallBackBlock((_EX_CALLBACK *)v18, v19);
        return -1073740008;
      }
      ExDereferenceCallBackBlock((_EX_CALLBACK *)v18, v19);
    }
  }
  v22 = (_EX_RUNDOWN_REF *)ExAllocateCallBack((INT64)CallbackRoutine, a2, v20, v21, v25, v26);
  if( !v22 )
    return -1073741801;
  for( j = 0; j < 8; ++j )
  {
    if( ExCompareExchangeCallBack(&stru_140C53C70 + 4 * j, v22, 0i64) )
    {
      result = 0;
      *((_DWORD *)&stru_140C53C70 + 4 * j + 2) = v14;
      return result;
    }
  }
  ExFreePoolWithTag(v22, 0);
  return -1073740757;
}

Referenced by:

No references.