NtPlugPlayControl
INT64 __fastcall NtPlugPlayControl(
_PLUGPLAY_CONTROL_CLASS PnPControlClass,
VOID *PnPControlData,
UINT64 PnPControlDataLength){
unsigned int v3;
__int64 v4;
INT8 CallerMode;
__int64 *v6;
INT64 result;
__int64 v8;
unsigned int v9;
int UserModeCallersCopy;
UINT64 AllocateDestination;
UINT64 AllocateDestinationa;
VOID *Src;
VOID *Destination;
Src = PnPControlData;
v3 = PnPControlDataLength;
v4 = (unsigned int)PnPControlClass;
CallerMode = *((_BYTE *)KeGetCurrentThread() + 562);
if( CallerMode && !SeSinglePrivilegeCheck(*(_QWORD *)&SeTcbPrivilege, 1) )
return 3221225569i64;
if( (unsigned int)v4 >= 0x18 )
return 3221225711i64;
v6 = &PlugPlayHandlerTable[3 * v4];
if( *(_DWORD *)v6 != (_DWORD)v4 )
return 3221225701i64;
if( !v6 )
return 3221225711i64;
if( !v6[1] )
return 3221225474i64;
if( *((_DWORD *)v6 + 1) != v3 )
return 3221225520i64;
if( PsIsCurrentThreadInServerSilo() && !*((_BYTE *)v6 + 16) )
return 3221225569i64;
Destination = 0i64;
LODWORD(AllocateDestination) = 1;
result = PiControlMakeUserModeCallersCopy(&Destination, Src, v3, 4ui64, CallerMode, AllocateDestination);
if( (int)result >= 0 )
{
LOBYTE(v8) = CallerMode;
v9 = ((__int64(__fastcall *)(_QWORD, VOID *, _QWORD, __int64))v6[1])((unsigned int)v4, Destination, v3, v8);
if( (v9 & 0xC0000000) != -1073741824 || v9 == -1073741789 )
{
LODWORD(AllocateDestinationa) = 0;
UserModeCallersCopy = PiControlMakeUserModeCallersCopy(
&Src,
Destination,
v3,
4ui64,
CallerMode,
AllocateDestinationa);
if( UserModeCallersCopy < 0 )
v9 = UserModeCallersCopy;
}
if( v9 == -1073741738 )
v9 = -1073741810;
PiControlFreeUserModeCallersBuffer(CallerMode, Destination);
return v9;
}
return result;
}Referenced by:
No references.