PiCMGetDeviceInterfaceList
NTSTATUS __stdcall PiCMGetDeviceInterfaceList(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
unsigned int v6;
UINT8 *v7;
unsigned int v8;
INT64 v9;
INT64 v10;
NTSTATUS v11;
INT64 v12;
int v13;
WCHAR *v14;
INT64 v15;
int inited;
unsigned int v17;
NTSTATUS v18;
WCHAR **SymbolicLinkList;
UINT64 *SymbolicLinkListSize;
UINT64 IoctlOutputBufferSizea;
UINT64 RequiredSize;
PVOID P;
UINT64 *v25;
struct _UNICODE_STRING DestinationString;
INT64 v27[2];
PCWSTR SourceString[2];
UINT64 ExpectedOutputSize;
UINT64 *v30;
v25 = v30;
ExpectedOutputSize = 0i64;
v6 = IoctlOutputBufferSize;
*(_DWORD *)v30 = 0;
v7 = 0i64;
v8 = 0;
P = 0i64;
DestinationString = 0i64;
LODWORD(RequiredSize) = 0;
*(_OWORD *)v27 = 0i64;
*(_OWORD *)SourceString = 0i64;
v11 = PiCMCaptureInterfaceListInputData(
(UINT64)IoctlInputBuffer,
IoctlInputBufferSize,
(unsigned int)BytesUsed,
(INT64)v27);
if( v11 < 0 )
goto LABEL_17;
v13 = HIDWORD(v27[0]);
v14 = (WCHAR *)SourceString[1];
if( (byte_140C130BB & 2) != 0 )
McTemplateK0jzt_EtwWriteTransfer(
HIWORD(HIDWORD(v27[0])) & 1,
v9,
v12,
(INT64)&v27[1],
SourceString[1],
BYTE6(v27[0]) & 1);
if( IoctlOutputBuffer && v6 >= 0x14 )
{
v15 = 3221225485i64;
if( (v13 & 0xFFFE0000) != 0 )
goto LABEL_22;
if( (_WORD)v13 )
v11 = -1073741811;
v15 = (unsigned int)v11;
if( v11 < 0 )
goto LABEL_22;
inited = RtlInitUnicodeStringEx(&DestinationString, v14);
v15 = (unsigned int)inited;
if( inited < 0 )
goto LABEL_22;
IopGetDeviceInterfaces(
(const _GUID *)&v27[1],
(_UNICODE_STRING *)((unsigned __int64)&DestinationString & -(__int64)(DestinationString.Length != 0)),
(v13 & 0x10000) == 0,
1u,
(WCHAR **)&P,
&RequiredSize);
v8 = RequiredSize;
v15 = v17;
v7 = (UINT8 *)P;
if( v6 - 20 < (unsigned int)RequiredSize )
v15 = 3221225507i64;
}
else
{
v15 = 3221225485i64;
}
if( (int)v15 >= 0 )
{
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(SymbolicLinkListSize) = HIDWORD(ExpectedOutputSize);
LODWORD(SymbolicLinkList) = v8;
v18 = PiCMReturnBufferResultData(
v15,
v8,
0i64,
v7,
(UINT64)SymbolicLinkList,
(UINT64)SymbolicLinkListSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v25);
goto LABEL_15;
}
LABEL_22:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(SymbolicLinkListSize) = HIDWORD(ExpectedOutputSize);
LODWORD(SymbolicLinkList) = 0;
v18 = PiCMReturnBufferResultData(
v15,
v8,
0i64,
0i64,
(UINT64)SymbolicLinkList,
(UINT64)SymbolicLinkListSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v25);
LABEL_15:
v11 = v18;
if( v7 )
ExFreePoolWithTag(v7, 0);
LABEL_17:
if( SourceString[1] )
PiControlFreeUserModeCallersBuffer(*((_BYTE *)KeGetCurrentThread() + 562), (PVOID)SourceString[1]);
if( (byte_140C130BB & 2) != 0 )
McTemplateK0d_EtwWriteTransfer(v10, &KMPnPEvt_CfgMgr_DeviceInterfaceList_Stop, v12, (unsigned int)v11);
return v11;
}Referenced by:
No references.