亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以向Windows上的應用程序發送ctrl-C(SIGINT)嗎?

我可以向Windows上的應用程序發送ctrl-C(SIGINT)嗎?

湖上湖 2019-07-10 16:17:35
我可以向Windows上的應用程序發送ctrl-C(SIGINT)嗎?我(在過去)編寫了跨平臺(windows/unix)應用程序,當從命令行啟動時,這些應用程序處理用戶類型的應用程序??颂?C以同樣的方式組合(即干凈地終止應用程序)。是否可以在Windows上發送克特-C/SIGINT/等效于來自另一個(不相關)進程的進程,請求它干凈地終止(給它一個清理資源的機會等等)?
查看完整描述

3 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

我最近找到的解決方案是SendSignal第三方應用。作者列出了源代碼和可執行文件。我已經驗證了它在64位窗口下工作(作為32位程序運行,殺死另一個32位程序),但我還沒有弄清楚如何將代碼嵌入到windows程序(32位或64位)中。

它是如何運作的:

在深入了解調試器之后,我發現實際執行與ctrl中斷等信號相關的行為的入口點是核32!ctrlRoutine。該函數與ThreadProc具有相同的原型,因此可以直接與CreateRemoteThread一起使用,而無需注入代碼。然而,這不是一個出口的符號!它位于不同版本的Windows上不同的地址(甚至有不同的名稱)。該怎么辦?

這是我最后想出的解決辦法。我為我的應用程序安裝了一個控制臺ctrl處理程序,然后為我的應用程序生成一個ctrl中斷信號。當調用我的處理程序時,我會回顧堆棧的頂部,找出傳遞給內核32!BaseThreadStart的參數。我獲取第一個Param,它是所需的線程開始地址,它是內核32!CtrlRoutine的地址。然后我從我的處理程序返回,表明我已經處理了信號,我的應用程序不應該被終止。回到主線程中,我將等待內核32!CtrlRoutine的地址被檢索。一旦我得到了它,我就在目標進程中創建一個遠程線程,并使用已發現的開始地址。這將導致對目標進程中的ctrl處理程序進行評估,就好像ctrl中斷已被按下一樣!

好的是,只有目標進程受到影響,任何進程(即使是加窗口的進程)都可以成為目標。一個缺點是我的小應用程序不能在批處理文件中使用,因為它會在發送ctrl中斷事件時殺死它,以便發現kernel 32!ctrlRoutine的地址。

(在此之前)start如果在批處理文件中運行它。)


查看完整回答
反對 回復 2019-07-10
?
www說

TA貢獻1775條經驗 獲得超8個贊

我想我在這個問題上有點晚了,但無論如何,我會寫一些東西給任何有同樣問題的人。這和我給出的答案是一樣的這,這個問題。

我的問題是,我希望我的應用程序是一個GUI應用程序,但是執行的進程應該在沒有任何交互控制臺窗口的背景下運行。我認為當父進程是控制臺進程時,這個解決方案也應該有效。但是,您可能必須移除“create_no_Window”標志。

我設法用GenerateConsoleCtrlEvent()使用包裝程序。棘手之處在于,文檔對于如何使用它以及其中的缺陷并不十分清楚。

我的解決方案是基于所描述的這里..但這并沒有真正解釋所有的細節和錯誤,所以下面是如何讓它工作的細節。

創建一個新的助手應用程序“Helper.exe”。此應用程序將位于應用程序(父進程)和您希望關閉的子進程之間。它還將創建實際的子進程。必須有這個“中間人”進程,否則GenerateConsoleCtrlEvent()將失敗。

使用某種IPC機制從父進程到助手進程進行通信,幫助進程應該關閉子進程。當幫助程序獲得此事件時,它調用“GenerateConsoleCtrlEvent(CTRL_Break,0)”,該事件關閉自身和子進程。為此,我自己使用了一個事件對象,當父進程想要取消子進程時,它將完成該事件對象。

若要創建Helper.exe,請使用create_no_Window和create_new_process_group創建它。當創建子進程時,創建它時沒有標志(0),這意味著它將從其父進程派生控制臺。如果不這樣做,將導致它忽略事件。

非常重要的是,每一步都是這樣做的。我一直在嘗試各種不同的組合,但這種組合是唯一起作用的組合。您不能發送CTRL_C事件。它將返回成功,但將被忽略的過程。Ctrl_Break是唯一起作用的。這并不重要,因為它們最終都將調用ExitProcess()。

您也不能使用子進程id的進程組id調用GenerateConsoleCtrlEvent(),從而允許助手進程繼續運行。這也會失敗。

我花了一整天的時間想讓這件事奏效。這個解決方案對我有效,但如果任何人有任何補充,請做。我在網上到處搜索,發現很多人都有類似的問題,但對這個問題沒有明確的解決辦法。GenerateConsoleCtrlEvent()的工作方式也有點奇怪,所以如果有人知道更多關于它的細節,請分享。


查看完整回答
反對 回復 2019-07-10
  • 3 回答
  • 0 關注
  • 2355 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號