IoVolumeDeviceToGuidPath
INT64 __fastcall IoVolumeDeviceToGuidPath(void *VolumeDeviceObject, _UNICODE_STRING *GuidPath){
unsigned __int64 v2;
__int64 v5;
IRP *v6;
NTSTATUS Status;
unsigned __int16 v8;
UNICODE_STRING GuidPatha;
UNICODE_STRING VolumeDeviceName;
struct _KEVENT Event;
struct _IO_STATUS_BLOCK IoStatusBlock;
unsigned __int16 OutputBuffer;
char v15;
v2 = *((unsigned int *)VolumeDeviceObject + 18);
*(_QWORD *)&GuidPatha.Length = 0i64;
GuidPatha.Buffer = 0i64;
memset(&Event, 0, sizeof(Event));
IoStatusBlock = 0i64;
VolumeDeviceName = 0i64;
if( (unsigned int)v2 <= 0x24 && (v5 = 0x1080000084i64, _bittest64(&v5, v2)) )
{
KeInitializeEvent(&Event, NotificationEvent, 0);
v6 = IoBuildDeviceIoControlRequest(
0x4D0008u,
(PDEVICE_OBJECT)VolumeDeviceObject,
0i64,
0,
&OutputBuffer,
0x200u,
0,
&Event,
&IoStatusBlock);
if( v6 )
{
Status = IofCallDriver((PDEVICE_OBJECT)VolumeDeviceObject, v6);
if( Status == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
v8 = OutputBuffer;
if( OutputBuffer >= 0x1FEu )
{
v8 = 510;
VolumeDeviceName.Length = 510;
}
else
{
VolumeDeviceName.Length = OutputBuffer;
}
VolumeDeviceName.MaximumLength = v8;
VolumeDeviceName.Buffer = (wchar_t *)&v15;
Status = IoVolumeDeviceNameToGuidPath(&VolumeDeviceName, &GuidPatha);
if( Status >= 0 )
{
GuidPath->Length = GuidPatha.Length;
GuidPath->MaximumLength = GuidPatha.MaximumLength;
GuidPath->Buffer = GuidPatha.Buffer;
}
}
}
else
{
return(unsigned int)-1073741670;
}
}
else
{
return(unsigned int)-1073741811;
}
return(unsigned int)Status;
}Referenced by:
CmpVolumeContextStart
IoVolumeDeviceToGuid
IopValidateJunctionTarget