레지스트리에서 Windows 장치 클래스 제거

레지스트리에서 Windows 장치 클래스 제거

보안 설명자 HKR,,Security,,"D:P(A;;GA;;SY)(A;;GA;;BA)"가 포함된 .INF가 있습니다.

관리자 권한을 제거하기 위해 이 보안 설명자를 변경했습니다. 모든 사용자가 응용 프로그램을 열 수 있도록 합니다. 하지만 INF 파일에서 장치 클래스와 ClassGUID를 변경하지 않으면 작동하지 않습니다.

Windows에서 이전에 설치된 드라이버의 장치 클래스를 제거하려면 어떻게 해야 합니까?

장치 관리자에서 드라이버를 삭제했는데도 이전에 설치한 보안 설명자가 삭제되지 않는 것 같습니다.

수정된 INF 파일로 보안 설명자를 재정의할 수 없습니다.

답변1

마침내 작은 C++ 프로그램을 사용하여 장치 클래스를 제거할 수 있었습니다. 다음 링크의 사이트 끝에는 ClassGUID와 관련된 ClassName을 포함하여 드라이버를 완전히 삭제할 수 있는 C++ 코드가 있습니다.

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;
 }

관련 정보