IopCheckTopDeviceHint
INT64 __fastcall IopCheckTopDeviceHint(
_DEVICE_OBJECT **TargetDeviceObject,
_OPEN_PACKET *Op,
const _UNICODE_STRING *DirectDeviceOpen,
const _UNICODE_STRING *RemainingName){
_DEVICE_OBJECT *v4;
unsigned __int64 v8;
__int64 v9;
struct _ECP_LIST *ExtraCreateParameter;
char *v12;
UNICODE_STRING *v13;
unsigned int InternalFlags;
PVOID EcpContext;
v4 = *TargetDeviceObject;
if( (_BYTE)DirectDeviceOpen )
return 3221225485i64;
v8 = *((unsigned int *)v4 + 18);
if( (unsigned int)v8 > 0x35 )
return 3221225485i64;
v9 = 0x20000100121108i64;
if( !_bittest64(&v9, v8) )
return 3221225485i64;
if( IopVerifyDeviceObjectOnStack(v4, (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint, 1u) )
{
*TargetDeviceObject = (_DEVICE_OBJECT *)Op->DriverCreateContext.DeviceObjectHint;
return 0i64;
}
ExtraCreateParameter = Op->DriverCreateContext.ExtraCreateParameter;
if( ExtraCreateParameter )
{
EcpContext = 0i64;
if( FsRtlFindExtraCreateParameter(ExtraCreateParameter, &GUID_ECP_IO_DEVICE_HINT, &EcpContext, 0i64) >= 0 )
{
v12 = (char *)EcpContext;
if( *((_WORD *)EcpContext + 5) < RemainingName->Length )
{
*((_WORD *)EcpContext + 4) = RemainingName->Length;
return 3221226646i64;
}
ObfReferenceObject(v4);
*(_QWORD *)v12 = v4;
RtlCopyUnicodeString((UNICODE_STRING *)(v12 + 8), (UNICODE_STRING *)RemainingName, v13);
*((_DWORD *)v12 - 6) |= 8u;
}
}
InternalFlags = Op->InternalFlags;
if( (InternalFlags & 0x10) == 0 )
return 3221226345i64;
Op->InternalFlags = InternalFlags & 0xFFFFFFEF;
return 3221226344i64;
}Referenced by:
IopParseDevice