GetFirmwareEnvironmentVariable失败返回错误码1314
来源:互联网 发布:数据核查计划dvp 编辑:程序博客网 时间:2024/04/30 08:38
GetFirmwareEnvironmentVariable是获取efi主板写入到固件里的数据,如果单单调用
#define VariableGuidStr "{8BE4DF61-93CA-11D2-AA0D-00E098032B8C}"
#define BootOrderStr "BootOrder"
DWORD dwRet = 0;
dwRet = GetFirmwareEnvironmentVariable(
_T(BootOrderStr),
_T(VariableGuidStr),
pBuffer,
iBufferSize);
dwRet的值会是0,msdn上也表明了0代表返回数据大小为0,即使错误,
到微软官方查阅了一下,发现时权限的问题,即使以管理员权限运行此程序也会有几个权限没有包含进来,所以要重新调整权限,于是编写了如下函数
BOOL adjusttoken()
{
HANDLE htoken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
{
size_t s = sizeof(TOKEN_PRIVILEGES) + 2*sizeof(LUID_AND_ATTRIBUTES);
TOKEN_PRIVILEGES *p = (PTOKEN_PRIVILEGES)malloc(s);
if(!LookupPrivilegeValue(NULL, SE_SYSTEM_ENVIRONMENT_NAME, &(p->Privileges[0].Luid)) ||
!LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &(p->Privileges[1].Luid)) ||
!LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &(p->Privileges[2].Luid)))
{
printf("failed to LookupPrivilegeValue error code : %d \r\n", GetLastError());
free(p);
return FALSE;
}
p->PrivilegeCount = 3;
for(int i = 0; i<3; ++i)
{
p->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED;
}
if(!AdjustTokenPrivileges(htoken, FALSE, p, s, NULL, NULL) || GetLastError() != ERROR_SUCCESS)
{
printf("AdjustTokenPrivileges failed! error code : %d \r\n", GetLastError());
free(p);
return FALSE;
}
//do something here...
free(p);
}
else
{
printf("Open process token failed! error code : %d \r\n", GetLastError());
return FALSE;
}
return TRUE;
}
在调用GetFirmwareEnvironmentVariable之前调用adjusttoken()就可以了,至于那个guid的字符串为什么和efi层规定的guid表示的不一样就不知道了,忘了哪里规定过windows层guid字符串的格式,反正这么写获取到的是对的//efi层是这么规定的GUID gEfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}; 虽然不是字符串,但是格式也不一样。
如果其他函数返回错误码1314的话,可以先怀疑是不是权限的问题,如果需要什么权限可以重新调整一下,//windows的1314错误码的意思是权限没有成功获取,而处理固件需要SE_SYSTEM_ENVIRONMENT_NAME权限
- GetFirmwareEnvironmentVariable失败返回错误码1314
- CoCreateInstance失败,返回错误码0x8007007e
- LoadLibray失败,返回错误码193
- RegisterNatives注册失败,返回错误码-1
- BindingResult错误返回显示失败
- 调用 RegLoadKey 失败,返回错误码1314的原因及解决办法
- APNs连接失败,返回错误码为0
- CreateDirectory(…)执行失败,GetLastError()返回错误码5
- 加载动态库失败,返回126错误码
- dll加载失败,返回126错误
- FTP操作失败返回码
- 高德地图Android错误码1008、32和7;错误提示invalid_user_scode;返回key鉴权失败的解决办法
- CFileDialog打开多个文件失败 返回错误 FNERR_BUFFERTOOSMALL
- CreateBitmapIndirect() GetLastError() 返回 错误的参数 创建失败原因
- C#连接Oracle错误:OCIEnvCreate 失败,返回代码为 -1
- 提示错误OCIEnvCreate 失败,返回代码为 -1
- EVP_DecryptFinal_ex调用返回失败,解密数据错误的解决方法
- http get请求发送失败,返回304错误
- jxl导出Excel通用方法
- 一个fork的面试题
- 奥卡姆剃刀定律
- 子网规划与划分
- 线程同步和线程死锁
- GetFirmwareEnvironmentVariable失败返回错误码1314
- mmap系统调用
- 二八法则
- Summer Sale邮件模板集锦
- poj3280 Cheapest Palindrome
- 工作周报052
- Nasm Assambly Intro - Compile error
- hdu2102-A计划(dfs)
- 自定义iOS7导航栏背景,标题和返回按钮文字颜色