IopRegistryCallback

VOID __stdcall IopRegistryCallback(VOID *CallbackContext){
  wchar_t *v1; 
  __int64 v2; 
  wchar_t **v3; 
  _IO_STATUS_BLOCK *IoStatusBlock; 
  bool v5; 
  _UNICODE_STRING Path[2]; 
  UINT8 FoundFullPath; 
  VOID *Handle; 

  Handle = 0i64;
  v1 = (wchar_t *)(unsigned int)CallbackContext;
  v2 = 14i64 * (unsigned int)CallbackContext;
  Path[0] = 0i64;
  FoundFullPath = 0;
  RtlInitUnicodeString(Path, (&IopRegistryRegisteredCallbacks)[v2]);
  v3 = &(&IopRegistryRegisteredCallbacks)[v2];
  v3[8] = 0i64;
  v3[10] = (wchar_t *)IopRegistryCallback;
  v3[11] = v1;
  if( (*(_DWORD *)(&IopRegistryRegisteredCallbacks + v2 + 5) & 1) != 0 )
  {
    ((void(__fastcall *)(_QWORD))(&IopRegistryRegisteredCallbacks)[v2 + 1])(*(&IopRegistryRegisteredCallbacks + v2 + 3));
    IoStatusBlock = (_IO_STATUS_BLOCK *)&(&IopRegistryRegisteredCallbacks)[v2 + 6];
    if( ZwNotifyChangeKey(
           (_HANDLE)(&IopRegistryRegisteredCallbacks)[v2 + 2],
           0,
           (PIO_APC_ROUTINE)(v3 + 8),
           (PVOID)1,
           IoStatusBlock,
           *((_DWORD *)&IopRegistryRegisteredCallbacks + 2 * v2 + 2),
           1u,
           0i64,
           0,
           1u) >= 0 )
      return;
  }
  else
  {
    IoStatusBlock = (_IO_STATUS_BLOCK *)&(&IopRegistryRegisteredCallbacks)[v2 + 6];
  }
  if( IopRegistryOpenDeepestPath(Path, &Handle, &FoundFullPath) < 0 )
    goto LABEL_10;
  ZwClose((_HANDLE)(&IopRegistryRegisteredCallbacks)[v2 + 2]);
  v5 = FoundFullPath == 1;
  (&IopRegistryRegisteredCallbacks)[v2 + 2] = (wchar_t *)Handle;
  if( v5 )
  {
    *((_DWORD *)&IopRegistryRegisteredCallbacks + 2 * v2 + 10) |= 1u;
    ((void(__fastcall *)(_QWORD))(&IopRegistryRegisteredCallbacks)[v2 + 1])(*(&IopRegistryRegisteredCallbacks + v2 + 3));
  }
  if( ZwNotifyChangeKey(
         (_HANDLE)(&IopRegistryRegisteredCallbacks)[v2 + 2],
         0,
         (PIO_APC_ROUTINE)(v3 + 8),
         (PVOID)1,
         IoStatusBlock,
         *((_DWORD *)&IopRegistryRegisteredCallbacks + 2 * v2 + 2),
         1u,
         0i64,
         0,
         1u) < 0 )
  {
LABEL_10:
    ZwClose((_HANDLE)(&IopRegistryRegisteredCallbacks)[v2 + 2]);
    *((_DWORD *)&IopRegistryRegisteredCallbacks + 2 * v2 + 2) = 0;
  }
}

Referenced by:

No references.