2015年11月

LastError=,=

惊闻我的代码出现了一个BUG。

本来逻辑是这样没问题,完全调通了

if(XXX失败)
{
    DWORD dwLastErr = GetLastError();
    if(某种特定的Error == dwLastErr)
    {
         doRepairLogic();
    }
}

发布之前心想失败了还是加个上报吧。

if(XXX失败)
{
    DoDataReport(xx);
    DWORD dwLastErr = GetLastError();
    if(某种特定的Error == dwLastErr)
    {
         doRepairLogic();
    }
}

上报完dwLastErr被覆盖成了0,后面逻辑全挂了……。

系统环境块,又是一个深坑

又是史前巨坑级别。维护服务代码的时候,发现里面有一个常用的CreateProcessAsUser。本来这个功能用在其他地方啥事没有,这一天我突然接到一个需求,要调用一个只能在用户权限运行的程序。本来获取User token,再Create Process一气呵成。跟踪一下却有些蹊跷

xxxy.png

卧槽这什么鬼,明明是当前用户起来的,仔细看了代码,果不其然,lpEnviroment用的是NULL,使用父进程的Enviroment,然而父进程是SYSTEM起的。

bfa1af.png

某智能Handle类 hDumpToken; 
if (!DuplicateTokenEx(hUserToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hDumpToken))
{
  return;
}

LPVOID lpEnvironmentBlock = NULL;
if (!CreateEnvironmentBlock(&lpEnvironmentBlock, hDumpToken, FALSE))
{
  return;
}

BOOL ret = CreateProcessAsUserW(hDumpToken, NULL,
  (LPWSTR)strFile.c_str(),
  NULL, NULL, FALSE,
  NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT, lpEnvironmentBlock, NULL,
  &si, &pi);

wtf。