Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

101 lines
2.2 KiB

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
reload.cpp
Abstract:
Restart a device stack
Revision History:
--*/
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <stdlib.h>
#include "debug.h"
extern "C" ULONG RestartDevice(
PWCHAR PnpDeviceId
)
{
HDEVINFO DevInfo;
SP_DEVINFO_DATA DevInfoData;
SP_PROPCHANGE_PARAMS PropChangeParams;
ULONG Status;
BOOL ok;
//
// First thing is to create a dev info set
//
DevInfo = SetupDiCreateDeviceInfoList(NULL, // ClassGuid
NULL); // hwndParent
if (DevInfo == INVALID_HANDLE_VALUE)
{
WmipDebugPrint(("SetupDiCreateDeviceInfoList failed %d\n",
GetLastError()));
return(GetLastError());
}
//
// Next step is to add our target device to the dev info set
//
DevInfoData.cbSize = sizeof(DevInfoData);
ok = SetupDiOpenDeviceInfoW(DevInfo,
PnpDeviceId,
NULL, // hwndParent
0, // OpenFlags
&DevInfoData);
if (ok)
{
memset(&PropChangeParams, 0, sizeof(PropChangeParams));
PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
PropChangeParams.StateChange = DICS_PROPCHANGE;
PropChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC;
PropChangeParams.HwProfile = 0; // current profile
ok = SetupDiSetClassInstallParamsW(DevInfo,
&DevInfoData,
(PSP_CLASSINSTALL_HEADER)&PropChangeParams,
sizeof(SP_PROPCHANGE_PARAMS));
if (ok)
{
ok = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
DevInfo,
&DevInfoData);
if (ok)
{
Status = ERROR_SUCCESS;
} else {
WmipDebugPrint(("SetupDiCallClassInstaller failed %d\n", GetLastError()));
Status = GetLastError();
}
} else {
WmipDebugPrint(("SetupDiSetClassInstallParams failed %d\n", GetLastError()));
Status = GetLastError();
}
} else {
printf("SetupDiOpenDeviceInfo failed %d\n", GetLastError());
Status = GetLastError();
}
//
// Finally we need to free the device info set
//
SetupDiDestroyDeviceInfoList(DevInfo);
return(Status);
}