我们在创建文件对象时,会使用宏InitializeObjectAttributes初始化OBJECT_ATTRIBUTES结构体,InitializeObjectAttributes声明如下:
VOID
InitializeObjectAttributes(
OUT POBJECT_ATTRIBUTES InitializedAttributes,
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN HANDLE RootDirectory,
IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
其中属性Attributes可以设置OBJ_KERNEL_HANDLE,这个常量值代表什么意思呢?
若属性中不包括这个掩码,则创建的句柄属于当前上下文所属进程的句柄表中,若包括此掩码,创建的句柄属于系统上下文句柄表中(也可以叫全局句柄表吧),且不可被用户模式程序访问。假设对象属性不包含OBJ_KERNEL_HANDLE,进程A访问属于进程B的句柄,估计蓝屏(没测过),至少不会有正确的结果,所以一般情况下的设置为OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE。