如何破解光驱被禁?(修改设置重启系统不奏效)

如何破解光驱被禁?(修改设置重启系统不奏效),第1张

你如果是在BIOS中禁用的修改设置后需按F10键,再按简颂弊Y键保存设置后方有效.如不行,机箱拆开,然后把光驱线扯掉,开机,再关机,把线插好,再开机,系统就找到新硬件,装好了就能用了

由于工作的实际需要,需要对光驱,软驱,USB的启用和禁用实现控制。参考大家提供的对网卡禁用的代码,实现了光驱,软驱,USB的启用和禁拦族用。主要实现代码如下:

// 必要的头文件和要链接的LIB文件

#include <setupapi.h>

#include <shlwapi.h>

#pragma comment(lib, "setupapi.lib")

#pragma comment(lib, "shlwapi.lib")

// device information set(我把樱知它译为设备信息集)

HDEVINFO hDevInfo = NULL

// 出错信息

void FormatMSG(DWORD dwError, LPTSTR * lpszMsg)

{

BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,

MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), (LPTSTR)lpszMsg, 0, NULL)

if (!bOk)

{

HMODULE hDll = LoadLibraryEx(_T("netmsg.dll"),

NULL,

DONT_RESOLVE_DLL_REFERENCES)

if (NULL != hDll)

{

FormatMessage(FORMAT_MESSAGE_FROM_HMODULE |

FORMAT_MESSAGE_FROM_SYSTEM,

hDll,

dwError,

MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),

(LPTSTR)lpszMsg,0, NULL)

FreeLibrary(hDll)

}

}

}

BOOL ChangeStatus(DWORD NewStatus, DWORD SelectedItem, HDEVINFO hDevInfo)

{

LPTSTR lpszMsg = NULL

HCURSOR hCursor = NULL

try

{

SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}

hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT))

// Get a handle to the Selected Item.

if (!SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, &DeviceInfoData))

{

FormatMSG(GetLastError(), &lpszMsg)

throw lpszMsg

}

// Set the PropChangeParams structure.

PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE

PropChangeParams.Scope = DICS_FLAG_GLOBAL

PropChangeParams.StateChange = NewStatus

if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER *)&PropChangeParams,

sizeof(PropChangeParams)))

{

FormatMSG(GetLastError(), &lpszMsg)

throw lpszMsg

}

// Call the ClassInstaller and perform the change.

if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDevInfo,&DeviceInfoData))

{

FormatMSG(GetLastError(), &lpszMsg)

throw lpszMsg

}

SetCursor(hCursor)

return TRUE

}

catch (TCHAR * pszError)

{

SetCursor(hCursor)

::MessageBox(NULL,pszError,_T("提示"),MB_OK)

if (NULL != lpszMsg)

{

LocalFree((HLOCAL)lpszMsg)

}

return FALSE

}

}

// 这些设备的启用和禁用主要有此函数实现

// 参数说明,nStatus 可取3个值,-1 :啥也不做

// 0 禁用设备,1启用设备。

// nIndex用于控制是对光驱,软驱还是对USB启用或禁用

// 也是可取3个值,0 代表软驱,1 代表光驱

// 2 代表USB

// 譬如要对光驱实现禁用,可以这样调用此函数

// ControlDisk(0, 1)

BOOL ControlDisk(int nStatus, int nIndex)

{

if (-1 == nStatus)

{

return FALSE

}

LPTSTR lpszMsg = NULL

try

{

TCHAR * GUIDString = NULL

GUID guid

ZeroMemory(&guid, sizeof(GUID))

switch(nIndex)

{

case 0: // 0 代表软驱

GUIDString = _T("4D36E980-E325-11CE-BFC1-08002BE10318")

UuidFromString((unsigned char *)GUIDString, &guid)

break

case 1: // 1 代表光驱

GUIDString = _T("4D36E965-E325-11CE-BFC1-08002BE10318")

UuidFromString((unsigned char *)GUIDString, &guid)

break

case 2: // 2 代表USB

GUIDString = _T("36FC9E60-C465-11CF-8056-444553540000")

UuidFromString((unsigned char *)GUIDString, &guid)

break

}

hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT)

if (INVALID_HANDLE_VALUE == hDevInfo)

{

FormatMSG(GetLastError(), &lpszMsg)

throw lpszMsg

}

DWORD i

SP_DEVINFO_DATA DeviceInfoData

ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA))

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA)

for (i = 0SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData)++i)

{

if (1 == nStatus)

{

StateChange(DICS_ENABLE, i, hDevInfo)

}

else if (0 == nStatus)

{

StateChange(DICS_DISABLE, i, hDevInfo)

}

}

// 释放 device information set

return SetupDiDestroyDeviceInfoList(hDevInfo)

}

catch (TCHAR * pszError)

{

::MessageBox(NULL,pszError,_T("提示"),MB_OK)

if (NULL != lpszMsg)

{

LocalFree((HLOCAL)lpszMsg)

}

return FALSE

}

return FALSE

}

经测试这样对光驱,软驱和USB实现禁用没有问题,但是当禁用过之后如果要对USB实现启用必须两次调用ControlDisk(1, 2)这个函数才可,其余的两个启用没什么问题。还有要说的就是我不是用的枚举所有的设备,然后再过滤(网上的那个禁用网卡的就是这种方法)。

据我观察,在注册表的此项下下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\

有很多GUID,每个GUID代表一个设备,譬如这个是USB的

{36FC9E60-C465-11CF-8056-444553540000}

这个是CDROM的

{4D36E965-E325-11CE-BFC1-08002BE10318}

等等了。

这些值你即使把它改为别的GUID,我使用原来的GUID仍然可以实现我的功能。

UuidFromString((unsigned char *)GUIDString, &guid)

去掉胡弊强制转换锋吵,裤基族改成

UuidFromString(GUIDString, &guid)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12260949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存