晚起的虫子ID:lfchen
1430次访问,排名2万外好友10人,关注者49
捣鼓捣鼓烟叶...
lfchen的文章
原创 1 篇
翻译 0 篇
转载 7 篇
评论 2 篇
最近评论
footway:编译时报
uuid.lib(cguid_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module

为什么?
文章分类
收藏
    相册
    danyueer
    灌水乐园
    我的图片
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 禁用设备(文摘)收藏

    新一篇: 枚举系统设备 | 

    参考

    Device Management Functions

    // 必要的头文件和要链接的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;

            default:;  

            }  

            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 = 0; SetupDiEnumDeviceInfo(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}

    发表于 @ 2006年04月30日 10:35:00|评论(loading...)|编辑

    新一篇: 枚举系统设备 | 

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 一条晚起的虫