PiGetDeviceRegProperty
NTSTATUS __stdcall PiGetDeviceRegProperty(
WCHAR *DeviceInstanceId,
UINT64 ExpectedType,
_CM_REG_PROP RegProperty,
VOID *Buffer,
UINT64 *BufferSize){
INT8 *v7;
NTSTATUS DeviceRegProp;
int v9;
VOID **PropertyBuffer;
WCHAR *v12;
int AlternateStringData;
size_t v14;
_WORD *v15;
char v16;
WORD *v17;
NTSTATUS v18;
__int64 v19;
WORD *v20;
INT8 *v21;
int v22;
WORD *v23;
UINT64 Flags;
UINT64 Flagsa;
UINT64 NumberOfBytes;
char CmRegPropType[12];
WCHAR *MessageFormat;
WCHAR *v29;
INT8 *Arguments[20];
UINT64 *BufferSizea;
LODWORD(Flags) = 0;
HIDWORD(NumberOfBytes) = (_DWORD)Buffer;
v7 = 0i64;
LODWORD(NumberOfBytes) = *(_DWORD *)BufferSizea;
v29 = (WCHAR *)BufferSize;
*(_DWORD *)CmRegPropType = 0;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceInstanceId,
0i64,
(INT64)Buffer,
(UINT64 *)CmRegPropType,
(UINT8 *)BufferSize,
&NumberOfBytes,
Flags);
v9 = DeviceRegProp;
if( RegProperty == CM_REG_PROP_DEVICEDESC )
{
if( DeviceRegProp < 0 )
{
if( DeviceRegProp != -1073741789 )
return v9;
}
else if( *(_DWORD *)CmRegPropType != 1 )
{
return -1073741584;
}
PropertyBuffer = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1869181008i64);
v12 = (WCHAR *)PropertyBuffer;
if( !PropertyBuffer )
return -1073741670;
if( v9 != -1073741789 )
{
memmove(PropertyBuffer, BufferSize, NumberOfBytes);
goto LABEL_15;
}
LODWORD(Flagsa) = 0;
v18 = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
DeviceInstanceId,
0i64,
HIDWORD(NumberOfBytes),
(UINT64 *)CmRegPropType,
(UINT8 *)PropertyBuffer,
&NumberOfBytes,
Flagsa);
v9 = v18;
if( v18 < 0 )
{
if( v18 == -1073741789 )
*(_DWORD *)BufferSizea = NumberOfBytes;
}
else
{
if( *(_DWORD *)CmRegPropType == 1 )
{
LABEL_15:
HIDWORD(NumberOfBytes) = NumberOfBytes;
*(_QWORD *)&CmRegPropType[4] = v12;
MessageFormat = v12;
AlternateStringData = PnpFindAlternateStringData(
v12,
NumberOfBytes,
&CmRegPropType[4],
(_DWORD *)&NumberOfBytes + 1);
v14 = HIDWORD(NumberOfBytes);
v15 = *(_WORD **)&CmRegPropType[4];
if( AlternateStringData )
{
MessageFormat = *(WCHAR **)&CmRegPropType[4];
v17 = wcsstr(*(WORD **)&CmRegPropType[4], (INT8 *)L";(");
v7 = (INT8 *)v17;
if( v17 )
{
v19 = (v14 >> 1) - 2;
if( v15[v19] == 41 )
{
*v17 = 0;
v7 = (INT8 *)(v17 + 2);
v15[v19] = 0;
memset(&Arguments[1], 0i64, 0x98u);
v20 = (WORD *)v7;
Arguments[0] = v7;
for( HIDWORD(NumberOfBytes) = 1; ; HIDWORD(NumberOfBytes) = v22 + 1 )
{
v23 = wcschr(v20, 44);
if( !v23 )
break;
*v23 = 0;
v21 = (INT8 *)(v23 + 1);
v22 = HIDWORD(NumberOfBytes);
if( HIDWORD(NumberOfBytes) >= 0x13 )
{
v16 = 1;
goto LABEL_17;
}
Arguments[HIDWORD(NumberOfBytes)] = v21;
v20 = (WORD *)v21;
}
}
}
}
v16 = 0;
LABEL_17:
if( *(_DWORD *)BufferSizea < v14 )
{
v9 = -1073741789;
}
else if( v7 )
{
if( v16 )
{
v9 = -1073741619;
}
else
{
LODWORD(Flagsa) = *(_DWORD *)BufferSizea;
v9 = RtlFormatMessageEx(MessageFormat, 0i64, 0, 0, 1u, Arguments, v29, Flagsa, BufferSizea);
}
}
else
{
memmove(v29, v15, v14);
}
*(_DWORD *)BufferSizea = v14;
goto LABEL_21;
}
v9 = -1073741584;
}
LABEL_21:
ExFreePoolWithTag(v12, 0);
return v9;
}
if( DeviceRegProp >= 0 )
{
if( *(_DWORD *)CmRegPropType != RegProperty )
v9 = -1073741584;
if( v9 >= 0 )
goto LABEL_8;
}
if( v9 == -1073741789 )
LABEL_8:
*(_DWORD *)BufferSizea = NumberOfBytes;
return v9;
}Referenced by:
IoGetDeviceProperty
IopPnPDispatch