IoVolumeDeviceToDosName
NTSTATUS __stdcall IoVolumeDeviceToDosName(PVOID VolumeDeviceObject, UNICODE_STRING *DosName){
unsigned __int64 v2;
__int64 v5;
IRP *v6;
NTSTATUS result;
WCHAR v8;
IRP *v9;
int Status;
ULONG OutputBufferLength;
UINT8 *PoolWithTag;
IRP *v13;
unsigned __int16 v14;
PDEVICE_OBJECT DeviceObject;
struct _KEVENT Event;
struct _IO_STATUS_BLOCK IoStatusBlock;
PFILE_OBJECT FileObject;
struct _UNICODE_STRING DestinationString;
int OutputBuffer;
char InputBuffer[512];
v2 = *((unsigned int *)VolumeDeviceObject + 18);
FileObject = 0i64;
DeviceObject = 0i64;
memset(&Event, 0, sizeof(Event));
IoStatusBlock = 0i64;
DestinationString = 0i64;
if( (unsigned int)v2 > 0x24 )
return -1073741811;
v5 = 0x1080000084i64;
if( !_bittest64(&v5, v2) )
return -1073741811;
KeInitializeEvent(&Event, NotificationEvent, 0);
v6 = IoBuildDeviceIoControlRequest(
0x4D0008u,
(PDEVICE_OBJECT)VolumeDeviceObject,
0i64,
0,
InputBuffer,
0x200u,
0,
&Event,
&IoStatusBlock);
if( !v6 )
return -1073741670;
result = IofCallDriver((PDEVICE_OBJECT)VolumeDeviceObject, v6);
if( result == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
result = IoStatusBlock.Status;
}
if( result >= 0 )
{
RtlInitUnicodeString(&DestinationString, L"\\Device\\MountPointManager", v8);
result = IoGetDeviceObjectPointer(&DestinationString, 0x80ui64, &FileObject, &DeviceObject);
if( result >= 0 )
{
KeInitializeEvent(&Event, NotificationEvent, 0);
v9 = IoBuildDeviceIoControlRequest(
0x6D0030u,
DeviceObject,
InputBuffer,
0x200u,
&OutputBuffer,
8u,
0,
&Event,
&IoStatusBlock);
if( v9 )
{
Status = IofCallDriver(DeviceObject, v9);
if( Status == 259 )
{
KeWaitForSingleObject(&Event, Executive, 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 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, OutputBufferLength, 0x20643244ui64);
if( PoolWithTag )
{
KeInitializeEvent(&Event, NotificationEvent, 0);
v13 = IoBuildDeviceIoControlRequest(
0x6D0030u,
DeviceObject,
InputBuffer,
0x200u,
PoolWithTag,
OutputBufferLength,
0,
&Event,
&IoStatusBlock);
if( v13 )
{
Status = IofCallDriver(DeviceObject, v13);
if( Status == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status < 0 )
{
ExFreePoolWithTag(PoolWithTag, 0);
}
else
{
v14 = *(_WORD *)PoolWithTag - 4;
DosName->Buffer = (wchar_t *)PoolWithTag;
DosName->Length = v14;
DosName->MaximumLength = v14 + 2;
memmove(PoolWithTag, PoolWithTag + 4, v14);
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