IopCreateSecurityCheck
UINT8 __stdcall IopCreateSecurityCheck(
_DEVICE_OBJECT *DeviceObject,
_DEVICE_OBJECT *AuditDeviceObject,
_ACCESS_STATE *AccessState,
UINT64 DesiredAccess,
_PRIVILEGE_SET *Privileges,
UINT64 *GrantedAccess,
_UNICODE_STRING *CompleteName,
_UNICODE_STRING *NameString,
_ETHREAD *CurrentThread,
UINT8 ApplyAccess){
int v10;
int v11;
_DEVICE_OBJECT *v13;
int v15;
__int64 v16;
_UNICODE_STRING *v17;
UINT8 v18;
PACCESS_STATE AccessStatea;
INT64 AccessStatus;
char v22;
LODWORD(AccessStatus) = 0;
v10 = 0;
v11 = DesiredAccess;
v13 = AuditDeviceObject;
if( (_DWORD)Privileges != 1 )
{
v15 = *((_DWORD *)DeviceObject + 13);
if( (v15 & 0x40001) != 0 || IopRequireDeviceAccessCheck && (v15 & 0x100000) != 0 )
v10 = 2;
}
v16 = ApplyAccess;
--*(_WORD *)(ApplyAccess + 484i64);
LOBYTE(AuditDeviceObject) = 1;
ExAcquireResourceSharedLite(&IopSecurityResource, (BOOL)AuditDeviceObject);
SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
v17 = CompleteName;
LODWORD(AccessStatea) = 0;
v18 = SeAccessCheck(
*((VOID **)DeviceObject + 34),
(SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
1u,
v11 | (unsigned int)v10,
(UINT64)AccessStatea,
(PRIVILEGE_SET **)&GrantedAccess,
(GENERIC_MAPPING *)((char *)IoFileObjectType + 76),
1,
(UINT64 *)&CompleteName->Length,
&AccessStatus);
if( GrantedAccess )
{
SeAppendPrivileges(AccessState, (PPRIVILEGE_SET)GrantedAccess);
ExFreePoolWithTag(GrantedAccess, 0);
}
if( v10 && (v10 & v11) == 0 )
*(_DWORD *)&v17->Length &= ~v10;
if( v22 && v18 )
{
*((_DWORD *)AccessState + 5) |= *(_DWORD *)&v17->Length;
*((_DWORD *)AccessState + 4) &= ~(*(_DWORD *)&v17->Length | 0x2000000);
}
if( v13 )
SeOpenObjectAuditAlarm(
(UNICODE_STRING *)CurrentThread,
v13,
NameString,
*((PVOID *)DeviceObject + 34),
AccessState,
0,
v18,
1,
(UINT8 *)AccessState + 10);
SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
ExReleaseResourceLite(&IopSecurityResource);
KeLeaveCriticalRegionThread(v16);
return v18;
}Referenced by:
IopParseDevice