天天看點

【匿名管道】重定向cmd.exe匿名管道通信——重定向CMD.EXE

匿名管道通信——重定向CMD.EXE

匿名管道

【匿名管道】重定向cmd.exe匿名管道通信——重定向CMD.EXE

匿名管道無非就是系統核心管理的一塊記憶體區域,把這個檔案的句柄分為讀寫,以程式使用。

實作原理

【匿名管道】重定向cmd.exe匿名管道通信——重定向CMD.EXE

是以重定向cmd.exe的标準輸入輸出分别為兩個匿名管道的輸入輸出即可。在GUI中對應接收和寫入内容(不要搞錯啦這裡,否則就讀不到正确的東西)。

程式大緻過程

①、匿名管道建立

BOOL WINAPI CreatePipe(
  _Out_     PHANDLE hReadPipe,		//匿名管道讀句柄
  _Out_     PHANDLE hWritePipe,		//匿名管道寫句柄
  _In_opt_  LPSECURITY_ATTRIBUTES lpPipeAttributes,		//這裡需要設定這個結構體(見下)
  _In_      DWORD nSize			//管道空間,設為0即預設大小
);
           
typedef struct _SECURITY_ATTRIBUTES {
  DWORD  nLength;
  LPVOID lpSecurityDescriptor;
  BOOL   bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
           

②、打開cmd.exe子程序

BOOL WINAPI CreateProcess(
  _In_opt_     LPCTSTR lpApplicationName,//執行子產品位置
  _Inout_opt_  LPTSTR lpCommandLine,//執行子產品傳入指令
  _In_opt_     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  _In_opt_     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_         BOOL bInheritHandles,//繼承句柄
  _In_         DWORD dwCreationFlags,
  _In_opt_     LPVOID lpEnvironment,
  _In_opt_     LPCTSTR lpCurrentDirectory,
  _In_         LPSTARTUPINFO lpStartupInfo,//啟動資訊(見下)
  _Out_        LPPROCESS_INFORMATION lpProcessInformation//程序資訊(為空即可)
);
           
typedef struct _STARTUPINFO {//此處隻寫本次索要用到的
  DWORD  cb;//大小
  LPTSTR lpReserved;
  LPTSTR lpDesktop;
  LPTSTR lpTitle;
  DWORD  dwX;
  DWORD  dwY;
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute;
  DWORD  dwFlags;//STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW顯示自己設定的模式
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;//标準輸入句柄
  HANDLE hStdOutput;//标準輸出句柄
  HANDLE hStdError;//标準錯誤句柄
} STARTUPINFO, *LPSTARTUPINFO;
           

到這裡其實已經都配置完了,無非是自己再寫個多線程讓UI和WORKER分開運作,讀取和寫入。值得提醒的是,對于cmd.exe的寫入時,需要在字元串後+“\r\n”,重新整理緩沖。這裡把CreatePipe寫出來,防止弄混:GUI讀取句柄+CMD.EXE寫入句柄,GUI寫入句柄+CMD.EXE讀取句柄,這樣兩對組成兩個匿名管道。

【匿名管道】重定向cmd.exe匿名管道通信——重定向CMD.EXE

源碼下載下傳連結

http://download.csdn.net/detail/yzt33/8521139 很喜歡程式設計,喜歡深入了解一切的實作,作為新人,希望前輩們多多指正,多多鼓勵,謝謝。

繼續閱讀