PiCMCaptureRegistryPropertyInputData
NTSTATUS __stdcall PiCMCaptureRegistryPropertyInputData(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
INT64 Is32BitProcess,
_CMAPI_INPUT_REGISTRY_PROPERTY_DATA *RegistryPropertyData){
char CallerMode;
int UserModeCallersCopy;
char *v7;
_CMAPI_INPUT_REGISTRY_PROPERTY_DATA *v8;
VOID *v9;
UINT64 v10;
VOID *v11;
char *v13;
UINT64 v14;
UINT64 AllocateDestination;
int v16;
int v17;
v16 = 0;
v17 = 0;
CallerMode = KeGetCurrentThread()->PreviousMode;
UserModeCallersCopy = 0;
if( !IoctlInputBuffer || !(_DWORD)IoctlInputBufferSize )
{
UserModeCallersCopy = -1073741811;
goto LABEL_21;
}
if( (_DWORD)Is32BitProcess )
{
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 >= 0x28 && *(_DWORD *)IoctlInputBuffer == 40 )
{
*RegistryPropertyData = 56;
RegistryPropertyData[1] = *((_DWORD *)IoctlInputBuffer + 1);
RegistryPropertyData[2] = *((_DWORD *)IoctlInputBuffer + 2);
*((_QWORD *)RegistryPropertyData + 2) = *((unsigned int *)IoctlInputBuffer + 3);
RegistryPropertyData[6] = *((_DWORD *)IoctlInputBuffer + 4);
RegistryPropertyData[7] = *((_DWORD *)IoctlInputBuffer + 5);
RegistryPropertyData[8] = *((_DWORD *)IoctlInputBuffer + 6);
*((_QWORD *)RegistryPropertyData + 5) = *((unsigned int *)IoctlInputBuffer + 7);
RegistryPropertyData[12] = *((_DWORD *)IoctlInputBuffer + 8);
RegistryPropertyData[13] = *((_DWORD *)IoctlInputBuffer + 9);
}
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 < 0x38 )
{
UserModeCallersCopy = -1073741811;
}
else
{
*(_OWORD *)RegistryPropertyData = *(_OWORD *)IoctlInputBuffer;
*((_OWORD *)RegistryPropertyData + 1) = *((_OWORD *)IoctlInputBuffer + 1);
*((_OWORD *)RegistryPropertyData + 2) = *((_OWORD *)IoctlInputBuffer + 2);
*((_QWORD *)RegistryPropertyData + 6) = *((_QWORD *)IoctlInputBuffer + 6);
if( *RegistryPropertyData != 56 )
UserModeCallersCopy = -1073741811;
}
}
if( UserModeCallersCopy < 0 )
goto LABEL_45;
v8 = RegistryPropertyData + 4;
v9 = (VOID *)*((_QWORD *)RegistryPropertyData + 2);
*((_QWORD *)RegistryPropertyData + 2) = 0i64;
if( v9 )
{
v10 = (unsigned int)RegistryPropertyData[6];
if( (unsigned int)v10 < 2 )
{
if( (unsigned int)RegistryPropertyData[6] < 2 )
goto LABEL_24;
}
else
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)RegistryPropertyData + 2,
v9,
v10,
2ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*(_QWORD *)v8 = 0i64;
RegistryPropertyData[6] = 0;
}
else
{
v16 = 1;
*(_WORD *)(*(_QWORD *)v8 + 2 * ((unsigned __int64)(unsigned int)RegistryPropertyData[6] >> 1) - 2) = 0;
}
}
}
else if( RegistryPropertyData[6] )
{
goto LABEL_24;
}
v11 = (VOID *)*((_QWORD *)RegistryPropertyData + 5);
*((_QWORD *)RegistryPropertyData + 5) = 0i64;
if( !v11 )
{
if( !RegistryPropertyData[12] )
goto LABEL_21;
goto LABEL_24;
}
v14 = (unsigned int)RegistryPropertyData[12];
if( (_DWORD)v14 )
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)RegistryPropertyData + 5,
v11,
v14,
1ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*((_QWORD *)RegistryPropertyData + 5) = 0i64;
RegistryPropertyData[12] = 0;
}
else
{
v17 = 1;
}
LABEL_21:
if( UserModeCallersCopy >= 0 )
return UserModeCallersCopy;
goto LABEL_45;
}
LABEL_24:
UserModeCallersCopy = -1073741811;
LABEL_45:
if( v16 )
PiControlFreeUserModeCallersBuffer(CallerMode, *((PVOID *)RegistryPropertyData + 2));
if( v17 )
PiControlFreeUserModeCallersBuffer(CallerMode, *((PVOID *)RegistryPropertyData + 5));
*(_OWORD *)RegistryPropertyData = 0i64;
*((_OWORD *)RegistryPropertyData + 1) = 0i64;
*((_OWORD *)RegistryPropertyData + 2) = 0i64;
*((_QWORD *)RegistryPropertyData + 6) = 0i64;
return UserModeCallersCopy;
}Referenced by:
PiCMGetRegistryProperty
PiCMSetRegistryProperty