NtQueryVolumeInformationFile
NTSTATUS __fastcall NtQueryVolumeInformationFile(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, UINT64 FsInformationClass){
UINT64 v5;
NTSTATUS v8;
_ETHREAD *CurrentThread;
INT8 PreviousMode;
int v11;
unsigned int v12;
UINT64 v13;
_EWOW64PROCESS *WoW64Process;
bool v15;
INT64 v16;
unsigned __int16 Machine;
NTSTATUS result;
_ADAPTER_OBJECT *v19;
_DWORD *p_Flags;
__int64 Flags;
UINT8 MountFlag;
_DEVICE_OBJECT *v23;
unsigned int Characteristics;
unsigned int v25;
_ETHREAD *v26;
_FILE_OBJECT *v27;
_BYTE *v28;
NTSTATUS v29;
PDEVICE_OBJECT v30;
_IRP *v31;
_IRP *v32;
_IO_STATUS_BLOCK *p_LocalIoStatus;
_KEVENT *v34;
__int64 v35;
VOID *PoolWithQuota;
__int64 v37;
UINT8 v38;
CHAR v39;
void *Pool;
_FILE_FS_DRIVER_PATH_INFORMATION *v41;
NTSTATUS v42;
UINT8 SynchronousIo;
CHAR v44;
bool v45;
NTSTATUS v46;
_FILE_OBJECT *pFileObject;
PVOID KernelEvent;
PDEVICE_OBJECT DeviceObject;
PIRP Irp;
_ETHREAD *v51;
_FILE_FS_DRIVER_PATH_INFORMATION *v52;
_IO_STATUS_BLOCK LocalIoStatus;
VOID *retaddr;
v5 = (unsigned int)a4;
v8 = 0;
pFileObject = 0i64;
KernelEvent = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v51 = CurrentThread;
PreviousMode = CurrentThread->Tcb.PreviousMode;
v44 = PreviousMode;
if( PreviousMode )
{
v11 = FsInformationClass;
if( (unsigned int)FsInformationClass >= 0xF )
return -1073741821;
v12 = *((unsigned __int8 *)IopQueryFsOperationLength + (int)FsInformationClass);
if( !(_BYTE)v12 )
return -1073741821;
if( (unsigned int)a4 < v12 )
return -1073741820;
v13 = a2;
if( a2 >= 0x7FFFFFFF0000i64 )
v13 = 0x7FFFFFFF0000i64;
*(_DWORD *)v13 = *(_DWORD *)v13;
WoW64Process = CurrentThread->Tcb.ApcState.Process->WoW64Process;
v15 = 0;
if( WoW64Process )
{
Machine = WoW64Process->Machine;
if( Machine == 332 || Machine == 452 )
v15 = 1;
}
v45 = v15;
if( v15 )
v16 = 4i64;
else
v16 = *((unsigned __int8 *)IopQuerySetFsAlignmentRequirement + (int)FsInformationClass);
ProbeForWrite(a3, (unsigned int)a4, v16);
}
else
{
v11 = FsInformationClass;
}
result = IopReferenceFileObject(
(VOID *)a1,
(unsigned int)IopQueryFsOperationAccess[v11],
PreviousMode,
&pFileObject,
0i64);
v46 = result;
if( result >= 0 )
{
v19 = (_ADAPTER_OBJECT *)pFileObject;
p_Flags = &pFileObject->Flags;
Irp = (PIRP)&pFileObject->Flags;
Flags = pFileObject->Flags;
if( (pFileObject->Flags & 0x800) != 0 )
{
if( v11 != 4 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)pFileObject);
return -1073741808;
}
}
else if( v11 != 4 )
{
goto LABEL_30;
}
if( (pFileObject->Flags & 0x800) != 0 || pFileObject->DeviceObject->DeviceType != 20 )
{
MountFlag = 0;
v23 = pFileObject->DeviceObject;
if( v23->Vpb )
MountFlag = IopGetMountFlag(pFileObject->DeviceObject);
if( (unsigned int)v5 < 8 )
{
v8 = -1073741820;
}
else
{
*(_DWORD *)a3 = v23->DeviceType;
Characteristics = v23->Characteristics;
*(_DWORD *)(a3 + 4) = Characteristics;
if( MountFlag )
*(_DWORD *)(a3 + 4) = Characteristics | 0x20;
*(_DWORD *)a2 = 0;
*(_QWORD *)(a2 + 8) = 8i64;
v46 = 0;
}
HalPutDmaAdapter(v19);
return v8;
}
LABEL_30:
if( (Flags & 2) != 0 )
{
v25 = (unsigned int)Flags >> 2;
LOBYTE(v25) = v25 & 1;
LODWORD(DeviceObject) = v25;
v26 = (_ETHREAD *)KeGetCurrentThread();
--v26->Tcb.KernelApcDisable;
v27 = pFileObject;
v28 = KeAbPreAcquire(pFileObject->gap80, 0i64, 0i64);
SynchronousIo = 0;
if( _InterlockedExchange((volatile __int32 *)&v27->Busy, 1) )
{
v19 = (_ADAPTER_OBJECT *)pFileObject;
v29 = IopWaitAndAcquireFileObjectLock(pFileObject, v44, (UINT8)DeviceObject, v28, (INT64)&SynchronousIo);
}
else
{
if( v28 )
v28[26] |= 1u;
v19 = (_ADAPTER_OBJECT *)pFileObject;
ObfReferenceObject(pFileObject);
v29 = 0;
}
if( SynchronousIo )
goto LABEL_63;
SynchronousIo = 1;
p_Flags = &Irp->Type;
}
else
{
SynchronousIo = 0;
}
if( v11 != 9 )
{
IopResetEvent((_FILE_OBJECT *)v19);
LODWORD(v30) = IoGetRelatedDeviceObject((INT64)v19);
DeviceObject = v30;
if( (*p_Flags & 2) == 0 )
{
Pool = IopVerifierExAllocatePool();
KernelEvent = Pool;
if( !Pool )
{
HalPutDmaAdapter(v19);
return -1073741670;
}
KeInitializeEvent((INT64)Pool, 1, 0);
v30 = DeviceObject;
}
v31 = IopAllocateIrpExReturn(v30, v30->StackSize, 0, retaddr);
Irp = v31;
if( v31 )
{
v32 = v31;
v31->Tail.OriginalFileObject = (_FILE_OBJECT *)v19;
v31->Tail.Thread = v51;
v31->RequestorMode = v44;
LocalIoStatus = 0i64;
if( SynchronousIo )
{
p_LocalIoStatus = (_IO_STATUS_BLOCK *)a2;
v34 = 0i64;
}
else
{
v31->Flags = 4;
p_LocalIoStatus = &LocalIoStatus;
v34 = (_KEVENT *)KernelEvent;
}
v32->UserEvent = v34;
v32->UserIosb = p_LocalIoStatus;
v32->Overlay.UserApcRoutine = 0i64;
v35 = (__int64)&v32->Tail.CurrentStackLocation[-1];
v51 = (_ETHREAD *)v35;
*(_BYTE *)v35 = 10;
*(_QWORD *)(v35 + 48) = v19;
v32->UserBuffer = (void *)a3;
v32->AssociatedIrp.MasterIrp = 0i64;
v32->MdlAddress = 0i64;
PoolWithQuota = IopVerifierExAllocatePoolWithQuota((__int64)v34, v5);
v32->AssociatedIrp.MasterIrp = (_IRP *)PoolWithQuota;
if( !*(&stru_140CF2E80 + 1657) )
memset(PoolWithQuota, 0i64, v5);
v32->Flags |= 0x870u;
v37 = (__int64)v51;
*(_DWORD *)&v51->Tcb.gap0[8] = v5;
*(_DWORD *)(v37 + 16) = v11;
v38 = SynchronousIo;
v39 = v44;
result = IopSynchronousServiceTail(
DeviceObject,
v32,
(_FILE_OBJECT *)v19,
1u,
v44,
SynchronousIo,
OtherTransfer);
if( !v38 )
return IopSynchronousApiServiceTail(
(unsigned int)result,
(_KEVENT *)KernelEvent,
v32,
v39,
&LocalIoStatus,
(_IO_STATUS_BLOCK *)a2);
return result;
}
if( (*p_Flags & 2) == 0 )
ExFreePoolWithTag(KernelEvent, 0);
IopAllocateIrpCleanup(v19, 0i64);
return -1073741670;
}
v52 = 0i64;
v41 = (_FILE_FS_DRIVER_PATH_INFORMATION *)IopVerifierExAllocatePoolWithQuota(Flags, v5);
v52 = v41;
memmove(v41, (const VOID *)a3, v5);
IopGetDriverPathInformation((_FILE_OBJECT *)v19, v41, (unsigned int)v5);
v29 = v42;
v46 = v42;
if( v42 < 0 )
RtlRaiseStatus(v42);
*(_BYTE *)a3 = v41->DriverInPath;
*(_DWORD *)a2 = 0;
*(_QWORD *)(a2 + 8) = 12i64;
if( v41 )
ExFreePoolWithTag(v41, 0);
if( (v19->AdapterObject.ScatterTranslationEnd.Offset & 2) != 0 )
IopReleaseFileObjectLock(v19);
LABEL_63:
HalPutDmaAdapter(v19);
return v29;
}
return result;
}Referenced by:
PfSnIsVolumeMounted
PfSnQueryVolumeInfo
PfpVolumeOpenAndVerify