function deviceDisableAndEnabled(aDevName: String): Boolean;
var
devInfo: hDevInfo;
devInfoData: TSPDevInfoData;
sppParams: TSPPropChangeParams;
idx: Integer;
dataType,
buffersize: DWORD;
buffer: LPTSTR;
ustatus,
ulProgNo: ULONG;
devName: String;
getOK: Boolean;
begin
Result := False;
if not IsApiLoaded then begin
MessageBeep(0);
Exit;
end;
devInfo := SetupDiGetClassDevs(nil, nil, 0, DIGCF_ALLCLASSES or DIGCF_PRESENT);
if DWORD(devInfo) = INVALID_HANDLE_VALUE then begin
MessageBeep(0);
Exit;
end;
FillChar(devInfoData, SizeOf(TSPDevInfoData), 0);
devInfoData.cbSize := SizeOf(TSPDevInfoData);
idx := 0;
buffersize := 0;
buffer := nil;
while SetupDiEnumDeviceInfo(devInfo, idx, devInfoData) do begin
if (CM_Get_DevNode_Status(ustatus, ulProgNo, devInfoData.DevInst, 0) = CR_SUCCESS) then begin
getOK := False;
while not SetupDiGetDeviceRegistryProperty(devInfo, devInfoData, SPDRP_DEVICEDESC,
dataType, PByte(buffer),
buffersize, buffersize) do begin
if (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
if buffer <> nil then LocalFree(Cardinal(buffer));
buffersize := buffersize * 2;
buffer := Pointer(LocalAlloc(LPTR, buffersize));
end
else begin
break;
end;
end;
if (buffer <> nil) then devName := buffer;
if aDevName <> '' then begin
getOK := AnsiPos(AnsiUpperCase(aDevName), AnsiUpperCase(devName)) > 0;
end;
if getOK then begin
sppParams.ClassInstallHeader.cbSize := SizeOf(TSPClassInstallHeader);
sppParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
sppParams.Scope := DICS_FLAG_GLOBAL ;
sppParams.HwProfile := 0;
sppParams.StateChange := DICS_DISABLE;
SetupDiSetClassInstallParams(devInfo, @devInfoData, @sppParams, SizeOf(sppParams));
SetupDiChangeState(devInfo, devInfoData);
sppParams.StateChange := DICS_ENABLE;
SetupDiSetClassInstallParams(devInfo, @devInfoData, @sppParams, SizeOf(sppParams));
SetupDiChangeState(devInfo, devInfoData);
Result := True;
end;
end;
Inc(idx);
end;
if buffer <> nil then LocalFree(Cardinal(buffer));
SetupDiDestroyDeviceInfoList(devInfo);
end;
|
|