PiCMRegisterDeviceInterface
INT64 __stdcall PiCMRegisterDeviceInterface(
PVOID IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
PVOID IoctlOutputBuffer,
UINT64 IoctlOutputBufferSize,
UINT64 *BytesUsed){
UINT64 *v5;
unsigned int v6;
unsigned int v8;
WCHAR *v9;
int v10;
__int64 v11;
int v12;
UINT64 v13;
int v14;
_ETHREAD *CurrentThread;
INT8 v16;
WCHAR *v18;
WCHAR *v19;
int v20;
__int64 v21;
UINT64 BufferSize;
UINT64 ExpectedOutputSize;
UINT64 IoctlOutputBufferSizea;
WCHAR *SymbolicLinkName;
INT64 v26[2];
WCHAR *DeviceInstanceName[2];
WCHAR *ReferenceString[2];
UINT64 v29;
UINT64 *v30;
v5 = v30;
v6 = IoctlOutputBufferSize;
SymbolicLinkName = 0i64;
*(_DWORD *)v30 = 0;
v8 = 0;
*(_OWORD *)v26 = 0i64;
v29 = 0i64;
v9 = 0i64;
*(_OWORD *)DeviceInstanceName = 0i64;
*(_OWORD *)ReferenceString = 0i64;
v10 = PiCMCaptureRegisterInterfaceInputData(
(UINT64)IoctlInputBuffer,
IoctlInputBufferSize,
(unsigned int)BytesUsed,
(INT64)v26);
if( v10 < 0 )
goto LABEL_8;
if( !PiAuDoesClientHaveAccess(2ui64) )
{
v12 = -1073741790;
LABEL_4:
v13 = 0i64;
LABEL_5:
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v29);
LODWORD(BufferSize) = 0;
v14 = PiCMReturnBufferResultData(
(unsigned int)v12,
v13,
0i64,
0i64,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v30);
goto LABEL_6;
}
v18 = DeviceInstanceName[1];
if( !DeviceInstanceName[1] || HIDWORD(v26[0]) )
{
v12 = -1073741811;
}
else
{
v19 = ReferenceString[1];
if( ReferenceString[1] && (unsigned int)v29 < 2 || !IoctlOutputBuffer || v6 < 0x14 )
{
v12 = -1073741811;
goto LABEL_4;
}
if( v6 - 20 < 2 )
{
v12 = -1073741811;
goto LABEL_4;
}
v12 = CmValidateDeviceName(v11, DeviceInstanceName[1]);
if( v12 >= 0 )
{
v20 = IopRegisterDeviceInterface(v18, (GUID *)&v26[1], v19, 1u, &SymbolicLinkName, 0i64);
v9 = SymbolicLinkName;
v12 = v20;
if( v20 >= 0 )
{
v21 = -1i64;
do
++v21;
while( SymbolicLinkName[v21] );
v8 = v21 + 1;
if( 2 * (unsigned __int64)v8 > v6 - 20 )
{
v12 = -1073741789;
v13 = 2 * v8;
goto LABEL_5;
}
}
}
v5 = v30;
}
v13 = 2 * v8;
if( v12 < 0 )
goto LABEL_5;
LODWORD(IoctlOutputBufferSizea) = v6;
LODWORD(ExpectedOutputSize) = HIDWORD(v29);
LODWORD(BufferSize) = 2 * v8;
v14 = PiCMReturnBufferResultData(
(unsigned int)v12,
v13,
0i64,
(UINT8 *)v9,
BufferSize,
ExpectedOutputSize,
IoctlOutputBuffer,
IoctlOutputBufferSizea,
v5);
LABEL_6:
v10 = v14;
if( v9 )
ExFreePoolWithTag(v9, 0);
LABEL_8:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v16 = *((_BYTE *)CurrentThread + 562);
if( DeviceInstanceName[1] )
PiControlFreeUserModeCallersBuffer(*((_BYTE *)CurrentThread + 562), DeviceInstanceName[1]);
if( ReferenceString[1] )
PiControlFreeUserModeCallersBuffer(v16, ReferenceString[1]);
return(unsigned int)v10;
}Referenced by:
No references.