IoVolumeDeviceToDosName
NTSTATUS __stdcall IoVolumeDeviceToDosName(VOID *VolumeDeviceObject, _UNICODE_STRING *DosName){
unsigned __int64 v2;
__int64 v5;
PIRP *v6;
NTSTATUS result;
PIRP *v8;
int Status;
UINT32 OutputBufferLength;
VOID **PoolWithTag;
PIRP *v12;
unsigned __int16 v13;
PDEVICE_OBJECT DeviceObject;
__int128 Object;
__int64 v16;
_IO_STATUS_BLOCK IoStatusBlock;
PFILE_OBJECT FileObject;
_UNICODE_STRING DestinationString;
int OutputBuffer;
char InputBuffer[512];
v16 = 0i64;
v2 = *((unsigned int *)VolumeDeviceObject + 18);
FileObject = 0i64;
DeviceObject = 0i64;
Object = 0i64;
IoStatusBlock = 0i64;
DestinationString = 0i64;
if( (unsigned int)v2 > 0x24 )
return -1073741811;
v5 = 0x1080000084i64;
if( !_bittest64(&v5, v2) )
return -1073741811;
KeInitializeEvent((INT64)&Object, 0, 0);
v6 = IoBuildDeviceIoControlRequest(
0x4D0008u,
(PDEVICE_OBJECT)VolumeDeviceObject,
0i64,
0,
InputBuffer,
0x200u,
0,
(PKEVENT)&Object,
&IoStatusBlock);
if( !v6 )
return -1073741670;
result = IofCallDriver((UINT64)VolumeDeviceObject, (UINT64)v6);
if( result == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
result = IoStatusBlock.Status;
}
if( result >= 0 )
{
RtlInitUnicodeString(&DestinationString, L"\\Device\\MountPointManager");
result = IoGetDeviceObjectPointer(&DestinationString, 0x80ui64, &FileObject, &DeviceObject);
if( result >= 0 )
{
KeInitializeEvent((INT64)&Object, 0, 0);
v8 = IoBuildDeviceIoControlRequest(
0x6D0030u,
DeviceObject,
InputBuffer,
0x200u,
&OutputBuffer,
8u,
0,
(PKEVENT)&Object,
&IoStatusBlock);
if( v8 )
{
Status = IofCallDriver((UINT64)DeviceObject, (UINT64)v8);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( (int)(Status + 0x80000000) >= 0 && Status != -2147483643 )
goto LABEL_19;
OutputBufferLength = OutputBuffer + 8;
if( (unsigned int)(OutputBuffer + 8) > 0xFFFF )
{
Status = -1073741306;
LABEL_19:
HalPutDmaAdapter((PADAPTER_OBJECT)FileObject);
return Status;
}
PoolWithTag = ExAllocatePoolWithTag(1ui64, OutputBufferLength, 543437380i64);
if( PoolWithTag )
{
KeInitializeEvent((INT64)&Object, 0, 0);
v12 = IoBuildDeviceIoControlRequest(
0x6D0030u,
DeviceObject,
InputBuffer,
0x200u,
PoolWithTag,
OutputBufferLength,
0,
(PKEVENT)&Object,
&IoStatusBlock);
if( v12 )
{
Status = IofCallDriver((UINT64)DeviceObject, (UINT64)v12);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status < 0 )
{
ExFreePoolWithTag(PoolWithTag, 0);
}
else
{
v13 = *(_WORD *)PoolWithTag - 4;
DosName->Buffer = (wchar_t *)PoolWithTag;
DosName->Length = v13;
DosName->MaximumLength = v13 + 2;
memmove(PoolWithTag, (char *)PoolWithTag + 4, v13);
Status = 0;
DosName->Buffer[(unsigned __int64)DosName->Length >> 1] = 0;
}
goto LABEL_19;
}
ExFreePoolWithTag(PoolWithTag, 0);
}
}
Status = -1073741670;
goto LABEL_19;
}
}
return result;
}Referenced by:
IopMountVolume
IopQueryNameInternal
IopValidateJunctionTarget