IopQueryXxxInformation
NTSTATUS __stdcall IopQueryXxxInformation(
PVOID FileObject,
UINT64 InformationClass,
UINT64 Length,
_KPROCESSOR_MODE Mode,
VOID *Information,
UINT64 *ReturnedLength,
UINT8 FileInformation){
CHAR v7;
int v8;
char v10;
_DEVICE_OBJECT *v11;
int v12;
UINT64 v13;
_IRP *Irp;
_IRP *v15;
__int128 *p_Object;
_IO_STACK_LOCATION *CurrentStackLocation;
bool v18;
NTSTATUS v19;
_KPROCESSOR_MODE v20;
NTSTATUS v21;
_ETHREAD *CurrentThread;
bool v24;
_BYTE *v25;
NTSTATUS v26;
__int128 v27;
__int128 Object;
__int64 v29;
VOID *retaddr;
INT64 v31;
int v32;
v32 = Length;
Object = 0i64;
v29 = 0i64;
v7 = Mode;
v27 = 0i64;
v8 = InformationClass;
ObfReferenceObject(FileObject);
if( (*((_DWORD *)FileObject + 20) & 2) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v24 = (*((_DWORD *)FileObject + 20) & 4) != 0;
--CurrentThread->Tcb.KernelApcDisable;
v25 = KeAbPreAcquire((char *)FileObject + 128, 0i64, 0i64);
LOBYTE(v31) = 0;
if( _InterlockedExchange((volatile __int32 *)FileObject + 29, 1) )
{
v26 = IopWaitAndAcquireFileObjectLock(FileObject, v7, v24, v25, (INT64)&v31);
if( (_BYTE)v31 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
return v26;
}
}
else
{
if( v25 )
v25[26] |= 1u;
ObfReferenceObject(FileObject);
}
KeResetEvent((_KEVENT *)((char *)FileObject + 152));
v10 = 1;
}
else
{
KeInitializeEvent((INT64)&Object, 1, 0);
v10 = 0;
}
LODWORD(v11) = IoGetRelatedDeviceObject((INT64)FileObject);
v12 = 71;
v13 = (UINT64)v11;
if( v8 != 75 )
v12 = v8;
Irp = IopAllocateIrpExReturn(v11, v11->StackSize, v10 ^ 1u, retaddr);
v15 = Irp;
if( Irp )
{
Irp->Tail.OriginalFileObject = (_FILE_OBJECT *)FileObject;
Irp->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
Irp->RequestorMode = v7;
if( v10 )
{
Irp->AllocationFlags |= 2u;
p_Object = 0i64;
}
else
{
Irp->Flags = 4;
p_Object = &Object;
}
v15->UserEvent = (_KEVENT *)p_Object;
v15->Overlay.UserApcRoutine = 0i64;
CurrentStackLocation = v15->Tail.CurrentStackLocation;
v18 = FileInformation != 0;
FileInformation = -FileInformation;
v15->UserIosb = (_IO_STATUS_BLOCK *)&v27;
CurrentStackLocation[-1].FileObject = (_FILE_OBJECT *)FileObject;
CurrentStackLocation[-1].MajorFunction = v18 ? 5 : 10;
v15->Flags |= 0x10u;
v15->AssociatedIrp.MasterIrp = (_IRP *)Information;
LODWORD(CurrentStackLocation[-1].Parameters.SecurityContext) = v32;
CurrentStackLocation[-1].Parameters.Options = v12;
if( v8 == 75 )
CurrentStackLocation[-1].Flags |= 1u;
IopQueueThreadIrp(v15);
v19 = IofCallDriver(v13, (UINT64)v15);
v21 = v19;
if( v10 )
{
if( v19 == 259 )
{
LOBYTE(v20) = v7;
IopWaitForSynchronousIo(v15, (_FILE_OBJECT *)FileObject, v20);
v21 = *((_DWORD *)FileObject + 14);
}
IopReleaseFileObjectLock((PADAPTER_OBJECT)FileObject);
}
else if( v19 == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
v21 = v27;
}
*(_DWORD *)ReturnedLength = DWORD2(v27);
return v21;
}
else
{
IopAllocateIrpCleanup(FileObject, 0i64);
return -1073741670;
}
}Referenced by:
IoQueryFileInformation
IopGetNetworkOpenInformation
IopQueryNameInternal
IopValidateJunctionTarget
MiAttemptPageFileExtension
PfSnGetSectionObject
PfpPrefetchEntireDirectory