用Windows服務(wù)API實(shí)現(xiàn)IP Helper自檢與自啟)
PortProxyGUI源碼解析如何用P/Invoke調(diào)用Windows服務(wù)API實(shí)現(xiàn)IP Helper自檢與自啟【免費(fèi)下載鏈接】PortProxyGUIA manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows.項(xiàng)目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUIPortProxyGUI 是一款開源的 Windows 端口轉(zhuǎn)發(fā)管理工具它將繁瑣的netsh interface portproxy命令行操作封裝成了直觀的圖形界面。本篇文章從源碼角度為你解析它的核心技術(shù)如何通過 P/Invoke 技術(shù)調(diào)用 Windows 服務(wù) API在程序運(yùn)行過程中自動(dòng)檢測 IP Helperiphlpsvc服務(wù)的狀態(tài)并在服務(wù)未啟動(dòng)時(shí)一鍵拉起它讓端口轉(zhuǎn)發(fā)規(guī)則立即可用。即使你是 C# 或 Windows 編程的新手也能輕松看懂這套自檢與自啟的完整原理。為什么端口轉(zhuǎn)發(fā)離不開 IP Helper 服務(wù)在 Windows 上netsh interface portproxy負(fù)責(zé) TCP/IP 端口重定向而它背后的執(zhí)行引擎正是IP Helper 服務(wù)iphlpsvc。如果該服務(wù)處于停止?fàn)顟B(tài)你配置的所有轉(zhuǎn)發(fā)規(guī)則都不會(huì)生效。因此一款好用的端口轉(zhuǎn)發(fā)工具必須能自檢服務(wù)狀態(tài)并自啟服務(wù)——這正是 PortProxyGUI 源碼中最值得學(xué)習(xí)的設(shè)計(jì)之一。源碼結(jié)構(gòu)Native 目錄就是系統(tǒng)對話層PortProxyGUI 將所有的 Win32 API 調(diào)用集中放在 Native 目錄下包括NativeMethods.csP/Invoke 聲明即所有系統(tǒng) API 的入口ServiceStatus.cs服務(wù)狀態(tài)結(jié)構(gòu)體ServiceState.cs服務(wù)運(yùn)行狀態(tài)枚舉ServiceRights.cs 與 ScmRights.cs訪問權(quán)限枚舉ServiceControls.cs服務(wù)控制指令枚舉這種把系統(tǒng)調(diào)用隔離到獨(dú)立目錄的做法既讓主程序代碼保持清爽也便于復(fù)用與維護(hù)是值得借鑒的工程習(xí)慣。P/Invoke 橋接C# 如何打電話給 Windows 服務(wù)管理器C# 無法直接調(diào)用 Win32 函數(shù)需要借助P/Invoke平臺(tái)調(diào)用這座橋梁。在 NativeMethods.cs 中作者用DllImport引入了advapi32.dll中的關(guān)鍵函數(shù)[DllImport(advapi32.dll, EntryPoint OpenSCManagerW, ...)] internal static extern IntPtr OpenSCManager(...); [DllImport(advapi32.dll, EntryPoint OpenServiceW, ...)] internal static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceRights dwDesiredAccess); [DllImport(advapi32.dll, ...)] internal static extern bool QueryServiceStatus(IntPtr hService, ref ServiceStatus dwServiceStatus);其中OpenSCManager用于連接服務(wù)控制管理器SCMOpenService用于打開指定服務(wù)QueryServiceStatus則用來查詢服務(wù)當(dāng)前狀態(tài)——它們構(gòu)成了服務(wù)管理的三件套。三步自檢查詢 IP Helper 服務(wù)運(yùn)行狀態(tài)具體的自檢邏輯封裝在 Util.cs 的IsServiceRunning()方法中核心流程只有三步打開服務(wù)管理器調(diào)用OpenSCManager并傳入GENERIC_READ讀取權(quán)限打開目標(biāo)服務(wù)用OpenService打開名為iphlpsvc的 IP Helper 服務(wù)并申請SERVICE_QUERY_STATUS查詢權(quán)限查詢并比對狀態(tài)調(diào)用QueryServiceStatus將結(jié)果寫入ServiceStatus結(jié)構(gòu)體再判斷dwCurrentState是否等于SERVICE_RUNNING。每次調(diào)用完畢后代碼都會(huì)通過CloseServiceHandle及時(shí)釋放句柄避免資源泄漏——這個(gè)細(xì)節(jié)也值得初學(xué)者學(xué)習(xí)。服務(wù)訪問權(quán)限讀懂枚舉里的鑰匙為什么要單獨(dú)定義 ServiceRights.cs 和 ScmRights.cs因?yàn)?Windows 服務(wù) API 要求調(diào)用者聲明自己需要的訪問權(quán)限就像開門需要對應(yīng)的鑰匙SERVICE_QUERY_STATUS0x0004僅查詢狀態(tài)用于自檢SERVICE_START0x0010允許啟動(dòng)服務(wù)用于自啟SERVICE_PAUSE_CONTINUE0x0040允許發(fā)送暫停/繼續(xù)類控制指令SC_MANAGER_CONNECT0x0001連接服務(wù)控制管理器的基本權(quán)限。通過位運(yùn)算把這些值組合起來就能精確控制每次調(diào)用的最小權(quán)限兼顧功能與安全。一鍵自啟 參數(shù)通知讓轉(zhuǎn)發(fā)規(guī)則立即生效當(dāng)檢測到 IP Helper 未運(yùn)行時(shí)PortProxyGUI 會(huì)調(diào)用StartService()方法先以SERVICE_START權(quán)限打開服務(wù)再調(diào)用StartService(hService, 0, null)拉起進(jìn)程。更巧妙的是 ServiceControls.cs 中的SERVICE_CONTROL_PARAMCHANGE控制碼——它通過ControlService通知 IP Helper 服務(wù)參數(shù)已變更從而讓新寫入的端口轉(zhuǎn)發(fā)規(guī)則無需重啟服務(wù)即可立即生效這個(gè)細(xì)節(jié)對追求低延遲配置生效的場景非常實(shí)用。彩蛋DnsFlushResolverCache 刷新 DNS 緩存除了服務(wù)管理NativeMethods.cs 還從dnsapi.dll引入了DnsFlushResolverCache函數(shù)并由 DnsUtil.cs 封裝成FlushCache()方法。這也是為什么右鍵菜單中會(huì)提供Flush DNS Cache選項(xiàng)——修改端口轉(zhuǎn)發(fā)后刷新 DNS 解析緩存可以避免訪問到舊地址保證配置切換的即時(shí)性。小結(jié)從源碼中學(xué)到的三個(gè)要點(diǎn)通過本次 PortProxyGUI 源碼解析你可以學(xué)到P/Invoke 是與 Win32 世界對話的通用手段DllImport 結(jié)構(gòu)體 枚舉即可調(diào)用服務(wù) API服務(wù)管理有固定套路OpenSCManager → OpenService → 操作 → CloseServiceHandle按權(quán)限最小化原則申請?jiān)L問權(quán)自檢與自啟是工具類軟件的高頻需求理解 iphlpsvc 與 portproxy 的關(guān)系你也能為自己的網(wǎng)絡(luò)工具加上同樣的能力。如果你也想在 Windows 上實(shí)現(xiàn)服務(wù)自檢 一鍵自啟不妨直接閱讀 PortProxyGUI 的 Util.cs 與 NativeMethods.cs這份精簡源碼就是最好的實(shí)戰(zhàn)教材?!久赓M(fèi)下載鏈接】PortProxyGUIA manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows.項(xiàng)目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考