首页 > 网吧技术 > 进阶殿堂 > BXP网卡PNP工具源代码 订阅

BXP网卡PNP工具源代码

http://www.xkq.com  2009年04月21日 15:43  gaochong      网吧技术群5 68896292
网吧技术群6 106313076 网吧技术群7 106313196 网吧技术群8 106313272 更多
5258网吧主页 百台机器每月收入100+ http://lm.5258.net/

BXP在无盘性能强劲,很多无盘DIY爱好者都非常喜欢用BXP组网,但是美中不足的是BXP的PNP方面不够理想,很多骨灰级的玩家都通过修改注册表,复制网卡的键值到每一个"节点"来实现对网卡的绑定,网上也流传过一个BXP的网卡绑定工具,得友人帮助我们重现这个工具,下面是全部的源代码:

unit UNetFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSkinData, SkinCaption, StdCtrls, AclAPI, accCtrl, Registry;


type
PADAPTER_INFO = ^TADAPTER_INFO;
TADAPTER_INFO = record
NicName: String[100]; //网卡名称
LinkName: string[20];
BnnfName: string[10];
ServiceName: string[20];
InstanceId: String[100]; //网卡ID地址
PNPInstanceId: String[100];
end;

type
TNetFrm = class(TForm)
SkinData1: TSkinData;
GroupBox1: TGroupBox;
Label1: TLabel;
LinkList: TComboBox;
Label2: TLabel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
Edit2: TEdit;
SkinCaption1: TSkinCaption;
procedure Button1Click(Sender: TObject);
procedure LinkListChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
adapter: TList;
public
{ Public declarations }
end;

var
NetFrm: TNetFrm;

implementation

{$R *.dfm}

function GetAdapterInfo: TList;
var
dwIndex: DWORD;
dwBufSize: DWORD;
dwDataType: DWORD;
szSubKey: array [0..255] of CHAR;
szData: array [0..255] of CHAR;
AdapterList: TList;
AdapterInfo: PADAPTER_INFO;
Key, hSubKey, hNdiintKey: HKEY;
begin
try
AdapterList := TList.Create;
//返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE, //Long,一个已打开项的句柄,或指定一个标准项名
'SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}',
0, //Long 未用设为零
KEY_READ,
Key
) <> ERROR_SUCCESS) then
begin
raise Exception.Create('打开注册表错误');
AdapterList.Free;
Exit;
end;

dwIndex := 0;
//遍历下面的子项
while (RegEnumKeyEx(Key, //Long,一个已打开项的句柄,或者指定一个标准项名
dwIndex, //Long,欲获取的子项的索引。第一个子项的索引编号为零
szSubKey,//String,用于装载指定索引处项名的一个缓冲区
dwBufSize, //Long,指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。一旦返回,它会设为实际装载到lpName缓冲区的字符数量
nil, //Long,未用,设为零
nil, //String,项使用的类名。可以为vbNullString
nil, //Long,用于装载lpClass缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字符数量
nil) //FILETIME,枚举子项上一次修改的时间
= ERROR_SUCCESS) do
begin
if (RegOpenKeyEx(Key, szSubKey, 0, KEY_READ, hSubKey) = ERROR_SUCCESS) then
begin
if (RegOpenKeyEx(hSubKey, 'Ndi\Interfaces', 0, KEY_READ, hNdiIntKey) = ERROR_SUCCESS) then
begin
dwBufSize := 256;
if (RegQueryValueEx(
hNdiIntKey, //Long,一个已打开项的句柄,或者指定一个标准项名
'LowerRange', //String,要获取值的名字
0, //Long,未用,设为零
@dwDataType, //Long,用于装载取回数据类型的一个变量
@szData, //Any,用于装载指定值的一个缓冲区
@dwBufSize) //Long,用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字节数
= ERROR_SUCCESS) then
begin
if CompareStr(Trim(szData), 'ethernet') = 0 then
begin
dwBufSize := 256;
if (RegQueryValueEx(hSubkey, 'DriverDesc', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS) then
begin
dwBufSize := 256;
getMem(adapterInfo, Sizeof(TADAPTER_INFO));
adapterInfo.NicName := Trim(szData);
if RegQueryValueEx(hSubKey, 'NetCfgInstanceID', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS then
begin
adapterInfo.InstanceId := Trim(szData);
adapterList.Add(adapterInfo);
end;
end;
end;
end;
RegClosekey(hNdiIntKey);
end;
RegCloseKey(hSubKey);
end;
Inc(dwIndex);
dwBufSize := 256;
end;
finally
Result := AdapterList;
//adapterList.Free;
end;
end;


procedure GetConnectionName(idStr: String; var pAdapter: PADAPTER_INFO);
var
Key: HKEY;
dwBufSize: DWORD;
dwDataType: DWORD;
szData: array [0..255] of CHAR;
begin
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE, //Long,一个已打开项的句柄,或指定一个标准项名
PCHAR('SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\'+idStr+'\Connection'),
0, //Long 未用设为零
KEY_READ,
Key
) <> ERROR_SUCCESS) then
begin
raise Exception.Create('打开注册表错误');
Exit;
end;

dwBufSize := 256;
if (RegQueryValueEx(Key, 'Name', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS) then
begin
pAdapter^.LinkName := Trim(szData);
end;

dwBufSize := 256;
if (RegQueryValueEx(Key, 'PnpInstanceID', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS) then
begin
pAdapter^.PNPInstanceId := Trim(szData);
end;
RegCloseKey(Key);
end;


procedure GetPciInfo(PnpidStr: String; var pAdapter: PADAPTER_INFO);
var
Key: HKEY;
dwBufSize: DWORD;
dwDataType: DWORD;
szData: array [0..255] of CHAR;
begin
if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE, //Long,一个已打开项的句柄,或指定一个标准项名
PCHAR('SYSTEM\CurrentControlSet\Enum\'+PnpidStr),
0, //Long 未用设为零
KEY_READ,
Key
) <> ERROR_SUCCESS) then
begin
raise Exception.Create('打开注册表错误');
Exit;
end;

dwBufSize := 256;
if (RegQueryValueEx(Key, 'Service', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS) then
begin
pAdapter^.ServiceName := Trim(szData);
end;

dwBufSize := 256;
if (RegQueryValueEx(Key, 'UpperFilters', 0, @dwDataType, @szData, @dwBufSize) = ERROR_SUCCESS) then
begin
pAdapter^.BnnfName := Trim(szData);
end;

RegCloseKey(Key);
end;


procedure SetPCIInfo(PnpidStr: String);
var
Reg: TRegistry;
SamName: String;

dwRet: DWORD;
pOldDacl: PACL;
pNewDacl: PACL;
ea: EXPLICIT_ACCESS;
pSD: PSECURITY_DESCRIPTOR;
begin
pSD := nil;
pOldDacl := nil;
pNewDacl := nil;

try
// 获取SamName主键的DACL
SamName := 'MACHINE\SYSTEM\CurrentControlSet\Enum\'+PnpidStr;
dwRet := GetNamedSecurityInfo(PCHAR(SamName), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
nil, nil, @pOldDacl, nil, pSD);
if dwRet <> ERROR_SUCCESS then
begin
MessageDlg(Format('GetSecurityInfo Error %d', [dwRet]), mtError, [mbOK], 0);
Exit;
end;

// 创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限
ZeroMemory(@ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(@ea, 'Everyone', KEY_ALL_ACCESS, SET_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT);

// 将新的ACE加入DACL
dwRet := SetEntriesInAcl(1, @ea, pOldDacl, &pNewDacl);
if dwRet <> ERROR_SUCCESS then
begin
MessageDlg(Format('SetEntriesInAcl Error: %d', [dwRet]), mtError, [mbOK], 0);
Exit;
end;

// 更新SamName主键的DACL
dwRet := SetNamedSecurityInfo(PCHAR(SamName), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
nil, nil, pNewDacl, nil);
if dwRet <> ERROR_SUCCESS then
begin
MessageDlg(Format('SetEntriesInAcl Error: %d', [dwRet]), mtError, [mbOK], 0);
Exit;
end;

Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SYSTEM\CurrentControlSet\Enum\'+PnpidStr, True) then
begin
Reg.WriteString('UpperFilters','BNNF');
end;

finally
Reg.Free;
if pNewDacl <> nil then
LocalFree(Cardinal(pNewDacl));

// 还原SamName主键的DACL
if pOldDacl <> nil then
SetNamedSecurityInfo(PCHAR(SamName), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
nil, nil, pOldDacl, nil);
if pSD <> nil then
LocalFree(Cardinal(pSD));
end;
end;

procedure SetNetService(ServiceName: String);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+ServiceName, True) then
begin
Reg.WriteInteger('Start', 0);
end;

Reg.Free;

end;

procedure SetSmart;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('SYSTEM\CurrentControlSet\Services\bnsm', True) then
begin
Reg.WriteInteger('smart', 1);
end;

Reg.Free;
end;


procedure TNetFrm.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TNetFrm.FormCreate(Sender: TObject);
var
i: Integer;
pAdapter: PADAPTER_INFO;
Str: String;
begin
adapter := GetAdapterInfo;
SetSmart;
str := ParamStr(1);
if Uppercase(Str) = 'AUTO' then
begin
for I:=0 to adapter.Count -1 do
begin
pAdapter := adapter.Items;
GetConnectionName(pAdapter^.InstanceId, pAdapter);
GetPCIInfo(pAdapter^.PNPInstanceId, pAdapter);
SetPCIInfo(pAdapter^.PNPInstanceId);
SetNetService(pAdapter^.ServiceName);
end;
Application.Terminate;
Exit;
end;

for I:=0 to adapter.Count -1 do
begin
pAdapter := adapter.Items;
GetConnectionName(pAdapter^.InstanceId, pAdapter);
GetPCIInfo(pAdapter^.PNPInstanceId, pAdapter);
LinkList.Items.Add(pAdapter^.LinkName);
end;
LinkList.ItemIndex := 0;
LinkListChange(nil);
end;

procedure TNetFrm.LinkListChange(Sender: TObject);
var
pAdapter: PADAPTER_INFO;
begin
pAdapter := adapter.Items[LinkList.ItemIndex];
Edit1.Text := pAdapter^.NicName;
if UpperCase(pAdapter^.BnnfName) = 'BNNF' then
begin
Edit2.Text := '已绑定 此型号网卡已实现PNP功能';
Edit2.Font.Color := ClBlue;
Button1.Enabled := False;
end else
begin
Edit2.Text := '未绑定 请设置此型号网卡的PNP功能';
Edit2.Font.Color := ClRed;
Button1.Enabled := True;
end;
end;

procedure TNetFrm.Button1Click(Sender: TObject);
var
pAdapter: PADAPTER_INFO;
begin
pAdapter := adapter.Items[linkList.ItemIndex];
SetPCIInfo(pAdapter^.PNPInstanceId);
SetNetService(pAdapter^.ServiceName);
MessageBox(0, '网卡设置成功!此型号网卡将开启PNP功能!', 'ZXP网卡设置', 48);
end;

end.


图片1

Tag: PnP BXP 网卡PNP

分享收藏到: 新浪ViVi 365Key网摘 和讯网摘 Google书签 Windows Live Del.icio.us Yahoo书签 提交新发现,Dig it 添加到百度搜藏 收藏此页到纯我网 收進你的MyShare個人書籤
RSS订阅】 
现在有人对本文发表评论
评价:
表情: 
匿名发表
相关文章