Бери, но учти что для компиляции потребуется SetupApi.pas, поиметь его можно отсюда: http://delphi-jedi.org
функции IsClassNet и GetDrvName можно выкинуть если использовать SetupDiGetClassRegistryProperty и SetupDiGetDeviceRegistryProperty, но оптимизировать неохота было, поэтому даю так как делал сам. Да, еще учти что на безсервиспакном nt4 и 95 работать не будет. А подробнее - на MSDN
var
hDI: HDEVINFO;
function StateChange(NewState:cardinal;DevInfoData:PSPDevInfoData):boolean;
var
i:cardinal;
var
PropChangeParams:SP_PROPCHANGE_PARAMS;
begin
FillChar(PropChangeParams,sizeof(PropChangeParams),#0);
with PropChangeParams do
begin
ClassInstallHeader.cbSize:=sizeof(SP_CLASSINSTALL_HEADER);
ClassInstallHeader.InstallFunction:=DIF_PROPERTYCHANGE;
Scope:=DICS_FLAG_GLOBAL;
StateChange:=NewState;
end;
if not SetupDiSetClassInstallParams(hDI,DevInfoData,@PropChangeParams,
sizeof(PropChangeParams)) then
begin
ShowMessage(SysErrorMessage(GetLastError));
result:=false;
exit;
end;
if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDI,DevInfoData) then
begin
result:=false;
exit;
end;
result:=true;
end;
function IsClassNet(ClassUID:PGUID):boolean;
const
MAX_NUM=49;
var
NetClass:string;
dwLength:cardinal;
dwType:cardinal;
hKeyClass:HKEY;
lret:integer;
ClassType:string;
begin
NetClass:='Net';dwLength:=MAX_NUM;dwType:=REG_SZ;
setLength(ClassType,dwLength);
hKeyClass:=SetupDiOpenClassRegKey(ClassUID,KEY_READ);
if hKeyClass<>0 then
begin
lRet := RegQueryValueEx(hKeyClass,'Class',nil,@dwType,@ClassType[1],@dwLength);
RegCloseKey(hKeyClass);
if lRet<>0 then
begin
Result:=false;
exit;
end;
setLength(ClassType,dwLength-1);
if ClassType=NetClass then
begin
Result:=true;
exit;
end;
end;
Result:=false;
end;
function GetDrvName(var DevInfoData:TSPDevInfoData):string;
const
MAX_NUM=254;
var
dwLength:cardinal;
dwType:cardinal;
hKeyDriver:HKEY;
lret:integer;
DriverName:string;
begin
dwLength:=MAX_NUM;dwType:=REG_SZ;
setLength(DriverName,dwLength);
hKeyDriver:=SetupDiOpenDevRegKey(hDI,DevInfoData,DICS_FLAG_GLOBAL ,0,DIREG_DRV,KEY_READ);
if hKeyDriver<>0 then
begin
lRet :=RegQueryValueEx(hKeyDriver,'DriverDesc',nil,@dwType,@DriverName[1],@dwLength);
RegCloseKey(hKeyDriver);
if lRet<>0 then
begin
Result:='';
exit;
end;
setLength(DriverName,dwLength-1);
Result:=DriverName;
exit
end;
Result:='';
end;
procedure TForm1.Button1Click(Sender: TObject);
const
DevChg=26;
DevChgState=DICS_ENABLE ;
var
i:cardinal;
DeviceInfoData:TSPDevInfoData;
DevInst:TSPDevInstallParams;
begin
LoadSetupApi;
hDi:=SetupDiGetClassDevs(nil,nil,0,DIGCF_PRESENT or DIGCF_ALLCLASSES);
if hDI=nil then
begin
memo1.Lines.Add('SetupDiGetClassDevs failed');
UnloadSetupApi;
exit;
end;
FillChar(DeviceInfoData,sizeof(DeviceInfoData),#0);
DeviceInfoData.cbSize:=sizeof(SP_DEVINFO_DATA);
i:=0;
while SetupDiEnumDeviceInfo(hDI,i,DeviceInfoData) do
begin
if IsClassNet(@DeviceInfoData.ClassGuid) then
begin
memo1.Lines.Add('network device index: '+inttostr(i)+
' DriverName: '+GetDrvName(DeviceInfoData));
end;
if i=DevChg then
begin
if StateChange(DevChgState,@DeviceInfoData) then
memo1.Lines.Add(' .... StateChange('+inttostr(DevChgState)+') - OK')
else
memo1.Lines.Add(' .... StateChange('+inttostr(DevChgState)+') - FAILED');
end;
inc(i);
end;
SetupDiDestroyDeviceInfoList(hDI);
UnloadSetupApi;
end;
|