2015-10-13 143 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