首页
社区
课程
招聘
[原创]使用代码关闭XP没有经过WHQL认证的ndis驱动安装警告
发表于: 2016-8-17 16:21 5732

[原创]使用代码关闭XP没有经过WHQL认证的ndis驱动安装警告

2016-8-17 16:21
5732
在XP环境安装基于passthru例子编译的ndis驱动安装会弹出警告窗口,通过修改"我的电脑"->"属性“->"硬件"->“驱动程序签名”->“忽略”的方式可以关闭警告,网上查找通过代码方式关闭没有找到,通过逆向分析sigtab.dll模块,整理下面代码可以关闭安装警告。
// 0=忽略,1=警告,2=阻止
DWORD SetDriverSigningPolicy(BYTE value)
{
  HMODULE hMod;
  FARPROC pfn;
  SYSTEMTIME stSystime;
  DWORD dwType;
  DWORD cbData;
  BYTE Data[4];
  HKEY phkResult;
  LONG lRtn;
  DWORD dwDisposition;

  lRtn = RegCreateKeyExW(
    HKEY_CURRENT_USER,
    L"Software\\Microsoft\\Driver Signing",
    0,
    0,
    0,
    KEY_ALL_ACCESS,
    NULL,
    &phkResult,
    &dwDisposition);
  if (!lRtn)
  {
    dwType = REG_DWORD;
    cbData = 4;
    lRtn = RegSetValueExW(phkResult, L"Policy", 0, dwType, Data, cbData);
    RegCloseKey(phkResult);
    if (!lRtn)
    {
      phkResult = 0;
      *(DWORD*)&Data = 0;
      lRtn = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\WPA\\Pnp", 0, KEY_READ, &phkResult);
      if (lRtn == ERROR_FILE_NOT_FOUND)
      {
        lRtn = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Session Manager\\WPA\\Pnp",
          0,
          KEY_READ,
          &phkResult);
      }

      if (!lRtn) // Success
      {
        cbData = 4;
        lRtn = RegQueryValueExW(phkResult, L"seed", 0, &dwType, Data, &cbData);
        RegCloseKey(phkResult);
      }

      if (lRtn != ERROR_SUCCESS)
      {
        dwType = REG_DWORD;
        cbData = 4;
        *(DWORD*)&Data = 0;
        lRtn = ERROR_SUCCESS;
      }

      hMod = LoadLibraryW(L"setupapi.dll");
      if (hMod != NULL)
      {
        pfn = GetProcAddress(hMod, "pSetupGetRealSystemTime");
        if (pfn != NULL)
        {
          stSystime.wMinute = *(WORD*)Data;
          stSystime.wYear = *(WORD*)&Data[2];
          stSystime.wDayOfWeek = (UINT)&phkResult | 4;
          stSystime.wMilliseconds = (UINT)&dwType & 0xF3FF | ((value & 3) << 10);
          ((void (__stdcall *)(SYSTEMTIME *))pfn)(&stSystime);
          stSystime.wDayOfWeek = (UINT)&phkResult | 4;
          ((void (__stdcall *)(SYSTEMTIME *))pfn)(&stSystime);
          if (value != ((((BYTE)(LOBYTE(stSystime.wMilliseconds) + 2) >> 2) ^ 0xFE) & 3))
            lRtn = ERROR_FUNCTION_FAILED;

        }
        else
        {
          lRtn = GetLastError();
        }

        FreeLibrary(hMod);
      }
      else
      {
        lRtn = GetLastError();
      }
    }
  }  

  return lRtn;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 60
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
make~
2016-8-18 09:51
0
雪    币: 69
活跃值: (242)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wmg
3
make~
2016-10-24 17:45
0
雪    币: 387
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark。。。
2017-3-3 21:26
0
雪    币: 4560
活跃值: (1012)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
/************************************************* 
  Function:       SetSigpolicy
  Description:    设置驱动验证状态
  Input:          true启用驱动验证,false取消驱动验证
  LuaInput:       无
  Output:         无
  Return:         返回成功状态布尔值
  LuaReturn:      无
  Others:         非Lua直接调用函数
*************************************************/ 

BOOL SetSigpolicy(BOOL a1)
{
    typedef int (__stdcall *GETREALSYSTEMTIME)(_SYSTEMTIME *);
    BOOL bResult; 
    HMODULE hSetup; 
    HKEY hKey;
    DWORD cbData;
    DWORD Type; 
    DWORD Data; 
    _SYSTEMTIME SystemTime; 
    GETREALSYSTEMTIME GetRealSystemTime;
    hKey = 0;
    cbData = 4;
    bResult = FALSE;
    if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\WPA\\PnP", 0, KEY_QUERY_VALUE, &hKey) )//正常XP不存在此键值
    {
        if ( !RegQueryValueEx(hKey, "seed", 0, &Type, (BYTE *)&Data, &cbData) )
        {
            if ( cbData == 4 )
            {
                if ( Type == 4 )                                        // REG_DWORD
                {
                    hSetup = LoadLibrary("setupapi.dll");
                    if ( hSetup )
                    {
                        GetRealSystemTime = (GETREALSYSTEMTIME)GetProcAddress(hSetup, "pSetupGetRealSystemTime");
                        if ( GetRealSystemTime )
                        {
                            SystemTime.wDayOfWeek = 4; //参数2赋值到wDayOfWeek低位
                            SystemTime.wYear = HIWORD(Data);//Seed高位赋值给wYear
                            SystemTime.wMilliseconds = (((4 * (a1 & 3)))<<16) + LOBYTE(SystemTime.wMilliseconds);//参数1赋值到wMilliseconds高位
                            SystemTime.wMinute = LOWORD(Data);//Seed低位赋值给wMinute 
                            GetRealSystemTime(&SystemTime);
                            bResult = TRUE;
                        }
                        FreeLibrary(hSetup);
                    }
                    else
                    {
                        RaiseException(SetupApi,EXCEPTION_NONCONTINUABLE,NULL,NULL);
                    }
                }
            }
        }
        RegCloseKey(hKey);
    }
    return bResult;
}


2017-3-3 21:48
0
游客
登录 | 注册 方可回帖
返回
//