Thứ Hai, 29 tháng 7, 2013

Objects and Handles

Windows kernel quản lý objects sử dụng một thành phần quản lý đối tượng trung tâm (a centralized object manager component). Object manager chịu trách nhiệm cho tất cả kernel objects ví dụ như sections, file, và device objects, synchronization objects, processes, và threads. Điều quan trọng để hiểu đó là thành phần này (object manager) chỉ quản lý các đối tượng liên quan đến kernel. Các đối tượng liên quan đến GUI ví dụ như windows, menus, và device contexts được quản lý bởi các object managers riêng biệt mà được implemented bên trong WIN32K.SYS

Viewing objects từ user mode, như hầu hết các ứng dụng vẫn làm, làm cho ta thấy chúng có cái gì đó hơi huyền bí. Điều quan trọng là phải hiểu rằng bản chất nằm phía ẩn sau tất cả các objects chỉ đơn thuần là các cấu trúc dữ liệu -- chúng thường được lưu trong nonpaged pool kernel memory. Tất cả objects sử dụng một standard object header, header này được sử dụng để mô tả các đặc tính cơ bản của đối tượng đó ví dụ như kiểu của đối tượng, reference count, name,... Object manager không biết gì về bất cứ các cấu trúc dữ liệu riêng biệt nào, nó chỉ biết header chung.

Kernel code thường truy nhập objects qua việc sử dụng direct pointers trỏ đến object data structures, nhưng các chương trình ứng dụng rõ ràng không làm như vậy. Thay vào đó, applications sử dụng handles để truy nhập từng đối tượng. Một handle là một process numeric identifier, cơ bản nó là một chỉ số (index) bên trong process's private handle table. Mỗi entry trong handle table chứa một con trỏ trỏ đến đối tượng phía dưới, đó là cách hệ thống liên kết handles với objects. Cùng với object pointer, mỗi handle entry còn chứa access mask dùng để xác định kiểu operations nào có thể thực hiện được trên đối tượng sử dụng handle đó.

Access mask của đối tượng là một số nguyên 32-bit được chia thành 2 16-bit access flag words. Upper word chứa generic access flags như là GENERIC_READ và  GENERIC_WRITE . Lower word chứa object specific flags như là PROCESS_TERMINATE , những gì cho phép bạn kết thúc một process sử dụng handle của nó, hoặc KEY_ENUMERATE _SUB_KEYS , những gì cho phép bạn liệt kê các subkeys của một open registry key. Tất cả access rights constants được định nghĩa trong WinNT.h trong Microsoft Platform SDK.

Đối với mọi object, kernel duy trì 2 reference counts: a kernel reference count và a handle count. Objects chỉ được xóa đi mỗi khi chúng có zero kernel references và zero handles.

Named objects

Một vài kernel objects có thể được đặt tên, những gì hỗ trợ một cách để nhận dạng chúng một cách duy nhất trong toàn hệ thống. Giả sử rằng, ví dụ, 2 processes đồng bộ một số operation giữa chúng. Một cách tiếp cận tiêu biểu đó là sử dụng một mutex object, nhưng làm thế nào chúng biết được chúng đang xử lý chung mutex? Kernel supports object names với ý nghĩa là nhận dạng từng objects. Trong ví dụ của chúng ta cả 2 processes có thể thử tạo một mutex có tên là MyMutex. Bất cứ ai mà thực sự tạo đối tượng MyMutex đầu tiên, chương trình thứ 2 sẽ chỉ mở một new handle đến object. Điều quan trọng là sử dụng một common name đảm bảo rằng cả 2 processes đang xử lý cùng một đối tượng. Khi một API tạo một đối tượng ví dụ như CreateMutex được gọi cho một đối tượng đã tồn tại, kernel tự động xác định đối tượng đó trong global table và return một handle đến nó.

Named objects được sắp xếp trong hierarchical directories, nhưng Win32 API giới hạn các ứng dụng user-mode truy nhập đến các thư mục này. Dưới đây là những thư mục quan trọng:

BaseNamedObjects  thư mục này là nơi tất cả conventional Win32 named objects, ví dụ như mutexes, được lưu. Tất cả named-object Win32 APIs tự động sử dụng thư mục này -- các chương trình ứng dụng không có quyền điều khiển trong thư mục này.

Devices Thư mục này chức device objects cho tất cả các active system devices hiện hành. Nói chung mỗi device driver đều có ít nhất một entry trong thư mục này, thậm chí những driver này không được kết nối đến bất cứ thiết bị vật lý nào. Nó bao gồm logical devices như là Tcp , và physical devices như Harddisk0 . Win32 APIs có thể không bao giờ access trực tiếp trong thư mục này - họ sử dụng symbolic links. 

GLOBAL ?? Thư mục này là một symbolic link. Symbolic links là old-style names cho kernel objects. Old-style naming là cơ chế đặt tên theo DOS. Nghĩ về việc gán cho mỗi drive một letter, ví dụ C:, và về việc truy nhập physical devices sử dụng một 8-letter name kết thúc với một colon, ví dụ COM1: Những thứ mới kể đó là DOS names, và trong modern versions của Windows chúng được linked đến các thiết bị thực trong Devices directive sử dụng symbolic links. Win32 applications chỉ có thể access devices sử dụng symbolic link names của họ.

Một vài kernel objects không được đặt tên và chỉ được nhận dạng bởi các handles của chúng hoặc kernel object pointers. Một ví dụ điển hình cho đối tượng loại này là thread object , những gì được tạo mà không cần đến tên và chỉ được biểu diễn bởi handles (từ usermode) hoặc bởi direct pointer trong object (từ kernel mode).

Không có nhận xét nào:

Đăng nhận xét