VC 不重起Windows直接更改IP位址

2021-06-12 10:19:59 字數 2601 閱讀 7183

源**執行效果圖如下:

設定ip位址只需要更改登錄檔中關於介面卡的相應設定,但更改後需要重新啟動系統才能生效,而addipaddress函式只能新增ip而不是更改當前的ip,我們在windows nt/2000介面上操作不需要重新啟動就可以生效,那系統到底做了什麼額外的工作才使ip設定直接生效呢?筆者通過跟蹤explorer.exe中api的呼叫發現在netcfgx.dll中呼叫了dhcpcsvc.dll中乙個未公開的api:dhcpnotifyconfigchange,現將不重新啟動windows直接更改ip位址的詳細方法介紹如下:

一、獲取介面卡名稱

這裡指的介面卡名稱要區別於介面卡描述,比如我的一塊網絡卡,介面卡描述是:realtek rtl8139(a) pci fast ethernet adapter,介面卡名稱為:。獲取介面卡名稱的方法有多種:

1.1 呼叫ip helper api取得介面卡名稱ulong uladapterinfosize = sizeof(ip_adapter_info);

ip_adapter_info *padapterinfobkp, *padapterinfo = (ip_adapter_info*)new char[uladapterinfosize];

if( getadaptersinfo(padapterinfo, &uladapterinfosize) == error_buffer_overflow ) // 緩衝區不夠大

if( getadaptersinfo(padapterinfo, &uladapterinfosize) == error_success )

padapterinfo = padapterinfo->next;

}while(padapterinfo);

}delete padapterinfobkp;

複製**

1.2 讀取登錄檔取得介面卡名稱

在windows2000中可以通過遍歷 hkey_local_machine\system\currentcontrolset\control\class\\000n\ (n是從0開始編號的數字)所有介面, 在windows nt中可以讀取hkey_local_machine\software\microsoft\windows nt\currentversion\networkcards中的資訊,下面以windows2000為例:

hkey hkey, hsubkey, hndiintkey;

if(regopenkeyex(hkey_local_machine,

"system\\currentcontrolset\\control\\class\\",

0,key_read,

&hkey) != error_success)

return false;

dword dwindex = 0;

dword dwbufsize = 256;

dword dwdatatype;

char szsubkey[256];

unsigned char szdata[256];

while(regenumkeyex(hkey, dwindex++, szsubkey, &dwbufsize, null, null, null, null) == error_success)}}

}regclosekey(hndiintkey);

}regclosekey(hsubkey);

}dwbufsize = 256;

}        /* end of while */

regclosekey(hkey);

複製**

二、將ip資訊寫入登錄檔

**如下:

bool regsetip(lpctstr lpszadaptername, lpctstr pipaddress, lpctstr pnetmask, lpctstr pnetgate)

複製**

三、呼叫dhcpnotifyconfigchange通知配置的改變

未公開函式dhcpnotifyconfigchange位於 dhcpcsvc.dll中,原型如下:

bool dhcpnotifyconfigchange(

lpwstr lpwszservername, // 本地機器為null

lpwstr lpwszadaptername, // 介面卡名稱

bool bnewipaddress, // true表示更改ip

dword dwipindex, // 指明第幾個ip位址,如果只有該介面只有乙個ip位址則為0

dword dwipaddress, // ip位址

dword dwsubnetmask, // 子網掩碼

int ndhcpaction ); // 對dhcp的操作 0:不修改, 1:啟用 dhcp,2:禁用 dhcp

複製**

具體呼叫**如下:

bool notifyipchange(lpctstr lpszadaptername, int nindex, lpctstr pipaddress, lpctstr pnetmask)

複製**

VC 建立Windows服務

我在開發的時候用到了dll裡面的函式,開始的時候採用的靜態匯入的方法,但是發現服務開機啟動以後就死掉了,這裡不是dll路徑的問題。沒辦法,自己只得用動態匯入的方法,還好,服務自動開機執行了,還算正常吧。當然,我這裡的初始化引數已經設定好了,在dos命令裡面安裝完成後,你會發現,那個框,我已經替你選上...

Windows 系統變數及重起

經常看到一些軟體的安裝說明上寫著,修改windows的環境變數,然後重新啟動計算機。這讓人不禁產生疑問,修改環境變數之後真的要重啟嗎?其實只要理解了環境變數的原理就可以做出正確的判斷。環境變數是一些系統變數,這些變數對執行的任意乙個程式都有效。最簡單的確認方法就是 cmd.exe 程式。單擊 開始 ...

Windows的關機和重起

第六節 windows的關機和重起 很多木馬都有遠端關機功能,但這並不是乙個很好的功能.不過對於入侵伺服器,有時需要重起伺服器.其實對於關機和重起,只需要呼叫幾個 api函式即可實現.對於win9x系統,可以直接呼叫,對於win2k以上,出於安全考慮,稍有不同,下面分別看一下.9x系統 exitwi...