这是一段USB设备挂起的代码,请哪位高手帮我解读一下,
有很多API我不懂, 麻烦给我加上注释,非常感谢!bool SWSuspendByDevID(int DevID, bool Disable)
{
BHDEV Dev;
if (DevID == ROOT_ID)
return false; if (!DeviceIoControl(BH_Handle, IOCTL_BUSHOUND_GET_DEVICE, &DevID, sizeof(DevID),
&Dev, sizeof(Dev),&BH_Ret,0))
return false;
//---------------example code from Paul
//Dev.ObjectName
char PdoName[1024];
strcpy(PdoName,Dev.ObjectName);
HDEVINFO DevSet; // device traversal handle
SP_DEVINFO_DATA DevData; // device basic data
TCHAR RegData[256]; // pdo name
DWORD RegDataType; // data type of reg data returned
DWORD StartDev = 0; // index of device being processed
bool Complete = false; // success status
// Get a handle for traversing every present device DevSet = SetupDiGetClassDevs(NULL, NULL, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT); if (DevSet != INVALID_HANDLE_VALUE)
{
DevData.cbSize = sizeof(SP_DEVINFO_DATA); // check the pdo name of the next device while (SetupDiEnumDeviceInfo(DevSet, StartDev++, &DevData))
if (SetupDiGetDeviceRegistryProperty(DevSet, &DevData,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
&RegDataType, (PBYTE)RegData,
sizeof(RegData), NULL))
if (!lstrcmp(PdoName, RegData))
{
SP_PROPCHANGE_PARAMS Prop; Prop.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
Prop.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
Prop.StateChange = (Disable) ? DICS_DISABLE : DICS_ENABLE;
Prop.Scope = DICS_FLAG_CONFIGSPECIFIC;
Prop.HwProfile = 0; if (SetupDiSetClassInstallParams(DevSet, &DevData, &Prop.ClassInstallHeader,sizeof(Prop)) &&
SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DevSet, &DevData))
{
SP_DEVINSTALL_PARAMS Parms; Parms.cbSize = sizeof(Parms); if (SetupDiGetDeviceInstallParams(DevSet, &DevData, &Parms))
if (Parms.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
puts("system restart needed"); Complete = true;
}
} SetupDiDestroyDeviceInfoList(DevSet);
} return Complete;
}
有很多API我不懂, 麻烦给我加上注释,非常感谢!bool SWSuspendByDevID(int DevID, bool Disable)
{
BHDEV Dev;
if (DevID == ROOT_ID)
return false; if (!DeviceIoControl(BH_Handle, IOCTL_BUSHOUND_GET_DEVICE, &DevID, sizeof(DevID),
&Dev, sizeof(Dev),&BH_Ret,0))
return false;
//---------------example code from Paul
//Dev.ObjectName
char PdoName[1024];
strcpy(PdoName,Dev.ObjectName);
HDEVINFO DevSet; // device traversal handle
SP_DEVINFO_DATA DevData; // device basic data
TCHAR RegData[256]; // pdo name
DWORD RegDataType; // data type of reg data returned
DWORD StartDev = 0; // index of device being processed
bool Complete = false; // success status
// Get a handle for traversing every present device DevSet = SetupDiGetClassDevs(NULL, NULL, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT); if (DevSet != INVALID_HANDLE_VALUE)
{
DevData.cbSize = sizeof(SP_DEVINFO_DATA); // check the pdo name of the next device while (SetupDiEnumDeviceInfo(DevSet, StartDev++, &DevData))
if (SetupDiGetDeviceRegistryProperty(DevSet, &DevData,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
&RegDataType, (PBYTE)RegData,
sizeof(RegData), NULL))
if (!lstrcmp(PdoName, RegData))
{
SP_PROPCHANGE_PARAMS Prop; Prop.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
Prop.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
Prop.StateChange = (Disable) ? DICS_DISABLE : DICS_ENABLE;
Prop.Scope = DICS_FLAG_CONFIGSPECIFIC;
Prop.HwProfile = 0; if (SetupDiSetClassInstallParams(DevSet, &DevData, &Prop.ClassInstallHeader,sizeof(Prop)) &&
SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DevSet, &DevData))
{
SP_DEVINSTALL_PARAMS Parms; Parms.cbSize = sizeof(Parms); if (SetupDiGetDeviceInstallParams(DevSet, &DevData, &Parms))
if (Parms.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT))
puts("system restart needed"); Complete = true;
}
} SetupDiDestroyDeviceInfoList(DevSet);
} return Complete;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货