FsRtlGetVirtualDiskNestingLevel
NTSTATUS __stdcall FsRtlGetVirtualDiskNestingLevel(
_DEVICE_OBJECT *DeviceObject,
UINT64 *NestingLevel,
UINT64 *NestingFlags){
unsigned __int64 v3;
ULONG MaximumVirtualDiskNestingLevel;
int v8;
__int64 v9;
UINT8 v10;
_IRP *v11;
int Status;
int v14;
UINT64 OutputBufferLength;
_KEVENT Object;
__int64 InputBuffer;
_IO_STATUS_BLOCK IoStatusBlock;
__int128 OutputBuffer;
ULONG v20;
PVOID ReturnAddress;
v3 = *((unsigned int *)DeviceObject + 18);
Object.Header.Reserved1 = 0;
MaximumVirtualDiskNestingLevel = 0;
v8 = 1;
IoStatusBlock = 0i64;
if( (unsigned int)v3 > 0x24 )
return -1073741808;
v9 = 0x100000018Ci64;
if( !_bittest64(&v9, v3) )
return -1073741808;
LOWORD(Object.Header.Lock) = 0;
Object.Header.WaitListHead.Blink = &Object.Header.WaitListHead;
Object.Header.Size = 6;
Object.Header.WaitListHead.Flink = &Object.Header.WaitListHead;
Object.Header.SignalState = 0;
v10 = IoSetThreadHardErrorMode(0);
InputBuffer = 1i64;
v20 = 0;
LODWORD(OutputBufferLength) = 20;
OutputBuffer = 0i64;
v11 = IopBuildDeviceIoControlRequest(
0x2D1190ui64,
DeviceObject,
&InputBuffer,
8ui64,
&OutputBuffer,
OutputBufferLength,
0,
&Object,
&IoStatusBlock,
ReturnAddress);
if( v11 )
{
Status = IofCallDriver(DeviceObject, v11);
if( Status == 259 )
{
KeWaitForSingleObject(&Object, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 && IoStatusBlock.Information >= 0x14 && (_DWORD)OutputBuffer == 1 )
{
if( v20 > FsRtlQueryMaximumVirtualDiskNestingLevel() )
{
MaximumVirtualDiskNestingLevel = FsRtlQueryMaximumVirtualDiskNestingLevel();
}
else if( v20 )
{
MaximumVirtualDiskNestingLevel = v20;
}
if( BYTE4(OutputBuffer) )
v8 = 0;
v14 = v8;
v8 |= 2u;
if( (BYTE12(OutputBuffer) & 2) == 0 )
v8 = v14;
}
else if( Status != -1073741670 )
{
Status = 0;
}
}
else
{
Status = -1073741670;
}
*(_DWORD *)NestingLevel = MaximumVirtualDiskNestingLevel;
if( NestingFlags )
*(_DWORD *)NestingFlags = v8;
IoSetThreadHardErrorMode(v10);
return Status;
}Referenced by:
No references.