CcRegistryChangeCallback

NTSTATUS __stdcall CcRegistryChangeCallback(PVOID P){
  char *v1; 
  char *v2; 
  volatile unsigned __int64 TickCountQuad; 
  unsigned __int64 v4; 
  NTSTATUS result; 
  __int64 v6; 
  INT64 v7; 
  __int64 v8; 
  NTSTATUS v9; 
  _IO_STATUS_BLOCK IoStatusBlock; 

  v1 = (char *)P + 56;
  IoStatusBlock = 0i64;
  v2 = (char *)P;
  TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
  v4 = KUSER_SHARED_DATA.TickCountQuad - *((_QWORD *)P + 6);
  result = DbgPrintEx(
             0x7Fu,
             2u,
             "CcRegistryChangeCallback: Something of interest changed(callback:%c), under:\"%wZ\"\n",
             *((_BYTE *)P + 72) != 0 ? 70 : 84,
             (char *)P + 56);
  if( !v2[72] )
  {
    (*((void(__fastcall **)(char *))v2 + 5))(v2);
    *((_QWORD *)v2 + 6) = TickCountQuad;
    result = DbgPrintEx(0x7Fu, 2u, "CcRegistryChangeCallback: Processed \"%wZ\", TickDiff=%I64d\n", v1, v4);
  }
  v2[72] = 0;
  if( !*((_QWORD *)v2 + 4) )
  {
    result = CcOpenRegistryPath((INT64)v1, (VOID **)v2 + 4, v6, v7);
    if( result < 0 )
    {
      DbgPrintEx(
        0x7Fu,
        0,
        "CcRegistryChangeCallback: Failed to open Key, status=0x%08x \"%wZ\n",
        (unsigned int)result,
        v1);
      result = (unsigned int)ExFreePoolWithTag(v2, 0x52576343u);
      v2 = 0i64;
    }
  }
  if( v2 )
  {
    v8 = *((_QWORD *)v2 + 4);
    if( v8 )
    {
      v9 = ZwNotifyChangeKey(v8, 0, (PIO_APC_ROUTINE)v2, (PVOID)1, &IoStatusBlock, 5u, 1u, 0i64, 0, 1u);
      if( v9 == 259 )
      {
        result = DbgPrintEx(0x7Fu, 2u, "CcRegistryChangeCallback: Watch queued \"%wZ\"\n", v2 + 56);
      }
      else if( v9 >= 0 )
      {
        result = DbgPrintEx(
                   0x7Fu,
                   2u,
                   "CcRegistryChangeCallback: Watch queued \"%wZ\" (for Immediate Processing)\n",
                   v2 + 56);
      }
      else
      {
        ZwClose(*((_QWORD *)v2 + 4));
        *((_QWORD *)v2 + 4) = 0i64;
        v2[72] = 1;
        result = DbgPrintEx(
                   0x7Fu,
                   0,
                   "CcRegistryChangeCallback: Failed Watch request, status=0x%08x \"%wZ\"\n",
                   (unsigned int)v9,
                   v2 + 56);
      }
    }
  }
  if( !dword_140C507F8 && v2 && !v2[72] )
    dword_140C507F8 = 1;
  return result;
}

Referenced by:

No references.