オブジェクトマネージャ

Windows のオブジェクト マネージャーは、名前空間を使用して階層的に分類されます。

オブジェクトマネージャ(内部的にはObと呼ばれます)は、 Windows Executiveの一部として実装され、Windowsリソースを管理するサブシステムです。リソースは論理オブジェクトとして表示され、それぞれが名前空間に存在し、分類されます。リソースには、物理​​デバイス、ボリューム上のファイルやフォルダ、レジストリキー、さらには実行中のプロセスなどが含まれます。リソースを表すすべてのオブジェクトには、リソースに関するプロパティやその他のメタデータが含まれますObject Type。オブジェクトマネージャは共有リソースであり、リソースを処理するすべてのサブシステムはオブジェクトマネージャを経由する必要があります。

建築

Windows NTのアーキテクチャにおけるオブジェクトマネージャ

オブジェクトマネージャは、 Windows NTシリーズのオペレーティングシステムにおける集中型リソースブローカーであり、プロセスに割り当てられたリソースを追跡します。リソースに依存せず、デバイスハンドルやファイルハンドルなど、あらゆる種類のリソースを管理できます。すべてのリソースはオブジェクトとして表現され、それぞれが分類のための論理名前空間に属し、リソースの種類を表す型を持ちます。型はプロパティを通じてリソースの機能を公開します。オブジェクトは、すべてのプロセスが使用を完了するまで利用可能な状態を保ちます。オブジェクトマネージャは、参照カウントによって現在使用中のオブジェクトと所有権の記録を維持します。プロセスへのリソース割り当て状態を変更するシステムコールはすべて、オブジェクトマネージャを経由します。

オブジェクトは、カーネル オブジェクトまたはエグゼクティブ オブジェクトのいずれかになります。カーネル オブジェクトは、物理デバイスなどのプリミティブ リソース、または同期などのサービスを表します。これらは、他の種類の OS サービスを実装するために必要なものです。カーネル オブジェクトはユーザー モードコードには公開されず、カーネル コードに制限されます。カーネルの外部で実行されるアプリケーションとサービスは、メモリ マネージャ、スケジューラ、I/O サブシステムなどのコンポーネントと共にWindows Executiveによって公開されるExecutive オブジェクトを使用します。エグゼクティブ オブジェクトは、1 つ以上のカーネル オブジェクトをカプセル化し、カーネルお​​よびカーネルを介したリソースだけでなく、カーネルが提供するサービスの拡張セットも公開します。[説明が必要]アプリケーション自体は、特定のサービスを提供する 1 つ以上の Executive オブジェクトとサーフェス オブジェクトをラップできます[定義が必要]。エグゼクティブ オブジェクトは、環境サブシステム (Win32 サブシステム、OS/2 サブシステム、POSIX サブシステムなど) によっても使用され、それぞれの環境の機能を実装します。

オブジェクトが作成または開かれるたびに、ハンドルと呼ばれるインスタンスへの参照が作成されます。オブジェクトマネージャは、オブジェクトの名前とハンドルの両方でオブジェクトをインデックス付けします。ハンドルによるオブジェクト参照は、名前の変換を回避できるため、高速です。ハンドルは、プロセスのハンドルテーブルにエントリを作成することでプロセスに関連付けられます。ハンドルテーブルには、プロセスが所有するハンドルがリストされ、プロセス間で転送できます。プロセスはオブジェクトを使用するためにハンドルを所有している必要があり、一度に最大16,000,000個のハンドルを所有できます。プロセスは作成時に、デフォルトのオブジェクトセットへのハンドルを取得します。ハンドルには、ファイルハンドル、イベントハンドル、プロセスハンドルなど、さまざまな種類があります。これらは対象オブジェクトのタイプを識別しますが、それらを介して実行できる操作は区別しません。この一貫性により、プログラムでさまざまな種類のオブジェクトを統一的に処理できます。ハンドルの作成とハンドルからのオブジェクトの解決は、オブジェクトマネージャによって排他的に管理されるため、リソースの使用状況が見逃されることはありません。

Windows NT によって公開される Executive オブジェクトの種類は次のとおりです。

タイプ説明ハンドルを取得するためのシステムコール
ディレクトリコンテナは他のカーネルオブジェクトを保持します。複数レベルのネストされたディレクトリが、すべてのカーネルオブジェクトを単一のツリーに整理します。NtCreateDirectoryObject
NtOpenDirectoryObject
プロセス仮想アドレスおよび制御情報とともに実行可能なスレッドのコレクション。NtCreateProcess
NtOpenProcess
プロセス内で実行中のコードを含むエンティティ。NtCreateThread
NtOpenThread
仕事プロセスの集合。NtCreateJobObject
NtOpenJobObject
ファイル開いているファイルディレクトリ、またはI/Oデバイス。NtCreateFile
NtOpenFile
セクションオプションでファイルまたはページ ファイルによってバックアップされるメモリの領域NtCreateSection
NtOpenSection
アクセストークンプロセスまたはスレッドの ID、プロパティ、特権、およびアクセス権。NtCreateToken
NtDuplicateToken
NtOpenProcessToken
NtOpenThreadToken
イベント何らかの情報をカプセル化し、プロセスに何かを通知するために使用されるオブジェクト。NtCreateEvent
NtOpenEvent
セマフォ/ミューテックス他のリソースへのアクセスをシリアル化するオブジェクト。NtCreateSemaphore
NtOpenSemaphore
タイマー一定の間隔でプロセスに通知するオブジェクト。NtCreateTimer
NtOpenTimer
レジストリキーNtCreateKey
NtOpenKey
デスクトップGUI要素を格納する論理表示サーフェス。なし
クリップボード他のオブジェクト用の一時リポジトリ。なし
ウィンドウステーションデスクトップ オブジェクトのグループ、1 つのクリップボード、およびその他のユーザー オブジェクトを含むオブジェクト。なし
シンボリックリンク別のオブジェクトへの参照。これを介して参照先のオブジェクトを使用できます。NtCreateSymbolicLinkObject
NtOpenSymbolicLinkObject

オブジェクト構造

オブジェクト マネージャーによって管理される各オブジェクトには、ヘッダーと本体があります。ヘッダーにはオブジェクト マネージャーで使用される状態情報が含まれ、本体にはオブジェクト固有のデータとそれが公開するサービスが含まれます。オブジェクト ヘッダーにはPropertiesObject Name(オブジェクトを識別する)、Object Directory(オブジェクトが属するカテゴリ)、Security Descriptors(オブジェクトへのアクセス権)、Quota Charges(オブジェクトのリソース使用情報)、Open handle count(オブジェクトの識別子であるハンドルが開かれた回数)、Open handle list(オブジェクトへのライブ参照を持つプロセスのリスト)、Reference count(オブジェクトへのライブ参照の数)、およびType(オブジェクト本体の構造を識別するオブジェクト) などの、 として公開される特定のデータが含まれます。

オブジェクトTypeには、オブジェクトの型に固有のプロパティと、オブジェクトが提供するサービスを実装する静的メソッドが含まれています。オブジェクト マネージャーで管理されるオブジェクトは、少なくとも、Close(オブジェクトへのハンドルを閉じる)、Duplicate(別のプロセスがオブジェクトへの共有アクセスを取得できるように、オブジェクトへの別のハンドルを作成する)、Query object(オブジェクトの属性とプロパティに関する情報の収集)、Query security(オブジェクトのセキュリティ記述子をSet security取得する)、 (セキュリティ アクセスを変更する)、Wait(特定のイベントを介して 1 つ以上のオブジェクトと同期する) という定義済みのサービス セットを提供する必要があります。型オブジェクトには、型名、非ページ メモリに割り当てるかどうか、アクセス権、同期情報など、いくつかの共通属性もあります。同じ型のすべてのインスタンスは同じ型オブジェクトを共有し、型オブジェクトは 1 回だけインスタンス化されます。新しいオブジェクト型は、オブジェクトの状態を公開するプロパティと、オブジェクトが提供するサービスを公開するメソッドをオブジェクトに付与することで作成できます。

Object nameは、オブジェクトに説明的な ID を与え、オブジェクトの検索を容易にするために使用されます。オブジェクト マネージャーは、管理対象のオブジェクトにすでに割り当てられている名前のリストを保持し、名前をインスタンスにマップします。ほとんどのオブジェクト アクセスはハンドルを介して行われるため、オブジェクト参照に解決するために名前を検索することが必ずしも必要ではありません。検索は、オブジェクトが作成された時点 (新しいオブジェクトが一意の名前を持っていることを確認するため)、またはプロセスが明示的に名前でオブジェクトにアクセスした時点のみ実行されます。は、Object directoriesタイプに従って分類するために使用されます。定義済みディレクトリには、 \??alias \DosDevices(デバイス名)、\BaseNamedObjects(ミューテックス、イベント、セマフォ、待機可能タイマー、およびセクション オブジェクト)、\Callback(コールバック関数)、\Device\Driver\FileSystem(言語テーブル)、(タイプ オブジェクト)、( RPCポート) 、 (セキュリティ サブシステム オブジェクト)、および(ウィンドウ サブシステム オブジェクト) があります。オブジェクトは\KnownDlls名前空間にも属します。各ユーザー セッションには、異なる名前空間が割り当てられます。すべてのセッション間で共有されるオブジェクトはGLOBAL名前空間にあり、(ログオン)セッション固有のオブジェクトは特定の(ログオン)セッション名前空間にあります。\Nls\ObjectTypes\RPC Control\Security\Windows

OBJECT_ATTRIBUTES 構造:

typedef struct _OBJECT_ATTRIBUTES { ULONG長さ; HANDLE RootDirectory ; PUNICODE_STRING ObjectName ; ULONG属性; PSECURITY_DESCRIPTOR SecurityDescriptor ; PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService ; } OBJECT_ATTRIBUTES * POBJECT_ATTRIBUTES ;                 

Attributes メンバーは 0、または次のフラグの組み合わせになります。

OBJ_INHERITOBJ_PERMANENTOBJ_排他OBJ_CASE_INSENSITIVEOBJ_OPENIFOBJ_OPENLINKOBJ_カーネル_ハンドル

使用法

オブジェクトマネージャのパスは多くのWindows APIファイル関数で利用可能ですが、ローカル名前空間の\\?\\\.\のようなWin32名でもほとんどの用途には十分です。 [1] Win32ユーザーモード関数で前者を使用すると\??に直接変換されますが、\??を使用するとNT形式ではパス名の拡張が無効にならないため、依然として異なります。[2]

オブジェクトマネージャの名前空間を探索するツールが利用可能です。これには、 Sysinternalsの32ビット版WinObj [3]や64ビット版WinObjEx64 [4]などがあります。

参照

参考文献

  1. ^ 「ファイル、パス、名前空間の命名 - Win32 アプリ」. docs.microsoft.com . 2024年8月28日.
  2. ^ 「winapi - \??\ パスと \\?\ パスには違いがありますか?」。Stack Overflow
  3. ^ 「WinObj - Windows Sysinternals」. docs.microsoft.com . 2023年7月26日.
  4. ^ “hfiref0x/WinObjEx64: Windows オブジェクト エクスプローラー 64 ビット”. GitHub . 2020年2月20日.
  • オブジェクト マネージャー ルーチン (Windows ドライバー)
  • チャンネル9インタビュー
「https://en.wikipedia.org/w/index.php?title=Object_Manager&oldid=1305703163」から取得