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权限

0 0
原创粉丝点击