Windows 中的三种对象

来源:互联网 发布:网络写手平台 编辑:程序博客网 时间:2024/05/17 22:48

窗口站和桌面

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687098(v=vs.85).aspx

       Windows 创建了三种主要类型的对象:用户接口,图形设备接口,还有内核。内核对象是可保安全的,但是用户对象和GDI 对象是不可以的。为了提供额外的安全性,使用窗口站和桌面来管理用户接口对象,这两个对象本身是可保安全的。

用户对象

https://msdn.microsoft.com/en-us/library/windows/desktop/ms725486(v=vs.85).aspx

       每个用户接口对象只可以拥有一个句柄。进程不能继承或者拷贝接口对象的句柄。一个会话中的进程不能引用另一个会话中的用户句柄。
       理论上,一个会话最多有65536 个用户句柄。实际上会比这个更少,因为可能在达到句柄限制之前内存就已经不够了,而且每个进程允许拥有的句柄数目是有限的。可以通过下面的注册表键值来修改每个进程可以使用的句柄的数目。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota

       这个键值的设置范围为:[200,18000]

用户对象的句柄

       用户对象的句柄对于所有的进程都是公开的。任何进程可以使用用户对象句柄,这意味着,任何有权限访问对象的进程都可以使用该用户对象句柄。

管理用户对象

       下面这个表格展示了所有的用户对象的创建和销毁函数。创建函数或者同时创建对象并返回句柄,或者仅仅是打开一个已经存在的句柄。销毁函数将把对象从内存中清除并使得对应的对象句柄失效。

用户对象 创建函数 销毁函数 快捷键表 CreateAcceleratorTable DestroyAcceleratorTable Caret(插入符号?) CreateCaret DestroyCaret 光标 CreateCursor, LoadCursor, LoadImage DestroyCursor DDE 会话 DdeConnect, DdeConnectList DdeDisconnect, DdeDisconnectList 钩子 SetWindowsHookEx UnhookWindowsHookEx 图标 CreateIconIndirect, LoadIcon, LoadImage DestroyIcon 菜单 CreateMenu, CreatePopupMenu, LoadMenu, LoadMenuIndirect DestroyMenu 窗口 CreateWindow, CreateWindowEx, CreateDialogParam, CreateDialogIndirectParam, CreateMDIWindow DestroyWindow 窗口位置 BeginDeferWindowPos EndDeferWindowPos

GDI 对象

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724291(v=vs.85).aspx
       一个GDI对象只有一个句柄,GDI 对象是进程私有的,只有创建它的进程才可以使用该对象句柄。

       会话中的GDI 句柄的个数的限制同用户对象一样。
Windows 2000:一个会话最多有16384个GDI 句柄。
       每个进程所能拥有的最大数量的GDI 对象的限制对应注册表键为:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota

       这个值的可以修改的范围为:[256~65536]

管理GDI 对象

       同用户对象

GDI对象 创建函数 销毁函数 位图 CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection, CreateDiscardableBitmap DeleteObject 画笔 CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush DeleteObject DC (设备上下文) CreateDC DeleteDC, ReleaseDC 增强的元文件 CreateEnhMetaFile DeleteEnhMetaFile 增强的元文件DC CreateEnhMetaFile CloseEnhMetaFile 字体 CreateFont, CreateFontIndirect DeleteObject 内存DC CreateCompatibleDC DeleteDC 元文件 CreateMetaFile CloseMetaFile 元文件DC CreateMetaFile CloseMetaFile 调色板 CreatePalette DeleteObject 画笔和扩展的画笔 CreatePen, CreatePenIndirect, ExtCreatePen DeleteObject 域 CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreatePolyPolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateRoundRectRgn, ExtCreateRegion, PathToRegion DeleteObject

内核对象

       内核对象句柄是进程相关的。一个进程如果想要对一个对象进行操作,必须创建或者打开一个已经存在的对象并得到其句柄。理论上进程可以创建2^24 个句柄,但是句柄是存储在分页内存池的,因此实际可以创建的句柄的个数取决于可使用的内存的数量。
       只要一个进程知道了一个已经存在的对象(即使是其它的进程创建的对象)的名称并拥有所请求的访问就可以打开该对象并获得其句柄。内核对象句柄包含当前进程对于该对象的访问权限,包括允许的操作和禁止的操作。在创建一个对象或者获得一个已存在对象的句柄的时候,进程指定了期望在该句柄上进行的操作。每一种类型的对象都有其对应的权限的集合,比如事件对象拥有触发或者等待权限(或者两个都有),文件对象可以有读或者写权限(或者两个都有)。
       大多数内核对象支持一个内核对象对应多个句柄。这个机制使得一个应用程序可以拥有同一个内核对象的不同访问权限的句柄。比如,对于一个事件对象来说,可能句柄1只有触发事件的权限,同时事件2只有等待事件的权限。
       除了使用对象特定的打开函数来获得一个已经存在有名字的内核对象的句柄外,还有两种方法,其中一个获得对象句柄的方法为DuplicateHandle,详情可以查看MSDN 或者我之前的介绍文章,另一种是句柄继承。
        直到对象的最后一个句柄被关闭,对象才被从内存中清除。另外,系统管理文件对象的方法和其它的对象不同。文件对象包含一个成员—文件指针,指向文件中下一个将被读/写的字节的位置。无论系统何时创建一个新的文件句柄,系统创建一个新的文件对象。因此,磁盘上一个单独的文件可以对应多个文件对象。只有通过复制或者继承句柄的方式才可以创建多个指向同一个文件对象的句柄。
       下面列出了各种内核对象的创建函数以及销毁函数。创建函数还是一样,或者创建并返回一个句柄,或者返回一个已经存在的对象的句柄。销毁函数稍微有些不同,当对象的最后一个句柄被关闭的时候对象才真正的销毁。

内核对象 创建函数 销毁函数 访问令牌 CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken CloseHandle Change notification FindFirstChangeNotification FindCloseChangeNotification 通信设备 CreateFile CloseHandle 控制台输入 CreateFile, with CONIN$ CloseHandle 控制台屏幕缓冲 CreateFile, with CONOUT$ CloseHandle 桌面 GetThreadDesktop Applications cannot delete this object. 事件 CreateEvent, CreateEventEx, OpenEvent CloseHandle 事件日志 OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog 文件 CreateFile CloseHandle 文件映射 CreateFileMapping, OpenFileMapping CloseHandle 文件查找 FindFirstFile FindClose 堆 HeapCreate HeapDestroy I/O 完成端口 CreateIoCompletionPort HeapDestroy 作业 CreateJobObject CloseHandle 邮槽 CreateMailslot CloseHandle 内存资源提醒 CreateMemoryResourceNotification CloseHandle 模块 LoadLibrary, GetModuleHandle FreeLibrary 互斥体 CreateMutex, CreateMutexEx, OpenMutex CloseHandle 管道 CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe 进程 CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess 信号量 CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle 套接字 socket, accept closesocket 线程 CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread 定时器 CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle 更新资源 BeginUpdateResource EndUpdateResource 窗口站 GetProcessWindowStation Applications cannot delete this object.