IoVerifyVolume
NTSTATUS __stdcall IoVerifyVolume(_DEVICE_OBJECT *DeviceObject, UINT8 AllowRawMount){
_ETHREAD *CurrentThread;
struct _KEVENT *v5;
NTSTATUS v6;
PDEVICE_OBJECT v7;
__int64 i;
IRP *Irp;
IRP *v10;
__int64 v11;
_VPB *v12;
__int128 v14;
struct _KEVENT Event;
VOID *retaddr;
_VPB *Vpb;
PDEVICE_OBJECT DeviceObjecta;
VPB *v19;
DeviceObjecta = 0i64;
Vpb = 0i64;
memset(&Event, 0, sizeof(Event));
v14 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = (struct _KEVENT *)((char *)DeviceObject + 280);
KeWaitForSingleObject((char *)DeviceObject + 280, Executive, 0, 0, 0i64);
if( !IopReferenceVerifyVpb(DeviceObject, &Vpb, &DeviceObjecta) )
{
v6 = 0;
LABEL_11:
if( (int)IopCreateVpb(DeviceObject) < 0
|| (PoVolumeDevice(DeviceObject), v19 = 0i64, IopMountVolume(DeviceObject, AllowRawMount, 1u, 0, &v19) < 0) )
{
*((_DWORD *)DeviceObject + 12) &= ~2u;
}
else if( v19 )
{
IopDecrementVpbRefCount(v19, 1u);
}
goto LABEL_16;
}
KeInitializeEvent(&Event, NotificationEvent, 0);
v7 = DeviceObjecta;
for( i = *((_QWORD *)DeviceObjecta + 3); i; i = *(_QWORD *)(i + 24) )
v7 = (PDEVICE_OBJECT)i;
Irp = IopAllocateIrpExReturn(v7, *((_BYTE *)v7 + 76), 0, retaddr);
v10 = Irp;
if( !Irp )
{
IopDereferenceVpbAndFree(Vpb);
v6 = -1073741670;
goto LABEL_16;
}
*((_DWORD *)Irp + 4) = 66;
*((_BYTE *)Irp + 64) = 0;
*((_QWORD *)Irp + 10) = &Event;
*((_QWORD *)Irp + 9) = &v14;
v11 = *((_QWORD *)Irp + 23);
v12 = Vpb;
*((_QWORD *)Irp + 19) = KeGetCurrentThread();
*(_BYTE *)(v11 - 70) = AllowRawMount != 0;
*(_QWORD *)(v11 - 56) = DeviceObjecta;
*(_WORD *)(v11 - 72) = 525;
*(_QWORD *)(v11 - 64) = v12;
IopQueueThreadIrp(Irp);
v6 = IofCallDriver(v7, v10);
if( v6 == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
v6 = v14;
}
IopDereferenceVpbAndFree(v12);
if( v6 == -1073741806 )
goto LABEL_11;
LABEL_16:
KeSetEvent(v5, 0);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v6;
}Referenced by:
No references.