⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskdevice.cpp

📁 一个vc程序
💻 CPP
字号:
#include <windows.h>
#include <tchar.h>
#include <setupapi.h>
//#include <shlwapi.h>
#pragma comment(lib, "setupapi.lib")
//#pragma comment(lib, "shlwapi.lib")
HDEVINFO hDevInfo = NULL;
// 出错信息
void FormatMSG(DWORD dwError, LPTSTR * o)
{
	LPTSTR oo=(LPTSTR)o;
	BOOL bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError,
		MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), oo, 0, NULL);
  if(!bOk)													//将**变成*2007 /01 /10
  {															//新建的字符串由oo指向。
	  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)o,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)
		{lpszMsg="hahazx";
			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 = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)
		{
			if (1 == nStatus)
			{::MessageBox(NULL,"启用","correct",MB_OK);
				ChangeStatus(DICS_ENABLE, i, hDevInfo);
			}
			else if (0 == nStatus)
			{::MessageBox(NULL,"禁用","error",MB_OK);
			    ChangeStatus(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;
}
void main()
{
	ControlDisk(1, 2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -