windows脚本命令啥意思(Windows系统中的句柄到底是什么)

任务管理器截图 上图中的内容相信大家都见过,红色框框中的句柄到底是什么,不知道大家有没有产生过疑问今天我就来讲讲句柄,今天小编就来说说关于windows脚本命令啥意思?下面更多详细答案一起来看看吧!

windows脚本命令啥意思(Windows系统中的句柄到底是什么)

windows脚本命令啥意思

任务管理器截图

上图中的内容相信大家都见过,红色框框中的句柄到底是什么,不知道大家有没有产生过疑问。今天我就来讲讲句柄。

由于windows是支持虚拟内存机制的(不明白的请先行补充一下),这就导致某对象在一次换进患出后的地址几乎不可能一致。为解决这个问题,Windows引入了句柄。

系统为每个进程分配一定大小的内存区域来存放句柄,即一个个64bit的无符号整数值。每个无符号整数值相当于一个指针,指向内存中的另一个区域(设为area),当对象的位置发生变化时,area的值被更新为此刻对象在内存中的地址。这样,只要我们掌握了句柄的值就可以找到区域area,进而找到对象。而句柄的值在程序的一次运行过程中是不会改变的,操作系统以句柄来寻找对象。

我们从一些头文件,以及一些windows早期的代码中看一看句柄的定义

在Winnt.h头文件中定义了通用句柄:

    #ifdef STRICT

    typedef void *HANDLE;

    #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name

    #else

    typedef Pvoid HANDLE;

    #define DECLARE_HANDLE(name) typedef HANDLE name

    #endif

    typedef HANDLE *PHANDLE;

在Windef.h种定义来特殊句柄:

    #if !defined(_MAC) || !defined(GDI_INTERNAL)

    DECLARE_HANDLE(HFONT);

    #endif

    DECLARE_HANDLE(HICON);

    #if !defined(_MAC) || !defined(WIN_INTERNAL)

    DECLARE_HANDLE(HMENU);

    #endif

    DECLARE_HANDLE(HMETAFILE);

    DECLARE_HANDLE(HINSTANCE);

    typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */

    #if !defined(_MAC) || !defined(GDI_INTERNAL)

    DECLARE_HANDLE(HPALETTE);

    DECLARE_HANDLE(HPEN);

    #endif

    DECLARE_HANDLE(HRGN);

    DECLARE_HANDLE(HRSRC);

    DECLARE_HANDLE(HSTR);

    DECLARE_HANDLE(HTASK);

    DECLARE_HANDLE(HWINSTA);

    DECLARE_HANDLE(HKL);

内存与句柄

可以看出,通用句柄时一个void指针,显然是一个马甲,微软并不想泄露句柄的真实类型。当然,微软还是一不小心在其他地方泄露来句柄的本质。如果你定义一个强制类型检查STRICT,又定义了特殊类型句柄DECLARE_HANDLE,对于诸如DECLARE_HANDLE(HMENU)定义如下:

    typedef struct HMENU__

    {

    int unused;

    } *HMENU;

守得云开见日出了,句柄实际上是一种指向结构题的指针。一些大神猜测Windows的句柄结构类似如下:

    struct

    {

    int pointer; //指针段

    int count; //内核计数段

    int attribute; //文件属性段:SHARED等等

    int memAttribute; //内存属性段:MOVABLE和FIXED等等

    ...

    };

内存管理器工作原理

在Windows系统中,内存管理器管理的直接对象就是句柄,以句柄管理指针。当Windows系统内存整理时检测内存属性端段,当可移动时,就移动逻辑地址,移动完之后更新新的地址到对应句柄的指针段中,当使用MOVABLE地址时必须LOCK,计数器将 1,内存管理器检测到计数器>0则不移动逻辑地址,此时才可获得固定的逻辑地址来操作无力内存,使用完之后再UNLOCK进行操作,内存管理器就可以再次移动逻辑地址来,所以在虚拟内存管理机制不会出现访问混乱的情况

感谢图片提供者

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页