NtPlugPlayControl
NTSTATUS __stdcall NtPlugPlayControl(
PLUGPLAY_CONTROL_CLASS PnPControlClass,
VOID *PnPControlData,
UINT64 PnPControlDataLength){
unsigned int v3;
__int64 v4;
char CallerMode;
__int64 *v6;
NTSTATUS result;
__int64 v8;
NTSTATUS v9;
NTSTATUS UserModeCallersCopy;
UINT64 AllocateDestination;
UINT64 AllocateDestinationa;
VOID *Src;
VOID *Destination;
Src = PnPControlData;
v3 = PnPControlDataLength;
v4 = (unsigned int)PnPControlClass;
CallerMode = KeGetCurrentThread()->PreviousMode;
if( CallerMode && !SeSinglePrivilegeCheck(*(_QWORD *)&SeTcbPrivilege, 1) )
return -1073741727;
if( (unsigned int)v4 >= 0x18 )
return -1073741585;
v6 = &PlugPlayHandlerTable[3 * v4];
if( *(_DWORD *)v6 != (_DWORD)v4 )
return -1073741595;
if( !v6 )
return -1073741585;
if( !v6[1] )
return -1073741822;
if( *((_DWORD *)v6 + 1) != v3 )
return -1073741776;
if( PsIsCurrentThreadInServerSilo() && !*((_BYTE *)v6 + 16) )
return -1073741727;
Destination = 0i64;
LODWORD(AllocateDestination) = 1;
result = PiControlMakeUserModeCallersCopy(&Destination, Src, v3, 4ui64, CallerMode, AllocateDestination);
if( 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.