MFC 關機小軟體

2021-06-25 10:47:51 字數 2991 閱讀 5167

windows下的關機函式是exitwindowex, 函式原型為:

bool winapi exitwindow***(

__in           uint        uflags,

__in           dword dwreason

)

功能上有「關閉系統」,「登出使用者」,「鎖定工作站」3中操作。在windows nt核心的作業系統中,程序需要擁有se_shutdown_name許可權才能成功呼叫此函式。

程序的許可權記錄在程序的令牌當中,程序的令牌是一種核心物件,它儲存了使用者的安全配置資訊,例如使用者的sid、組的uid以及各種許可權等,令牌也記錄乙個已登入會話的引用和核心使用的預設安全設定。程序的令牌在程序被建立時產生,繼承于父程序。下面來看如何是區別當前作業系統版本,以及使本程序擁有se_shutdown_name許可權。

windows的系統的版本資訊使用乙個結構體osversioninfo表示,定義如下:

typedef struct _osversioninfo osversioninfo;

獲取系統的版本資訊的函式是getversionex, 函式原型為:

bool getversionex(

lposversioninfo    lpversioninformation   // 指向儲存獲得資訊的結構體

)

現在,我們已經知道關機程式的大體流程如下:

...osversioninfo   verinfo;

verinfo.dwosversioninfosize = sizeof(osversioninfo);

if(getversionex(&verinfo) == 0)

if(verinfo.dwplatformid == ver_platform_win32_nt)

exitwindow***(ewx_force, 0);   //關機

下面來看獲得許可權一部分。要使程序的許可權改變,就是改變他的令牌的屬性。首先,得獲取現有程序的令牌,使用函式openprocesstoken, 他的原型如下:

bool winapi openprocesstoken(

__in     handle       processhandle,   //程序的控制代碼

__in     dword       desiredaccess,   //令牌的訪問許可權

__out    phandle   tokenhandle      //儲存獲得的令牌的指標

)

本程序的控制代碼可以用函式getcurrentprocess()函式得到。要使程序擁有se_shutdown_name許可權,實際上就是使該程序的令牌擁有該許可權對應的luid值。獲得某個許可權對應的luid值可以使用函式lookupprivilegevalue,原型如下:

bool winapi lookupprivilegevalue(

__in_opt       lpctstr lpsystemname,   //系統名,本系統為null

__in             lpctstr    lpname,             //許可權名

__out          pluid          lpluid                //獲得的luid

)

知道了這些之後,將程序的令牌對照進行調整,程序便擁有我們想要的許可權了,這裡用到函式adjusttokenprivileges,原型如下:

bool winapi adjusttokenprivileges(

__in              handle                         tokenhandle,   //要更改的令牌

__in             bool                               disableallprivileges,

__in_opt       ptoken_privileges    newstate,

__in            dword                           bufferlength,

__out_opt      ptoken_privileges   previousstate, //用以在更改後儲存先前的令牌

__out_opt      pdword                        returnlength

)

現在我們也知道了獲得se_shutdown_name許可權的大體流程:

handle token;

token_privileges tp;

if(!openprocesstoken(getcurrentprocess(), token_adjust_privileges | token_query, &token) )

總程式如下:

#include

#include

int main()

if(verinfo.dwplatformid == ver_platform_win32_nt)

}exitwindow***(ewx_force, 0);

return 0;

}

MFC 獲得關機訊息 阻止Windows關機

wm queryendsession訊息是windows向你詢問windows能否關閉,wm endsession訊息表示提示你windows即將關閉。故當應用程式退出時,wm queryendsession訊息和wm endsession訊息均不響應。也就是說也就是說,你的程式在執行狀態時,而系統...

xp定時關機軟體 電腦小技巧,這樣關機更顯你實力!

有一些軟體在執行某些任務的時候,有乙個選項 執行完後自動關機 但是有些軟體並沒有這樣的功能,如果你想睡覺,可是又不想立即關閉電腦的時候,該怎麼辦,例如看片的時候,看著看著睡著了.看片睡著了 下面釋放大招的時刻到了,本人親測,xp到win10通用!首先,按下windows鍵 r,開啟執行對話方塊,就是...

MFC發布小軟體的注意事項

如果是debug版發布,常會出現 沒有找到mfc42d.dll,因此這個應用程式未能啟動.重新安裝應用程式可能會修復此問題 解決方法說明 一般在程式設計序時,都是生成了除錯版的程式,就是在那個 debug目錄下的可執行檔案。執行這除錯版的exe檔案,都會動態連線mfc42d.dll和msvcrtd....