OpenProcessToken
この関数は、MSDNによると
プロセスに関連付けられているアクセストークンを開きます。
とのことである。アクセストークンというのが何かはよくわからないが、ユーザーのセキュリティに関する情報であることは確かである。ここでは、TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGESという特権を取得してみた。
これらは、ここのシャットダウンに関する説明を元にするとこの時に特権を変更できるアクセス(TOKEN_ADJUST_PRIVILEGES)と、情報を取得するためのアクセス(TOKEN_QUERY)を指定しています。
とのことである。TOKEN_QUERYをはずすと後のAdjustTokenPrivilegesで引っかかる(FALSE)が帰ってきたりする。ちなみに、3番目の引数は関数が成功した場合トークンのハンドルが返ってくるが必要なくなった時に当然CloseHandleする必要がある。
LookupPrivilegeValue
この関数は、MSDNによると
指定されたシステムで使われているローカル一意識別子(LUID)を取得し、指定された特権名をローカルで表現します。
とのことである。今回は、SE_INC_BASE_PRIORITY_NAMEのLUIDを取得するということでこれを使っている。実際関数を使ってみると
Luid {LowPart=14 HighPart=0 } _LUID
このような値が返ってきた。
AdjustTokenPrivileges
最後に使うこの関数は、MSDNによると
指定したアクセストークン内の特権を有効または無効にします。TOKEN_ADJUST_PRIVILEGES アクセス権が必要です。
とのことである。TOKEN_ADJUST_PRIVILEGESは、先に指定しているので問題ないだろう。今回の場合特権を得るため、 BOOL DisableAllPrivilegesはFALSEにしておく必要がある。NewStateで新しい特権を設定しPreviousStateで元の状態を受け取る。元の状態が特にいらない場合は特に設定しなくてもよいとのこと。
コード
最終的にはこのような流れになる。チェックは各自作っていただければ。
1 2 3 4 5 6 7 8 9 10 11 12 |
OpenProcessToken( hp, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &ht ); LUID l; LookupPrivilegeValue( NULL, SE_INC_BASE_PRIORITY_NAME, &l ); TOKEN_PRIVILEGES n; n.PrivilegeCount = 1; n.Privileges[ 0 ].Luid = l; n.Privileges[ 0 ].Attributes = SE_PRIVILEGE_ENABLED; DWORD r; AdjustTokenPrivileges( ht, FALSE, &n, 0, NULL, NULL ); |
一連の流れは、ExitWindowsEx( EWX_SHUTDOWN, 0 );を使う場合にも応用できる。
ピンバック: VC++ Get&SetProcessWorkingSetSizeの使い方 | 豆知識