的write方法有哪些參數_向子進程傳遞大量數據的方法

如何傳遞大型數據給子進程

昨天的一篇文章中,我們說到如果想向一個子進程傳輸多于32767個字符的數據,我們需要尋找其他的方法(而不是命令行參數)來實現。

我們能想到的第一個方法是:WM_COPYDATA。當子進程創建并進入消息循環后,我們使用FindWindow來尋找進程的窗口并發送WM_COPYDATA消息。但是,這種方法有幾個問題:

> 你需要尋找一種方法確定子進程確實已經創建了目標窗口并進入消息循環,這樣才可以進行窗口查找。(提示:可以使用WaitForInputIdle這個方法)

> 你需要確保我們使用FindWindow查找到的窗口確實是你希望得到的那個,因為如果其他進程的窗口碰巧也有相同的標題或者窗口類,則你可能得到的不是目標窗口。又或者,有多個相同的子進程實例,也會創建同樣的窗口實例。所以,你需要確定查找到正確的目標窗口。(提示:可以使用GetWindowThreadProcessId這個方法)

> 你需要確保其他人不會查找到你的窗口并在你之前發送WM_COPYDATA,如果他們這樣做了,那他們就得到了你的子進程的控制權了。

> 子進程需要設計一種機制,來對抗一些惡意進程發送偽造的WM_COPYDATA消息,并盡可能正確處理它們(丟棄這種請求)。

我所推薦的方法是:匿名共享內存

基本想法是,創建一塊共享內存并填充你需要傳輸的數據。然后將它的句柄設置為可繼承的,然后創建子進程,傳輸句柄的數字表示到子進程的命令行。
子進程會從命令行中得到這個句柄,并映射這塊共享內存到它的進程空間,這樣就能訪問到你傳遞給它的數據了。

關于這種方法的幾點說明:

> 子進程需要判斷句柄的有效性,防止某些人傳遞一些無效的或者偽造的數據。

> 如果惡意進程想搞亂你的子進程命令行,則它們必須擁有PROCESS_VM_WRITE權限。如果它們想訪問進程句柄表,則還需要有PROCESS_DUP_HANDLE權限。這些都是安全的訪問掩碼,所有配置合適的ACL可以起到很好的保護作用。(默認的ACL就可以起到保護,所以使用默認的ACL就行了)

> 在這種方法中,沒有名字和數字可以被惡意進程監聽或者偽造。前提是你對子進程實施了PROCESS_VM_WRITE和PROCESS_DUP_HANDLE保護。

> 因為我們使用的是共享內存,所以共享的數據不會真正地在兩個進程之間拷貝,它們只是被操作系統重新映射而已。對于傳輸大型數據來說,這種方法十分高效。

在下面的例子代碼中,我們演示了如何使用共享內存技術來傳輸數據。

4ca8d2bf396cbcaf164ea1dc1dc08291.png

在實際的項目中,上面的STARTUPPARAMS結構體的成員可能會十分復雜,但是出于演示目的,我在這里僅僅定義了一個整數成員。

2c0d4570d68e5ca59aec266a3a386bd4.png

CreateStartupParams創建了一個在共享內存區中的STARTUPPARAMS的結構體。首先,我們填充SECURITY_ATTRIBUTES結構體并將它的可繼承屬性設置為TRUE,這樣子進程就可以訪問到這塊共享內存。將lpSecurityDescriptor設置為NULL表明我們希望使用默認的安全描述符,我們使用這個默認的值就夠了。然后,我們創建了一個指定大小的共享內存對象,然后將它映射到內存,最后,我們返回了一個共享內存的句柄和映射后的內存地址。

90759ca02fb99f037bc7472a23edc1d1.png

GetStartupParams函數是與CreateStartupParams對應的函數。它從命令行上解析出句柄的值并嘗試進行內存映射。如果句柄不是一個合法的文件映射句柄,則MapViewOfFile調用會失敗,我們可以通過這種方法進行參數的有效性校驗。然后,我們使用了VirtualQuery來查詢內存映射區的大小。(這里,我們沒有使用更加嚴格的測試方法,因為它的返回值可能被舍入到最近的頁邊界)

38ded11f41f415a85a6c1469895c9147.png

我們還需要釋放共享內存來防止可能出現的內存泄露,所以我們定義了上面的FreeStartupParams函數實現這一點。

feac4aa4929d71cf7f2c4a4df8509f7c.png

上面的函數中,我們主要是構建子進程的命令行參數。我們使用了GetModuleFileName(NULL)來獲取執行程序的全路徑,然后傳輸句柄的數字表示,并在調用CreateProcess時設置了參數TRUE來表明我們希望子進程的句柄是可以繼承的。
有一個小地方需要注意的:我們使用了引號來處理程序路徑中含有空格的情況。

e721902d7bd5b70f43b05a8361c6ffec.png

最后,我們將上面所有的程序片段組合在一起。
如果命令行上已經有一個參數了,表明這次運行的是子進程,所以我們將這個參數轉換為STARTUPPARAMS并獲取其中的數據并顯示出來。
如果命令行上沒有傳遞參數,則表明我們運行的是父進程,在這種情況下,我們創建了一個STARTUPPARAMS,并設置我們需要傳輸的數據(這里使用了42作為例子),然后傳輸給子進程。

總結

今天我們演示了如何向子進程傳輸大量數據的方法,雖然在上面的例子中,我們傳遞的數據量很小,但是如果稍加改進,完全可以實現傳遞大型數據。
所以各位老哥,可以將這種方法,穩穩地放到你的技能工具箱了。

e9a666413faf30be4b4ab4e4a5605a89.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

厲害了!中關村軟件園人工智能軍團有料有看點

人工智能已成為當下全球科技界的新熱點,中外競相攀登這座劃時代的科技高峰。上月,國務院印發《新一代人工智能發展規劃》,明確將人工智能作為未來國家重要的發展戰略。《規劃》提出前瞻布局新一代人工智能重大科技項目,到2030年中…

Hive的使用之hwi

概述 hwi是hive開發的網頁形式查看數據。方便非專業人士使用。 安裝步驟 1、下載hive源碼包 地址:http://apache.fayea.com/hive/ apache-hive-2.1.0-src.tar.gz 2、打包war 解壓apache-hive-2.1.0-src.tar.gz源碼包,進入到 C:\Users\zengmg\Deskto…

c 服務器傳輸大文件,cend.me:不須經過服務器,直接點對點的文件傳輸免費服務...

要傳送文件給遠程的手機、平板、電腦等設備,通常的做法就是先將文件上傳到服務器存放,然后再從服務器下載,這樣的做法看似合理,但如果上傳的同時就由遠程的設備來接收,不要經過服務器,這樣就能更節省上、下…

win10系統遷移后系統重裝_win7/win10系統遷移到新SSD硬盤的方法

隨著固態硬盤的普及,越來越多的朋友把電腦的硬盤換成了固態,原來的機械硬盤當數據盤使用,關于在固態硬盤中安裝系統,那是簡單的,和機械硬盤一樣,當是對原來的系統比較重要,不能重裝的朋友來說&a…

hive參數配置使用

概述 set命令設置hive的參數。 ${} 可以獲取配置項的值,作為參數使用。 在啟動hive時可以傳入配置項啟動。 hive參數初始化配置set命令~/.hiverc hive參數介紹 輸入set,可以查看所有可設置項和現在設置項的值。 hive> set; 項太多了&#xff…

Thrift源碼學習二——Server層

Thrift 提供了如圖五種模式:TSimpleServer、TNonblockingServer、THsHaServer、TThreadPoolServer、TThreadSelectorServer ?? TSimpleServer、TThreadPoolServer 屬于阻塞模型 TNonblockingServer、THsHaServer、TThreadedSelectorServer 屬于非阻塞模型 TServer…

linux top 命令可視化_25個Linux性能監控工具

一段時間以來,我們在網上向讀者介紹了如何為Linux以及類Linux操作系統配置多種不同的性能監控工具。在這篇文章中我們將羅列一系列使用最頻繁的性能監控工具,并對介紹到的每一個工具提供了相應的簡介鏈接,大致將其劃分為兩類,基于…

base64是哪個jar包的_漲知識 | 用maven輕松管理jar包

前言相信只要做過 Java 開發的童鞋們,對 Ant 想必都不陌生,我們往往使用 Ant 來構建項目,尤其是涉及到特別繁雜的工作量,一個 build.xml 能夠完成編譯、測試、打包、部署等很多任務,這在很大的程度上解放了程序員們的雙…

Hive數據類型

概述 Hive的內置數據類型可以分為兩大類:(1)、基礎數據類型;(2)、復雜數據類型。 基礎數據類型 數據類型 所占字節 開始支持版本 TINYINT 1byte,-128 ~ 127 SMALLINT 2byte,-32,768 ~ 32,767 INT 4byte,-2,147,483,648 ~ 2,14…

JMS(Java消息服務)與消息隊列ActiveMQ基本使用(一)

最近的項目中用到了mq,之前自己一直在碼農一樣的照葫蘆畫瓢。最近幾天研究了下,把自己所有看下來的文檔和了解總結一下。 一. 認識JMS 1.概述 對于JMS,百度百科,是這樣介紹的:JMS即Java消息服務(Java Message Service&…

python單詞反轉_python文本 字符串逐字符反轉以及逐單詞反轉

python文本 字符串逐字符反轉以及逐單詞反轉 場景: 字符串逐字符反轉以及逐單詞反轉 首先來看字符串逐字符反轉,由于python提供了非常有用的切片,所以只需要一句就可以搞定了 >>> aabc edf degd >>> a[::-1] dged fde cba …

hive復合數據類型之struct

概述 STRUCT:STRUCT可以包含不同數據類型的元素。這些元素可以通過”點語法”的方式來得到所需要的元素,比如user是一個STRUCT類型,那么可以通過user.address得到這個用戶的地址。 操作實例 1、創建表 create table student_test(id int,in…

pycharm 運行celery_Celery全面學習筆記

來源介紹Celery 是 Distributed Task Queue,分布式任務隊列。分布式決定了可以有多個 worker 的存在,隊列表示其是異步操作。Celery 核心模塊Celery有一下5個核心角色Task就是任務,有異步任務和定時任務Broker中間人,接收生產者發…

hive復合數據類型之array

概述 ARRAY:ARRAY類型是由一系列相同數據類型的元素組成,這些元素可以通過下標來訪問。比如有一個ARRAY類型的變量fruits,它是由[apple,orange,mango]組成,那么我們可以通過fruits[1]來訪問元素orange,因為ARRAY類型的…

Exploit開發系列教程-Mona 2 SEH

P3nro5e 2015/07/10 10:580x00 Mona 2 前言 & 準備Mona 2是一種非常有用的插件,它由Corelan Team開發。起初是為Immunity Debugger寫的,現在它適用于WinDbg調試器。你將需要為WinDbg x86 和 WinDbg x64安裝一些工具:安裝Python 2.7 (從這…

python集合的元素可以是_Python集合的元素中,為什么不可以是包含嵌套列表的元組?...

你有一個誤解,hash算法針對的是元素的內容,并不是針對指針,所以指針不變不等于可hash。 如果你想深究細節的話,可以看tuple的源碼: static Py_hash_t tuplehash(PyTupleObject *v) { Py_uhash_t x; /* Unsigned for de…

python lib庫_python_lib基礎庫

1:argv傳遞給python腳本的命令行參數列表,argv[0]是腳本的名字(他是平臺獨立的,不管他是一個路徑全名或不是),如果使用了-c參數選項,argv[0]會被設置為字符串-c,如果沒有腳本名傳遞給python解釋器&#xff…

hive復合數據類型之map

概述 MAP:MAP包含key->value鍵值對,可以通過key來訪問元素。比如”userlist”是一個map類型,其中username是key,password是value;那么我們可以通過userlist[username]來得到這個用戶對應的password; 操…

Beego框架使用

為什么80%的碼農都做不了架構師&#xff1f;>>> Beego Web項目目錄結構 new 命令是新建一個 Web 項目&#xff0c;我們在命令行下執行 bee new <項目名> 就可以創建一個新的項目。但是注意該命令必須在 $GOPATH/src 下執行。最后會在 $GOPATH/src 相應目錄下…

oracle下lag和lead分析函數

Lag和Lead分析函數可以在同一次查詢中取出同一字段的前N行的數據(Lag)和后N行的數據(Lead)作為獨立的列。 這種操作可以代替表的自聯接&#xff0c;并且LAG和LEAD有更高的效率。 語法&#xff1a; [sql] view plaincopy /*語法*/ lag(exp_str,offset,defval) over() Lead(…