searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

windows句柄介绍

2024-11-28 09:53:12
60
0

基本慨念

在Windows操作系统中,句柄(Handle)是一个非常重要的概念。它是一个指向系统资源的指针,用于管理系统资源,如文件、进程、线程、通信端口等。以下是关于Windows句柄的一些基本介绍:

  1. 句柄的作用

    • 句柄的主要作用是提供一种安全的方式来访问或操作系统资源。
    • 它隐藏了资源的具体实现细节,使得程序员无需关心资源的物理位置或状态。
    • 句柄还有助于操作系统管理资源的访问权限和同步。
  2. 句柄的类型

    • 文件句柄:用于访问文件或设备。
    • 进程句柄:用于控制另一个进程。
    • 线程句柄:用于控制或监视一个线程。
    • 窗口句柄:用于操作窗口和控件。
    • 事件句柄:用于同步线程或进程。
    • 互斥锁句柄:用于同步对共享资源的访问。
    • 信号量句柄:用于控制对资源的访问数量。
    • 定时器句柄:用于创建和控制定时器。
  3. 句柄的创建

    • 通过调用特定的系统API函数来创建句柄,如CreateFile用于创建文件句柄,CreateProcess用于创建进程句柄。
  4. 句柄的关闭

    • 使用完句柄后,必须调用相应的API函数来关闭句柄,如CloseHandle,以释放系统资源。不关闭句柄可能会导致资源泄露。
  5. 句柄的继承性

    • 在创建进程时,可以指定哪些句柄被新进程继承。默认情况下,新进程不会继承父进程的句柄。
  6. 句柄的复制

    • 可以通过DuplicateHandle函数复制句柄,使得多个进程可以共享对同一资源的访问。
  7. 句柄的安全性

    • 句柄可以有特定的访问权限,这些权限在创建句柄时指定,以确保只有具有适当权限的进程或线程可以操作句柄。
  8. 句柄的值

    • 在Windows中,句柄是一个32位的值,通常表示为HANDLE类型。实际上,它是一个指向内核对象的指针。
  9. 句柄的引用计数

    • 每个句柄都有一个与之关联的引用计数。每次复制句柄时,引用计数增加;每次关闭句柄时,引用计数减少。当引用计数达到零时,系统会销毁相应的内核对象并释放资源。
  10. 句柄的无效值

    • INVALID_HANDLE_VALUE是一个特殊的句柄值,用于表示一个无效的句柄。它通常用于函数的返回值,以指示操作失败。

 

句柄(Handle)和指针(Pointer)

句柄(Handle)和指针(Pointer)是计算机编程中两个不同的概念,它们在用途和实现上有所区别:

  1. 定义和用途

    • 指针:指针是一个变量,其值为另一个变量的内存地址。指针通常用于直接访问和操作内存中的数据。
    • 句柄:句柄是一个标识符,用于访问系统中的资源(如文件、进程、线程等)。句柄并不直接包含资源的地址,而是指向一个由操作系统管理的内核对象。
  2. 内存管理

    • 指针:指针直接指向内存中的一个位置,因此它受到内存管理的影响,如内存分配和释放。如果指针指向的内存被释放或重新分配,指针可能会变得无效(悬挂指针)。
    • 句柄:句柄不直接指向内存地址,因此不会因为内存的分配和释放而变得无效。句柄的生命周期由操作系统管理,操作系统负责资源的分配和释放。
  3. 安全性

    • 指针:指针可以直接访问内存,因此使用不当可能会导致安全问题,如缓冲区溢出、内存泄漏等。
    • 句柄:句柄提供了一种更安全的方式来访问系统资源,因为操作系统控制着资源的访问权限和同步。
  4. 类型和值

    • 指针:指针通常有具体的类型,如int*char*等,这表明它指向的数据类型。
    • 句柄:句柄通常是一个无类型的整数值(如HANDLE),它不直接反映资源的类型或内容。
  5. 操作系统依赖性

    • 指针:指针是编程语言的一部分,与操作系统无关。
    • 句柄:句柄是操作系统的概念,不同的操作系统可能有不同的句柄实现。
  6. 资源管理

    • 指针:指针本身不涉及资源管理,它只是一个地址标识符。
    • 句柄:句柄通常与资源管理相关,操作系统通过句柄来跟踪资源的使用情况,并在资源不再使用时进行清理。
  7. 传递和共享

    • 指针:指针可以直接在函数间传递,但需要注意所有权和生命周期问题。
    • 句柄:句柄可以通过特定的系统调用(如DuplicateHandle)在进程间传递和共享。

 

句柄原理

句柄在Windows操作系统中的底层原理涉及到几个关键概念和机制:

  1. 句柄表(Handle Table): 每个进程都有自己的句柄表,用于管理和存储所有在该进程中有效的句柄。句柄表可以是一个数组或哈希表,具体取决于系统的实现细节。

  2. _HANDLE_TABLE_ENTRY结构体: 在内核模式下管理句柄的结构体。每个句柄表条目都与一个_HANDLE_TABLE_ENTRY实例关联,包含指向实际内核对象的指针(Object Pointer)、描述对该对象的访问权限(Granted Access)以及关于句柄的附加属性(Handle Attributes)等信息。

  3. 句柄的生成与销毁: 当用户空间的应用程序打开一个文件或创建一个网络连接时,内核会生成一个句柄并将其返回给应用程序。当资源不再使用时,应用程序需要关闭句柄,内核随后会销毁该句柄。

  4. 句柄项(_HANDLE_TABLE_ENTRY): 句柄项是一个结构体,里面包含了句柄值。它低32位到低2位保存的是内核对象的首地址。例如,如果句柄表项的值为0x000000018812ad09,则对应的对象首地址就为8812ad09,将低3位清零的结果为8812ad08。

  5. 多层句柄表结构: 句柄表是一个多层结构,最多有三层,最少有一层。层数由TableCode的低2位的值来判断。最底层结构中保存的内容才是实实在在需要的内容,叫做句柄项。

  6. 句柄验证和访问控制: 内核在处理句柄操作时会验证句柄的有效性,确保其指向的对象仍然存在且未被释放。同时,内核检查句柄的访问权限,以确保进程对对象的操作符合其权限要求。

  7. 句柄操作: 常见的句柄操作包括创建、打开、关闭、复制和继承。例如,CreateFile函数用于创建或打开一个文件,并返回一个句柄;CloseHandle函数用于关闭句柄并释放相关资源。

  8. 句柄继承: 在创建子进程时,句柄可以被继承。通过设置句柄的继承标志和传递句柄,父进程可以允许子进程访问某些资源。

  9. 句柄回收: 当一个句柄不再需要时,CloseHandle函数会释放它,并通知内核释放相关资源。如果句柄未被正确关闭,可能导致资源泄漏。

0条评论
作者已关闭评论
张伯雄
3文章数
0粉丝数
张伯雄
3 文章 | 0 粉丝
张伯雄
3文章数
0粉丝数
张伯雄
3 文章 | 0 粉丝
原创

windows句柄介绍

2024-11-28 09:53:12
60
0

基本慨念

在Windows操作系统中,句柄(Handle)是一个非常重要的概念。它是一个指向系统资源的指针,用于管理系统资源,如文件、进程、线程、通信端口等。以下是关于Windows句柄的一些基本介绍:

  1. 句柄的作用

    • 句柄的主要作用是提供一种安全的方式来访问或操作系统资源。
    • 它隐藏了资源的具体实现细节,使得程序员无需关心资源的物理位置或状态。
    • 句柄还有助于操作系统管理资源的访问权限和同步。
  2. 句柄的类型

    • 文件句柄:用于访问文件或设备。
    • 进程句柄:用于控制另一个进程。
    • 线程句柄:用于控制或监视一个线程。
    • 窗口句柄:用于操作窗口和控件。
    • 事件句柄:用于同步线程或进程。
    • 互斥锁句柄:用于同步对共享资源的访问。
    • 信号量句柄:用于控制对资源的访问数量。
    • 定时器句柄:用于创建和控制定时器。
  3. 句柄的创建

    • 通过调用特定的系统API函数来创建句柄,如CreateFile用于创建文件句柄,CreateProcess用于创建进程句柄。
  4. 句柄的关闭

    • 使用完句柄后,必须调用相应的API函数来关闭句柄,如CloseHandle,以释放系统资源。不关闭句柄可能会导致资源泄露。
  5. 句柄的继承性

    • 在创建进程时,可以指定哪些句柄被新进程继承。默认情况下,新进程不会继承父进程的句柄。
  6. 句柄的复制

    • 可以通过DuplicateHandle函数复制句柄,使得多个进程可以共享对同一资源的访问。
  7. 句柄的安全性

    • 句柄可以有特定的访问权限,这些权限在创建句柄时指定,以确保只有具有适当权限的进程或线程可以操作句柄。
  8. 句柄的值

    • 在Windows中,句柄是一个32位的值,通常表示为HANDLE类型。实际上,它是一个指向内核对象的指针。
  9. 句柄的引用计数

    • 每个句柄都有一个与之关联的引用计数。每次复制句柄时,引用计数增加;每次关闭句柄时,引用计数减少。当引用计数达到零时,系统会销毁相应的内核对象并释放资源。
  10. 句柄的无效值

    • INVALID_HANDLE_VALUE是一个特殊的句柄值,用于表示一个无效的句柄。它通常用于函数的返回值,以指示操作失败。

 

句柄(Handle)和指针(Pointer)

句柄(Handle)和指针(Pointer)是计算机编程中两个不同的概念,它们在用途和实现上有所区别:

  1. 定义和用途

    • 指针:指针是一个变量,其值为另一个变量的内存地址。指针通常用于直接访问和操作内存中的数据。
    • 句柄:句柄是一个标识符,用于访问系统中的资源(如文件、进程、线程等)。句柄并不直接包含资源的地址,而是指向一个由操作系统管理的内核对象。
  2. 内存管理

    • 指针:指针直接指向内存中的一个位置,因此它受到内存管理的影响,如内存分配和释放。如果指针指向的内存被释放或重新分配,指针可能会变得无效(悬挂指针)。
    • 句柄:句柄不直接指向内存地址,因此不会因为内存的分配和释放而变得无效。句柄的生命周期由操作系统管理,操作系统负责资源的分配和释放。
  3. 安全性

    • 指针:指针可以直接访问内存,因此使用不当可能会导致安全问题,如缓冲区溢出、内存泄漏等。
    • 句柄:句柄提供了一种更安全的方式来访问系统资源,因为操作系统控制着资源的访问权限和同步。
  4. 类型和值

    • 指针:指针通常有具体的类型,如int*char*等,这表明它指向的数据类型。
    • 句柄:句柄通常是一个无类型的整数值(如HANDLE),它不直接反映资源的类型或内容。
  5. 操作系统依赖性

    • 指针:指针是编程语言的一部分,与操作系统无关。
    • 句柄:句柄是操作系统的概念,不同的操作系统可能有不同的句柄实现。
  6. 资源管理

    • 指针:指针本身不涉及资源管理,它只是一个地址标识符。
    • 句柄:句柄通常与资源管理相关,操作系统通过句柄来跟踪资源的使用情况,并在资源不再使用时进行清理。
  7. 传递和共享

    • 指针:指针可以直接在函数间传递,但需要注意所有权和生命周期问题。
    • 句柄:句柄可以通过特定的系统调用(如DuplicateHandle)在进程间传递和共享。

 

句柄原理

句柄在Windows操作系统中的底层原理涉及到几个关键概念和机制:

  1. 句柄表(Handle Table): 每个进程都有自己的句柄表,用于管理和存储所有在该进程中有效的句柄。句柄表可以是一个数组或哈希表,具体取决于系统的实现细节。

  2. _HANDLE_TABLE_ENTRY结构体: 在内核模式下管理句柄的结构体。每个句柄表条目都与一个_HANDLE_TABLE_ENTRY实例关联,包含指向实际内核对象的指针(Object Pointer)、描述对该对象的访问权限(Granted Access)以及关于句柄的附加属性(Handle Attributes)等信息。

  3. 句柄的生成与销毁: 当用户空间的应用程序打开一个文件或创建一个网络连接时,内核会生成一个句柄并将其返回给应用程序。当资源不再使用时,应用程序需要关闭句柄,内核随后会销毁该句柄。

  4. 句柄项(_HANDLE_TABLE_ENTRY): 句柄项是一个结构体,里面包含了句柄值。它低32位到低2位保存的是内核对象的首地址。例如,如果句柄表项的值为0x000000018812ad09,则对应的对象首地址就为8812ad09,将低3位清零的结果为8812ad08。

  5. 多层句柄表结构: 句柄表是一个多层结构,最多有三层,最少有一层。层数由TableCode的低2位的值来判断。最底层结构中保存的内容才是实实在在需要的内容,叫做句柄项。

  6. 句柄验证和访问控制: 内核在处理句柄操作时会验证句柄的有效性,确保其指向的对象仍然存在且未被释放。同时,内核检查句柄的访问权限,以确保进程对对象的操作符合其权限要求。

  7. 句柄操作: 常见的句柄操作包括创建、打开、关闭、复制和继承。例如,CreateFile函数用于创建或打开一个文件,并返回一个句柄;CloseHandle函数用于关闭句柄并释放相关资源。

  8. 句柄继承: 在创建子进程时,句柄可以被继承。通过设置句柄的继承标志和传递句柄,父进程可以允许子进程访问某些资源。

  9. 句柄回收: 当一个句柄不再需要时,CloseHandle函数会释放它,并通知内核释放相关资源。如果句柄未被正确关闭,可能导致资源泄漏。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0