2015-10-13 234 views
1

我有一个带有安全描述符HKR,安全性的.INF“D:P(A ;; GA ;;; SY)(A ;; GA ;;; BA)” 。在注册表中删除Windows驱动程序设备类

我更改了此安全描述符以删除管理员权限。这样任何用户都可以打开该应用程序。我使用的描述符是“D:P(A ;; GA ;;; WD)(A ;; GA ;;; BU)(A ;; GA ;;; S-1-1-0)” 我卸载了驱动程序并重新安装修改后的.INF文件。但是,除非我更改INF文件中的设备“class”和“ClassGUID”,否则它不起作用。

我认为以前安装的安全描述符不会被删除,即使我从设备管理器中删除了驱动程序。我也用devcon来删除驱动程序。但它并没有删除设备类。

只有这样我才能使它工作就是修改现有.INF文件的“Class”和“ClassGUID”。

如何在Windows中删除以前安装的驱动程序的设备类? 我正在使用Windows 7.

回答

0

我终于能够使用小型C++程序最终卸载设备类。 在下面的链接中,在网站末尾有一个C++代码,您可以完全删除驱动程序,包括与ClassGUID关联的ClassName。

https://www.osronline.com/showthread.cfm?link=168171

我还复制下同代码。我做了一个小的MFC应用程序来执行卸载。

HDEVINFO devs = INVALID_HANDLE_VALUE; 
    SP_DEVINFO_LIST_DETAIL_DATA devInfoListDetail; 
    SP_DEVINFO_DATA devInfo; 
    unsigned int DeviceNo = 0; 
    GUID cls; 
    DWORD numClass = 0; 
    TCHAR devID[MAX_DEVICE_ID_LEN]; 
    SP_REMOVEDEVICE_PARAMS rmdParams; 
SetupDiClassGuidsFromNameEx ("ClassName", &cls, 1, &numClass, 
          NULL, NULL); 
devs = SetupDiGetClassDevsEx (&cls, NULL, NULL, 
         DIGCF_PRESENT, NULL, NULL, NULL); 
devInfo.cbSize = sizeof(devInfo); 
while (SetupDiEnumDeviceInfo (devs, DeviceNo++, &devInfo)) 
{ 
    devInfoListDetail.cbSize = sizeof(devInfoListDetail); 
    if (!SetupDiGetDeviceInfoListDetail (devs, &devInfoListDetail) || 
     CM_Get_Device_ID_Ex(devInfo.DevInst, devID, 
          MAX_DEVICE_ID_LEN/* 200 */, 0, 
          devInfoListDetail.RemoteMachineHandle)) 
    { 
     break; 
    } 
    rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); 
    rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE; 
    rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL; 
    rmdParams.HwProfile = 0; 
    SetupDiSetClassInstallParams (devs, &devInfo, 
             &rmdParams.ClassInstallHeader,sizeof 
(rmdParams)); 
    SetupDiCallClassInstaller (DIF_REMOVE, devs, &devInfo); 
} 
SetupDiDestroyDeviceInfoList(devs); 
DEVINST devRoot; 
if(CM_Locate_DevNode_Ex(&devRoot,NULL,CM_LOCATE_DEVNODE_NORMAL,NULL) != 
CR_SUCCESS) { 
     goto final; 
} 
CM_Reenumerate_DevNode_Ex(devRoot, 0, NULL); 
final: 
return; 
} 
0

使用SetupAPI,您也可以更改SDS。这并不直接回答你的问题,但它确实解决了不安全描述符的问题。

static GUID MY_GUID = { 0x91A3EB99, 0x5FB7, 0x4CA4, { 0x83, 0xC9, 0x8E, 0x39, 0xC1, 0x39, 0xEF, 0xE8 } }; 

SetClassSDS(&MY_GUID); 

如果你愿意,你也可以通过在你SetupDiClassGuidsFromNameEx检索的GUID:

SetClassSDS(&cls); 

这是上面使用我的函数(一定要使用你想要的ACL):

void SetClassSDS(GUID* guid) 
{ 
    wprintf(L"\tGUID: {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX}\n", 
     guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2], 
     guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); 

    const int strSize = 256; 

    // This discretionary ACL: 
    //  * Deny access to Built-in Guests 
    //  * Deny access to Anonymous Logon 
    //  * Allow read/write/execute to Authenticated Users 
    //  * Allow full control to Administrators 
    WCHAR newStr[strSize] = L"D:(D;OICI;GA;;;BG)(D;OICI;GA;;;AN)(A;OICI;GRGWGX;;;AU)(A;OICI;GA;;;BA)"; 

    PBYTE str = new BYTE[strSize]; 

    DEVPROPTYPE type; 

    DWORD reqSize = 0; 

    if (SetupDiGetClassProperty(guid, &DEVPKEY_DeviceClass_SecuritySDS, &type, str, strSize, &reqSize, DICLASSPROP_INSTALLER)) 
    { 
     wprintf(L"\tCurrent SDS: %s\n", str); 

     wprintf(L"\tDesired SDS: %s\n", newStr); 

     if (SetupDiSetClassProperty(guid, &DEVPKEY_DeviceClass_SecuritySDS, type, 
     (BYTE*)newStr, sizeof(newStr), DICLASSPROP_INSTALLER)) 
     { 
     wprintf(L"\n\tSetupDiSetClassProperty succeeded\n\n"); 
     } 
     else 
     { 
     wprintf(L"\tSetupDiSetClassProperty - Error code: 0x%X\n\n", GetLastError()); 
     } 
    } 
    else 
    { 
     wprintf(L"\tSetupDiGetClassProperty - Error code: 0x%X\n\n", GetLastError()); 

     if (reqSize > strSize) 
     { 
     wprintf(L"\tSecurity string too long\n"); 
     } 
    } 

    wprintf(L"\n"); 

    delete [] str; 
} 

您将需要以下包括:

#include <initguid.h> 
#include <devguid.h> 
#include <devpkey.h> 
#include <devpropdef.h> 
#include <setupapi.h> 

您需要链接到该库:

Setupapi.lib