PiCMCapturePropertyInputData
NTSTATUS __stdcall PiCMCapturePropertyInputData(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
_CMAPI_INPUT_PROPERTY_DATA *PropertyData){
__int64 v3;
__int64 v4;
char CallerMode;
int UserModeCallersCopy;
char *v7;
_QWORD *v8;
VOID *v9;
UINT64 v10;
VOID *v11;
char *v13;
UINT64 v14;
UINT64 AllocateDestination;
int v16;
int v17;
v4 = v3;
v16 = 0;
v17 = 0;
CallerMode = KeGetCurrentThread()->PreviousMode;
UserModeCallersCopy = 0;
if( !IoctlInputBuffer || !(_DWORD)IoctlInputBufferSize )
{
UserModeCallersCopy = -1073741811;
goto LABEL_21;
}
if( (_DWORD)PropertyData )
{
if( ((unsigned __int8)IoctlInputBuffer & 3) != 0 )
ExRaiseDatatypeMisalignment();
v13 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
if( (unsigned __int64)v13 > 0x7FFFFFFF0000i64 || v13 < IoctlInputBuffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( (unsigned int)IoctlInputBufferSize >= 0x38 && *(_DWORD *)IoctlInputBuffer == 56 )
{
*(_DWORD *)v3 = 72;
*(_DWORD *)(v3 + 4) = *((_DWORD *)IoctlInputBuffer + 1);
*(_DWORD *)(v3 + 8) = *((_DWORD *)IoctlInputBuffer + 2);
*(_QWORD *)(v3 + 16) = *((unsigned int *)IoctlInputBuffer + 3);
*(_DWORD *)(v3 + 24) = *((_DWORD *)IoctlInputBuffer + 4);
*(_OWORD *)(v3 + 28) = *(_OWORD *)((char *)IoctlInputBuffer + 20);
*(_DWORD *)(v3 + 44) = *((_DWORD *)IoctlInputBuffer + 9);
*(_DWORD *)(v3 + 48) = *((_DWORD *)IoctlInputBuffer + 10);
*(_QWORD *)(v3 + 56) = *((unsigned int *)IoctlInputBuffer + 11);
*(_DWORD *)(v3 + 64) = *((_DWORD *)IoctlInputBuffer + 12);
*(_DWORD *)(v3 + 68) = *((_DWORD *)IoctlInputBuffer + 13);
}
else
{
UserModeCallersCopy = -1073741811;
}
}
else
{
if( ((unsigned __int8)IoctlInputBuffer & 7) != 0 )
ExRaiseDatatypeMisalignment();
v7 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < IoctlInputBuffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( (unsigned int)IoctlInputBufferSize < 0x48 )
{
UserModeCallersCopy = -1073741811;
}
else
{
*(_OWORD *)v3 = *(_OWORD *)IoctlInputBuffer;
*(_OWORD *)(v3 + 16) = *((_OWORD *)IoctlInputBuffer + 1);
*(_OWORD *)(v3 + 32) = *((_OWORD *)IoctlInputBuffer + 2);
*(_OWORD *)(v3 + 48) = *((_OWORD *)IoctlInputBuffer + 3);
*(_QWORD *)(v3 + 64) = *((_QWORD *)IoctlInputBuffer + 8);
if( *(_DWORD *)v3 != 72 )
UserModeCallersCopy = -1073741811;
}
}
if( UserModeCallersCopy < 0 )
goto LABEL_41;
v8 = (_QWORD *)(v3 + 16);
v9 = *(VOID **)(v3 + 16);
*(_QWORD *)(v3 + 16) = 0i64;
if( v9 )
{
v10 = *(unsigned int *)(v3 + 24);
if( (unsigned int)v10 < 2 )
{
if( *(_DWORD *)(v3 + 24) < 2u )
goto LABEL_40;
}
else
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)(v3 + 16),
v9,
v10,
2ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*v8 = 0i64;
*(_DWORD *)(v4 + 24) = 0;
}
else
{
v16 = 1;
*(_WORD *)(*v8 + 2 * ((unsigned __int64)*(unsigned int *)(v4 + 24) >> 1) - 2) = 0;
}
}
}
else if( *(_DWORD *)(v3 + 24) )
{
goto LABEL_40;
}
v11 = *(VOID **)(v4 + 56);
*(_QWORD *)(v4 + 56) = 0i64;
if( !v11 )
{
if( !*(_DWORD *)(v4 + 64) )
goto LABEL_21;
goto LABEL_40;
}
v14 = *(unsigned int *)(v4 + 64);
if( (_DWORD)v14 )
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)(v4 + 56),
v11,
v14,
1ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*(_QWORD *)(v4 + 56) = 0i64;
*(_DWORD *)(v4 + 64) = 0;
}
else
{
v17 = 1;
}
LABEL_21:
if( UserModeCallersCopy >= 0 )
return UserModeCallersCopy;
goto LABEL_41;
}
LABEL_40:
UserModeCallersCopy = -1073741811;
LABEL_41:
if( v16 )
PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 16));
if( v17 )
PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 56));
memset((VOID *)v4, 0i64, 0x48u);
return UserModeCallersCopy;
}Referenced by:
PiCMGetObjectProperty
PiCMSetObjectProperty