CmGetDeviceInterfaceName
NTSTATUS __stdcall CmGetDeviceInterfaceName(
WCHAR *ClassGuid,
WCHAR *DeviceInstanceId,
WCHAR *ReferenceString,
UINT8 NtPathFormat,
WCHAR *DeviceInterfaceName,
UINT64 DeviceInterfaceNameLength,
UINT64 *RequiredLength){
WCHAR *v7;
WCHAR *v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
UINT64 v15;
WCHAR *v16;
NTSTATUS result;
__int16 *i;
__int16 v19;
WCHAR v20;
_WORD *v21;
UINT64 dwFlags;
UINT64 dwFlagsa;
UINT64 dwFlagsb;
UINT64 dwFlagsc;
UINT64 dwFlagsd;
UINT64 dwFlagse;
_NTSTRSAFE_PWSTR ppszDestEnd[2];
UINT64 cchDest;
_DWORD *v30;
v7 = (WCHAR *)NtPathFormat;
*(_QWORD *)ppszDestEnd = 0i64;
cchDest = 0i64;
if( CmValidateInstallerClassName(ClassGuid) < 0 || CmValidateDeviceName(v10) < 0 )
return -1073741811;
v11 = -1i64;
if( v7 )
{
v12 = -1i64;
do
++v12;
while( v7[v12] );
if( (unsigned __int64)(v12 - 1) <= 0x102 )
{
v20 = *v7;
v21 = v7;
while( v20 )
{
if( v20 == 92 || v20 == 47 )
return -1073741773;
v20 = *++v21;
}
goto LABEL_5;
}
return -1073741811;
}
v12 = 0i64;
do
LABEL_5:
++v11;
while( ReferenceString[v11] );
v13 = v11 + 44;
v14 = v12 + 2;
if( !v12 )
v14 = v13;
if( v14 > 0xFFFFFFFF )
return -1073741675;
if( v30 )
*v30 = v14;
if( (unsigned int)v14 > (unsigned int)RequiredLength )
return -1073741789;
v15 = DeviceInterfaceNameLength;
v16 = (WCHAR *)L"\\??\\";
if( !(_BYTE)DeviceInterfaceName )
v16 = (WCHAR *)L"\\\\?\\";
LODWORD(dwFlags) = 2304;
result = RtlStringCchCopyExW(
(WCHAR *)DeviceInterfaceNameLength,
(unsigned int)RequiredLength,
v16,
(WCHAR **)ppszDestEnd,
&cchDest,
dwFlags);
if( result >= 0 )
{
LODWORD(dwFlagsa) = 2304;
result = RtlStringCchCopyExW(
*(WCHAR **)ppszDestEnd,
cchDest,
ReferenceString,
(WCHAR **)ppszDestEnd,
&cchDest,
dwFlagsa);
if( result >= 0 )
{
LODWORD(dwFlagsb) = 2304;
result = RtlStringCchCopyExW(
*(WCHAR **)ppszDestEnd,
cchDest,
(WCHAR **)ppszDestEnd,
&cchDest,
dwFlagsb);
if( result >= 0 )
{
LODWORD(dwFlagsc) = 2304;
result = RtlStringCchCopyExW(
*(WCHAR **)ppszDestEnd,
cchDest,
DeviceInstanceId,
(WCHAR **)ppszDestEnd,
&cchDest,
dwFlagsc);
if( result >= 0 )
{
for( i = (__int16 *)(v15 + 8); ; ++i )
{
v19 = *i;
if( !*i )
break;
if( v19 == 92 || v19 == 47 )
*i = 35;
}
if( v12 )
{
LODWORD(dwFlagsd) = 2304;
result = RtlStringCchCopyExW(
*(WCHAR **)ppszDestEnd,
cchDest,
(WCHAR *)L"\\",
(WCHAR **)ppszDestEnd,
&cchDest,
dwFlagsd);
if( result >= 0 )
{
LODWORD(dwFlagse) = 2304;
return RtlStringCchCopyExW(*(WCHAR **)ppszDestEnd, cchDest, v7, (WCHAR **)ppszDestEnd, &cchDest, dwFlagse);
}
}
}
}
}
}
return result;
}Referenced by:
IoGetDeviceInterfaceAlias
IopRegisterDeviceInterface