IoCheckFunctionAccess
NTSTATUS __stdcall IoCheckFunctionAccess(
UINT64 GrantedAccess,
UINT8 MajorFunction,
UINT8 MinorFunction,
UINT64 IoControlCode,
VOID *Arg1,
VOID *Arg2){
NTSTATUS v6;
char v7;
int v8;
char v10;
bool v11;
int v12;
int v13;
int v14;
UINT64 DesiredAccess;
v6 = 0;
LODWORD(DesiredAccess) = 0;
if( MajorFunction > 9u )
{
if( MajorFunction == 10 )
{
if( (~(_DWORD)GrantedAccess & IopQueryFsOperationAccess[*(int *)Arg2]) != 0 )
return -1073741790;
return v6;
}
if( MajorFunction == 11 )
{
v11 = (~(_DWORD)GrantedAccess & IopSetFsOperationAccess[*(int *)Arg2]) != 0;
goto LABEL_20;
}
if( MajorFunction != 12 )
{
if( MajorFunction > 0xCu )
{
if( MajorFunction <= 0xFu )
{
v14 = (unsigned __int16)IoControlCode >> 14;
if( v14 && (v14 & (unsigned int)GrantedAccess) == 0 )
return -1073741790;
return v6;
}
switch( MajorFunction )
{
case 0x11u:
v7 = GrantedAccess & 3;
goto LABEL_8;
case 0x14u:
SeQuerySecurityAccessMask(*(unsigned int *)Arg1, &DesiredAccess);
break;
case 0x15u:
SeSetSecurityAccessMask(*(unsigned int *)Arg1, &DesiredAccess);
break;
default:
return -1073741808;
}
v11 = ((unsigned int)DesiredAccess & ~v13) != 0;
goto LABEL_20;
}
return -1073741808;
}
LABEL_18:
v10 = (GrantedAccess & 1) == 0;
LABEL_19:
v11 = v10 != 0;
LABEL_20:
v8 = -v11;
return v8 & 0xC0000022;
}
switch( MajorFunction )
{
case 9u:
v10 = ~(_BYTE)GrantedAccess & 2;
goto LABEL_19;
case 0u:
case 2u:
return v6;
case 3u:
goto LABEL_18;
case 4u:
v7 = GrantedAccess & 6;
LABEL_8:
v8 = -(v7 == 0);
return v8 & 0xC0000022;
}
if( MajorFunction != 5 )
{
switch( MajorFunction )
{
case 6u:
v12 = IopSetOperationAccess[*(int *)Arg1];
goto LABEL_23;
case 7u:
v10 = ~(_BYTE)GrantedAccess & 8;
goto LABEL_19;
case 8u:
v10 = ~(_BYTE)GrantedAccess & 0x10;
goto LABEL_19;
}
return -1073741808;
}
v12 = IopQueryOperationAccess[*(int *)Arg1];
LABEL_23:
if( v12 && (~(_DWORD)GrantedAccess & v12) != 0 )
return -1073741790;
return v6;
}Referenced by:
No references.