PsCreateSystemThread 関数 (wdm.h)

PsCreateSystemThread ルーチンは、カーネル モードで実行され、スレッドのハンドルを返すシステム スレッドを作成します。

構文

NTSTATUS PsCreateSystemThread(
  [out]           PHANDLE            ThreadHandle,
  [in]            ULONG              DesiredAccess,
  [in, optional]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional]  HANDLE             ProcessHandle,
  [out, optional] PCLIENT_ID         ClientId,
  [in]            PKSTART_ROUTINE    StartRoutine,
  [in, optional]  PVOID              StartContext
);

パラメーター

[out] ThreadHandle

ハンドルを受け取る変数を指します。 ハンドルが使用されなくなったら、ドライバーは ZwClose でハンドルを閉じる必要があります。 このハンドルは、Windows Vista 以降のバージョンの Windows のカーネル ハンドルです。 以前のバージョンの Windows では、ハンドルがカーネル ハンドルではない可能性があります。

[in] DesiredAccess

作成 されたスレッド へのアクセスの要求された種類を表すACCESS_MASK値を指定します。

[in, optional] ObjectAttributes

オブジェクトの属性を指定する構造体を指します。 OBJ_PERMANENT、OBJ_EXCLUSIVE、およびOBJ_OPENIFは、スレッド オブジェクトの有効な属性ではありません。 Windows XP 以降のバージョンの Windows では、呼び出し元がシステム プロセス コンテキストで実行されていない場合は、 ObjectAttributes のOBJ_KERNEL_HANDLE属性を設定する必要があります。 Microsoft Windows 2000 および Windows 98/Me のドライバーは、システム プロセス コンテキストから PsCreateSystemThread のみを呼び出す必要があります。 Windows Vista 以降のバージョンの Windows の場合、ハンドルはカーネル ハンドルになります。

[in, optional] ProcessHandle

スレッドを実行するアドレス空間を持つ プロセスのオープン ハンドルを指定します。 呼び出し元のスレッドは、このプロセスにPROCESS_CREATE_THREADアクセスできる必要があります。 このパラメーターが指定されていない場合、スレッドは初期システム プロセスで作成されます。 この値は、ドライバーによって作成されたスレッドの 場合は NULL である 必要があります。 Ntddk.h で定義されている NtCurrentProcess マクロを使用して、現在のプロセスを指定します。

[out, optional] ClientId

新しいスレッドのクライアント識別子を受け取る構造体を指します。 この値は、ドライバーによって作成されたスレッドの 場合は NULL である 必要があります。

[in] StartRoutine

新しく作成されたシステム スレッドのエントリ ポイント。 このパラメーターは、呼び出し元によって提供される StartContext パラメーター値である 1 つの引数を受け取る ThreadStart ルーチンへの関数ポインターです。

[in, optional] StartContext

実行の開始時にスレッドに渡される 1 つの引数を指定します。

戻り値

PsCreateSystemThread は、スレッドが作成された場合STATUS_SUCCESSを返します。

注釈

デバイス専用スレッドを作成するドライバーは、初期化時または I/O 要求がこのようなドライバーのディスパッチ ルーチンに入り始めるとき、このルーチンを呼び出します。 たとえば、ドライバーは、非同期デバイス制御要求を受信したときに、このようなスレッドを作成する場合があります。

PsCreateSystemThread は、システム内で個別の実行スレッドを開始するカーネル モード スレッドを作成します。 このようなシステム スレッドには TEB またはユーザー モードのコンテキストがなく、カーネル モードでのみ実行されます。

入力 ProcessHandleNULL の場合、作成されたスレッドはシステム プロセスに関連付けられます。 このようなスレッドは、システムがシャットダウンされるか、 PsTerminateSystemThread を呼び出してスレッドが終了するまで実行を続けます。

システム プロセス以外のプロセス コンテキストで実行されるドライバー ルーチンは、PsCreateSystemThreadObjectAttributes パラメーターのOBJ_KERNEL_HANDLE属性を設定する必要があります。 これにより、 PsCreateSystemThread によって返されるハンドルの使用が、カーネル モードで実行されているプロセスに制限されます。 それ以外の場合は、ドライバーが実行されているコンテキスト内のプロセスによってスレッド ハンドルにアクセスできます。 ドライバーは、次のようにOBJ_KERNEL_HANDLE属性を設定できます。

InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

StartContext パラメーターの詳細については、「ThreadStart」を参照してください。

新しく作成されたシステム スレッドは、 通常のカーネル APC が 無効になっているクリティカル リージョン内のPASSIVE_LEVELで実行されます。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlPsPassive(wdm)

こちらもご覧ください

InitializeObjectAttributes

KeSetBasePriorityThread

KeSetPriorityThread

PsTerminateSystemThread

Threadstart

ZwSetInformationThread