問題タブ [createprocess]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - NtCreateProcessとZwCreateProcessの違いは何ですか?
NtCreateProcess
との違いは何ZwCreateProcess
ですか?ntdll.dllでは、NtCreateProcess
とZwCreateProcess
がまったく同じアドレスを指している
c++ - Windows で CreateProcessW() を介して新しいプロセスを開始する UNICODE 環境ブロックはどのように見えますか?
基本的に、新しいプロセスを作成し、親プロセスからその環境を定義したいと考えています。CreateProcessW
(変更された) UNICODE 環境を使用して に渡したいのlpEnvironment
ですが、ANSII 環境ブロックと比較してコンテンツがどのように見えるべきかわかりません。
私が実際に見つけた唯一のドキュメントは、MSDN にあります。
ANSI 環境ブロックは 2 つのゼロ バイトで終了することに注意してください。1 つは最後の文字列用で、もう 1 つはブロックを終了するためのものです。Unicode 環境ブロックは、4 つのゼロ バイトで終了します。最後の文字列用に 2 つ、ブロックを終了するためにさらに 2 つです。
今、私はしようとしました
- 呼び出し
GetEnvironmentStrings
て子プロセスに渡します - 呼び出し
GetEnvironmentStringsW
て子プロセスに渡す - これらのブロックを追加の環境文字列で変更し、それを渡します
それらのどれも機能しません
私は本当にそれを機能させるために設定lpEnvironment
することしかできませんでしNULL
たが、今は親の処理環境を変更して元に戻す必要があります-それがここに行く方法ですか?
(私も設定しましたCREATE_UNICODE_ENVIRONMENT
)
環境ブロックの何が特別なのか、誰か教えてください。ものを使って呼び出すUNICODE
だけでうまくいきました...ASCII
CreateProcessA()
windows - Win32 CreateProcess: CREATE_UNICODE_ENVIRONMENT が *本当に* 必要になるのはいつですか?
CreateProcessのドキュメントには次のように記載されています (太字で強調しています)。
lpEnvironment [入力、オプション]
[...] lpEnvironment が指す環境ブロックに Unicode 文字が含まれている場合は、dwCreationFlags に CREATE_UNICODE_ENVIRONMENT が含まれていることを確認してください。このパラメーターが NULL で、親プロセスの環境ブロックに Unicode 文字が含まれている場合、dwCreationFlags に CREATE_UNICODE_ENVIRONMENT が含まれていることも確認する必要があります。
MSDN は間違っていて、フラグの意味を誇張していますか、それとも実際の要件ですか?
フラグを設定せず、機能しているように見えるコードを見たことがありますが、私の妄想的な部分は、MSDN の言うことを 100% 遵守したいと考えています。そうは言っても、極端に行かずに MSDN の規則に本当に従うことができるかどうかはわかりません。
lpEnvironment が NULL のときに CREATE_UNICODE_ENVIRONMENT を設定する (または設定しない) 必要があるのはばかげていると思います。
環境ブロックを渡さない場合、CreateProcess はブロック自体を取得する必要があります。その場合、ブロックのタイプを知ることは私よりも良い立場にあります。
ブロックに実際に Unicode 文字が含まれているかどうかを確認するにはどうすればよいですか?
ブロックを取得して、現在のコード ページ外の文字を検査する必要がありますか? (ここでは、MSDN が "Unicode 文字" と呼ぶのは、それを意味していると思います。)
env-block を取得する必要がある場合は、NULL ではなく lpEnvionment で渡すこともできますが、なぜ NULL を許可するのでしょうか?
環境ブロックを取得して検査する必要があるのは、CreateProcess のすべての呼び出し元にとって非常識な要件のようです。それは確かに API 自体が処理する必要があるものです。
「親プロセス」と言うとき、それは私のプロセスを意味するのでしょうか、それは新しい親になろうとしていますか、それとも私のプロセスの親を意味しますか? MSDN を最初に読んだとき、プロセスを開始した CreateProcess 呼び出しがANSI または Unicode 環境ブロックを渡されたかどうかを何らかの方法で判断する必要があると思いましたが、そうではありません。
NT ベースの OS では、プロセスの作成時に必要に応じて ANSI から変換された Unicode 環境ブロックがすべてのプロセスにあり、CreateProcess にそのまま渡されたデータのブロックにプロセスが固執しないと想定しています。
(もしかしたら、この全体は、OS 自体が Unicode ではなかった Win9x 時代の名残なのだろうか? それでも、アプリケーション コードが OS 自体よりも優れた決定を下す方法や、そうすべき理由がわかりません。することが期待されます。)
フラグを設定しないコードだけでなく、コンパイル時に UNICODE が定義されている場合は常にフラグを設定するコードを見てきました。要件が実行時の env ブロックにある場合、およびコードが外部プロセスにロードされた DLL にある可能性がある場合、それは意味がありません。
env ブロックはプロセス全体であるため、コンパイル時に定義されている UNICODE は無関係に見えます。
CreateProcessA または CreateProcessW のどちらを呼び出すかだけの問題である場合、ブロックが NULL の場合、フラグは暗黙的でなければならないため、それも意味がありません。
私自身のコードでは、この質問を避け、常に環境ブロックの Unicode コピーを (GetEnvironmentStringsW 経由で) 取得し、常にそれを CreateProcess に渡し、常に CREATE_UNICODE_ENVIRONMENT を設定することにしました。これが、MSDN の記述に基づいて 100% 正しいと判断できる唯一の方法です。
確かに私がやっていることは冗長ですが。CreateProcess はそれほど愚かではありませんね。
一方、これは私たちが話している CreateProcess です。これは最適に設計された API ではなく、他にも多くの落とし穴があります (頭の中で):
- 引数文字列が const の場合、インプレースで変更されるため失敗します。
- 最初の引数をオプションにすることで、2 番目の引数で exe-path を引用するのを忘れないようにします。
- 最初の引数で明示的に指定されている場合でも、2 番目の引数で適切に引用された exe-path を要求します。
したがって、それがインテリジェントに動作する、または呼び出し元の雑用を処理する可能性が高いと想定するのはおそらく正しくありません...
自分のコードからパラノイアのがらくたを削除するか、他のすべてのコードに追加するかはわかりません。ああ。:-)
2010 年 11 月 18 日追加:
少なくとも Windows 2000 から Windows 7 まで、env-block が NULL の場合、フラグは無関係であるように思われます。以下の私のテストを参照してください。
明らかに、これは、フラグが将来のすべての OS で常に無関係であるという決定的なものではありませんが、それ以外の場合はどうなるかわかりません。
子を作成しようとしている親を作成した祖父母がいるとします。
OS が常に親の環境ブロックを Unicode として格納する場合 (祖父母が ANSI ブロックを渡した場合に親の作成中に ANSI から変換した場合)、親が NULL ブロックを渡すときにフラグに注意を払うと、CreateProcess はエラーになります。 . CreateProcess は、Child が継承するブロックが常に Unicode であることを認識している必要があります。
あるいは、OS は、親の環境ブロックを祖父母からのものとまったく同じように保存する場合があります。(これはありそうにないようですが、可能です。) その場合、親は、祖父母が通過したブロックのタイプを検出する方法がありません。ここでも、CreateProcess はブロックのタイプを認識し、フラグを無視する必要があります。
これは私が今朝書いたテストで、さまざまな方法で子プロセスを起動し、子プロセスが env-var (簡潔にするために「OS」変数のみ) を報告するようにします。
これは以下を出力します:
env-block が NULL の場合、フラグは関係ありません。
NULL でない場合は、CreateProcess に void* の背後にあるものを伝える必要があるため、フラグは重要です (ただし、それは明らかであり、問題は純粋に NULL の場合に関するものです)。
env-block が NULL のときにフラグが問題になる可能性があるシナリオを考えられる人はいますか? そして、そのシナリオでは、OS 自体よりもアプリの方がフラグの正しい値をどのように知っているのでしょうか?
winapi - AppCertDlls:ウイルスによるWin32でのプロセス作成の速度低下
私は約2か月間、Windows XPHomeSP3で多額のプロセス作成ペナルティを享受してきました。問題は、シェルスクリプト(ちなみに、Cygwin上のbashスクリプト)、Makefile、SpringSource Tool SuiteインストーラーなどのIzPackパッケージの解凍(多数の個別のunpack200.exe
JAR抽出プロセス)など、多くのプロセスを作成するタスクで最も明白で厄介です。 )。bashスクリプトの診断出力を監視するか、タスクマネージャーにプロセスが表示されるのを監視することで、プロセスが作成されると確信しています。プロセスが稼働すると、目立った遅延はありません。
Cygwinのみが影響を受けていると最初に誤って考え、Cygwin DLLのバグを疑っていたため、Cygwinメーリングリストでその問題を報告しました。
Win32(XPホーム)での更新後の速度低下- (Cygwinリストへの私の投稿へのリンク)
Windowsに存在すると思われるプロセス作成フックに何かががらくたをインストールしたのではないかと思います。(Javaのセキュリティマネージャと同様です。)ウイルス、またはセキュリティソフトウェア?私も意識的にインストールしていません。また、Microsoft Updateの不具合も疑われましたが、今では修正されていると思います。
私の知る限り、Win32のプロセスはによって作成されCreateProcess
ます。
プロセスの作成に時間がかかる理由と、ここで何が起こっているのかをどのように知ることができますか?Linuxのようなものstrace
、あるいはもっと良いものはありますか?
c++ - C++ CreateProcess SW_HIDE firefox, chrome, safari
I'm writing a web testing framework for windows that uses multiple browsers to test web apps. I want to launch the browsers hidden but it's not working.
I'm using CreateProcess to start the browsers with the SW_HIDE flag
It works fine for internet explorer and other apps, but fails with firefox and other browsers. I'm aware that a process is able to choose whether or not to follow the passed flags. Is there any way i can force it to start hidden?
I can probably wait until the window shows up and then hide it by getting a handle to the open window. But I'm looking for cleaner solution.
c++ - Windows CE で CreateProcess を使用して起動されたアプリケーションがタスク マネージャーにアプリケーションとして表示されない
CreateProcess() 呼び出しを使用して、C++ dll から Windows CE 3.0 でアプリケーションを起動します。起動されたアプリケーションは、要件に従って実行されます。しかし、このアプリケーションはタスクマネージャにアプリケーションとしてリストされていません。タスク マネージャーの設定がすべてのプロセスを表示するように変更された場合にのみ表示されます。
起動したプロセスをタスク マネージャーでアプリケーションとして表示するにはどうすればよいですか?
(windows mobile 6.1を使用しており、起動するアプリはac#.net CFアプリです)
java - CreateProcessW の失敗 (ACESS_DENIED)
私は現在、アプリケーションが提供する情報が必要なため、CreateProcessW()
代わりに使用するようにアプリケーションを変換しています。Runtime.exec()
ただし、CreateProcessW() の呼び出しはエラー コード 5 (ACCESS DENIED) で失敗します。同じケースで Runtime.exec() が正常に実行されるため、これが発生する理由を見つけることができませんでした。
私のエラーは、次のコード スニペット、メソッド呼び出し、および jna インターフェイスのいずれかにある可能性があります。
私の CreateProcessW の定義
追加情報:
- Runtime.exec() は指定された文字列で成功します
- StartupInfo のサイズが設定されている
- 使用したテスト環境: WinXP SP3 および Netbeans 6.9.1
使用されるパラメーターの例:
- お名前: moviemk.exe
- ディレクトリ: C:\Programme\Movie Maker\
異なるパスでもテストされているため、空白の問題ではありません
ありがとう
アップデート:
結局のところ、エラーは、呼び出しコードが作業ディレクトリとexeパスをチェックした後に切り替えたことが原因でした。結果としてアクセスが拒否されたため、実際には少なくともexeが見つかったと思いました。その問題に対処するために IllegalArgumentException を追加します。
exeが作業ディレクトリに関連しているという追加のエラーがあったので、その答えを受け入れます。助けてくれてありがとう。
c++ - 昇格と待機が必要な子プロセスを実行するにはどうすればよいですか?
Win 7/UACは私を夢中にさせています。
C ++アプリケーション内から、Windows 7で昇格が必要な実行可能ファイルを実行する必要があります。これを実行し、完了するのを待ってから続行します。これを行う最も簡単な方法は何ですか?
私は通常、を介してこの種のことをCreateProcess()
行いますが、昇格を必要とする実行可能ファイルでは失敗します。
cmd.exe /c ...
を使用して実行してみCreateProcess
ましたが、これは機能しますが、醜いcmdターミナルウィンドウがポップアップします。
昇格できるように読んでいShellExecute()
ますが、を使用しているときにexeが終了するのを待つのは簡単ではないようShellExecute()
です。仕事のような単純なものはありsystem()
ますか?
他のアイデアは大歓迎です!
windows - CreateProcess を呼び出した後に砂時計を避ける
私の Win32 アプリでは、ビデオ プレビュー用に ffplay.exe を埋め込みます。うまく機能しますが、プレビューを開始するたびに、カーソルが「ビジー」になります。つまり、矢印+砂時計です。それは避けたい。