0

基本的なスレッド マネージャーを作成しようとしています。以前の質問で、私が悪いコードを提示したのを見たことがあるかもしれませんが、私はまだそのコードに取り組んでいます! しかし、関数 GetExitCodeThread(HANDLE, LPDWORD) を呼び出せるようにしたいので行き詰まっていますが、これを実装するのに問題があります。私が遭遇した最初の問題は、何をする必要があるかを理解したと思いますが、それを実装する方法がわかりません。私は元々、セキュリティ属性を NULL に設定して CreateThread を呼び出していましたが、その外観から、それを THREAD_QUERY_INFORMATION に設定する必要がありますが、必要な LPSECURITY_ATTRIBUTES 構造を埋める方法がわかりません。msdn の構造は次のとおりです。

typedef struct _SECURITY_ATTRIBUTES {
  DWORD  nLength;
  LPVOID lpSecurityDescriptor;
  BOOL   bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

しかし、それを THREAD_QUERY_INFORMATION で埋める方法がわかりません。また、構造の他の部分を何で埋めるかがわかりません。

スレッド作成のセキュリティ属性を設定すれば、GetExitCodeThread を呼び出すことができ、コードが機能するはずだと思います...スレッドの作成中にセキュリティ属性を設定するコードの例はありますか?の参照?また、Windows ライブラリをよりよく理解するための推奨事項はありますか?

4

1 に答える 1

1

引数はlpThreadAttributes、ハンドルが継承可能かどうか、およびスレッド オブジェクトに設定されているセキュリティ アクセス許可を決定します。によって返されるハンドルに付与されるセキュリティ アクセスには影響しません。CreateThreadこれは常にTHREAD_ALL_ACCESSです。

同様に、新しいスレッド自体が呼び出すときに返されるハンドルには、GetCurrentThreadサポートされていない古いバージョンの Windows を除いて、常に完全なアクセス権があります。

後で追加のハンドルを取得するために使用するOpenThread場合、または外部プロセスがOpenThreadハンドルを取得するために使用しようとした場合は、スレッド セキュリティのアクセス許可が有効になります。

サポートされているバージョンの Windows では、スレッド オブジェクトの既定のセキュリティ アクセス許可は (ほぼ?) 常に適切であるため、 または のいずれlpThreadAttributesかにするlpSecurityDescriptor必要がありますNULL。暗号化、認証、またはその他の特に機密性の高いタスクを扱うソフトウェアは、まれにデフォルト以外のスレッド セキュリティ アクセス許可を使用する場合があります。(これが役立つ有用な目的は思いつきませんが、適切な奇妙なケースがいくつかあるかもしれません。)

古いバージョンの Windows ではlpSecurityDescriptor、スレッドの呼び出しCreateThreadが別のユーザーを偽装しているかどうかを指定する必要がある場合がありますが、 CreateThread.

これについては、MSDN のドキュメントでCreateThread詳しく説明されています。

于 2013-01-10T01:12:32.967 に答える