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.