IopCheckTopDeviceHint
NTSTATUS __stdcall IopCheckTopDeviceHint(
_DEVICE_OBJECT **TargetDeviceObject,
_OPEN_PACKET *Op,
UINT8 DirectDeviceOpen,
_UNICODE_STRING *RemainingName){
_DEVICE_OBJECT *v4;
unsigned __int64 DeviceType;
__int64 v9;
char v10;
_ECP_LIST *ExtraCreateParameter;
char *v13;
unsigned int InternalFlags;
PVOID EcpContext;
v4 = *TargetDeviceObject;
if( DirectDeviceOpen )
return -1073741811;
DeviceType = v4->DeviceType;
if( (unsigned int)DeviceType > 0x35 )
return -1073741811;
v9 = 0x20000100121108i64;
if( !_bittest64(&v9, DeviceType) )
return -1073741811;
IopVerifyDeviceObjectOnStack(v4, (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint, 1u);
if( v10 )
{
*TargetDeviceObject = (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint;
return 0;
}
ExtraCreateParameter = Op->DriverCreateContext.ExtraCreateParameter;
if( ExtraCreateParameter )
{
EcpContext = 0i64;
if( FsRtlFindExtraCreateParameter(ExtraCreateParameter, &GUID_ECP_IO_DEVICE_HINT, &EcpContext, 0i64) >= 0 )
{
v13 = (char *)EcpContext;
if( *((_WORD *)EcpContext + 5) < RemainingName->Length )
{
*((_WORD *)EcpContext + 4) = RemainingName->Length;
return -1073740650;
}
ObfReferenceObject(v4);
*(_QWORD *)v13 = v4;
RtlCopyUnicodeString((PUNICODE_STRING)(v13 + 8), RemainingName);
*((_DWORD *)v13 - 6) |= 8u;
}
}
InternalFlags = Op->InternalFlags;
if( (InternalFlags & 0x10) == 0 )
return -1073740951;
Op->InternalFlags = InternalFlags & 0xFFFFFFEF;
return -1073740952;
}Referenced by:
IopParseDevice