PiCMCaptureCreateDeviceInputData
NTSTATUS __stdcall PiCMCaptureCreateDeviceInputData(
VOID *IoctlInputBuffer,
UINT64 IoctlInputBufferSize,
_CMAPI_INPUT_CREATE_DEVICE_DATA *CreateDeviceData){
__int64 v3;
__int64 v4;
char CallerMode;
int UserModeCallersCopy;
char *v7;
char *v8;
_QWORD *v9;
VOID *v10;
UINT64 v11;
_QWORD *v12;
VOID *v13;
UINT64 v14;
UINT64 AllocateDestination;
int v17;
int v18;
v4 = v3;
v17 = 0;
v18 = 0;
CallerMode = KeGetCurrentThread()->PreviousMode;
UserModeCallersCopy = 0;
if( !IoctlInputBuffer || !(_DWORD)IoctlInputBufferSize )
{
UserModeCallersCopy = -1073741811;
goto LABEL_44;
}
if( (_DWORD)CreateDeviceData )
{
if( ((unsigned __int8)IoctlInputBuffer & 3) != 0 )
ExRaiseDatatypeMisalignment();
v7 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
if( (unsigned __int64)v7 > 0x7FFFFFFF0000i64 || v7 < IoctlInputBuffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( (unsigned int)IoctlInputBufferSize >= 0x1C && *(_DWORD *)IoctlInputBuffer == 28 )
{
*(_DWORD *)v3 = 40;
*(_DWORD *)(v3 + 4) = *((_DWORD *)IoctlInputBuffer + 1);
*(_QWORD *)(v3 + 8) = *((unsigned int *)IoctlInputBuffer + 2);
*(_DWORD *)(v3 + 16) = *((_DWORD *)IoctlInputBuffer + 3);
*(_QWORD *)(v3 + 24) = *((unsigned int *)IoctlInputBuffer + 4);
*(_DWORD *)(v3 + 32) = *((_DWORD *)IoctlInputBuffer + 5);
*(_DWORD *)(v3 + 36) = *((_DWORD *)IoctlInputBuffer + 6);
}
else
{
UserModeCallersCopy = -1073741811;
}
}
else
{
if( ((unsigned __int8)IoctlInputBuffer & 7) != 0 )
ExRaiseDatatypeMisalignment();
v8 = (char *)IoctlInputBuffer + (unsigned int)IoctlInputBufferSize;
if( (unsigned __int64)v8 > 0x7FFFFFFF0000i64 || v8 < IoctlInputBuffer )
MEMORY[0x7FFFFFFF0000] = 0;
if( (unsigned int)IoctlInputBufferSize >= 0x28 )
{
*(_OWORD *)v3 = *(_OWORD *)IoctlInputBuffer;
*(_OWORD *)(v3 + 16) = *((_OWORD *)IoctlInputBuffer + 1);
*(_QWORD *)(v3 + 32) = *((_QWORD *)IoctlInputBuffer + 4);
if( *(_DWORD *)v3 != 40 )
UserModeCallersCopy = -1073741811;
}
else
{
UserModeCallersCopy = -1073741811;
}
}
if( UserModeCallersCopy >= 0 )
{
v9 = (_QWORD *)(v3 + 8);
v10 = *(VOID **)(v3 + 8);
*(_QWORD *)(v3 + 8) = 0i64;
if( v10 )
{
v11 = *(unsigned int *)(v3 + 16);
if( (unsigned int)v11 >= 2 )
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)(v3 + 8),
v10,
v11,
2ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*v9 = 0i64;
*(_DWORD *)(v4 + 16) = 0;
}
else
{
v17 = 1;
*(_WORD *)(*v9 + 2 * ((unsigned __int64)*(unsigned int *)(v4 + 16) >> 1) - 2) = 0;
}
LABEL_27:
v12 = (_QWORD *)(v4 + 24);
v13 = *(VOID **)(v4 + 24);
*(_QWORD *)(v4 + 24) = 0i64;
if( v13 )
{
v14 = *(unsigned int *)(v4 + 32);
if( (unsigned int)v14 >= 2 )
{
LODWORD(AllocateDestination) = 1;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
(VOID **)(v4 + 24),
v13,
v14,
2ui64,
CallerMode,
AllocateDestination);
if( UserModeCallersCopy < 0 )
{
*v12 = 0i64;
*(_DWORD *)(v4 + 32) = 0;
}
else
{
v18 = 1;
*(_WORD *)(*v12 + 2 * ((unsigned __int64)*(unsigned int *)(v4 + 32) >> 1) - 2) = 0;
}
LABEL_44:
if( UserModeCallersCopy >= 0 )
return UserModeCallersCopy;
goto LABEL_45;
}
if( *(_DWORD *)(v4 + 32) >= 2u )
goto LABEL_44;
}
else if( !*(_DWORD *)(v4 + 32) )
{
goto LABEL_44;
}
goto LABEL_36;
}
if( *(_DWORD *)(v3 + 16) >= 2u )
goto LABEL_27;
}
else if( !*(_DWORD *)(v3 + 16) )
{
goto LABEL_27;
}
LABEL_36:
UserModeCallersCopy = -1073741811;
}
LABEL_45:
if( v17 )
PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 8));
if( v18 )
PiControlFreeUserModeCallersBuffer(CallerMode, *(PVOID *)(v4 + 24));
*(_OWORD *)v4 = 0i64;
*(_OWORD *)(v4 + 16) = 0i64;
*(_QWORD *)(v4 + 32) = 0i64;
return UserModeCallersCopy;
}Referenced by:
PiCMCreateDevice