MiTec/MSICS/MSI_Network.pas
2024-07-06 22:30:25 +02:00

2194 lines
69 KiB
ObjectPascal

{*******************************************************}
{ MiTeC System Information Component Suite }
{ Network Detection Part }
{ version 14.5.0 }
{ }
{ Copyright (c) 1997-2021 Michal Mutl }
{ }
{*******************************************************}
{$INCLUDE Compilers.inc}
unit MSI_Network;
interface
uses {$IFDEF RAD9PLUS}
WinAPI.Windows, System.SysUtils, System.Classes, WinAPI.WinSock,
WinAPI.ActiveX, System.Win.ComObj, MiTeC_SS,
{$ELSE}
Windows, SysUtils, Classes, WinSock, ActiveX, ComObj, MiTeC_SS,
{$ENDIF}
MSI_Common, MSI_Defs, MiTeC_IpHlpAPI, MiTeC_NetBIOS, MiTeC_Shares, MiTeC_Ws2_32;
const
StorageFolderName = 'Network';
TCPIP_StorageFolderName = 'TCPIP';
Winsock_StorageFolderName = 'Winsock';
Shares_StorageFolderName = 'Shares';
Sessions_StorageFolderName = 'Sessions';
OpenFiles_StorageFolderName = 'OpenFiles';
Connections_StorageFolderName = 'Connections';
type
TConnectionList = array of TConnectionRecord;
TShareList = array of TNTShareRecord;
TOpenFileList = array of TOpenFileRecord;
TSessionList = array of TNTSessionRecord;
{$IFDEF RAD9PLUS} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$ENDIF}
TMiTeC_NetResources = class(TMiTeC_Component)
private
FConns: TConnections;
FShares: TNTShares;
FConnList: TConnectionList;
FShareList: TShareList;
FSessionList: TSessionList;
FFileList: TOpenFileList;
function GetConn(Index: Cardinal): TConnectionRecord;
function GetConnCount: Cardinal;
function GetOpenFile(Index: Cardinal): TOpenFileRecord;
function GetOpenFileCount: Cardinal;
function GetSession(Index: Cardinal): TNTSessionRecord;
function GetSessionCount: Cardinal;
function GetShare(Index: Cardinal): TNTShareRecord;
function GetShareCount: Cardinal;
procedure SaveConnsToStorage(const AFilename: string; ACodeStream: TCodeStreamProcedure = nil);
procedure SaveSharesToStorage(const AFilename: string; ACodeStream: TCodeStreamProcedure = nil);
procedure SaveSessionsToStorage(const AFilename: string; ACodeStream: TCodeStreamProcedure = nil);
procedure SaveFilesToStorage(const AFilename: string; ACodeStream: TCodeStreamProcedure = nil);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear; override;
procedure RefreshData(AScanObjects: TScanObjects = soAll); override;
procedure SaveToStorage(const AFilename: string; var AWriteHeader: Boolean; AFormat: integer = 0; const AComment: string=''; ACodeStream: TCodeStreamProcedure = nil); override;
function LoadFromStorage(const AFilename: string; var AReadHeader: boolean; ACodeStream: TCodeStreamProcedure = nil): boolean; override;
property ConnectionCount: Cardinal read GetConnCount;
property Connections[Index: Cardinal]: TConnectionRecord read GetConn;
property ShareCount: Cardinal read GetShareCount;
property Shares[Index: Cardinal]: TNTShareRecord read GetShare;
property SessionCount: Cardinal read GetSessionCount;
property Sessions[Index: Cardinal]: TNTSessionRecord read GetSession;
property OpenFileCount: Cardinal read GetOpenFileCount;
property OpenFiles[Index: Cardinal]: TOpenFileRecord read GetOpenFile;
end;
{$IFDEF RAD9PLUS} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$ENDIF}
TMiTeC_Winsock = class(TMiTeC_Component)
private
FDesc: string;
FStat: string;
FMajVer: word;
FMinVer: word;
public
procedure Clear; override;
procedure RefreshData(AScanObjects: TScanObjects = soAll); override;
procedure SaveToStorage(const AFilename: string; var AWriteHeader: Boolean; AFormat: integer = 0; const AComment: string=''; ACodeStream: TCodeStreamProcedure = nil); override;
function LoadFromStorage(const AFilename: string; var AReadHeader: boolean; ACodeStream: TCodeStreamProcedure = nil): boolean; override;
published
property Description: string read FDesc stored False;
property MajorVersion: word read FMajVer stored False;
property MinorVersion: word read FMinVer stored False;
property Status: string read FStat stored False;
end;
TAdapterType = (atOther, atEthernet, atTokenRing, atFDDI, atPPP, atLoopback, atATM, atIEEE80211, atTunnel, atIEEE1394, atIEEE80216_WMAN, atWWANPP, atWWANPP2);
TAdapter = record
Name,
Alias,
AdapterName,
Address: string;
MaxSpeed,
MTU: Cardinal;
Typ: TAdapterType;
AdminStatus,
OperStatus: Cardinal;
EnableDHCP,
HaveWINS,
DNSEnabled,
NETBIOSEnabled,
IPv4Enabled,
IPv6Enabled: Boolean;
IPAddress,
IPAddressMask,
Gateway_IPAddress,
Gateway_IPAddressMask,
DHCP_IPAddress,
DHCP_IPAddressMask,
PrimaryWINS_IPAddress,
PrimaryWINS_IPAddressMask,
SecondaryWINS_IPAddress,
SecondaryWINS_IPAddressMask: TStringList;
DNSServers: TStringList;
IPv6Address,
Gateway_IPv6,
DHCP_IPv6,
PrimaryWINS_IPv6,
DNSServers_IPv6: TStringList;
DNSSuffix: string;
IntfIdx: Cardinal;
end;
TAdapterList = array of TAdapter;
TAddressRecord = record
IP,
Mask: string;
IntfIdx: Cardinal;
Typ: Word;
end;
TAddressTable = array of TAddressRecord;
TNodeType = (ntUnknown, ntBroadcast, ntPeerToPeer, ntMixed, ntHybrid);
{$IFDEF RAD9PLUS} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$ENDIF}
TMiTeC_TCPIP = class(TMiTeC_Component)
private
FAdapters: TAdapterList;
FAT: TAddressTable;
FProxy: boolean;
FRouting: boolean;
FDNS: boolean;
FHost: string;
FDomain: string;
FDNSSuf: string;
FDNSList,
FIL,
FDNSSuffix: TStrings;
FNode: TNodeType;
FDHCPScope: string;
FBII: Cardinal;
procedure ClearList;
function GetAdapter(Index: Word): TAdapter;
function GetAdapterCount: Word;
function Add(ARecord: TAdapter): Integer;
function GetAddrRec(Index: Word): TAddressRecord;
function GetAddrRecCount: Word;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear; override;
procedure RefreshData(AScanObjects: TScanObjects = soAll); override;
procedure SaveToStorage(const AFilename: string; var AWriteHeader: Boolean; AFormat: integer = 0; const AComment: string=''; ACodeStream: TCodeStreamProcedure = nil); override;
function LoadFromStorage(const AFilename: string; var AReadHeader: boolean; ACodeStream: TCodeStreamProcedure = nil): boolean; override;
function FindAdapter(AName: string): Integer; overload;
function FindAdapter(AIntfIdx: Cardinal): Integer; overload;
function FindAddress(AIP: string): Integer; overload;
function FindAddress(AIntfIdx: Cardinal): Integer; overload;
function GetSubnetMask(AIP: string): string;
property Adapter[Index: Word]: TAdapter read GetAdapter;
property AddressRecord[Index: Word]: TAddressRecord read GetAddrRec;
published
property AdapterCount: Word read GetAdapterCount stored False;
property AddressRecordCount: Word read GetAddrRecCount stored False;
property HostName: string read FHost stored False;
property DomainName: string read FDomain stored False;
property EnableProxy: boolean read FProxy stored False;
property EnableRouting: boolean read FRouting stored False;
property EnableDNS: boolean read FDNS stored False;
property PrimaryDNSSuffix: string read FDNSSuf stored False;
property DHCPScopeName: string read FDHCPScope stored False;
property DNSServers: TStrings read FDNSList stored False;
property DNSSuffixes: TStrings read FDNSSuffix stored False;
property NodeType: TNodeType read FNode stored False;
property BestInterfaceIdx: Cardinal read FBII stored False;
end;
{$IFDEF RAD9PLUS} [ComponentPlatformsAttribute(pidWin32 or pidWin64)] {$ENDIF}
TMiTeC_Network = class(TMiTeC_Component)
private
FVirtAdapter,FPhysAdapter: TStrings;
FWinsock: TMiTeC_Winsock;
FIPAddress: TStrings;
FMACAddress: TStrings;
FCli: TStrings;
FServ: TStrings;
FProto: TStrings;
FTCPIP: TMiTeC_TCPIP;
FNetResources: TMiTeC_NetResources;
//FDevices: TMiTeC_Devices;
function GetLocalIP :string;
protected
procedure SetHeaderReader(const Value: THeaderReader); override;
procedure SetHeaderWriter(const Value: THeaderWriter); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Clear; override;
procedure RefreshData(AScanObjects: TScanObjects = soAll); override;
procedure SaveToStorage(const AFilename: string; var AWriteHeader: Boolean; AFormat: integer = 0; const AComment: string=''; ACodeStream: TCodeStreamProcedure = nil); override;
function LoadFromStorage(const AFilename: string; var AReadHeader: boolean; ACodeStream: TCodeStreamProcedure = nil): boolean; override;
published
//property MiTeC_Devices: TMiTeC_Devices read FDevices write FDevices;
property IPAddresses: TStrings read FIPAddress stored false;
property MACAddresses: TStrings read FMACAddress stored False;
property PhysicalAdapters :TStrings read FPhysAdapter stored False;
property VirtualAdapters :TStrings read FVirtAdapter stored false;
property Protocols :TStrings read FProto stored False;
property Services :TStrings read FServ stored False;
property Clients :TStrings read FCli stored False;
property WinSock: TMiTeC_Winsock read FWinsock stored false;
property Resources: TMiTeC_NetResources read FNetResources stored False;
property TCPIP: TMiTeC_TCPIP read FTCPIP stored False;
end;
const
NodeTypes: array[TNodeType] of string = ('Unknown','Broadcast','Peer-To-Peer','Mixed','Hybrid');
AdapterTypes: array[TAdapterType] of string = ('Other',
'Ethernet',
'Token Ring',
'FDDI',
'PPP',
'Loopback',
'ATM',
'IEEE 802.11 wireless',
'Tunnel encapsulation',
'IEEE 1394 (Firewire) high performance serial bus',
'Mobile broadband for WiMax',
'Mobile broadband for GSM',
'Mobile broadband for CDMA');
implementation
uses {$IFDEF RAD9PLUS}
System.Win.Registry,
{$ELSE}
Registry,
{$ENDIF}
MiTeC_StrUtils, MiTeC_Routines, MiTeC_IPTypes, MiTeC_CfgMgrSetupAPI, MiTeC_RegUtils;
{ TMiTeC_Winsock }
procedure TMiTeC_Winsock.Clear;
begin
end;
function TMiTeC_Winsock.LoadFromStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
strm: TStorageStream;
sl: TStringList;
begin
Result:=inherited LoadFromStorage(AFilename,AReadHeader,ACodeStream);
Clear;
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
Exit;
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_READ_INSTORAGE,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
Result:=False;
try
Sub:=SS.OpenSubStorage(Winsock_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
strm:=Sub.OpenStream(strm_Props,STG_READ_INSTORAGE,False);
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
Self.FMajVer:=ReadIntProperty(sl,'MajorVersion');
Self.FMinVer:=ReadIntProperty(sl,'MinorVersion');
Self.FDesc:=ReadStrProperty(sl,'Description');
Self.FStat:=ReadStrProperty(sl,'Status');
Result:=True;
SetDataAvail(True);
finally
sl.Free;
end;
finally
strm.Free;
end;
finally
if Sub<>nil then
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_Winsock.RefreshData;
var
GInitData :TWSADATA;
begin
inherited;
Clear;
if wsastartup($101,GInitData)=0 then begin
FDesc:=string(GInitData.szDescription);
FStat:=string(GInitData.szSystemStatus);
FMajVer:=Hi(GInitData.wHighVersion);
FMinVer:=Lo(GInitData.wHighVersion);
wsacleanup;
end else
FStat:='Winsock cannot be initialized.';
SetDataAvail(True);
end;
procedure TMiTeC_Winsock.SaveToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
strm: TStorageStream;
sl: TStringList;
begin
inherited SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(Winsock_StorageFolderName);
Sub:=SS.OpenSubStorage(Winsock_StorageFolderName,STG_OPEN,True);
try
sl:=TStringList.Create;
try
WriteIntProperty(sl,'MajorVersion',Self.MajorVersion);
WriteIntProperty(sl,'MinorVersion',Self.MinorVersion);
WriteStrProperty(sl,'Description',Self.Description);
WriteStrProperty(sl,'Status',Self.Status);
strm:=Sub.OpenStream(strm_Props,STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
{ TMiTeC_Network }
function TMiTeC_Network.GetLocalIP: string;
type
TaPInAddr = array [0..255] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe :PHostEnt;
pptr :PaPInAddr;
Buffer :array [0..63] of ansichar;
i :integer;
GInitData :TWSADATA;
begin
wsastartup($101,GInitData);
result:='';
GetHostName(Buffer,SizeOf(Buffer));
phe:=GetHostByName(buffer);
if not assigned(phe) then
exit;
pptr:=PaPInAddr(Phe^.h_addr_list);
i:=0;
while pptr^[I]<>nil do begin
result:=Result+IPv4ToStr(InAddrToIPv4(pptr^[I]^))+',';
inc(i);
end;
Delete(Result,Length(Result),1);
wsacleanup;
end;
function TMiTeC_Network.LoadFromStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
strm: TStorageStream;
sl: TStringList;
begin
inherited LoadFromStorage(AFilename,AReadHeader,ACodeStream);
Clear;
{$B+}
Result:=TCPIP.LoadFromStorage(AFilename,AReadHeader,ACodeStream)
and Winsock.LoadFromStorage(AFilename,AReadHeader,ACodeStream)
and Resources.LoadFromStorage(AFilename,AReadHeader,ACodeStream);
{$B-}
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
Exit;
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_READ_INSTORAGE,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
Result:=False;
try
Sub:=SS.OpenSubStorage(StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
strm:=Sub.OpenStream(strm_Props,STG_READ_INSTORAGE,False);
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
Self.FPhysAdapter.CommaText:=ReadStrProperty(sl,'PhysicalAdapters');
Self.FVirtAdapter.CommaText:=ReadStrProperty(sl,'VirtualAdapters');
Self.FIPAddress.CommaText:=ReadStrProperty(sl,'IPAdress');
Self.FMACAddress.CommaText:=ReadStrProperty(sl,'MACAddress');
Self.FProto.CommaText:=ReadStrProperty(sl,'Protocols');
Self.FServ.CommaText:=ReadStrProperty(sl,'Services');
Self.FCli.CommaText:=ReadStrProperty(sl,'Clients');
Result:=True;
SetDataAvail(True);
finally
sl.Free;
end;
finally
strm.Free;
end;
finally
if Sub<>nil then
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_Network.RefreshData;
var
i: integer;
s,ck,dv,li,nm,rlk,rlv: string;
sl: TStringList;
guid: TGUID;
did: TSPDeviceInterfaceData;
pdidd: PSPDeviceInterfaceDetailData;
dinfo: TSPDevInfoData;
hdev: HDEVINFO;
le,n: Cardinal;
const
rkNetworkNT = {HKEY_LOCAL_MACHINE}'\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards';
rkNetwork2K = {HKEY_LOCAL_MACHINE}'\SYSTEM\CurrentControlSet\Control\Network';
rkClass = {HKEY_LOCAL_MACHINE}'\SYSTEM\CurrentControlSet\Control\Class';
rvNetworkNT = 'Description';
rvProtoClass = 'NetTrans';
rvServClass = 'NetService';
rvCliClass = 'NetClient';
procedure GetComponents(AGroup: string; AList: TStrings);
var
i,j,p: Integer;
kl1,kl2,vl: TStringList;
s,d,f: string;
begin
with OpenRegistryReadOnly do begin
kl1:=TStringList.Create;
kl2:=TStringList.Create;
vl:=TStringList.Create;
try
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey(rkClass,False) then begin
GetKeyNames(kl1);
CloseKey;
for i:=0 to kl1.Count-1 do begin
if OpenKey(rkClass+'\'+kl1[i],False) then begin
s:='';
if ValueExists('Class') then
s:=ReadString('Class');
CloseKey;
if not SameText(s,AGroup) then
Continue;
if OpenKey(rkNetwork2K+'\'+kl1[i],False) then begin
GetKeyNames(kl2);
CloseKey;
for j:=0 to kl2.Count-1 do begin
if OpenKey(rkNetwork2K+'\'+kl1[i]+'\'+kl2[j],False) then begin
if ValueExists(rvNetworkNT) then begin
d:=ReadString(rvNetworkNT);
p:=Pos(';',d);
if p>0 then
d:=Copy(d,p+1,255)
else begin
if Pos('@',d)=1 then
Delete(d,1,1);
p:=Pos(',',d);
if p>0 then begin
f:=ExpandEnvVars(Copy(d,1,p-1));
try
p:=StrToInt(Copy(d,p+2,255));
except
p:=0;
end;
d:=LoadResourceString(f,p);
end;
end;
if d='' then
d:=GetFileDesc(f);
if d='' then
d:=ExtractFilename(d);
AList.Add(d);
end;
CloseKey;
end;
end;
end;
Break;
end;
end;
end;
finally
kl1.Free;
kl2.Free;
vl.Free;
Free;
end;
end;
end;
begin
inherited;
Clear;
{
s:='';
if Assigned(FDevices) then
with FDevices do begin
if not (Owner is TMiTeC_Component) or not FDevices.DataAvailable then
RefreshData;
for i:=0 to DeviceCount-1 do begin
s:=Devices[i].Name;
if Devices[i].DeviceClass=dcNet then begin
if (Devices[i].ResourceListKey<>'') and (Devices[i].Location<>'') then
FPhysAdapter.Add(s)
else
FVirtAdapter.Add(s)
end;
end;
end;
}
guid:=GUID_DEVINTERFACE_NET;
hdev:=SetupDiGetClassDevs(@guid,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
if (INVALID_HANDLE_VALUE<>THandle(hdev)) then begin
try
for i:=0 to 99 do begin
FillChar(did,SizeOf(did),0);
did.cbSize:=SizeOf(did);
if (SetupDiEnumDeviceInterfaces(hdev,nil,guid,i,did)) then begin
n:=0;
SetupDiGetDeviceInterfaceDetail(hdev,@did,nil,0,n,nil);
le:=GetLastError;
if (le=ERROR_INSUFFICIENT_BUFFER) then begin
n:=n;
pdidd:=AllocMem(n);
try
pdidd.cbSize:=SizeOf(TSPDeviceInterfaceDetailData);
dinfo.cbSize:=sizeof(TSPDevInfoData);
if (SetupDiGetDeviceInterfaceDetail(hdev,@did,pdidd,n,n,@dinfo)) then begin
s:=PChar(@(pdidd.DevicePath));
if (Trim(s)<>'') and (Trim(s)<>'\') then begin
nm:=GetString(hdev,dinfo,SPDRP_DEVICEDESC);
li:=GetString(hdev,dinfo,SPDRP_LOCATION_INFORMATION);
GetResourceListLocation('\SYSTEM\CurrentControlSet\Enum\'+FastStringReplace(Copy(s,5,Pos('{',s)-5),'#','\'),rlk,rlv);
if (rlk<>'') and (li<>'') then
FPhysAdapter.Add(nm)
else
FVirtAdapter.Add(nm);
end;
end;
finally
FreeMem(pdidd);
end;
end;
end else begin
le:=GetLastError;
if le=ERROR_NO_MORE_ITEMS then
Break;
end;
end;
finally
SetupDiDestroyDeviceInfoList(hdev);
end;
end;
Resources.RefreshData;
Winsock.RefreshData;
TCPIP.RefreshData;
with OpenRegistryReadOnly do begin
sl:=TStringList.Create;
try
RootKey:=HKEY_LOCAL_MACHINE;
if OpenKey(rkNetworkNT,False) then begin
GetKeyNames(sl);
CloseKey;
for i:=0 to sl.Count-1 do
if OpenKey(rkNetworkNT+'\'+sl[i],False) then begin
s:=ReadString(rvNetworkNT);
if FPhysAdapter.IndexOf(s)=-1 then
FPhysAdapter.Add(s);
Closekey;
end;
end;
finally
sl.Free;
Free;
end;
end;
FIPAddress.CommaText:=GetLocalIP;
ck:=rkNetwork2K;
dv:=rvNetworkNT;
GetComponents(rvProtoClass,FProto);
GetComponents(rvServClass,FServ);
GetComponents(rvCliClass,FCli);
for i:=0 to TCPIP.AdapterCount-1 do
if (TCPIP.Adapter[i].OperStatus=MIB_IF_OPER_STATUS_OPERATIONAL) then
FMACAddress.Add(TCPIP.Adapter[i].Address);
//NB_GetMACAddresses(Machinename,FMACAddress);
SetDataAvail(True);
end;
procedure TMiTeC_Network.Clear;
begin
FPhysAdapter.Clear;
FVirtAdapter.Clear;
FIPAddress.Clear;
FMACAddress.Clear;
FCli.Clear;
FServ.Clear;
FProto.Clear;
Resources.Clear;
Winsock.Clear;
TCPIP.ClearList;
end;
constructor TMiTeC_Network.Create;
begin
inherited Create(AOwner);
FNetResources:=TMiTeC_NetResources.Create(Self);
FNetResources.Name:='NetResources';
FWinsock:=TMiTeC_Winsock.Create(Self);
FWinsock.Name:='Winsock';
FTCPIP:=TMiTeC_TCPIP.Create(Self);
FTCPIP.Name:='TCPIP';
FVirtAdapter:=TStringList.Create;
FPhysAdapter:=TStringList.Create;
FIPAddress:=TStringList.Create;
FMACAddress:=TStringList.Create;
FProto:=TStringList.Create;
FServ:=TStringList.Create;
FCli:=TStringList.Create;
end;
destructor TMiTeC_Network.Destroy;
begin
FNetResources.Free;
FWinsock.Destroy;
FTCPIP.Destroy;
FVirtAdapter.Destroy;
FPhysAdapter.Destroy;
FMACAddress.Destroy;
FIPAddress.Destroy;
FProto.Destroy;
FCli.Destroy;
FServ.Destroy;
inherited;
end;
procedure TMiTeC_Network.SaveToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
strm: TStorageStream;
sl: TStringList;
begin
inherited SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
Resources.SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
Winsock.SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
TCPIP.SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(StorageFolderName);
Sub:=SS.OpenSubStorage(StorageFolderName,STG_OPEN,True);
try
sl:=TStringList.Create;
try
WriteStrProperty(sl,'PhysicalAdapters',Self.PhysicalAdapters.CommaText);
WriteStrProperty(sl,'VirtualAdapters',Self.VirtualAdapters.CommaText);
WriteStrProperty(sl,'IPAdress',Self.IPAddresses.CommaText);
WriteStrProperty(sl,'MACAddress',Self.MACAddresses.CommaText);
WriteStrProperty(sl,'Protocols',Self.Protocols.CommaText);
WriteStrProperty(sl,'Services',Self.Services.CommaText);
WriteStrProperty(sl,'Clients',Self.Clients.CommaText);
strm:=Sub.OpenStream(strm_Props,STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_Network.SetHeaderReader(const Value: THeaderReader);
begin
inherited;
FNetResources.OnReadHeader:=Value;
FWinsock.OnReadHeader:=Value;
FTCPIP.OnReadHeader:=Value;
end;
procedure TMiTeC_Network.SetHeaderWriter(const Value: THeaderWriter);
begin
inherited;
FNetResources.OnWriteHeader:=Value;
FWinsock.OnWriteHeader:=Value;
FTCPIP.OnWriteHeader:=Value;
end;
{ TMiTeC_TCPIP }
function TMiTeC_TCPIP.Add(ARecord: TAdapter): Integer;
begin
SetLength(FAdapters,Length(FAdapters)+1);
Result:=High(FAdapters);
FAdapters[Result]:=ARecord;
end;
procedure TMiTeC_TCPIP.Clear;
begin
ClearList;
Finalize(FAT);
FProxy:=False;
FRouting:=False;
FDNS:=False;
FHost:='';
FDomain:='';
FDNSList.Clear;
FNode:=ntUnknown;
FDHCPScope:='';
FDNSSuf:='';
FBII:=0;
FIL.Clear;
end;
procedure TMiTeC_TCPIP.ClearList;
var
i: Integer;
begin
for i:=0 to High(FAdapters) do begin
FAdapters[i].IPAddress.Free;
FAdapters[i].IPAddressMask.Free;
FAdapters[i].Gateway_IPAddress.Free;
FAdapters[i].Gateway_IPAddressMask.Free;
FAdapters[i].DHCP_IPAddress.Free;
FAdapters[i].DHCP_IPAddressMask.Free;
FAdapters[i].PrimaryWINS_IPAddress.Free;
FAdapters[i].PrimaryWINS_IPAddressMask.Free;
FAdapters[i].SecondaryWINS_IPAddress.Free;
FAdapters[i].SecondaryWINS_IPAddressMask.Free;
FAdapters[i].DNSServers.Free;
FAdapters[i].IPv6Address.Free;
FAdapters[i].Gateway_IPv6.Free;
FAdapters[i].DHCP_IPv6.Free;
FAdapters[i].PrimaryWINS_IPv6.Free;
FAdapters[i].DNSServers_IPv6.Free;
Finalize(FAdapters[i]);
end;
Finalize(FAdapters);
end;
constructor TMiTeC_TCPIP.Create;
begin
inherited Create(AOwner);
FDNSList:=TStringList.Create;
FDNSSuffix:=TStringList.Create;
FIL:=TStringList.Create;
end;
destructor TMiTeC_TCPIP.Destroy;
begin
ClearList;
FDNSList.Destroy;
FDNSSuffix.Destroy;
FIL.Free;
inherited;
end;
function TMiTeC_TCPIP.FindAdapter(AIntfIdx: Cardinal): Integer;
var
i: Integer;
begin
Result:=-1;
for i:=0 to High(FAdapters) do
if (FAdapters[i].IntfIdx=AIntfIdx) then begin
Result:=i;
Break;
end;
end;
function TMiTeC_TCPIP.FindAdapter(AName: string): Integer;
var
i: Integer;
begin
Result:=-1;
for i:=0 to High(FAdapters) do
if SameText(FAdapters[i].Name,AName) then begin
Result:=i;
Break;
end;
end;
function TMiTeC_TCPIP.GetAdapter(Index: Word): TAdapter;
begin
Result:=FAdapters[Index];
end;
function TMiTeC_TCPIP.GetAdapterCount: Word;
begin
Result:=Length(FAdapters);
end;
function TMiTeC_TCPIP.GetAddrRec(Index: Word): TAddressRecord;
begin
Result:=FAT[Index];
end;
function TMiTeC_TCPIP.GetAddrRecCount: Word;
begin
Result:=Length(FAT);
end;
function TMiTeC_TCPIP.GetSubnetMask(AIP: string): string;
var
c: Byte;
begin
Result:='0.0.0.0';
c:=StrToIntDef(Copy(AIP,1,Pos('.',AIP)-1),0);
if c in [1..126] then
Result:='255.0.0.0'
else if c in [128..191] then
Result:='255.255.0.0'
else if c in [192..223] then
Result:='255.255.255.0';
end;
function TMiTeC_TCPIP.LoadFromStorage;
var
stg: IStorage;
SS, Sub: TStructuredStorage;
function ReadAdapterFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
A: TAdapter;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
A.IPAddress:=TStringList.Create;
A.IPAddressMask:=TStringList.Create;
A.Gateway_IPAddress:=TStringList.Create;
A.Gateway_IPAddressMask:=TStringList.Create;
A.DHCP_IPAddress:=TStringList.Create;
A.DHCP_IPAddressMask:=TStringList.Create;
A.PrimaryWINS_IPAddress:=TStringList.Create;
A.PrimaryWINS_IPAddressMask:=TStringList.Create;
A.SecondaryWINS_IPAddress:=TStringList.Create;
A.SecondaryWINS_IPAddressMask:=TStringList.Create;
A.DNSServers:=TStringList.Create;
A.IPv6Address:=TStringList.Create;
A.Gateway_IPv6:=TStringList.Create;
A.DHCP_IPv6:=TStringList.Create;
A.PrimaryWINS_IPv6:=TStringList.Create;
A.DNSServers_IPv6:=TStringList.Create;
A.Name:=ReadStrProperty(sl,'Name');
A.AdapterName:=ReadStrProperty(sl,'AdapterName');
A.Alias:=ReadStrProperty(sl,'Alias');
A.Address:=ReadStrProperty(sl,'Address');
A.MaxSpeed:=ReadIntProperty(sl,'MaxSpeed');
A.MTU:=ReadIntProperty(sl,'MTU');
A.OperStatus:=ReadIntProperty(sl,'OperStatus');
A.AdminStatus:=ReadIntProperty(sl,'AdminStatus');
A.Typ:=TAdapterType(ReadIntProperty(sl,'Typ'));
A.EnableDHCP:=ReadIntProperty(sl,'EnableDHCP')=1;
A.HaveWINS:=ReadIntProperty(sl,'HaveWINS')=1;
A.DNSEnabled:=ReadIntProperty(sl,'DNSEnabled')=1;
A.IPv4Enabled:=ReadIntProperty(sl,'IPv4Enabled')=1;
A.IPv6Enabled:=ReadIntProperty(sl,'IPv6Enabled')=1;
A.IPAddress.CommaText:=ReadStrProperty(sl,'IPAddress');
A.IPAddressMask.CommaText:=ReadStrProperty(sl,'IPAddressMask');
A.Gateway_IPAddress.CommaText:=ReadStrProperty(sl,'Gateway_IPAddress');
A.Gateway_IPAddressMask.CommaText:=ReadStrProperty(sl,'Gateway_IPAddressMask');
A.DHCP_IPAddress.CommaText:=ReadStrProperty(sl,'DHCP_IPAddress');
A.DHCP_IPAddressMask.CommaText:=ReadStrProperty(sl,'DHCP_IPAddressMask');
A.PrimaryWINS_IPAddress.CommaText:=ReadStrProperty(sl,'PrimaryWINS_IPAddress');
A.PrimaryWINS_IPAddressMask.CommaText:=ReadStrProperty(sl,'PrimaryWINS_IPAddressMask');
A.SecondaryWINS_IPAddress.CommaText:=ReadStrProperty(sl,'SecondaryWINS_IPAddress');
A.SecondaryWINS_IPAddressMask.CommaText:=ReadStrProperty(sl,'SecondaryWINS_IPAddressMask');
A.DNSServers.CommaText:=ReadStrProperty(sl,'DNSServers');
A.IPv6Address.CommaText:=ReadStrProperty(sl,'IPv6Address');
A.Gateway_IPv6.CommaText:=ReadStrProperty(sl,'Gateway_IPv6');
A.DHCP_IPv6.CommaText:=ReadStrProperty(sl,'DHCP_IPv6');
A.PrimaryWINS_IPv6.CommaText:=ReadStrProperty(sl,'PrimaryWINS_IPv6');
A.DNSServers_IPv6.CommaText:=ReadStrProperty(sl,'DNSServers_IPv6');
A.DNSSuffix:=ReadStrProperty(sl,'DNSSuffix');
A.IntfIdx:=ReadIntProperty(sl,'InterfaceIndex');
Add(A);
Result:=True;
SetDataAvail(True);
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
function ReadAddressRecordFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
A: TAddressRecord;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_IP,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
A.IP:=ReadStrProperty(sl,'IP');
A.Mask:=ReadStrProperty(sl,'Mask');
A.IntfIdx:=ReadIntProperty(sl,'InterfaceIndex');
A.Typ:=ReadIntProperty(sl,'Typ');
SetLength(FAT,Length(FAT)+1);
FAT[High(FAT)]:=A;
Result:=True;
SetDataAvail(True);
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
var
i: Integer;
strm: TStorageStream;
sl: TStringList;
begin
i:=0;
Clear;
Result:=inherited LoadFromStorage(AFilename,AReadHeader,ACodeStream);
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
Exit;
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_READ_INSTORAGE,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
try
Sub:=SS.OpenSubStorage(TCPIP_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
try
if Sub<>nil then begin
strm:=Sub.OpenStream(strm_Props,STG_READ_INSTORAGE,False);
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
Self.FHost:=ReadStrProperty(sl,'HostName');
Self.FDomain:=ReadStrProperty(sl,'DomainName');
Self.FDNSSuf:=ReadStrProperty(sl,'PrimaryDNSSuffix');
Self.FDNSList.CommaText:=ReadStrProperty(sl,'DNSServers');
Self.FDNSSuffix.CommaText:=ReadStrProperty(sl,'DNSSuffixes');
Self.FDHCPScope:=ReadStrProperty(sl,'DHCPScopeName');
Self.FNode:=TNodeType(ReadIntProperty(sl,'NodeType'));
Self.FProxy:=ReadIntProperty(sl,'EnableProxy')=1;
Self.FRouting:=ReadIntProperty(sl,'EnableRouting')=1;
Self.FDNS:=ReadIntProperty(sl,'EnableDNS')=1;
Self.FBII:=ReadIntProperty(sl,'BestInterfaceIndex');
Result:=True;
SetDataAvail(True);
finally
sl.Free;
end;
finally
strm.Free;
end;
i:=0;
while ReadAddressRecordFromStream(i) do
Inc(i);
i:=0;
while ReadAdapterFromStream(i) do
Inc(i);
end;
Result:=Result or (i>0);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_TCPIP.RefreshData;
var
aim: TIP_ADAPTER_INDEX_MAP;
ai, aiInitPtr: PIP_ADAPTER_INFO;
lastip,ip: PIP_ADDR_STRING;
aa,aaInitPtr: PIP_ADAPTER_ADDRESSES;
lastdns,dns: PIP_ADAPTER_DNS_SERVER_ADDRESS;
gw,lastgw: PIP_ADAPTER_GATEWAY_ADDRESS_LH;
wins,lastwins: PIP_ADAPTER_WINS_SERVER_ADDRESS_LH;
fua,lastfua: PIP_ADAPTER_UNICAST_ADDRESS;
Entry: TMIB_IFROW;
IPAdrRow: TMIB_IPADDRROW;
np: PFixedInfo;
r,j,n: Cardinal;
Size: ulong;
A: TAdapter;
s: string;
pBuf,pb: PAnsiChar;
idx: Integer;
luid: NET_LUID;
alias: array[0..IF_MAX_STRING_SIZE] of char;
sa4: sockaddr_in;
sa6: TSockAddrIn6;
buf: array[0..255] of char;
const
rkTCPIP = {HKEY_LOCAL_MACHINE\}'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters';
rvSL = 'SearchList';
begin
inherited;
Clear;
if InitIpHlpAPI then begin
size:=SizeOf(TIP_INTERFACE_INFO);
pBuf:=AllocMem(size);
try
r:=GetInterfaceInfo(PIP_INTERFACE_INFO(pBuf),size);
while(r=ERROR_INSUFFICIENT_BUFFER) do begin
size:=Size+SizeOf(TIP_INTERFACE_INFO);
ReallocMem(pBuf,size);
r:=GetInterfaceInfo(PIP_INTERFACE_INFO(pBuf),size);
end;
pb:=pBuf;
if(r=ERROR_SUCCESS) then begin
n:=PIP_INTERFACE_INFO(pb).NumAdapters;
if n>0 then begin
Inc(pb,SizeOf(integer));
for j:=1 to n do begin
aim:=PIP_ADAPTER_INDEX_MAP(pb)^;
s:={$IFNDEF UNICODE}WideToAnsi{$ENDIF}(Trim(WideString(aim.Name)));
idx:=Pos('}',s);
if idx>0 then
SetLength(s,idx);
FIL.Add(Format('%s=%d',[s,aim.Index]));
Inc(pb,SizeOf(Integer)+SizeOf(TIP_ADAPTER_INDEX_MAP));
end;
end;
end;
finally
try FreeMem(pBuf) except end;
end;
size:=SizeOf(IP_ADAPTER_INFO);
aiInitPtr:=AllocMem(size);
try
r:=GetAdaptersInfo(aiInitPtr,size);
while(r=ERROR_BUFFER_OVERFLOW) do begin
size:=Size+SizeOf(IP_ADAPTER_INFO);
ReallocMem(aiInitPtr,size);
r:=GetAdaptersInfo(aiInitPtr,size);
end;
ai:=aiInitPtr;
if(r=ERROR_SUCCESS) then begin
while assigned(ai) do begin
A.IPAddress:=TStringList.Create;
A.IPAddressMask:=TStringList.Create;
A.Gateway_IPAddress:=TStringList.Create;
A.Gateway_IPAddressMask:=TStringList.Create;
A.DHCP_IPAddress:=TStringList.Create;
A.DHCP_IPAddressMask:=TStringList.Create;
A.PrimaryWINS_IPAddress:=TStringList.Create;
A.PrimaryWINS_IPAddressMask:=TStringList.Create;
A.SecondaryWINS_IPAddress:=TStringList.Create;
A.SecondaryWINS_IPAddressMask:=TStringList.Create;
A.DNSServers:=TStringList.Create;
A.IPv6Address:=TStringList.Create;
A.Gateway_IPv6:=TStringList.Create;
A.DHCP_IPv6:=TStringList.Create;
A.PrimaryWINS_IPv6:=TStringList.Create;
A.DNSServers_IPv6:=TStringList.Create;
A.AdapterName:=Trim(string(ai^.AdapterName));
A.Name:=Trim(string(ai^.Description));
case ai^.Type_ of
MIB_IF_OTHER_ADAPTERTYPE: A.Typ:=atOther;
MIB_IF_ETHERNET_ADAPTERTYPE: A.Typ:=atEthernet;
MIB_IF_TOKEN_RING_ADAPTERTYPE: A.Typ:=atTokenRing;
MIB_IF_FDDI_ADAPTERTYPE: A.Typ:=atFDDI;
MIB_IF_PPP_ADAPTERTYPE: A.Typ:=atPPP;
MIB_IF_LOOPBACK_ADAPTERTYPE: A.Typ:=atLoopback;
MIB_IF_ATM_ADAPTERTYPE,MIB_IF_TYPE_SLIP: A.Typ:=atATM;
MIB_IF_TYPE_IEEE80211: A.Typ:=atIEEE80211;
MIB_IF_TYPE_TUNNEL: A.Typ:=atTunnel;
MIB_IF_TYPE_IEEE1394: A.Typ:=atIEEE1394;
MIB_IF_TYPE_IEEE80216_WMAN: A.Typ:=atIEEE80216_WMAN;
MIB_IF_TYPE_WWANPP: A.Typ:=atWWANPP;
MIB_IF_TYPE_WWANPP2: A.Typ:=atWWANPP2;
end;
s:='';
if ai^.AddressLength>0 then begin
for j:=0 to ai^.AddressLength-1 do
s:=s+Format('%2.2x:',[ai^.Address[j]]);
SetLength(s,Length(s)-1);
end;
A.Address:=s;
A.EnableDHCP:=Boolean(ai^.DhcpEnabled);
A.HaveWINS:=Boolean(ai^.HaveWins);
ip:=@(ai^.IpAddressList);
repeat
lastip:=ip;
if string(ip^.IpAddress.s)<>'' then begin
A.IPAddress.Add(string(ip^.IpAddress.s));
A.IPAddressMask.Add(string(ip^.IpMask.s));
end;
ip:=ip.Next;
until not Assigned(ip) or (lastip=ip);
ip:=@(ai^.GatewayList);
repeat
lastip:=ip;
if string(ip^.IpAddress.s)<>'' then begin
A.Gateway_IPAddress.Add(string(ip^.IpAddress.s));
A.Gateway_IPAddressMask.Add(string(ip^.IpMask.s));
end;
ip:=ip.Next;
until not Assigned(ip) or (lastip=ip);
ip:=@(ai^.DhcpServer);
repeat
lastip:=ip;
if string(ip^.IpAddress.s)<>'' then begin
A.DHCP_IPAddress.Add(string(ip^.IpAddress.s));
A.DHCP_IPAddressMask.Add(string(ip^.IpMask.s));
end;
ip:=ip.Next;
until not Assigned(ip) or (lastip=ip);
ip:=@(ai^.PrimaryWinsServer);
repeat
lastip:=ip;
if string(ip^.IpAddress.s)<>'' then begin
A.PrimaryWINS_IPAddress.Add(string(ip^.IpAddress.s));
A.PrimaryWINS_IPAddressMask.Add(string(ip^.IpMask.s));
end;
ip:=ip.Next;
until not Assigned(ip) or (lastip=ip);
ip:=@(ai^.SecondaryWinsServer);
repeat
lastip:=ip;
if string(ip^.IpAddress.s)<>'' then begin
A.SecondaryWINS_IPAddress.Add(string(ip^.IpAddress.s));
A.SecondaryWINS_IPAddressMask.Add(string(ip^.IpMask.s));
end;
ip:=ip.Next;
until not Assigned(ip) or (lastip=ip);
FillChar(Entry,SizeOf(Entry),0);
Entry.dwIndex:=ai.Index;
if GetIfEntry(Entry)=0 then begin
A.AdapterName:={$IFNDEF UNICODE}WideToAnsi{$ENDIF}(Trim(WideString(Entry.wszName)));
A.MaxSpeed:=Entry.dwSpeed;
A.MTU:=Entry.dwMTU;
A.AdminStatus:=Entry.dwAdminStatus;
A.OperStatus:=Entry.dwOperStatus;
end;
idx:=FIL.IndexOfName(A.Name);
if idx>-1 then
A.IntfIdx:=StrToInt(FIL.ValueFromIndex[idx])
else
A.IntfIdx:=ai.Index;
if Assigned(ConvertInterfaceIndexToLuid) and (ConvertInterfaceIndexToLuid(A.IntfIdx,@luid)=0) then begin
if ConvertInterfaceLuidToAlias(@luid,@alias,SizeOf(alias))=0 then
A.Alias:=alias;
end;
if A.Typ in [atOther, atEthernet, atTokenRing, atFDDI, atPPP, atLoopback, atATM, atIEEE80211, atTunnel, atIEEE1394, atIEEE80216_WMAN, atWWANPP, atWWANPP2] then
Add(A);
ai:=ai.Next;
end;
end;
finally
if Assigned(aiInitPtr) then
FreeMem(aiInitPtr);
end;
if Assigned(GetAdaptersAddresses) then begin
size:=SizeOf(IP_ADAPTER_ADDRESSES);
aaInitPtr:=AllocMem(size);
try
r:=GetAdaptersAddresses(AF_INET,GAA_FLAG_INCLUDE_PREFIX or GAA_FLAG_INCLUDE_ALL_INTERFACES,nil,aaInitPtr,@size);
while(r=ERROR_BUFFER_OVERFLOW) do begin
size:=Size+SizeOf(IP_ADAPTER_ADDRESSES);
ReallocMem(aaInitPtr,size);
r:=GetAdaptersAddresses(AF_INET,GAA_FLAG_INCLUDE_PREFIX or GAA_FLAG_INCLUDE_ALL_INTERFACES,nil,aaInitPtr,@size);
end;
aa:=aaInitPtr;
if(r=ERROR_SUCCESS) then begin
while assigned(aa) do begin
idx:=FindAdapter(aa.Union.IfIndex);
if idx>-1 then begin
FAdapters[idx].DNSEnabled:=aa.Flags and IP_ADAPTER_DDNS_ENABLED>0;
FAdapters[idx].NETBIOSEnabled:=aa.Flags and IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED>0;
FAdapters[idx].IPv4Enabled:=aa.Flags and IP_ADAPTER_IPV4_ENABLED>0;
FAdapters[idx].IPv6Enabled:=aa.Flags and IP_ADAPTER_IPV6_ENABLED>0;
FAdapters[idx].DNSSuffix:=aa.DnsSuffix;
dns:=aa^.FirstDnsServerAddress;
lastdns:=nil;
while Assigned(dns) and (lastdns<>dns) do begin
lastdns:=dns;
Move(dns.Address.lpSockaddr^,sa4,sizeof(sa4));
s:=IPv4ToStr(InAddrToIPv4(sa4.sin_addr));
FAdapters[idx].DNSServers.Add(s);
dns:=dns.Next;
end;
end;
aa:=aa.Next;
end;
end;
r:=GetAdaptersAddresses(AF_INET6,GAA_FLAG_INCLUDE_PREFIX,nil,aaInitPtr,@size);
while(r=ERROR_BUFFER_OVERFLOW) do begin
size:=Size+SizeOf(IP_ADAPTER_ADDRESSES);
ReallocMem(aaInitPtr,size);
r:=GetAdaptersAddresses(AF_INET6,GAA_FLAG_INCLUDE_PREFIX,nil,aaInitPtr,@size);
end;
aa:=aaInitPtr;
if(r=ERROR_SUCCESS) then begin
while assigned(aa) do begin
idx:=FindAdapter(aa.Union.IfIndex);
if idx>-1 then begin
fua:=aa^.FirstUnicastAddress;
lastfua:=nil;
while Assigned(fua) and (lastfua<>fua) do begin
lastfua:=fua;
Move(fua.Address.lpSockaddr^,sa6,sizeof(sa6));
if Assigned(InetNtop) then begin
ZeroMemory(@buf,sizeof(buf));
InetNtop(AF_INET6,@sa6.sin6_addr,@buf,sizeof(buf));
s:=string(buf);
end else
s:=IPv6ToStr(InAddrToIPv6(sa6.sin6_addr));
FAdapters[idx].IPv6Address.Add(s);
fua:=fua.Next;
end;
dns:=aa^.FirstDnsServerAddress;
lastdns:=nil;
while Assigned(dns) and (lastdns<>dns) do begin
lastdns:=dns;
Move(dns.Address.lpSockaddr^,sa6,sizeof(sa6));
if Assigned(InetNtop) then begin
ZeroMemory(@buf,sizeof(buf));
InetNtop(AF_INET6,@sa6.sin6_addr,@buf,sizeof(buf));
s:=string(buf);
end else
s:=IPv6ToStr(InAddrToIPv6(sa6.sin6_addr));
FAdapters[idx].DNSServers_IPv6.Add(s);
dns:=dns.Next;
end;
gw:=aa^.FirstGatewayAddress;
lastgw:=nil;
while Assigned(gw) and (lastgw<>gw) do begin
lastgw:=gw;
Move(gw.Address.lpSockaddr^,sa6,sizeof(sa6));
if Assigned(InetNtop) then begin
ZeroMemory(@buf,sizeof(buf));
InetNtop(AF_INET6,@sa6.sin6_addr,@buf,sizeof(buf));
s:=string(buf);
end else
s:=IPv6ToStr(InAddrToIPv6(sa6.sin6_addr));
FAdapters[idx].Gateway_IPv6.Add(s);
gw:=gw.Next;
end;
wins:=aa^.FirstWinsServerAddress;
lastwins:=nil;
while Assigned(wins) and (lastwins<>wins) do begin
lastwins:=wins;
Move(wins.Address.lpSockaddr^,sa6,sizeof(sa6));
if Assigned(InetNtop) then begin
ZeroMemory(@buf,sizeof(buf));
InetNtop(AF_INET6,@sa6.sin6_addr,@buf,sizeof(buf));
s:=string(buf);
end else
s:=IPv6ToStr(InAddrToIPv6(sa6.sin6_addr));
FAdapters[idx].PrimaryWINS_IPv6.Add(s);
wins:=wins.Next;
end;
if Assigned(aa.Dhcpv6Server.lpSockaddr) then begin
Move(aa.Dhcpv6Server.lpSockaddr^,sa6,sizeof(sa6));
if Assigned(InetNtop) then begin
ZeroMemory(@buf,sizeof(buf));
InetNtop(AF_INET6,@sa6.sin6_addr,@buf,sizeof(buf));
s:=string(buf);
end else
s:=IPv6ToStr(InAddrToIPv6(sa6.sin6_addr));
FAdapters[idx].DHCP_IPv6.Add(s);
end;
end;
aa:=aa.Next;
end;
end;
finally
if Assigned(aaInitPtr) then
FreeMem(aaInitPtr);
end;
end;
Size:=SizeOf(TFixedInfo);
np:=Allocmem(size);
try
r:=GetNetworkparams(np,Size);
while r=ERROR_BUFFER_OVERFLOW do begin
Reallocmem(np,size);
r:=GetNetworkparams(np,Size);
end;
if r=ERROR_SUCCESS then begin
case np^.NodeType of
BROADCAST_NODETYPE: FNode:=ntBroadcast;
PEER_TO_PEER_NODETYPE: FNode:=ntPeerToPeer;
MIXED_NODETYPE: FNode:=ntMixed;
HYBRID_NODETYPE: FNode:=ntHybrid;
else FNode:=ntUnknown;
end;
FDHCPScope:=string(np^.ScopeId);
if Assigned(np^.CurrentDnsServer) then
FDNSSuf:=string(np^.CurrentDnsServer.IpAddress.S)
else
FDNSSuf:='';
ip:=@(np^.DnsServerList);
FDNSList.Clear;
repeat
s:=string(ip^.IpAddress.s);
FDNSList.Add(s);
ip:=ip.Next;
until (not Assigned(ip)) or (s=string(ip^.IpAddress.s));
FHost:=string(np^.HostName);
FDomain:=string(np^.DomainName);
FProxy:=Boolean(np^.EnableProxy);
FRouting:=Boolean(np^.EnableRouting);
FDNS:=Boolean(np^.EnableDns);
end;
finally
if Assigned(np) then
FreeMem(np);
end;
size:=0;
r:=GetIPAddrTable(nil,@size,False);
if r=ERROR_NO_DATA then
Exit;
GetMem(pBuf,size);
n:=0;
try
r:=GetIpAddrTable(PMIB_IPADDRTABLE(pBuf),@Size,False);
pb:=pBuf;
if r=NO_ERROR then begin
n:=PMIB_IPADDRTABLE(pb)^.dwNumEntries;
if n>0 then begin
Inc(pb,SizeOf(Cardinal));
SetLength(FAT,n);
for j:=1 to n do begin
IPAdrRow:=PMIB_IPADDRROW(pb)^;
FAT[j-1].IP:=IPv4ToStr(InAddrToIPV4(TInAddr(IPAdrRow.dwAddr)));
FAT[j-1].Mask:=IPv4ToStr(InAddrToIPV4(TInAddr(IPAdrRow.dwMask)));
FAT[j-1].IntfIdx:=IPAdrRow.dwIndex;
FAT[j-1].Typ:=IPAdrRow.wType;
Inc(pb,SizeOf(IPAdrRow));
end;
end;
end;
finally
try FreeMem(pBuf) except end;
end;
if Assigned(GetBestInterface) then begin
r:=GetBestInterface(inet_addr(PAnsiChar('8.8.8.8')),n);
if r=NO_ERROR then
FBII:=n;
end;
FDNSSuffix.Clear;
s:=ReadRegistryString(HKEY_LOCAL_MACHINE,rkTCPIP,rvSL);
while Pos(',',s) <> 0 do begin
FDNSSuffix.Add(Copy(s,1,Pos(',',s)-1));
Delete(s,1,Pos(',',s));
end;
FDNSSuffix.Add(s);
end;
SetDataAvail(True);
end;
procedure TMiTeC_TCPIP.SaveToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
procedure WriteAdapterToStream(AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'Name',Self.Adapter[AIndex].Name);
WriteStrProperty(sl,'AdapterName',Self.Adapter[AIndex].AdapterName);
WriteStrProperty(sl,'Alias',Self.Adapter[AIndex].Alias);
WriteStrProperty(sl,'Address',Self.Adapter[AIndex].Address);
WriteIntProperty(sl,'MaxSpeed',integer(Self.Adapter[AIndex].MaxSpeed));
WriteIntProperty(sl,'MTU',integer(Self.Adapter[AIndex].MTU));
WriteIntProperty(sl,'AdminStatus',integer(Self.Adapter[AIndex].AdminStatus));
WriteIntProperty(sl,'OperStatus',integer(Self.Adapter[AIndex].OperStatus));
WriteStrProperty(sl,'IPAddress',Self.Adapter[AIndex].IPAddress.CommaText);
WriteStrProperty(sl,'IPAddressMask',Self.Adapter[AIndex].IPAddressMask.CommaText);
WriteStrProperty(sl,'Gateway_IPAddress',Self.Adapter[AIndex].Gateway_IPAddress.CommaText);
WriteStrProperty(sl,'Gateway_IPAddressMask',Self.Adapter[AIndex].Gateway_IPAddressMask.CommaText);
WriteStrProperty(sl,'DHCP_IPAddress',Self.Adapter[AIndex].DHCP_IPAddress.CommaText);
WriteStrProperty(sl,'DHCP_IPAddressMask',Self.Adapter[AIndex].DHCP_IPAddressMask.CommaText);
WriteStrProperty(sl,'PrimaryWINS_IPAddress',Self.Adapter[AIndex].PrimaryWINS_IPAddress.CommaText);
WriteStrProperty(sl,'PrimaryWINS_IPAddressMask',Self.Adapter[AIndex].PrimaryWINS_IPAddressMask.CommaText);
WriteStrProperty(sl,'SecondaryWINS_IPAddress',Self.Adapter[AIndex].SecondaryWINS_IPAddress.CommaText);
WriteStrProperty(sl,'SecondaryWINS_IPAddressMask',Self.Adapter[AIndex].SecondaryWINS_IPAddressMask.CommaText);
WriteStrProperty(sl,'DNSServers',Self.Adapter[AIndex].DNSServers.CommaText);
WriteStrProperty(sl,'IPv6Address',Self.Adapter[AIndex].IPv6Address.CommaText);
WriteStrProperty(sl,'Gateway_IPv6',Self.Adapter[AIndex].Gateway_IPv6.CommaText);
WriteStrProperty(sl,'DHCP_IPv6',Self.Adapter[AIndex].DHCP_IPv6.CommaText);
WriteStrProperty(sl,'PrimaryWINS_IPv6',Self.Adapter[AIndex].PrimaryWINS_IPv6.CommaText);
WriteStrProperty(sl,'DNSServers_IPv6',Self.Adapter[AIndex].DNSServers_IPv6.CommaText);
WriteStrProperty(sl,'DNSSuffix',Self.Adapter[AIndex].DNSSuffix);
WriteIntProperty(sl,'Typ',integer(Self.Adapter[AIndex].Typ));
WriteIntProperty(sl,'EnableDHCP',integer(Self.Adapter[AIndex].EnableDHCP));
WriteIntProperty(sl,'HaveWINS',integer(Self.Adapter[AIndex].HaveWINS));
WriteIntProperty(sl,'DNSEnabled',integer(Self.Adapter[AIndex].DNSEnabled));
WriteIntProperty(sl,'IPv4Enabled',integer(Self.Adapter[AIndex].IPv4Enabled));
WriteIntProperty(sl,'IPv6Enabled',integer(Self.Adapter[AIndex].IPv6Enabled));
WriteIntProperty(sl,'InterfaceIndex',integer(Self.Adapter[AIndex].IntfIdx));
strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
procedure WriteAddressRecordToStream(AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'IP',Self.FAT[AIndex].IP);
WriteStrProperty(sl,'Mask',Self.FAT[AIndex].Mask);
WriteIntProperty(sl,'InterfaceIndex',Self.FAT[AIndex].IntfIdx);
WriteIntProperty(sl,'Typ',Self.FAT[AIndex].Typ);
strm:=Sub.OpenStream(Format(strm_IP,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
var
i: Integer;
strm: TStorageStream;
sl: TStringList;
begin
inherited SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(TCPIP_StorageFolderName);
Sub:=SS.OpenSubStorage(TCPIP_StorageFolderName,STG_OPEN,True);
try
sl:=TStringList.Create;
try
WriteStrProperty(sl,'HostName',Self.HostName);
WriteStrProperty(sl,'DomainName',Self.DomainName);
WriteStrProperty(sl,'PrimaryDNSSuffix',Self.PrimaryDNSSuffix);
WriteStrProperty(sl,'DHCPScopeName',Self.DHCPScopeName);
WriteStrProperty(sl,'DNSServers',Self.DNSServers.CommaText);
WriteStrProperty(sl,'DNSSuffixes',Self.DNSSuffixes.CommaText);
WriteIntProperty(sl,'NodeType',integer(Self.NodeType));
WriteIntProperty(sl,'EnableProxy',integer(Self.EnableProxy));
WriteIntProperty(sl,'EnableRouting',integer(Self.EnableRouting));
WriteIntProperty(sl,'EnableDNS',integer(Self.EnableDNS));
WriteIntProperty(sl,'BestInterfaceIndex',Self.FBII);
strm:=Sub.OpenStream(strm_Props,STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
for i:=0 to Self.AdapterCount-1 do
WriteAdapterToStream(i);
for i:=0 to Self.AddressRecordCount-1 do
WriteAddressRecordToStream(i);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
function TMiTeC_TCPIP.FindAddress(AIP: string): Integer;
var
i: Integer;
begin
Result:=-1;
for i:=0 to High(FAT) do
if SameText(FAT[i].IP,AIP) then begin
Result:=i;
Break;
end;
end;
function TMiTeC_TCPIP.FindAddress(AIntfIdx: Cardinal): Integer;
var
i: Integer;
begin
Result:=-1;
for i:=0 to High(FAT) do
if (FAT[i].IntfIdx=AIntfIdx) then begin
Result:=i;
Break;
end;
end;
{ TMiTeC_NetResources }
procedure TMiTeC_NetResources.Clear;
begin
Finalize(FShareList);
Finalize(FConnList);
Finalize(FSessionList);
Finalize(FFileList);
end;
constructor TMiTeC_NetResources.Create(AOwner: TComponent);
begin
inherited;
FConns:=TConnections.Create;
FShares:=TNTShares.Create;
end;
destructor TMiTeC_NetResources.Destroy;
begin
Finalize(FShareList);
Finalize(FConnList);
Finalize(FSessionList);
Finalize(FFileList);
FConns.Free;
FShares.Free;
inherited;
end;
function TMiTeC_NetResources.GetConn(Index: Cardinal): TConnectionRecord;
begin
try Result:=FConnList[Index] except end;
end;
function TMiTeC_NetResources.GetConnCount: Cardinal;
begin
Result:=Length(FConnList);
end;
function TMiTeC_NetResources.GetOpenFile(Index: Cardinal): TOpenFileRecord;
begin
try Result:=FFileList[Index] except end;
end;
function TMiTeC_NetResources.GetOpenFileCount: Cardinal;
begin
Result:=Length(FFileList);
end;
function TMiTeC_NetResources.GetSession(Index: Cardinal): TNTSessionRecord;
begin
try Result:=FSessionList[Index] except end;
end;
function TMiTeC_NetResources.GetSessionCount: Cardinal;
begin
Result:=Length(FSessionList);
end;
function TMiTeC_NetResources.GetShare(Index: Cardinal): TNTShareRecord;
begin
try Result:=FShareList[Index] except end;
end;
function TMiTeC_NetResources.GetShareCount: Cardinal;
begin
Result:=Length(FShareList);
end;
function TMiTeC_NetResources.LoadFromStorage;
var
stg: IStorage;
SS, Sub: TStructuredStorage;
function ReadSharesFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
r: TNTShareRecord;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
r.Name:=ReadStrProperty(sl,'Name');
r.Comment:=ReadStrProperty(sl,'Comment');
r.ShareType:=TShareType(ReadIntProperty(sl,'Type'));
r.Permissions:=ReadIntProperty(sl,'Permissions');
r.MaxUserCount:=ReadIntProperty(sl,'MaxUserCount');
r.CurUserCount:=ReadIntProperty(sl,'CurUserCount');
r.SecurityDesc:=ReadIntProperty(sl,'SecurityDesc')=1;
r.Path:=ReadStrProperty(sl,'Path');
r.Password:=ReadStrProperty(sl,'Password');
SetLength(FShareList,Length(FShareList)+1);
FShareList[High(FShareList)]:=r;
Result:=True;
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
function ReadSessionsFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
r: TNTSessionRecord;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
r.Name:=ReadStrProperty(sl,'Name');
r.UserName:=ReadStrProperty(sl,'Username');
r.SesiType:=ReadStrProperty(sl,'Type');
r.Transport:=ReadStrProperty(sl,'Transport');
r.ConnectedTime:=ReadIntProperty(sl,'ConnTime');
r.IdleTime:=ReadIntProperty(sl,'IdleTime');
r.OpenFiles:=ReadIntProperty(sl,'Files');
r.Guest:=ReadIntProperty(sl,'Guest')=1;
SetLength(FSessionList,Length(FSessionList)+1);
FSessionList[High(FSessionList)]:=r;
Result:=True;
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
function ReadFilesFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
r: TOpenFileRecord;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
r.Name:=ReadStrProperty(sl,'Name');
r.UserName:=ReadStrProperty(sl,'Username');
r.Sharename:=ReadStrProperty(sl,'Sharename');
r.Locks:=ReadIntProperty(sl,'Locks');
r.Mode:=ReadIntProperty(sl,'Mode');
r.ID:=ReadIntProperty(sl,'ID');
SetLength(FFileList,Length(FFileList)+1);
FFileList[High(FFileList)]:=r;
Result:=True;
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
function ReadConnsFromStream(AIndex: Cardinal): boolean;
var
strm: TStorageStream;
sl: TStringList;
r: TConnectionRecord;
begin
Result:=False;
try strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_READ_INSTORAGE,False) except strm:=nil end;
if strm<>nil then
try
sl:=TStringList.Create;
try
LoadFromEncodedStream(strm,sl,ACodeStream);
r.Name:=ReadStrProperty(sl,'Name');
r.UserName:=ReadStrProperty(sl,'Username');
r.ID:=ReadIntProperty(sl,'ID');
r.ConnType:=TShareType(ReadIntProperty(sl,'Type'));
r.Time:=ReadIntProperty(sl,'Time');
r.OpenFiles:=ReadIntProperty(sl,'Files');
r.Users:=ReadIntProperty(sl,'Users');
SetLength(FConnList,Length(FConnList)+1);
FConnList[High(FConnList)]:=r;
Result:=True;
finally
sl.Free;
end;
finally
strm.Free;
end;
end;
var
i: Integer;
begin
Clear;
Result:=inherited LoadFromStorage(AFilename,AReadHeader,ACodeStream);
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
Exit;
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_READ_INSTORAGE,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
try
Sub:=SS.OpenSubStorage(Shares_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
i:=0;
while ReadSharesFromStream(i) do
Inc(i);
Result:=Result or (i>0);
finally
Sub.Free;
end;
try
Sub:=SS.OpenSubStorage(Sessions_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
i:=0;
while ReadSessionsFromStream(i) do
Inc(i);
Result:=Result or (i>0);
finally
Sub.Free;
end;
try
Sub:=SS.OpenSubStorage(OpenFiles_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
i:=0;
while ReadFilesFromStream(i) do
Inc(i);
Result:=Result or (i>0);
finally
Sub.Free;
end;
try
Sub:=SS.OpenSubStorage(Connections_StorageFolderName,STG_READ_INSTORAGE,False);
except
Sub:=nil;
end;
if Sub<>nil then
try
i:=0;
while ReadConnsFromStream(i) do
Inc(i);
Result:=Result or (i>0);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_NetResources.RefreshData;
var
i: Integer;
begin
inherited;
Clear;
try
FShares.RefreshShares;
SetLength(FShareList,FShares.ShareCount);
for i:=0 to FShares.ShareCount-1 do
FShareList[i]:=FShares.Shares[i]^;
FShares.RefreshSessions;
SetLength(FSessionList,FShares.SessionCount);
for i:=0 to FShares.SessionCount-1 do
FSessionList[i]:=FShares.Sessions[i]^;
FShares.RefreshOpenFiles;
SetLength(FFileList,FShares.OpenFileCount);
for i:=0 to FShares.OpenFileCount-1 do
FFileList[i]:=FShares.OpenFiles[i]^;
{$IFDEF WIN32}
for i:=0 to FShares.ShareCount-1 do begin
FConns.Qualifier:=FShares.Shares[i].Name;
FConns.Refresh(i=0);
end;
{$ENDIF}
SetLength(FConnList,FConns.ConnectionCount);
for i:=0 to FConns.ConnectionCount-1 do
FConnList[i]:=FConns.Connections[i]^;
except
end;
end;
procedure TMiTeC_NetResources.SaveConnsToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
procedure WriteToStream(AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'Name',Self.FConnList[AIndex].Name);
WriteStrProperty(sl,'Username',Self.FConnList[AIndex].UserName);
WriteIntProperty(sl,'ID',integer(Self.FConnList[AIndex].ID));
WriteIntProperty(sl,'Type',integer(Self.FConnList[AIndex].ConnType));
WriteIntProperty(sl,'Time',integer(Self.FConnList[AIndex].Time));
WriteIntProperty(sl,'Files',integer(Self.FConnList[AIndex].OpenFiles));
WriteIntProperty(sl,'Users',integer(Self.FConnList[AIndex].Users));
strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
var
i: Integer;
begin
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(Connections_StorageFolderName);
Sub:=SS.OpenSubStorage(Connections_StorageFolderName,STG_OPEN,True);
try
for i:=0 to High(FConnList) do
WriteToStream(i);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_NetResources.SaveFilesToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
procedure WriteToStream(AName: string; AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'Name',Self.FFileList[AIndex].Name);
WriteStrProperty(sl,'Username',Self.FFileList[AIndex].UserName);
WriteStrProperty(sl,'Sharename',Self.FFileList[AIndex].Sharename);
WriteIntProperty(sl,'Locks',integer(Self.FFileList[AIndex].Locks));
WriteIntProperty(sl,'Mode',integer(Self.FFileList[AIndex].Mode));
WriteIntProperty(sl,'ID',integer(Self.FFileList[AIndex].ID));
strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
var
i: Integer;
begin
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(OpenFiles_StorageFolderName);
Sub:=SS.OpenSubStorage(OpenFiles_StorageFolderName,STG_OPEN,True);
try
for i:=0 to High(FFileList) do
WriteToStream(IntToStr(i),i);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_NetResources.SaveSessionsToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
procedure WriteToStream(AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'Name',Self.FSessionList[AIndex].Name);
WriteStrProperty(sl,'Username',Self.FSessionList[AIndex].UserName);
WriteStrProperty(sl,'Type',Self.FSessionList[AIndex].SesiType);
WriteStrProperty(sl,'Transport',Self.FSessionList[AIndex].Transport);
WriteIntProperty(sl,'Files',integer(Self.FSessionList[AIndex].OpenFiles));
WriteIntProperty(sl,'ConnTime',integer(Self.FSessionList[AIndex].ConnectedTime));
WriteIntProperty(sl,'IdleTime',integer(Self.FSessionList[AIndex].IdleTime));
WriteIntProperty(sl,'Guest',integer(Self.FSessionList[AIndex].Guest));
strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
var
i: Integer;
begin
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(Sessions_StorageFolderName);
Sub:=SS.OpenSubStorage(Sessions_StorageFolderName,STG_OPEN,True);
try
for i:=0 to High(FSessionList) do
WriteToStream(i);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_NetResources.SaveSharesToStorage;
var
stg: IStorage;
SS: TStructuredStorage;
Sub: TStructuredStorage;
procedure WriteToStream(AIndex: Cardinal);
var
strm: TStorageStream;
sl: TStringList;
begin
sl:=TStringList.Create;
try
WriteStrProperty(sl,'Name',Self.FShareList[AIndex].Name);
WriteStrProperty(sl,'Comment',Self.FShareList[AIndex].Comment);
WriteStrProperty(sl,'Path',Self.FShareList[AIndex].Path);
WriteStrProperty(sl,'Password',Self.FShareList[AIndex].Password);
WriteIntProperty(sl,'Type',integer(Self.FShareList[AIndex].ShareType));
WriteIntProperty(sl,'Permissions',integer(Self.FShareList[AIndex].Permissions));
WriteIntProperty(sl,'MaxUserCount',integer(Self.FShareList[AIndex].MaxUserCount));
WriteIntProperty(sl,'CurUserCount',integer(Self.FShareList[AIndex].CurUserCount));
WriteIntProperty(sl,'SecurityDesc',integer(Self.FShareList[AIndex].SecurityDesc));
strm:=Sub.OpenStream(Format(strm_Item,[AIndex]),STG_OPEN,True);
try
SaveToEncodedStream(sl,strm,ACodeStream);
finally
strm.Free;
end;
finally
sl.Free;
end;
end;
var
i: Integer;
begin
if StgIsStorageFile(PWideChar(WideString(AFileName)))<>S_OK then
OleCheck(StgCreateDocFile(PWideChar(WideString(AFileName)),STG_CREATE_OPEN,0,stg))
else
OleCheck(StgOpenStorage(PWideChar(WideString(AFileName)),nil,STG_OPEN,nil,LongInt(nil),stg));
SS:=TStructuredStorage.Create(nil,stg);
try
SS.DeleteElement(Shares_StorageFolderName);
Sub:=SS.OpenSubStorage(Shares_StorageFolderName,STG_OPEN,True);
try
for i:=0 to High(FShareList) do
WriteToStream(i);
finally
Sub.Free;
end;
finally
SS.Free;
end;
end;
procedure TMiTeC_NetResources.SaveToStorage;
begin
inherited SaveToStorage(AFilename,AWriteHeader,AFormat,AComment,ACodeStream);
SaveConnsToStorage(AFilename,ACodeStream);
SaveSharesToStorage(AFilename,ACodeStream);
SaveSessionsToStorage(AFilename,ACodeSTream);
SaveFilesToStorage(AFilename,ACodeStream);
end;
end.