PiDqDispatch

NTSTATUS __stdcall PiDqDispatch(
        _DEVICE_OBJECT *DeviceObject,
        _IRP *Irp,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT64 *a7,
        INT64 a8){
  _IO_STACK_LOCATION *CurrentStackLocation; 
  int Status; 
  _FILE_OBJECT *FileObject; 
  unsigned __int8 MajorFunction; 
  void **p_FsContext2; 
  void *FsContext2; 
  unsigned int v16; 
  wchar_t *Buffer; 
  PI_DQ_QUERY **v19; 
  _ETHREAD *CurrentThread; 
  _IRP *v21; 
  _PI_DQ_OBJECT_MANAGER *ObjectManager; 
  _ETHREAD *v23; 
  __int64 v24; 

  CurrentStackLocation = Irp->Tail.CurrentStackLocation;
  Status = Irp->IoStatus.Status;
  FileObject = CurrentStackLocation->FileObject;
  MajorFunction = CurrentStackLocation->MajorFunction;
  p_FsContext2 = &FileObject->FsContext2;
  FsContext2 = FileObject->FsContext2;
  if( CurrentStackLocation->MajorFunction )
  {
    if( MajorFunction != 14 )
    {
      if( MajorFunction == 2 )
      {
        if( FsContext2 )
        {
          PiDqQueryRelease((_PI_DQ_QUERY *)FileObject->FsContext2);
          CurrentStackLocation->FileObject->FsContext2 = 0i64;
        }
      }
      else
      {
        if( MajorFunction != 18 )
          return Status;
        if( FsContext2 )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          v21 = 0i64;
          ObjectManager = 0i64;
          --CurrentThread->Tcb.KernelApcDisable;
          ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)FsContext2 + 8, 0i64);
          if( (*((_DWORD *)FsContext2 + 54) & 4) != 0 )
            ObjectManager = PiDqQueryGetObjectManager((_PI_DQ_QUERY *)FsContext2);
          ExReleasePushLockEx((_DWORD)FsContext2 + 64, 0);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          if( ObjectManager )
            PiDqObjectManagerUnregisterQuery(ObjectManager, (_PI_DQ_QUERY *)FsContext2);
          v23 = (_ETHREAD *)KeGetCurrentThread();
          --v23->Tcb.KernelApcDisable;
          ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)FsContext2 + 8, 0i64);
          v24 = *((_QWORD *)FsContext2 + 22);
          *((_DWORD *)FsContext2 + 54) |= 8u;
          if( v24 && _InterlockedExchange64((volatile __int64 *)(v24 + 104), 0i64) )
          {
            v21 = (_IRP *)*((_QWORD *)FsContext2 + 22);
            *((_QWORD *)FsContext2 + 22) = 0i64;
          }
          ExReleasePushLockEx((_DWORD)FsContext2 + 64, 0);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          if( v21 )
          {
            v21->IoStatus.Information = 0i64;
            v21->IoStatus.Status = -1073741536;
            IofCompleteRequest(v21, 0);
          }
        }
      }
      Status = 0;
      Irp->IoStatus.Status = 0;
      goto LABEL_7;
    }
    v16 = *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes;
    if( v16 == 4653056 )
      return PiDqIrpQueryCreate(Irp);
    if( v16 > 0x470006 )
    {
      if( v16 <= 0x470008 )
        return PiDqIrpQueryGetResult(Irp);
      if( v16 == 4653068 )
        return PiDqIrpPropertySet(Irp);
    }
    Status = -1073741637;
    Irp->IoStatus.Status = -1073741637;
  }
  else
  {
    Buffer = FileObject->FileName.Buffer;
    Status = 0;
    if( !wcscmp((PWCHAR)L"\\Dev\\Query", Buffer) )
    {
      LOBYTE(v19) = !IoIs32bitProcess(Irp);
      Status = PiDqQueryCreate(v19);
    }
    else if( !wcscmp((PWCHAR)L"\\Dev\\NoState", Buffer) )
    {
      *p_FsContext2 = 0i64;
    }
    else
    {
      Status = -1073741811;
    }
    Irp->IoStatus.Status = Status;
  }
LABEL_7:
  IofCompleteRequest(Irp, 0);
  return Status;
}

Referenced by:

No references.