请问MSDN上的例子代码是微软工程师写的吗?

BAO BAO 2018-06-27 01:32:53
#include <windows.h>

#pragma comment( lib, "advapi32.lib" )

BOOL PreventSystemShutdown()
{
HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure

// Get the current process token handle so we can get shutdown privilege.

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE;

// Get the LUID for shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
return FALSE;

// Prevent the system from shutting down.

if ( !AbortSystemShutdown(NULL) ) return FALSE;

// Disable shutdown privilege.

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);

return TRUE;
}



if ( !AbortSystemShutdown(NULL) ) return FALSE;

// Disable shutdown privilege.

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);

return TRUE;

这几行代码 我感觉写的并不严谨啊,AbortSystemShutdown失败的话直接就返回了,后面的取消本进程权限的代码都没执行,
而且tkp.Privileges[0].Attributes = 0; 的0是什么意思,我看属性值只有:
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED (0x00000002L)
#define SE_PRIVILEGE_REMOVED (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
如果使用完特权 想取消不应该用 tkp.Privileges[0].Attributes = SE_PRIVILEGE_REMOVED 吗?
还有个问题请问各位老师:
高版本的vc编译的时候怎么连接低版本的CRT库啊,比如让vc2010编译出的程序运行时自动连接msvcrt.dll,而不是动态连接msvcr110.dll
其实就是想高版本编译器编译的程序 在各版本系统上都能运行 不用附带此版本的运行库,像mingw那样
...全文
258 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2018-07-27
  • 打赏
  • 举报
回复
演示版程序!
smwhotjay 2018-07-01
  • 打赏
  • 举报
回复
msdn api 都是演示,而不是最后实施运行100% 无bug
蒋晟 2018-06-28
  • 打赏
  • 举报
回复
是不严谨,不过MSDN示例代码为简洁起见不检查错误代码的都有很多。毕竟只是写来演示API的。

tkp.Privileges[0].Attributes不是枚举是位域,那些值之间是异或的关系,那么0就是所有的位都是非,也就是既没有默认启用,也没有启用,也没有被删除,也不是用来获得服务或者对象的访问权。被删除的权限不能被启用,所以不能用SE_PRIVILEGE_REMOVED。
赵4老师 2018-06-28
  • 打赏
  • 举报
回复
微软工程师是人不是神。
BAO BAO 2018-06-28
  • 打赏
  • 举报
回复
引用 4 楼 jiangsheng 的回复:
是不严谨,不过MSDN示例代码为简洁起见不检查错误代码的都有很多。毕竟只是写来演示API的。

tkp.Privileges[0].Attributes不是枚举是位域,那些值之间是异或的关系,那么0就是所有的位都是非,也就是既没有默认启用,也没有启用,也没有被删除,也不是用来获得服务或者对象的访问权。被删除的权限不能被启用,所以不能用SE_PRIVILEGE_REMOVED。


谢谢,大概理解了。。
1. 之前设置文件属性就看到过类似SetFileAttributes(file,0); 去除所有属性的代码,但是查询参数值并没有值为0的参数;这么用是可以,疑惑微软没标 注这样的参数啊?
2. 我用完SE_PRIVILEGE_REMOVED后,怎么之前指定的权限还能使用啊,用0就不能使用了 表示被删除了,这个SE_PRIVILEGE_REMOVED到底啥意思啊,用了也没删除也没禁用啊
encoderlee 2018-06-28
  • 打赏
  • 举报
回复
示例代码一般不做错误处理,这样更简洁直观

静态链接CRT运行库就行,/MT
sevancheng 2018-06-27
  • 打赏
  • 举报
回复
微软实习生写的?
Eleven 2018-06-27
  • 打赏
  • 举报
回复
静态链接MFC的库,另外C/C++选择/MT
赵4老师 2018-06-27
  • 打赏
  • 举报
回复
提mingw我觉得就low了。
BTW:微软工程师是人不是神。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧