源**執行效果圖如下:
設定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...