home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d56 / MSYSINFO.ZIP / Demos / GUI / Main.pas < prev    next >
Pascal/Delphi Source File  |  2002-01-08  |  74KB  |  2,439 lines

  1. {$INCLUDE MITEC_DEF.INC}
  2.  
  3. unit Main;
  4.  
  5. interface
  6.  
  7. uses
  8.   {$IFDEF D6PLUS} Variants, {$ENDIF}
  9.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  10.   Menus, ImgList, StdCtrls, MiTeC_PerfLibNT, MiTeC_PerfLib9x, PropsDlg, MSI_GUI,
  11.   MSI_Overview, MiTeC_EventLogNT, MiTeC_Shares, MiTeC_AccountsNT,
  12.   ComCtrls, ExtCtrls, MiTeC_JobsNT, MiTeC_WkstaNT, MiTeC_ServerNT;
  13.  
  14.  
  15. type
  16.   TListViewClass = TListView;
  17.  
  18.   TfrmMain = class(TForm)
  19.     sb: TStatusBar;
  20.     Splitter1: TSplitter;
  21.     Notebook: TNotebook;
  22.     lv: TListView;
  23.     TopicPanel: TPanel;
  24.     Tree: TTreeView;
  25.     Splitter2: TSplitter;
  26.     Splitter3: TSplitter;
  27.     ValPanel: TPanel;
  28.     Panel2: TPanel;
  29.     InstPanel: TPanel;
  30.     Panel4: TPanel;
  31.     lbInst: TListBox;
  32.     lbVal: TListBox;
  33.     InfoPanel: TPanel;
  34.     TreePanel: TPanel;
  35.     TreeTitle: TPanel;
  36.     tv: TTreeView;
  37.     imgList: TImageList;
  38.     imgTree: TImageList;
  39.     SystemInfo: TMSystemInfo;
  40.     TreeMenu: TPopupMenu;
  41.     pmRefresh: TMenuItem;
  42.     N2: TMenuItem;
  43.     pmSaveRep: TMenuItem;
  44.     PopupMenu: TPopupMenu;
  45.     pmSave: TMenuItem;
  46.     N4: TMenuItem;
  47.     pmProps: TMenuItem;
  48.     pmClose: TMenuItem;
  49.     MainMenu: TMainMenu;
  50.     File1: TMenuItem;
  51.     mmClose: TMenuItem;
  52.     mmAbout: TMenuItem;
  53.     pmRefs: TMenuItem;
  54.     pmDelete: TMenuItem;
  55.     imgDevices: TImageList;
  56.     N3: TMenuItem;
  57.     N1: TMenuItem;
  58.     ControlPanels1: TMenuItem;
  59.     All1: TMenuItem;
  60.     N5: TMenuItem;
  61.     AddRemovePrograms1: TMenuItem;
  62.     DateTime1: TMenuItem;
  63.     Display1: TMenuItem;
  64.     Multimedia1: TMenuItem;
  65.     mmNet: TMenuItem;
  66.     RegionalSettings1: TMenuItem;
  67.     System1: TMenuItem;
  68.     mmAction: TMenuItem;
  69.     Refresh1: TMenuItem;
  70.     N6: TMenuItem;
  71.     mmSave: TMenuItem;
  72.     N7: TMenuItem;
  73.     mmCloseItem: TMenuItem;
  74.     mmDelete: TMenuItem;
  75.     mmRefs: TMenuItem;
  76.     mmProps: TMenuItem;
  77.     mmSI: TMenuItem;
  78.     N8: TMenuItem;
  79.     procedure cmClose(Sender: TObject);
  80.     procedure FormCreate(Sender: TObject);
  81.     procedure TreeChange(Sender: TObject; Node: TTreeNode);
  82.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  83.     procedure tvChange(Sender: TObject; Node: TTreeNode);
  84.     procedure lvDblClick(Sender: TObject);
  85.     procedure tvDblClick(Sender: TObject);
  86.     procedure TreeMenuPopup(Sender: TObject);
  87.     procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
  88.       Shift: TShiftState; X, Y: Integer);
  89.     procedure cmAbout(Sender: TObject);
  90.     procedure cmRefresh(Sender: TObject);
  91.     procedure PopupMenuPopup(Sender: TObject);
  92.     procedure cmProps(Sender: TObject);
  93.     procedure cmCloseItem(Sender: TObject);
  94.     procedure cmSave(Sender: TObject);
  95.     procedure cmRefs(Sender: TObject);
  96.     procedure cmDelete(Sender: TObject);
  97.     procedure cmCP(Sender: TObject);
  98.     procedure cmAction(Sender: TObject);
  99.     procedure lvChange(Sender: TObject; Item: TListItem;
  100.       Change: TItemChange);
  101.     procedure mmSIClick(Sender: TObject);
  102.   private
  103.     { Private declarations }
  104.     PLNT: TPerfLibNT;
  105.     PL9x: TPerfLib9x;
  106.     EventLog: TEventLog;
  107.     ShareNT: TNTShares;
  108.     Share9x: T9xShares;
  109.     Accounts: TAccounts;
  110.     JobNT: TNTJobs;
  111.     Wksta: TNTWksta;
  112.     Server: TNTServer;
  113.     RefList, WinList, ProcessList, ServiceList, DriverList, ServerList: TStringList;
  114.     FComputer: string;
  115.     FSingleMachine: Boolean;
  116.  
  117.     procedure FreeWindowList(AList: TStringList);
  118.   public
  119.     { Public declarations }
  120.     procedure RefreshProcesses(AListView: TListViewClass; AImageIndex: Integer);
  121.     procedure RefreshModules(AListView: TListViewClass; AImageIndex: Integer);
  122.     procedure RefreshServices(AListView: TListViewClass; AImageIndex: Integer);
  123.     procedure RefreshEnvironment(AListView: TListViewClass; AImageIndex: Integer);
  124.     procedure RefreshDrivers(AListView: TListViewClass; AImageIndex: Integer);
  125.     procedure RefreshPerformance(ATreeView: TTreeView);
  126.     procedure RefreshWindows(ATreeView: TTreeView);
  127.     procedure RefreshEvents(AListView: TListViewClass; AImageIndex: Integer; AType: TEventLogType);
  128.     procedure RefreshSysInfo(AListView: TListViewClass);
  129.     procedure RefreshShares(AListView: TListViewClass; AImageIndex: Integer);
  130.     procedure RefreshSessions(AListView: TListViewClass; AImageIndex: integer);
  131.     procedure RefreshOpenFiles(AListView: TListViewClass; AImageIndex: integer);
  132.     procedure RefreshUsers(AListView: TListViewClass; AImageIndex: Integer);
  133.     procedure RefreshGroups(AListView: TListViewClass; AImageIndex: Integer);
  134.     procedure RefreshGlobalGroups(AListView: TListViewClass; AImageIndex: Integer);
  135.     procedure RefreshErrors(AListView: TListViewClass; AImageIndex: integer);
  136.     procedure RefreshJobs(AListView: TListViewClass; AImageIndex: integer);
  137.     procedure RefreshWkstaInfo(AListView: TListViewClass; AImageIndex: integer);
  138.     procedure RefreshWkstaTrans(AListView: TListViewClass; AImageIndex: integer);
  139.     procedure RefreshWkstaUsers(AListView: TListViewClass; AImageIndex: integer);
  140.     procedure RefreshServerTrans(AListView: TListViewClass; AImageIndex: integer);
  141.     procedure RefreshServers;
  142.     procedure RefreshDevices(ATreeView: TTreeView);
  143.  
  144.     procedure Refresh;
  145.  
  146.     procedure ShowProps(AType: TPropertyType; AParameter: Variant);
  147.     procedure ShowSIProps(AType: TPages);
  148.     procedure CloseSession(AName, AUsername: string);
  149.     procedure CloseOpenFile(AID: DWORD);
  150.     procedure DeleteJob(AID: DWORD);
  151.  
  152.     property Computer: string read FComputer write FComputer;
  153.  
  154.     property SingleMachine: Boolean read FSingleMachine;
  155.   end;
  156.  
  157. var
  158.   frmMain: TfrmMain;
  159.  
  160. implementation
  161.  
  162. uses MiTeC_EnumsNT, MiTeC_Enums9x, MiTeC_Routines, MiTeC_NetAPI32, ShellAPI,
  163.  RefsDlg, MSI_Devices, MiTeC_CtrlRtns;
  164.  
  165. {$R *.DFM}
  166.  
  167. const
  168.   iiCompInfo = 0;
  169.     iiSystemInfo = 5;
  170.     iiSoftware = 6;
  171.       iiEnvVar = 7;
  172.       iiRunningTasks = 8;
  173.       iiModules = 9;
  174.       iiServices = 10;
  175.       iiDrivers = 11;
  176.     iiPerformance = 12;
  177.     iiWindows = 13;
  178.     iiEventViewer = 1;
  179.       iiApplication = 2;
  180.       iiSecurity = 3;
  181.       iiSystem = 4;
  182.         iiError = 14;
  183.         iiWarning = 15;
  184.         iiInfo = 16;
  185.         iiAuditSucc = 17;
  186.         iiAuditFail = 18;
  187.     iiSharedFolders = 19;
  188.       iiShares = 20;
  189.       iiSessions = 21;
  190.       iiOpenFiles = 22;
  191.     iiAccounts = 23;
  192.       iiUsers = 24;
  193.       iiGroups = 25;
  194.     iiScheduler = 26;
  195.       iiTask = 27;
  196.     iiWkstaNT = 28;
  197.       iiWkstaTrans = 29;
  198.       iiWkstaUsers = 30;
  199.       iiWkstaInfo = 32;
  200.     iiGlobalGroups = 31;
  201.     iiDevices = 33;
  202.  
  203.     iiWksta = 50;
  204.     iiCPU = 51;
  205.     iiMemory = 52;
  206.     iiOS = 53;
  207.     iiDrives = 54;
  208.     iiNetwork = 55;
  209.     iiMultimedia = 56;
  210.     iiDisplay = 57;
  211.     iiUSB = 58;
  212.     iiInput = 59;
  213.     iiPorts = 60;
  214.     iiSysDev = 61;
  215.  
  216.     iiObject = 2;
  217.     iiCounter = 3;
  218.  
  219.  
  220.     ControlPanelRun: array[0..8] of string=
  221.    ('shell32.dll,Control_RunDLL',
  222.     'shell32.dll,Control_RunDLL appwiz.cpl',
  223.     'shell32.dll,Control_RunDLL timedate.cpl',
  224.     'shell32.dll,Control_RunDLL desk.cpl',
  225.     'shell32.dll,Control_RunDLL mmsys.cpl',
  226.     'shell32.dll,Control_RunDLL netcpl.cpl',
  227.     'shell32.dll,Control_RunDLL ncpa.cpl',
  228.     'shell32.dll,Control_RunDLL intl.cpl',
  229.     'shell32.dll,Control_RunDLL sysdm.cpl');
  230.  
  231. type
  232.   THeaderType = (htTopic, htProc, htSrv, htDrv, htEvent, htItem, htShare,
  233.                  htSession, htMods, htErrors, htUsers, htGroups, htOpenFiles,
  234.                  htJobs, htWkstaTrans,htSrvTrans,htWkstaUsers);
  235.   TDetailType = (dtDefault, dtList, dtTree);
  236.  
  237. procedure SetDetail(ANotebook: TNotebook; AType: TDetailType);
  238. begin
  239.   with ANotebook do begin
  240.     PageIndex:=Integer(AType);
  241.     if Assigned(OnPageChanged) then
  242.       OnPageChanged(ANotebook);
  243.   end;
  244. end;
  245.  
  246. procedure SetTopics(ATreeView: TTreeView; ALocalInfo: Boolean);
  247. var
  248.   Root, SubRoot, Node: TTreeNode;
  249. begin
  250.   with ATreeView, Items do begin
  251.     FullCollapse;
  252.     BeginUpdate;
  253.     Clear;
  254.     Root:=Add(nil,'Computer Information');
  255.     Root.ImageIndex:=iiCompInfo;
  256.     Root.SelectedIndex:=Root.ImageIndex;
  257.  
  258.       if IsNT then begin
  259.         SubRoot:=AddChild(Root,'Event Viewer');
  260.         SubRoot.ImageIndex:=iiEventViewer;
  261.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  262.  
  263.           Node:=AddChild(SubRoot,'Application');
  264.           Node.ImageIndex:=iiApplication;
  265.           Node.SelectedIndex:=Node.ImageIndex;
  266.           Node:=AddChild(SubRoot,'Security');
  267.           Node.ImageIndex:=iiSecurity;
  268.           Node.SelectedIndex:=Node.ImageIndex;
  269.           Node:=AddChild(SubRoot,'System');
  270.           Node.ImageIndex:=iiSystem;
  271.           Node.SelectedIndex:=Node.ImageIndex;
  272.       end;
  273.  
  274.       if ALocalInfo then begin
  275.         SubRoot:=AddChild(Root,'System Information');
  276.         SubRoot.ImageIndex:=iiSystemInfo;
  277.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  278.         SubRoot:=AddChild(Root,'Device Manager');
  279.         SubRoot.ImageIndex:=iiDevices;
  280.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  281.       end;
  282.       SubRoot:=AddChild(Root,'Software Environment');
  283.       SubRoot.ImageIndex:=iiSoftware;
  284.       SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  285.         if ALocalInfo then begin
  286.           Node:=AddChild(SubRoot,'Environment Variables');
  287.           Node.ImageIndex:=iiEnvVar;
  288.           Node.SelectedIndex:=Node.ImageIndex;
  289.           Node:=AddChild(SubRoot,'Running Tasks');
  290.           Node.ImageIndex:=iiRunningTasks;
  291.           Node.SelectedIndex:=Node.ImageIndex;
  292.           Node:=AddChild(SubRoot,'Loaded Modules');
  293.           Node.ImageIndex:=iiModules;
  294.           Node.SelectedIndex:=Node.ImageIndex;
  295.         end;
  296.         if IsNT then begin
  297.           Node:=AddChild(SubRoot,'Services');
  298.           Node.ImageIndex:=iiServices;
  299.           Node.SelectedIndex:=Node.ImageIndex;
  300.         end;
  301.         if ALocalInfo then begin
  302.           if IsNT then begin
  303.             Node:=AddChild(SubRoot,'Drivers');
  304.             Node.ImageIndex:=iiDrivers;
  305.             Node.SelectedIndex:=Node.ImageIndex;
  306.           end;
  307.           Node:=AddChild(SubRoot,'Windows');
  308.           Node.ImageIndex:=iiWindows;
  309.           Node.SelectedIndex:=Node.ImageIndex;
  310.         end;
  311.       if ALocalInfo and (IsNT or Is98 or IsME or (Is95 and IsOSR2)) then begin
  312.         SubRoot:=AddChild(Root,'Performance');
  313.         SubRoot.ImageIndex:=iiPerformance;
  314.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  315.       end;
  316.       SubRoot:=AddChild(Root,'Shared Folders');
  317.       SubRoot.ImageIndex:=iiSharedFolders;
  318.       SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  319.         Node:=AddChild(SubRoot,'Shares');
  320.         Node.ImageIndex:=iiShares;
  321.         Node.SelectedIndex:=Node.ImageIndex;
  322.         Node:=AddChild(SubRoot,'Sessions');
  323.         Node.ImageIndex:=iiSessions;
  324.         Node.SelectedIndex:=Node.ImageIndex;
  325.         if IsNT then begin
  326.           Node:=AddChild(SubRoot,'Open Files');
  327.           Node.ImageIndex:=iiOpenFiles;
  328.           Node.SelectedIndex:=Node.ImageIndex;
  329.         end;
  330.       if IsNT then begin
  331.         SubRoot:=AddChild(Root,'Local Users and Groups');
  332.         SubRoot.ImageIndex:=iiAccounts;
  333.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  334.           Node:=AddChild(SubRoot,'Users');
  335.           Node.ImageIndex:=iiUsers;
  336.           Node.SelectedIndex:=Node.ImageIndex;
  337.           Node:=AddChild(SubRoot,'Groups');
  338.           Node.ImageIndex:=iiGroups;
  339.           Node.SelectedIndex:=Node.ImageIndex;
  340.         SubRoot:=AddChild(Root,'Scheduled Tasks');
  341.         SubRoot.ImageIndex:=iiScheduler;
  342.         SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  343.  
  344.         if not frmMain.SingleMachine then begin
  345.           SubRoot:=AddChild(Root,'Global Groups');
  346.           SubRoot.ImageIndex:=iiGlobalGroups;
  347.           SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  348.  
  349.           SubRoot:=AddChild(Root,'Machine');
  350.           SubRoot.ImageIndex:=iiWkstaNT;
  351.           SubRoot.SelectedIndex:=SubRoot.ImageIndex;
  352.             Node:=AddChild(SubRoot,'Information');
  353.             Node.ImageIndex:=iiWkstaInfo;
  354.             Node.SelectedIndex:=Node.ImageIndex;
  355.             Node:=AddChild(SubRoot,'Transport Protocols');
  356.             Node.ImageIndex:=iiWkstaTrans;
  357.             Node.SelectedIndex:=Node.ImageIndex;
  358.             Node:=AddChild(SubRoot,'Users');
  359.             Node.ImageIndex:=iiWkstaUsers;
  360.             Node.SelectedIndex:=Node.ImageIndex;
  361.         end;
  362.       end;
  363.  
  364.     EndUpdate;
  365.     Root.Expand(False);
  366.   end;
  367. end;
  368.  
  369. procedure SetHeader(AListView: TListViewClass; AType: THeaderType);
  370. begin
  371.   with AListView, Columns do begin
  372.     ViewStyle:=vsReport;
  373.     AListView.Items.BeginUpdate;
  374.     AListView.Items.Clear;
  375.     AListView.Items.EndUpdate;
  376.     BeginUpdate;
  377.     Clear;
  378.     case AType of
  379.       htTopic:
  380.         with Add do begin
  381.           Caption:='Name';
  382.           Alignment:=taLeftJustify;
  383.           Width:=200;
  384.         end;
  385.       htProc: begin
  386.         if IsNT then begin
  387.           with Add do begin
  388.             Caption:='Image name';
  389.             Alignment:=taLeftJustify;
  390.             Width:=150;
  391.           end;
  392.           with Add do begin
  393.             caption:='PID';
  394.             alignment:=taRightJustify;
  395.             width:=50;
  396.           end;
  397.           with Add do begin
  398.             Caption:='CPU Time';
  399.             Alignment:=taRightJustify;
  400.             Width:=70;
  401.           end;
  402.           with Add do begin
  403.             Caption:='Mem usage';
  404.             Alignment:=taRightJustify;
  405.             Width:=70;
  406.           end;
  407.           with Add do begin
  408.             Caption:='Priority';
  409.             Alignment:=taRightJustify;
  410.             Width:=50;
  411.           end;
  412.         end else begin
  413.           with Add do begin
  414.             Caption:='Image name';
  415.             Alignment:=taLeftJustify;
  416.             Width:=150;
  417.           end;
  418.           with Add do begin
  419.             Caption:='PID';
  420.             Alignment:=taRightJustify;
  421.             Width:=80;
  422.           end;
  423.           with Add do begin
  424.             Caption:='Priority';
  425.             Alignment:=taRightJustify;
  426.             Width:=75;
  427.           end;
  428.           with Add do begin
  429.             Caption:='Usage';
  430.             Alignment:=taRightJustify;
  431.             Width:=50;
  432.           end;
  433.         end;
  434.       end;
  435.       htSrv: begin
  436.         with Add do begin
  437.           Caption:='Display Name';
  438.           Alignment:=taLeftJustify;
  439.           Width:=200;
  440.         end;
  441.         with Add do begin
  442.           Caption:='Name';
  443.           Alignment:=taLeftJustify;
  444.           Width:=150;
  445.         end;
  446.         with Add do begin
  447.           caption:='Status';
  448.           alignment:=taLeftJustify;
  449.           width:=75;
  450.         end;
  451.         with Add do begin
  452.           Caption:='Startup Type';
  453.           Alignment:=taLeftJustify;
  454.           Width:=75;
  455.         end;
  456.         with Add do begin
  457.           Caption:='Log On As';
  458.           Alignment:=taLeftJustify;
  459.           Width:=75;
  460.         end;
  461.       end;
  462.       htDrv: begin
  463.         with Add do begin
  464.           Caption:='Name';
  465.           Alignment:=taLeftJustify;
  466.           Width:=100;
  467.         end;
  468.         with Add do begin
  469.           caption:='Description';
  470.           alignment:=taLeftJustify;
  471.           width:=200;
  472.         end;
  473.         with Add do begin
  474.           Caption:='Group';
  475.           Alignment:=taLeftJustify;
  476.           Width:=100;
  477.         end;
  478.         with Add do begin
  479.           Caption:='File';
  480.           Alignment:=taLeftJustify;
  481.           Width:=150;
  482.         end;
  483.         with Add do begin
  484.           Caption:='Type';
  485.           Alignment:=taLeftJustify;
  486.           Width:=100;
  487.         end;
  488.         with Add do begin
  489.           Caption:='Start Mode';
  490.           Alignment:=taLeftJustify;
  491.           Width:=75;
  492.         end;
  493.         with Add do begin
  494.           Caption:='State';
  495.           Alignment:=taLeftJustify;
  496.           Width:=60;
  497.         end;
  498.         with Add do begin
  499.           Caption:='Error Control';
  500.           Alignment:=taLeftJustify;
  501.           Width:=75;
  502.         end;
  503.         {with Add do begin
  504.           Caption:='Accept Pause';
  505.           Alignment:=taLeftJustify;
  506.           Width:=100;
  507.         end;
  508.         with Add do begin
  509.           Caption:='Accept Stop';
  510.           Alignment:=taLeftJustify;
  511.           Width:=100;
  512.         end;}
  513.       end;
  514.       htEvent: begin
  515.         with Add do begin
  516.           Caption:='Type';
  517.           Alignment:=taLeftJustify;
  518.           Width:=100;
  519.         end;
  520.         with Add do begin
  521.           Caption:='Datetime';
  522.           Alignment:=taLeftJustify;
  523.           Width:=120;
  524.         end;
  525.         with Add do begin
  526.           Caption:='Source';
  527.           Alignment:=taLeftJustify;
  528.           Width:=150;
  529.         end;
  530.         with Add do begin
  531.           Caption:='Category';
  532.           Alignment:=taLeftJustify;
  533.           Width:=75;
  534.         end;
  535.         with Add do begin
  536.           Caption:='Event';
  537.           Alignment:=taRightJustify;
  538.           Width:=50;
  539.         end;
  540.         with Add do begin
  541.           Caption:='User';
  542.           Alignment:=taLeftJustify;
  543.           Width:=100;
  544.         end;
  545.         with Add do begin
  546.           Caption:='Computer';
  547.           Alignment:=taLeftJustify;
  548.           Width:=100;
  549.         end;
  550.       end;
  551.       htItem: begin
  552.         with Add do begin
  553.           Caption:='Item';
  554.           Alignment:=taLeftJustify;
  555.           Width:=200;
  556.         end;
  557.         with Add do begin
  558.           Caption:='Value';
  559.           Alignment:=taLeftJustify;
  560.           Width:=300;
  561.         end;
  562.       end;
  563.       htShare: begin
  564.         with Add do begin
  565.           Caption:='Name';
  566.           Alignment:=taLeftJustify;
  567.           Width:=100;
  568.         end;
  569.         with Add do begin
  570.           Caption:='Path';
  571.           Alignment:=taLeftJustify;
  572.           Width:=200;
  573.         end;
  574.         with Add do begin
  575.           Caption:='Type';
  576.           Alignment:=taLeftJustify;
  577.           Width:=70;
  578.         end;
  579.         with Add do begin
  580.           Caption:='Descriptor';
  581.           Alignment:=taLeftJustify;
  582.           Width:=70;
  583.         end;
  584.         with Add do begin
  585.           Caption:='Max Users';
  586.           Alignment:=taRightJustify;
  587.           Width:=65;
  588.         end;
  589.         with Add do begin
  590.           Caption:='Cur Users';
  591.           Alignment:=taRightJustify;
  592.           Width:=60;
  593.         end;
  594.         with Add do begin
  595.           Caption:='Permissions';
  596.           Alignment:=taLeftJustify;
  597.           Width:=70;
  598.         end;
  599.         with Add do begin
  600.           Caption:='Comment';
  601.           Alignment:=taLeftJustify;
  602.           Width:=100;
  603.         end;
  604.       end;
  605.       htSession: begin
  606.         with Add do begin
  607.           Caption:='User';
  608.           Alignment:=taLeftJustify;
  609.           Width:=100;
  610.         end;
  611.         with Add do begin
  612.           Caption:='Computer';
  613.           Alignment:=taLeftJustify;
  614.           Width:=200;
  615.         end;
  616.         with Add do begin
  617.           Caption:='Type';
  618.           Alignment:=taLeftJustify;
  619.           Width:=100;
  620.         end;
  621.         with Add do begin
  622.           Caption:='Open Files';
  623.           Alignment:=taRightJustify;
  624.           Width:=75;
  625.         end;
  626.         with Add do begin
  627.           Caption:='Connected Time';
  628.           Alignment:=taLeftJustify;
  629.           Width:=120;
  630.         end;
  631.         with Add do begin
  632.           Caption:='Idle Time';
  633.           Alignment:=taLeftJustify;
  634.           Width:=120;
  635.         end;
  636.         with Add do begin
  637.           Caption:='Guest';
  638.           Alignment:=taLeftJustify;
  639.           Width:=75;
  640.         end;
  641.       end;
  642.       htMods: begin
  643.         with Add do begin
  644.           Caption:='Name';
  645.           Alignment:=taLeftJustify;
  646.           Width:=100;
  647.         end;
  648.         with Add do begin
  649.           Caption:='Version';
  650.           Alignment:=taLeftJustify;
  651.           Width:=100;
  652.         end;
  653.         with Add do begin
  654.           Caption:='Size';
  655.           Alignment:=taRightJustify;
  656.           Width:=75;
  657.         end;
  658.         with Add do begin
  659.           Caption:='FileDate';
  660.           Alignment:=taLeftJustify;
  661.           Width:=120;
  662.         end;
  663.         with Add do begin
  664.           Caption:='Usage';
  665.           Alignment:=taRightJustify;
  666.           Width:=50;
  667.         end;
  668.         with Add do begin
  669.           Caption:='Manufacturer';
  670.           Alignment:=taLeftJustify;
  671.           Width:=150;
  672.         end;
  673.         with Add do begin
  674.           Caption:='Description';
  675.           Alignment:=taLeftJustify;
  676.           Width:=200;
  677.         end;
  678.         with Add do begin
  679.           Caption:='Path';
  680.           Alignment:=taLeftJustify;
  681.           Width:=200;
  682.         end;
  683.       end;
  684.       htUsers: begin
  685.         with Add do begin
  686.           Caption:='Name';
  687.           Alignment:=taLeftJustify;
  688.           Width:=150;
  689.         end;
  690.         with Add do begin
  691.           Caption:='Full Name';
  692.           Alignment:=taLeftJustify;
  693.           Width:=200;
  694.         end;
  695.         with Add do begin
  696.           Caption:='Comment';
  697.           Alignment:=taLeftJustify;
  698.           Width:=400;
  699.         end;
  700.       end;
  701.       htGroups: begin
  702.         with Add do begin
  703.           Caption:='Name';
  704.           Alignment:=taLeftJustify;
  705.           Width:=150;
  706.         end;
  707.         with Add do begin
  708.           Caption:='Comment';
  709.           Alignment:=taLeftJustify;
  710.           Width:=500;
  711.         end;
  712.       end;
  713.       htErrors: begin
  714.         with Add do begin
  715.           Caption:='Code';
  716.           Alignment:=taLeftJustify;
  717.           Width:=60;
  718.         end;
  719.         with Add do begin
  720.           Caption:='Message';
  721.           Alignment:=taLeftJustify;
  722.           Width:=1000;
  723.         end;
  724.       end;
  725.       htOpenFiles: begin
  726.         with Add do begin
  727.           Caption:='Open File';
  728.           Alignment:=taLeftJustify;
  729.           Width:=200;
  730.         end;
  731.         with Add do begin
  732.           Caption:='Accessed By';
  733.           Alignment:=taLeftJustify;
  734.           Width:=100;
  735.         end;
  736.         with Add do begin
  737.           Caption:='# Locks';
  738.           Alignment:=taRightJustify;
  739.           Width:=75;
  740.         end;
  741.         with Add do begin
  742.           Caption:='Open Mode';
  743.           Alignment:=taLeftJustify;
  744.           Width:=100;
  745.         end;
  746.       end;
  747.       htJobs: begin
  748.         with Add do begin
  749.           Caption:='ID';
  750.           Alignment:=taLeftJustify;
  751.           Width:=50;
  752.         end;
  753.         with Add do begin
  754.           Caption:='Time';
  755.           Alignment:=taLeftJustify;
  756.           Width:=100;
  757.         end;
  758.         with Add do begin
  759.           Caption:='Days of Month';
  760.           Alignment:=taLeftJustify;
  761.           Width:=100;
  762.         end;
  763.         with Add do begin
  764.           Caption:='Days of Week';
  765.           Alignment:=taLeftJustify;
  766.           Width:=100;
  767.         end;
  768.         with Add do begin
  769.           Caption:='Flags';
  770.           Alignment:=taLeftJustify;
  771.           Width:=100;
  772.         end;
  773.         with Add do begin
  774.           Caption:='Command';
  775.           Alignment:=taLeftJustify;
  776.           Width:=150;
  777.         end;
  778.       end;
  779.       htWkstaTrans: begin
  780.         with Add do begin
  781.           Caption:='Name';
  782.           Alignment:=taLeftJustify;
  783.           Width:=200;
  784.         end;
  785.         with Add do begin
  786.           Caption:='Address';
  787.           Alignment:=taLeftJustify;
  788.           Width:=100;
  789.         end;
  790.         with Add do begin
  791.           Caption:='Quality';
  792.           Alignment:=taRightJustify;
  793.           Width:=50;
  794.         end;
  795.         with Add do begin
  796.           Caption:='Number of clients';
  797.           Alignment:=taRightJustify;
  798.           Width:=100;
  799.         end;
  800.         with Add do begin
  801.           Caption:='WAN';
  802.           Alignment:=taLeftJustify;
  803.           Width:=50;
  804.         end;
  805.       end;
  806.       htSrvTrans: begin
  807.         with Add do begin
  808.           Caption:='Name';
  809.           Alignment:=taLeftJustify;
  810.           Width:=200;
  811.         end;
  812.         with Add do begin
  813.           Caption:='Domain';
  814.           Alignment:=taLeftJustify;
  815.           Width:=100;
  816.         end;
  817.         with Add do begin
  818.           Caption:='Address';
  819.           Alignment:=taLeftJustify;
  820.           Width:=100;
  821.         end;
  822.         with Add do begin
  823.           Caption:='Number of clients';
  824.           Alignment:=taRightJustify;
  825.           Width:=100;
  826.         end;
  827.       end;
  828.       htWkstaUsers: begin
  829.         with Add do begin
  830.           Caption:='Name';
  831.           Alignment:=taLeftJustify;
  832.           Width:=100;
  833.         end;
  834.         with Add do begin
  835.           Caption:='Logon Domain';
  836.           Alignment:=taLeftJustify;
  837.           Width:=100;
  838.         end;
  839.         with Add do begin
  840.           Caption:='Logon Server';
  841.           Alignment:=taLeftJustify;
  842.           Width:=100;
  843.         end;
  844.       end;
  845.     end;
  846.     EndUpdate;
  847.     //AListView.LastColumnClicked:=0;
  848.   end;
  849. end;
  850.  
  851. function GetNodeChild(ANode: TTreeNode; AIndex: Integer): TTreeNode;
  852. var
  853.   i: integer;
  854. begin
  855.   i:=0;
  856.   Result:=ANode.GetFirstChild;
  857.   while Assigned(Result) and (i<>AIndex) do begin
  858.     Result:=ANode.GetNextChild(Result);
  859.     inc(i);
  860.   end;
  861. end;
  862.  
  863. procedure OpenTopic(ATreeView: TTreeView; AIndex: integer);
  864. begin
  865.   with ATreeView do begin
  866.     Selected:=GetNodeChild(Selected,AIndex);
  867.     Selected.Expand(False);
  868.   end;
  869. end;
  870.  
  871. procedure TfrmMain.RefreshDrivers;
  872. var
  873.   i: integer;
  874. begin
  875.   try
  876.     Screen.Cursor:=crHourGlass;
  877.     SetDetail(Notebook,dtDefault);
  878.     sb.Panels[0].Text:='';
  879.     Update;
  880.     SetHeader(AListView,htDrv);
  881.     GetNTDriverList(DriverList);
  882.     with AListView, Items do begin
  883.       BeginUpdate;
  884.       for i:=0 to DriverList.Count-1 do
  885.         with Add do begin
  886.           Caption:=PNTDriver(DriverList.Objects[i])^.Name;
  887.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.Description);
  888.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.Group);
  889.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.ImageName);
  890.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.szTyp);
  891.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.szStartUp);
  892.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.szStatus);
  893.           SubItems.Add(PNTDriver(DriverList.Objects[i])^.szErrCtrl);
  894.           {if PNTDriver(DriverList.Objects[i])^.AcceptPause then
  895.             SubItems.Add('True')
  896.           else
  897.             SubItems.Add('False');
  898.           if PNTDriver(DriverList.Objects[i])^.AcceptStop then
  899.             SubItems.Add('True')
  900.           else
  901.             SubItems.Add('False');}
  902.           ImageIndex:=AImageIndex;
  903.         end;
  904.       EndUpdate;
  905.     end;
  906.   finally
  907.     Screen.Cursor:=crDefault;
  908.     SetDetail(Notebook,dtList);
  909.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  910.   end;
  911. end;
  912.  
  913. procedure TfrmMain.RefreshPerformance;
  914. var
  915.   i,j,k: integer;
  916.   Root,Child: TTreeNode;
  917.   szObj, szCtr: string;
  918. begin
  919.   try
  920.     Screen.Cursor:=crHourGlass;
  921.     TreeTitle.Caption:='  Counters';
  922.     Splitter2.Visible:=IsNT;
  923.     InstPanel.Visible:=IsNT;
  924.     Splitter3.Show;
  925.     ValPanel.Show;
  926.     SetDetail(Notebook,dtDefault);
  927.     sb.Panels[0].Text:='';
  928.     Update;
  929.     with ATreeView, Items do begin
  930.       Images:=imgTree;
  931.       OnChange:=tvChange;
  932.       FullCollapse;
  933.       BeginUpdate;
  934.       Clear;
  935.       if IsNT then begin
  936.         if not Assigned(PLNT) then begin
  937.           PLNT:=TPerfLibNT.Create;
  938.           PLNT.Refresh;
  939.         end else
  940.           PLNT.TakeSnapshot;
  941.         if Count=0 then
  942.           for i:=0 to PLNT.ObjectCount-1 do begin
  943.             Root:=Add(nil,PLNT.Objects[i].Name);
  944.             Root.ImageIndex:=iiObject;
  945.             Root.SelectedIndex:=Root.ImageIndex;
  946.             for j:=0 to PLNT.Objects[i].CounterCount-1 do begin
  947.               Child:=AddChild(Root,PLNT.Objects[i].Counters[j].Name);
  948.               Child.ImageIndex:=iiCounter;
  949.               Child.SelectedIndex:=Child.ImageIndex;
  950.             end;
  951.           end;
  952.       end else begin
  953.         if not Assigned(PL9x) and (Is98 or isME or (Is95 and IsOSR2)) then begin
  954.           PL9x:=TPerfLib9x.Create;
  955.           PL9x.Open;
  956.           if Count=0 then
  957.             for i:=PL9x.Names.Count-1 downto 0 do begin
  958.               k:=Pos('\',PL9x.Names[i]);
  959.               if k>0 then begin
  960.                 szObj:=copy(PL9x.Names[i],1,k-1);
  961.                 szCtr:=copy(PL9x.Names[i],k+1,255);
  962.               end;
  963.               Root:=GetFirstNode;
  964.               while Assigned(Root) do
  965.                 if Root.Text=szObj then
  966.                   break
  967.                 else
  968.                   Root:=Root.GetNextSibling;
  969.               if not Assigned(Root) then begin
  970.                 Root:=Add(nil,szObj);
  971.                 Root.ImageIndex:=iiObject;
  972.                 Root.SelectedIndex:=Root.ImageIndex;
  973.               end;
  974.               if szCtr<>'' then begin
  975.                 Child:=AddChild(Root,szCtr);
  976.                 Child.ImageIndex:=iiCounter;
  977.                 Child.SelectedIndex:=Child.ImageIndex;
  978.               end;
  979.             end;
  980.         end;
  981.       end;
  982.       EndUpdate;
  983.     end;
  984.   finally
  985.     SetDetail(Notebook,dtTree);
  986.     Screen.Cursor:=crDefault;
  987.     sb.Panels[0].Text:=Format('%d items',[ATreeView.Items.Count]);
  988.   end;
  989. end;
  990.  
  991. procedure TfrmMain.RefreshProcesses;
  992. var
  993.   i: integer;
  994. begin
  995.   try
  996.     Screen.Cursor:=crHourGlass;
  997.     SetDetail(Notebook,dtDefault);
  998.     sb.Panels[0].Text:='';
  999.     Update;
  1000.     SetHeader(AListView,htProc);
  1001.     if IsNT then begin
  1002.        if not Assigned(PLNT) then begin
  1003.           PLNT:=TPerfLibNT.Create;
  1004.           PLNT.Refresh;
  1005.        end else
  1006.          PLNT.TakeSnapShot;
  1007.        GetNTProcessList(PLNT,ProcessList);
  1008.        with AListView, Items do begin
  1009.          BeginUpdate;
  1010.          for i:=0 to ProcessList.Count-1 do
  1011.             with Add do begin
  1012.               Caption:=PNTProcess(ProcessList.objects[i])^.Name;
  1013.               SubItems.Add(IntToStr(PNTProcess(ProcessList.Objects[i])^.PID));
  1014.               SubItems.Add(FormatSeconds(PNTProcess(ProcessList.Objects[i])^.CPUTime,true,false,true));
  1015.               SubItems.Add(FormatFloat('0 K',PNTProcess(ProcessList.Objects[i])^.WorkingSetSize/1024));
  1016.               SubItems.Add(IntToStr(PNTProcess(ProcessList.Objects[i])^.PriorityBase));
  1017.               ImageIndex:=AImageIndex;
  1018.             end;
  1019.          EndUpdate;
  1020.        end;
  1021.     end else begin
  1022.       Get95ProcessList(ProcessList);
  1023.       with AListView, Items do begin
  1024.          BeginUpdate;
  1025.          for i:=0 to ProcessList.Count-1 do
  1026.             with Add do begin
  1027.               Caption:=P95Process(ProcessList.objects[i])^.Name;
  1028.               SubItems.Add(IntToHex(P95Process(ProcessList.Objects[i])^.PID,8));
  1029.               SubItems.Add(Format('%d',[P95Process(ProcessList.Objects[i])^.Priority]));
  1030.               SubItems.Add(IntToStr(P95Process(ProcessList.Objects[i])^.Usage));
  1031.               ImageIndex:=AImageIndex;
  1032.             end;
  1033.          EndUpdate;
  1034.        end;
  1035.     end;
  1036.   finally
  1037.     Screen.Cursor:=crDefault;
  1038.     SetDetail(Notebook,dtList);
  1039.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1040.   end;
  1041. end;
  1042.  
  1043. procedure TfrmMain.RefreshModules;
  1044. var
  1045.   i,j: integer;
  1046.   n: TListItem;
  1047.   VIR: TVersionInfo;
  1048.   FI: TFileInfo;
  1049. begin
  1050.   try
  1051.     Screen.Cursor:=crHourGlass;
  1052.     SetDetail(Notebook,dtDefault);
  1053.     sb.Panels[0].Text:='';
  1054.     Update;
  1055.     SetHeader(AListView,htMods);
  1056.     if IsNT then begin
  1057.        if not Assigned(PLNT) then begin
  1058.           PLNT:=TPerfLibNT.Create;
  1059.           PLNT.Refresh;
  1060.        end else
  1061.          PLNT.TakeSnapShot;
  1062.        GetNTProcessList(PLNT,ProcessList);
  1063.        RefList.Clear;
  1064.        with AListView, Items do begin
  1065.          BeginUpdate;
  1066.          for i:=0 to ProcessList.Count-1 do begin
  1067.             GetNTProcessInfo(PNTProcess(ProcessList.objects[i])^,PLNT,PNTProcess(ProcessList.Objects[i])^.PID,True);
  1068.             for j:=0 to PNTProcess(ProcessList.objects[i])^.Modules.Count-1 do begin
  1069.               n:=FindCaption(0,LowerCase(PNTProcess(ProcessList.objects[i])^.Modules[j]),False,True,True);
  1070.               if Assigned(n) then begin
  1071.                 n.SubItems[3]:=IntToStr(StrToInt(n.SubItems[3])+1);
  1072.                 RefList[n.Index]:=RefList[n.Index]+(PNTProcess(ProcessList.objects[i])^.ImageName)+',';
  1073.               end else
  1074.                 with Add, PNTModule(PNTProcess(ProcessList.objects[i])^.Modules.Objects[j])^ do begin
  1075.                   RefList.Add(PNTProcess(ProcessList.objects[i])^.ImageName+',');
  1076.                   Caption:=LowerCase(Name);
  1077.                   GetFileVerInfo(ImageName,VIR);
  1078.                   GetFileInfo(ImageName,fi);
  1079.                   SubItems.Add(VIR.Version);
  1080.                   SubItems.Add(Format('%d B',[fi.Size]));
  1081.                   try
  1082.                     SubItems.Add(DateTimeToStr(FileDateToDateTime(FileAge(ImageName))));
  1083.                   except
  1084.                   end;
  1085.                   SubItems.Add('1');
  1086.                   SubItems.Add(VIR.CompanyName);
  1087.                   SubItems.Add(VIR.Description);
  1088.                   SubItems.Add(LowerCase(ImageName));
  1089.                   ImageIndex:=AImageIndex;
  1090.                 end;
  1091.             end;
  1092.          end;
  1093.          EndUpdate;
  1094.        end;
  1095.     end else begin
  1096.       Get95ProcessList(ProcessList);
  1097.       with AListView, Items do begin
  1098.         BeginUpdate;
  1099.         for i:=0 to ProcessList.Count-1 do begin
  1100.           P95Process(ProcessList.objects[i])^:=Get95ProcessInfo(P95Process(ProcessList.Objects[i])^.PID,True);
  1101.           for j:=0 to P95Process(ProcessList.objects[i])^.Modules.Count-1 do begin
  1102.             n:=FindCaption(0,LowerCase(P95Process(ProcessList.objects[i])^.Modules[j]),False,True,True);
  1103.             if Assigned(n) then begin
  1104.               n.SubItems[3]:=IntToStr(StrToInt(n.SubItems[3])+1);
  1105.               RefList[n.Index]:=RefList[n.Index]+(PNTProcess(ProcessList.objects[i])^.ImageName)+',';
  1106.             end else
  1107.               with Add, P95Module(P95Process(ProcessList.objects[i])^.Modules.Objects[j])^ do begin
  1108.                 RefList.Add(PNTProcess(ProcessList.objects[i])^.ImageName+',');
  1109.                 Caption:=LowerCase(Name);
  1110.                 VIR.Filename:=ImageName;
  1111.                 GetFileInfo(ImageName,fi);
  1112.                 GetFileVerInfo(ImageName,VIR);
  1113.                 SubItems.Add(VIR.Version);
  1114.                 SubItems.Add(Format('%d B',[fi.Size]));
  1115.                 try
  1116.                   SubItems.Add(DateTimeToStr(FileDateToDateTime(FileAge(ImageName))));
  1117.                 except
  1118.                 end;
  1119.                 SubItems.Add('1');
  1120.                 SubItems.Add(VIR.CompanyName);
  1121.                 SubItems.Add(VIR.Description);
  1122.                 SubItems.Add(LowerCase(ImageName));
  1123.                 ImageIndex:=AImageIndex;
  1124.               end;
  1125.           end;
  1126.         end;
  1127.         EndUpdate;
  1128.       end;
  1129.     end;
  1130.   finally
  1131.     Screen.Cursor:=crDefault;
  1132.     SetDetail(Notebook,dtList);
  1133.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1134.   end;
  1135. end;
  1136.  
  1137. procedure TfrmMain.RefreshServices;
  1138. var
  1139.   i: integer;
  1140. begin
  1141.   try
  1142.     Screen.Cursor:=crHourGlass;
  1143.     SetDetail(Notebook,dtDefault);
  1144.     sb.Panels[0].Text:='';
  1145.     Update;
  1146.     SetHeader(AListView,htSrv);
  1147.     GetNTServiceList(Computer,ServiceList);
  1148.     with AListView, Items do begin
  1149.       BeginUpdate;
  1150.       for i:=0 to ServiceList.Count-1 do
  1151.         with Add do begin
  1152.           Caption:=PNTService(ServiceList.objects[i])^.DisplayName;
  1153.           SubItems.Add(PNTService(ServiceList.Objects[i])^.Name);
  1154.           SubItems.Add(PNTService(ServiceList.Objects[i])^.szStatus);
  1155.           SubItems.Add(PNTService(ServiceList.Objects[i])^.szStartUp);
  1156.           SubItems.Add(PNTService(ServiceList.Objects[i])^.ObjectName);
  1157.           ImageIndex:=AImageIndex;
  1158.         end;
  1159.       EndUpdate;
  1160.     end;
  1161.   finally
  1162.     Screen.Cursor:=crDefault;
  1163.     SetDetail(Notebook,dtList);
  1164.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1165.   end;
  1166. end;
  1167.  
  1168. procedure TfrmMain.RefreshEvents;
  1169. var
  1170.   i,n: integer;
  1171. begin
  1172.   try
  1173.     Screen.Cursor:=crHourGlass;
  1174.     SetDetail(Notebook,dtDefault);
  1175.     sb.Panels[0].Text:='';
  1176.     Update;
  1177.     SetHeader(AListView,htEvent);
  1178.     if not Assigned(EventLog) then
  1179.       EventLog:=TEventLog.Create;
  1180.     with AListView, Items, EventLog do begin
  1181.       LogType:=AType;
  1182.       Machine:=Computer;
  1183.       Refresh;
  1184.       n:=RecordCount;
  1185.       BeginUpdate;
  1186.       for i:=0 to n-1 do
  1187.         with Add,LogRecords[i]^ do begin
  1188.           Caption:=EventTypes[EventType];
  1189.           Subitems.Add(DateTimeToStr(DateTime));
  1190.           Subitems.Add(Source);
  1191.           if Category='' then
  1192.             SubItems.Add('None')
  1193.           else
  1194.             Subitems.Add(Category);
  1195.           Subitems.Add(Format('%d',[EventID]));
  1196.           if UserName='' then
  1197.             SubItems.Add('N/A')
  1198.           else
  1199.             Subitems.Add(Username);
  1200.           Subitems.Add(Computer);
  1201.           case EventType of
  1202.             MiTec_EventLogNT.etError: ImageIndex:=iiError;
  1203.             MiTec_EventLogNT.etWarning: ImageIndex:=iiWarning;
  1204.             MiTec_EventLogNT.etInformation: ImageIndex:=iiInfo;
  1205.             MiTec_EventLogNT.etAuditSuccess: ImageIndex:=iiAuditSucc;
  1206.             MiTec_EventLogNT.etAuditFailure: ImageIndex:=iiAuditFail;
  1207.           end;
  1208.         end;
  1209.       EndUpdate;
  1210.     end;
  1211.   finally
  1212.     Screen.Cursor:=crDefault;
  1213.     SetDetail(Notebook,dtList);
  1214.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1215.   end;
  1216. end;
  1217.  
  1218. procedure TfrmMain.RefreshEnvironment;
  1219. var
  1220.   sl: TStrings;
  1221. begin
  1222.   sl:=TStringList.Create;
  1223.   try
  1224.     Screen.Cursor:=crHourGlass;
  1225.     SetDetail(Notebook,dtDefault);
  1226.     sb.Panels[0].Text:='';
  1227.     Update;
  1228.     SetHeader(AListView,htItem);
  1229.     GetEnvironment(sl);
  1230.     ListView_LoadStrings(sl,AListView.Items,'=',AImageIndex);
  1231.   finally
  1232.     sl.Free;
  1233.     Screen.Cursor:=crDefault;
  1234.     SetDetail(Notebook,dtList);
  1235.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1236.   end;
  1237. end;
  1238.  
  1239. procedure TfrmMain.RefreshSysInfo;
  1240. begin
  1241.   try
  1242.     Screen.Cursor:=crHourGlass;
  1243.     SetDetail(Notebook,dtDefault);
  1244.     sb.Panels[0].Text:='';
  1245.     Update;
  1246.     SetHeader(AListView,htItem);
  1247.     with AListView, Items, SystemInfo do begin
  1248.       //Refresh;
  1249.       BeginUpdate;
  1250.       with Add do begin
  1251.         Caption:='Operating System';
  1252.         SubItems.Add(Format('%s [%d.%d.%d]',[OSVersion,
  1253.                                           OS.MajorVersion,
  1254.                                           OS.MinorVersion,
  1255.                                           OS.BuildNumber]));
  1256.         ImageIndex:=iiOS;
  1257.       end;
  1258.       with Add do begin
  1259.         Caption:='Machine';
  1260.         SubItems.Add(Machine.Name);
  1261.         ImageIndex:=iiWksta;
  1262.       end;
  1263.       with Add do begin
  1264.         Caption:='CPU';
  1265.         SubItems.Add(format('%d x %s - %d MHz',[CPU.Count,CPU.VendorID,CPU.Frequency]));
  1266.         ImageIndex:=iiCPU;
  1267.       end;
  1268.       with Add do begin
  1269.         Caption:='Memory';
  1270.         SubItems.Add(Format('%d MB (%d KB free)',[Memory.PhysicalTotal div 1024 div 1024,Memory.PhysicalFree div 1024]));
  1271.         ImageIndex:=iiMemory;
  1272.       end;
  1273.       with Add do begin
  1274.         Caption:='Disks';
  1275.         SubItems.Add(Disk.AvailableDisks);
  1276.         ImageIndex:=iiDrives;
  1277.       end;
  1278.       with Add do begin
  1279.         Caption:='Sound adapter';
  1280.         if Media.Devices.Count>0 then begin
  1281.           if Media.SoundCardIndex>-1 then
  1282.             SubItems.Add(Media.Devices[Media.SoundCardIndex])
  1283.           else
  1284.             SubItems.Add(Media.Devices[0]);
  1285.         end else
  1286.           SubItems.Add('?');
  1287.         ImageIndex:=iiMultiMedia;
  1288.       end;
  1289.       with Add do begin
  1290.         Caption:='Display adapter';
  1291.         SubItems.Add(Format('%s (%d x %d - %d bit)',[Display.Adapter,
  1292.                                                      Display.HorzRes,
  1293.                                                      Display.VertRes,
  1294.                                                      Display.ColorDepth]));
  1295.         ImageIndex:=iiDisplay;
  1296.       end;
  1297.       with Add do begin
  1298.         Caption:='Network adapter';
  1299.         if Network.Adapters.Count>0 then begin
  1300.           if Network.CardAdapterIndex>-1 then
  1301.             SubItems.Add(Network.Adapters[Network.CardAdapterIndex])
  1302.           else
  1303.             SubItems.Add(Network.Adapters[0]);
  1304.         end else
  1305.           SubItems.Add('?');
  1306.         ImageIndex:=iiNetwork;
  1307.       end;
  1308.       with Add do begin
  1309.         Caption:='IP Address';
  1310.         SubItems.Add(Format('%s',[Network.IPAddresses[0]]));
  1311.         if Network.MACAddresses.Count>0 then
  1312.           SubItems[0]:=SubItems[0]+Format(' (MAC Address: %s)',[Network.MACAddresses[0]]);
  1313.         ImageIndex:=iiNetwork;
  1314.       end;
  1315.       if Printers.Names.Count>0 then
  1316.         with Add do begin
  1317.           Caption:='Printer';
  1318.           SubItems.Add(Format('%s on %s',[Printers.Names[Printers.DefaultIndex],
  1319.                                                       Printers.Ports[Printers.DefaultIndex]]));
  1320.           ImageIndex:=iiPrinter;
  1321.         end;
  1322.       EndUpdate;
  1323.     end;
  1324.   finally
  1325.     Screen.Cursor:=crDefault;
  1326.     SetDetail(Notebook,dtList);
  1327.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1328.   end;
  1329. end;
  1330.  
  1331. procedure TfrmMain.RefreshWindows;
  1332. var
  1333.   wh :hwnd;
  1334.   root :ttreenode;
  1335.   pw :PWindow;
  1336.  
  1337.   procedure EnumChildWins(Awh :hwnd; ARoot :ttreenode);
  1338.   var
  1339.     node :ttreenode;
  1340.   begin
  1341.     while awh<>0 do begin
  1342.       pw:=getwindowinfo(awh);
  1343.       node:=ATreeView.items.addchild(aroot,'Window '+inttohex(pw^.handle,8)+' "'+pw^.text+'" :'+pw^.classname);
  1344.       node.imageindex:=integer(pw^.visible);
  1345.       node.SelectedIndex:=node.imageindex;
  1346.       winlist.addobject(inttohex(pw^.Handle,8),@pw^);
  1347.       enumchildwins(getwindow(awh,GW_CHILD),node);
  1348.       awh:=getwindow(awh,GW_HWNDNEXT);
  1349.     end;
  1350.   end;
  1351.  
  1352. begin
  1353.   try
  1354.     Screen.Cursor:=crHourGlass;
  1355.     TreeTitle.Caption:='  Windows';
  1356.     Splitter2.Hide;
  1357.     InstPanel.Hide;
  1358.     ValPanel.Hide;
  1359.     Splitter3.Hide;
  1360.     SetDetail(Notebook,dtDefault);
  1361.     sb.Panels[0].Text:='';
  1362.     Update;
  1363.     with ATreeView, Items do begin
  1364.       Images:=imgTree;
  1365.       OnChange:=nil;
  1366.       FullCollapse;
  1367.       BeginUpdate;
  1368.       Clear;
  1369.       FreeWindowList(WinList);
  1370.       wh:=GetDesktopWindow;
  1371.       pw:=GetWindowInfo(wh);
  1372.       WinList.AddObject(IntToHex(pw^.Handle,8),@pw^);
  1373.       Root:=Add(nil,'Window '+inttohex(pw^.handle,8)+' "'+pw^.text+'" :'+pw^.classname);
  1374.       Root.ImageIndex:=integer(pw^.visible);
  1375.       Root.SelectedIndex:=Root.ImageIndex;
  1376.       EnumChildWins(GetWindow(wh,GW_CHILD),Root);
  1377.       EndUpdate;
  1378.       if Assigned(Items[0]) then
  1379.         Items[0].Expand(False);
  1380.     end;
  1381.   finally
  1382.     SetDetail(Notebook,dtTree);
  1383.     Screen.Cursor:=crDefault;
  1384.     sb.Panels[0].Text:=Format('%d items',[ATreeView.Items.Count]);
  1385.   end;
  1386. end;
  1387.  
  1388. procedure TfrmMain.RefreshShares;
  1389. var
  1390.   i,n: integer;
  1391. begin
  1392.   try
  1393.     Screen.Cursor:=crHourGlass;
  1394.     SetDetail(Notebook,dtDefault);
  1395.     sb.Panels[0].Text:='';
  1396.     Update;
  1397.     SetHeader(AListView,htShare);
  1398.     if IsNT then begin
  1399.       if not Assigned(ShareNT) then
  1400.         ShareNT:=TNTShares.Create;
  1401.       with AListView, Items, ShareNT do begin
  1402.         Machine:=Computer;
  1403.         RefreshShares;
  1404.         n:=ShareCount;
  1405.         BeginUpdate;
  1406.         for i:=0 to n-1 do
  1407.           with Add, Shares[i]^ do begin
  1408.             Caption:=Name;
  1409.             Subitems.Add(Path);
  1410.             Subitems.Add(ShareTypes[ShareType]);
  1411.             Subitems.Add(BoolToStr(SecurityDesc,True));
  1412.             if MaxUserCount=uint(-1) then
  1413.               SubItems.Add('Unlimited')
  1414.             else
  1415.               Subitems.Add(Format('%d',[MaxUserCount]));
  1416.             Subitems.Add(Format('%d',[CurUserCount]));
  1417.             Subitems.Add(GetPermissionStr(Permissions));
  1418.             Subitems.Add(Comment);
  1419.             ImageIndex:=AImageIndex;
  1420.           end;
  1421.         EndUpdate;
  1422.       end;
  1423.     end else begin
  1424.       if not Assigned(Share9x) then
  1425.         Share9x:=T9xShares.Create;
  1426.       with AListView, Items, Share9x do begin
  1427.         RefreshShares;
  1428.         n:=ShareCount;
  1429.         BeginUpdate;
  1430.         for i:=0 to n-1 do
  1431.           with Add, Shares[i]^ do begin
  1432.             Caption:=Name;
  1433.             Subitems.Add(Path);
  1434.             Subitems.Add(ShareTypes[ShareType]);
  1435.             Subitems.Add('Not Available');
  1436.             Subitems.Add('Not Available');
  1437.             Subitems.Add('Not Available');
  1438.             Subitems.Add('Not Available');
  1439.             Subitems.Add(Comment);
  1440.             ImageIndex:=AImageIndex;
  1441.           end;
  1442.         EndUpdate;
  1443.       end;
  1444.     end;
  1445.   finally
  1446.     Screen.Cursor:=crDefault;
  1447.     SetDetail(Notebook,dtList);
  1448.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1449.   end;
  1450. end;
  1451.  
  1452. procedure TfrmMain.RefreshSessions;
  1453. var
  1454.   i,n: integer;
  1455. begin
  1456.   try
  1457.     Screen.Cursor:=crHourGlass;
  1458.     SetDetail(Notebook,dtDefault);
  1459.     sb.Panels[0].Text:='';
  1460.     Update;
  1461.     SetHeader(AListView,htSession);
  1462.     if IsNT then begin
  1463.       if not Assigned(ShareNT) then
  1464.         ShareNT:=TNTShares.Create;
  1465.       with AListView, Items, ShareNT do begin
  1466.         Machine:=Computer;
  1467.         RefreshSessions;
  1468.         n:=SessionCount;
  1469.         BeginUpdate;
  1470.         for i:=0 to n-1 do
  1471.           with Add, Sessions[i]^ do begin
  1472.             Caption:=Name;
  1473.             SubItems.Add(UserName);
  1474.             SubItems.Add(SesiType);
  1475.             SubItems.Add(Format('%d',[OpenFiles]));
  1476.             SubItems.Add(FormatSeconds(ConnectedTime,True,False,True));
  1477.             SubItems.Add(FormatSeconds(IdleTime,True,False,True));
  1478.             SubItems.Add(BoolToStr(Guest,True));
  1479.             ImageIndex:=AImageIndex;
  1480.           end;
  1481.         EndUpdate;
  1482.       end;
  1483.     end else begin
  1484.       if not Assigned(Share9x) then
  1485.         Share9x:=T9xShares.Create;
  1486.       with AListView, Items, Share9x do begin
  1487.         RefreshSessions;
  1488.         n:=SessionCount;
  1489.         BeginUpdate;
  1490.         for i:=0 to n-1 do
  1491.           with Add, Sessions[i]^ do begin
  1492.             Caption:='Not Available';
  1493.             SubItems.Add(Name);
  1494.             SubItems.Add('Not Available');
  1495.             SubItems.Add('Not Available');
  1496.             SubItems.Add('Not Available');
  1497.             SubItems.Add('Not Available');
  1498.             SubItems.Add('Not Available');
  1499.             ImageIndex:=AImageIndex;
  1500.           end;
  1501.         EndUpdate;
  1502.       end;
  1503.     end;
  1504.   finally
  1505.     Screen.Cursor:=crDefault;
  1506.     SetDetail(Notebook,dtList);
  1507.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1508.   end;
  1509. end;
  1510.  
  1511. procedure TfrmMain.RefreshOpenFiles;
  1512. var
  1513.   i,n: integer;
  1514. begin
  1515.   try
  1516.     Screen.Cursor:=crHourGlass;
  1517.     SetDetail(Notebook,dtDefault);
  1518.     sb.Panels[0].Text:='';
  1519.     Update;
  1520.     SetHeader(AListView,htOpenFiles);
  1521.     if IsNT then begin
  1522.       if not Assigned(ShareNT) then
  1523.         ShareNT:=TNTShares.Create;
  1524.       with AListView, Items, ShareNT do begin
  1525.         Machine:=Computer;
  1526.         RefreshOpenFiles;
  1527.         n:=OpenFileCount;
  1528.         BeginUpdate;
  1529.         for i:=0 to n-1 do
  1530.           with Add, OpenFiles[i]^ do begin
  1531.             Caption:=Name;
  1532.             SubItems.Add(UserName);
  1533.             SubItems.Add(Format('%d',[Locks]));
  1534.             case Mode of
  1535.               pmRead: SubItems.Add('Read Only');
  1536.               pmWrite: SubItems.Add('Write');
  1537.               pmCreate: SubItems.Add('Create');
  1538.             end;
  1539.             ImageIndex:=AImageIndex;
  1540.           end;
  1541.         EndUpdate;
  1542.       end;
  1543.     end else begin
  1544.       if not Assigned(Share9x) then
  1545.         Share9x:=T9xShares.Create;
  1546.       with AListView, Items, Share9x do begin
  1547.         RefreshOpenFiles;
  1548.         n:=OpenFileCount;
  1549.         BeginUpdate;
  1550.         for i:=0 to n-1 do
  1551.           with Add, OpenFiles[i]^ do begin
  1552.             Caption:=Name;
  1553.             ImageIndex:=AImageIndex;
  1554.           end;
  1555.         EndUpdate;
  1556.       end;
  1557.     end;
  1558.   finally
  1559.     Screen.Cursor:=crDefault;
  1560.     SetDetail(Notebook,dtList);
  1561.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1562.   end;
  1563. end;
  1564.  
  1565. procedure TfrmMain.RefreshGroups;
  1566. var
  1567.   i,n: integer;
  1568. begin
  1569.   try
  1570.     Screen.Cursor:=crHourGlass;
  1571.     SetDetail(Notebook,dtDefault);
  1572.     sb.Panels[0].Text:='';
  1573.     Update;
  1574.     SetHeader(AListView,htGroups);
  1575.     if not Assigned(Accounts) then
  1576.       Accounts:=TAccounts.Create;
  1577.     Accounts.Machine:=Computer;
  1578.     Accounts.RefreshLocalGroups;
  1579.     n:=Accounts.LocalGroupCount;
  1580.     with AListView, Items do begin
  1581.       BeginUpdate;
  1582.       for i:=0 to n-1 do
  1583.         with Add, Accounts.LocalGroups[i]^ do begin
  1584.           Caption:=Name;
  1585.           SubItems.Add(Comment);
  1586.           ImageIndex:=AImageIndex;
  1587.         end;
  1588.       EndUpdate;
  1589.     end;
  1590.   finally
  1591.     Screen.Cursor:=crDefault;
  1592.     SetDetail(Notebook,dtList);
  1593.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1594.   end;
  1595. end;
  1596.  
  1597. procedure TfrmMain.RefreshUsers;
  1598. var
  1599.   i,n: integer;
  1600. begin
  1601.   try
  1602.     Screen.Cursor:=crHourGlass;
  1603.     SetDetail(Notebook,dtDefault);
  1604.     sb.Panels[0].Text:='';
  1605.     Update;
  1606.     SetHeader(AListView,htUsers);
  1607.     if not Assigned(Accounts) then
  1608.       Accounts:=TAccounts.Create;
  1609.     Accounts.Machine:=Computer;
  1610.     Accounts.RefreshUsers;
  1611.     n:=Accounts.UserCount;
  1612.     with AListView, Items do begin
  1613.       BeginUpdate;
  1614.       for i:=0 to n-1 do
  1615.         with Add, Accounts.Users[i]^ do begin
  1616.           Caption:=Name;
  1617.           SubItems.Add(Fullname);
  1618.           SubItems.Add(Comment);
  1619.           ImageIndex:=AImageIndex;
  1620.         end;
  1621.       EndUpdate;
  1622.     end;
  1623.   finally
  1624.     Screen.Cursor:=crDefault;
  1625.     SetDetail(Notebook,dtList);
  1626.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  1627.   end;
  1628. end;
  1629.  
  1630. procedure TfrmMain.RefreshErrors;
  1631. const
  1632.   BUFFER_SIZE = 1024;
  1633. var
  1634.   lpMsgBuf: Pchar;
  1635.   LangID: DWORD;
  1636.   i: integer;
  1637.   s: string;
  1638. begin
  1639.   try
  1640.     Screen.Cursor:=crHourGlass;
  1641.     SetHeader(AListView,htErrors);
  1642.     lpMsgBuf:=AllocMem(BUFFER_SIZE);
  1643.     if IsNT then
  1644.       LangID:=$409
  1645.     else
  1646.       LangID:=GetUserDefaultLangID;
  1647.     s:='';
  1648.     with AListView, Items do begin
  1649.       BeginUpdate;
  1650.       for i:=0 to 12000 do begin
  1651.         FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS,
  1652.                   nil,i,LangID,lpMsgBuf,BUFFER_SIZE,nil);
  1653.         if StrPas(lpMsgBuf)<>s then
  1654.           with Add do begin
  1655.             Caption:=Format('%0.5d',[i]);
  1656.             SubItems.Add(StringReplace(StrPas(lpMsgBuf),#13#10,' ',[rfReplaceAll,rfIgnoreCase]));
  1657.             ImageIndex:=AImageIndex;
  1658.           end;
  1659.         s:=StrPas(lpMsgBuf);
  1660.       end;
  1661.       EndUpdate;
  1662.     end;
  1663.   finally
  1664.     if Assigned(lpMsgBuf) then
  1665.       FreeMem(lpMsgBuf);
  1666.     Screen.Cursor:=crDefault;
  1667.   end;
  1668. end;
  1669.  
  1670. procedure TfrmMain.FormCreate(Sender: TObject);
  1671. begin
  1672.   Computer:=MachineName;
  1673.   ServerList:=TStringList.Create;
  1674.   RefList:=TStringList.Create;
  1675.   ProcessList:=TStringList.Create;
  1676.   ServiceList:=TStringList.Create;
  1677.   DriverList:=TStringList.Create;
  1678.   WinList:=TStringList.Create;
  1679.   RefreshServers;
  1680.   SystemInfo.Refresh;
  1681.   if IsNT then 
  1682.     mmNet.Tag:=6;
  1683. end;
  1684.  
  1685. procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
  1686. begin
  1687.   RefList.Free;
  1688.   FreeNTServiceList(ServiceList);
  1689.   ServiceList.Free;
  1690.   FreeNTDriverList(DriverList);
  1691.   DriverList.Free;
  1692.   WinList.Free;
  1693.   FreeServerList(ServerList);
  1694.   ServerList.Free;
  1695.   if Assigned(PLNT) then begin
  1696.     PLNT.Free;
  1697.     FreeNTProcessList(ProcessList);
  1698.   end;
  1699.   if Assigned(PL9x) then begin
  1700.     PL9x.Close;
  1701.     PL9x.Free;
  1702.     Free95ProcessList(ProcessList);
  1703.   end;
  1704.   ProcessList.Free;
  1705. end;
  1706.  
  1707. procedure TfrmMain.TreeChange(Sender: TObject; Node: TTreeNode);
  1708. var
  1709.   n: TTreeNode;
  1710. begin
  1711.   cmAction(nil);
  1712.   if Node.Count>0 then begin
  1713.     lv.PopupMenu:=nil;
  1714.     SetDetail(Notebook,dtList);
  1715.     SetHeader(lv,htTopic);
  1716.     with lv, Items do begin
  1717.       n:=Node.GetFirstChild;
  1718.       repeat
  1719.         with Add do begin
  1720.           Caption:=n.Text;
  1721.           ImageIndex:=n.ImageIndex;
  1722.         end;
  1723.         n:=Node.GetNextChild(n);
  1724.       until not Assigned(n);
  1725.     end;
  1726.     sb.Panels[0].Text:=Format('%d topics',[Node.Count]);
  1727.   end else begin
  1728.     lv.PopupMenu:=PopupMenu;
  1729.     case Node.ImageIndex of
  1730.       iiApplication: RefreshEvents(lv,Node.ImageIndex,elApplication);
  1731.       iiSecurity: RefreshEvents(lv,Node.ImageIndex,elSecurity);
  1732.       iiSystem: RefreshEvents(lv,Node.ImageIndex,elSystem);
  1733.       iiSystemInfo: RefreshSysInfo(lv);
  1734.       iiEnvVar: RefreshEnvironment(lv,Node.ImageIndex);
  1735.       iiRunningTasks: RefreshProcesses(lv,Node.ImageIndex);
  1736.       iiModules: RefreshModules(lv,Node.ImageIndex);
  1737.       iiServices: RefreshServices(lv,Node.ImageIndex);
  1738.       iiDrivers: RefreshDrivers(lv,Node.ImageIndex);
  1739.       iiPerformance: RefreshPerformance(tv);
  1740.       iiWindows: RefreshWindows(tv);
  1741.       iiShares: RefreshShares(lv,Node.ImageIndex);
  1742.       iiSessions: RefreshSessions(lv,Node.ImageIndex);
  1743.       iiOpenFiles: RefreshOpenFiles(lv,Node.ImageIndex);
  1744.       iiUsers: RefreshUsers(lv,Node.ImageIndex);
  1745.       iiGroups: RefreshGroups(lv,Node.ImageIndex);
  1746.       iiGlobalGroups: RefreshGlobalGroups(lv,Node.ImageIndex);
  1747.       iiScheduler: RefreshJobs(lv,iiTask);
  1748.       iiWkstaTrans: RefreshWkstaTrans(lv,iiWkstaTrans);
  1749.       iiWkstaUsers: RefreshWkstaUsers(lv,iiWkstaUsers);
  1750.       iiWkstaInfo: RefreshWkstaInfo(lv,iiWkstaInfo);
  1751.       iiDevices: RefreshDevices(tv);
  1752.     end;
  1753.   end;
  1754. end;
  1755.  
  1756. procedure TfrmMain.cmClose(Sender: TObject);
  1757. begin
  1758.   Close;
  1759. end;
  1760.  
  1761. procedure TfrmMain.tvChange(Sender: TObject; Node: TTreeNode);
  1762. var
  1763.   i,oi,ci: integer;
  1764. begin
  1765.   if Assigned(Node) then begin
  1766.     if Tree.Selected.ImageIndex=iiPerformance then begin
  1767.       lbInst.Items.BeginUpdate;
  1768.       lbInst.Items.Clear;
  1769.       lbVal.Items.BeginUpdate;
  1770.       lbVal.Items.Clear;
  1771.       try try
  1772.  
  1773.       if IsNT then begin
  1774.         if Assigned(Node.Parent) then
  1775.           oi:=PLNT.GetIndexByName(Node.Parent.Text)
  1776.         else
  1777.           oi:=PLNT.GetIndexByName(Node.Text);
  1778.         if PLNT.Objects[oi].InstanceCount>0 then
  1779.           for i:=0 to PLNT.Objects[oi].InstanceCount-1 do
  1780.             lbInst.Items.Add(PLNT.Objects[oi].Instances[i].Name);
  1781.         if Assigned(Node.Parent) then begin
  1782.           ci:=PLNT.Objects[oi].GetCntrIndexByName(Node.Text);
  1783.           i:=0;
  1784.           repeat
  1785.             lbVal.Items.Add(PLNT.Objects[oi].Counters[ci].DataStrEx[i]);
  1786.             Inc(i);
  1787.           until i>PLNT.Objects[oi].InstanceCount-1;
  1788.         end;
  1789.       end else begin
  1790.         if Assigned(Node.Parent) then
  1791.           lbVal.Items.Add(Format('%d',[PL9x.SysData[Node.Parent.Text+'\'+Node.Text]]));
  1792.       end;
  1793.  
  1794.       except
  1795.       end;
  1796.       finally
  1797.       lbVal.Items.EndUpdate;
  1798.       lbInst.Items.EndUpdate;
  1799.       end;
  1800.     end;
  1801.   end;
  1802. end;
  1803.  
  1804. procedure TfrmMain.ShowProps(AType: TPropertyType; AParameter: Variant);
  1805. var
  1806.   po: TPerfObject;
  1807.   pd: PDevice;
  1808.   p: PChar;
  1809. begin
  1810.   p:=nil;
  1811.   with TdlgProperties.Create(Self) do begin
  1812.     PropertyType:=AType;
  1813.     case AType of
  1814.       ptProcess: Parameter:=ProcessList.Objects[ProcessList.IndexOf(AParameter)];
  1815.       ptService: Parameter:=ServiceList.Objects[ServiceList.IndexOf(AParameter)];
  1816.       ptPerf:
  1817.         if IsNT then begin
  1818.           if VarIsArray(AParameter) then begin
  1819.             po:=PLNT.Objects[PLNT.GetIndexByName(AParameter[1])];
  1820.             Parameter:=po.Counters[po.GetCntrIndexByName(AParameter[0])];
  1821.           end else begin
  1822.             Parameter:=PLNT.Objects[PLNT.GetIndexByName(AParameter)]
  1823.           end;
  1824.         end else begin
  1825.           p:=AllocMem(255);
  1826.           if VarIsArray(AParameter) then begin
  1827.             strpcopy(p,AParameter[1]+'\'+AParameter[0]);
  1828.             Parameter:=TObject(p);
  1829.           end else begin
  1830.             strpcopy(p,AParameter);
  1831.             Parameter:=TObject(p);
  1832.           end;
  1833.         end;
  1834.       ptWindow: Parameter:=WinList.Objects[AParameter];
  1835.       ptLog: Parameter:=TObject(EventLog.LogRecords[AParameter]);
  1836.       ptShare: Parameter:=TObject(ShareNT.Shares[AParameter]);
  1837.       ptDevice: begin
  1838.         new(pd);
  1839.         pd^:=SystemInfo.Devices.Devices[AParameter];
  1840.         Parameter:=TObject(pd);
  1841.       end;
  1842.       ptUser, ptGroup, ptGlobalGroup: begin
  1843.         Parameter:=Accounts;
  1844.         Idx:=AParameter;
  1845.       end;
  1846.     end;
  1847.     PerfLibNT:=PLNT;
  1848.     PerfLib9x:=PL9x;
  1849.     ShowModal;
  1850.     if Assigned(pd) then
  1851.       dispose(pd);
  1852.     if Assigned(p) then
  1853.       FreeMem(p);
  1854.     Free;
  1855.   end;
  1856. end;
  1857.  
  1858. procedure TfrmMain.lvDblClick(Sender: TObject);
  1859. begin
  1860.   if Assigned(lv.Selected) then begin
  1861.     if lv.ViewStyle=vsReport then begin
  1862.       if (Tree.Selected.ImageIndex=lv.Selected.ImageIndex) or
  1863.          (Tree.Selected.ImageIndex=iiSystemInfo) or
  1864.          (lv.Selected.ImageIndex in [iiError..iiAuditFail])
  1865.           then begin
  1866.         case lv.Selected.ImageIndex of
  1867.           iiEventViewer, iiCompInfo, iiSoftware:
  1868.             OpenTopic(Tree,lv.Selected.Index);
  1869.           iiError, iiWarning, iiInfo, iiAuditSucc, iiAuditFail:
  1870.             ShowProps(ptLog,lv.Selected.Index);
  1871.           iiSystemInfo:
  1872.             RefreshSysInfo(lv);
  1873.           iiWksta:
  1874.             ShowSIProps([pgWksta,pgAPM]);
  1875.           iiOS:
  1876.             ShowSIProps([pgOS,pgEng,pgTZ,pgStartup,pgSoftware]);
  1877.           iiMemory:
  1878.             ShowSIProps([pgMem]);
  1879.           iiDrives:
  1880.             ShowSIProps([pgDisk]);
  1881.           iiNetwork:
  1882.             ShowSIProps([pgNet]);
  1883.           iiMultimedia:
  1884.             ShowSIProps([pgMedia]);
  1885.           iiDisplay:
  1886.             ShowSIProps([pgDisplay]);
  1887.           iiCPU:
  1888.             ShowSIProps([pgCPU]);
  1889.           iiPrinter:
  1890.             ShowSIProps([pgPrn]);
  1891.           iiRunningTasks:
  1892.             ShowProps(ptProcess,lv.Selected.SubItems[0]);
  1893.           iiServices:
  1894.             ShowProps(ptService,lv.Selected.SubItems[0]);
  1895.           iiUsers:
  1896.             ShowProps(ptUser,lv.Selected.index);
  1897.           iiGroups:
  1898.             ShowProps(ptGroup,lv.Selected.index);
  1899.           iiGlobalGroups:
  1900.             ShowProps(ptGlobalGroup,lv.Selected.index);
  1901.           iiShares:
  1902.             if IsNT then
  1903.               ShowProps(ptShare,lv.Selected.Index);
  1904.           iiModules:
  1905.             DisplayPropDialog(Handle,lv.Selected.SubItems[6]);
  1906.         end;
  1907.       end else
  1908.       OpenTopic(Tree,lv.Selected.Index);
  1909.     end else
  1910.       ShellExecute(Application.Handle,'open','rundll32.exe',
  1911.       PChar(ControlPanelRun[lv.Selected.ImageIndex]),nil,SW_NORMAL);
  1912.   end;
  1913. end;
  1914.  
  1915. procedure TfrmMain.tvDblClick(Sender: TObject);
  1916. begin
  1917.   if Assigned(tv.Selected) and assigned(Tree.Selected) then
  1918.     case Tree.Selected.ImageIndex of
  1919.       iiPerformance:
  1920.         if Assigned(tv.Selected.Parent) then
  1921.           ShowProps(ptPerf,VarArrayOf([tv.Selected.Text,tv.Selected.Parent.Text]))
  1922.         else
  1923.           ShowProps(ptPerf,tv.Selected.Text);
  1924.       iiWindows:
  1925.         ShowProps(ptWindow,tv.Selected.AbsoluteIndex);
  1926.       iiDevices:
  1927.         if tv.Selected.Level=2 then
  1928.           ShowProps(ptDevice,PInteger(tv.Selected.Data)^);
  1929.     end;
  1930. end;
  1931.  
  1932. procedure TfrmMain.ShowSIProps(AType: TPages);
  1933. begin
  1934.   with TfrmMSI_Overview.Create(Self) do begin
  1935.     ShowReportButton:=false;
  1936.     SysInfo:=SystemInfo;
  1937.     DisplayedPages:=AType;
  1938.     cmRefresh(nil);
  1939.     ShowModal;
  1940.     Free;
  1941.   end;
  1942. end;
  1943.  
  1944. procedure TfrmMain.TreeMenuPopup(Sender: TObject);
  1945. begin
  1946.   pmRefresh.Enabled:=Assigned(Tree.Selected) and
  1947.                    not(Tree.Selected.ImageIndex in
  1948.                       [iiEventViewer,iiCompInfo,iiAccounts,iiSharedFolders,
  1949.                       iiSoftware]);
  1950.   pmSaveRep.Enabled:=pmRefresh.Enabled;
  1951. end;
  1952.  
  1953. procedure TfrmMain.TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
  1954.   Shift: TShiftState; X, Y: Integer);
  1955. var
  1956.   n :ttreenode;
  1957. begin
  1958.   n:=ttreeview(sender).getnodeat(x,y);
  1959.   if assigned(n) then
  1960.     ttreeview(sender).selected:=n;
  1961. end;
  1962.  
  1963.  
  1964. procedure TfrmMain.cmAbout(Sender: TObject);
  1965. begin
  1966.   ShellAbout(Handle,PChar(Application.Title),PChar(SystemInfo.About),Application.Icon.Handle);
  1967. end;
  1968.  
  1969. procedure TfrmMain.CloseOpenFile(AID: DWORD);
  1970. var
  1971.   n: DWORD;
  1972.   Buf: array[0..256] of WideChar;
  1973. begin
  1974.   if MessageDlg('Close file?',mtConfirmation,[mbyes,mbNo],0)=mryes then begin
  1975.  
  1976.     n:=NetFileClose(StringToWideChar(Computer,Buf,256),AID);
  1977.     if n<>ERROR_SUCCESS then
  1978.       raise Exception.Create(GetErrorMessage(n))
  1979.     else
  1980.       RefreshOpenFiles(lv,iiOpenFiles);
  1981.   end;
  1982. end;
  1983.  
  1984. procedure TfrmMain.CloseSession(AName, AUsername: string);
  1985. var
  1986.   n: DWORD;
  1987.   Buf1, Buf2,Buf3: array[0..256] of WideChar;
  1988. begin
  1989.   if MessageDlg('Close session?',mtConfirmation,[mbyes,mbNo],0)=mryes then begin
  1990.     n:=NetSessionDel(StringToWideChar(Computer,Buf1,256),
  1991.                      StringToWideChar('\\'+AName,Buf2,256),
  1992.                      StringToWideChar(AUserName,Buf3,256));
  1993.     if n<>ERROR_SUCCESS then
  1994.       raise Exception.Create(GetErrorMessage(n))
  1995.     else
  1996.       RefreshSessions(lv,iiSessions);
  1997.   end;
  1998. end;
  1999.  
  2000. procedure TfrmMain.cmRefresh(Sender: TObject);
  2001. begin
  2002.   TreeChange(Tree,Tree.Selected);
  2003. end;
  2004.  
  2005. procedure TfrmMain.PopupMenuPopup(Sender: TObject);
  2006. begin
  2007.   if ActiveControl=lv then begin
  2008.     pmProps.Enabled:=Assigned(lv.Selected);
  2009.     if IsNT then
  2010.       pmProps.Visible:=Assigned(lv.Selected) and not(lv.Selected.ImageIndex in [iiDrivers,iiEnvVar,iiSessions,iiOpenFiles,iiTask,iiWkstaTrans,iiWkstaUsers,iiWkstaInfo])
  2011.     else
  2012.       pmProps.Visible:=Assigned(lv.Selected) and not(lv.Selected.ImageIndex in [iiDrivers,iiEnvVar,iiSessions,iiOpenFiles,iiShares,iiTask,iiWkstaTrans,iiWkstaUsers,iiWkstaInfo]);
  2013.     pmRefs.Visible:=Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiModules]);
  2014.     pmClose.Enabled:=Assigned(lv.Selected);
  2015.     pmClose.Visible:=IsNT and Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiSessions,iiOpenFiles]);
  2016.     pmDelete.Enabled:=Assigned(lv.Selected);
  2017.     pmDelete.Visible:=IsNT and Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiTask]);
  2018.     pmSave.Enabled:=Assigned(lv.Selected);
  2019.     pmSave.Visible:=Assigned(lv.Selected) and (lv.ViewStyle<>vsIcon);
  2020.   end else
  2021.     if ActiveControl=tv then begin
  2022.       pmClose.Visible:=False;
  2023.       pmProps.Enabled:=Assigned(tv.Selected);
  2024.       pmProps.Visible:=Assigned(tv.Selected);
  2025.       if pmProps.Visible and (Tree.Selected.ImageIndex=iiDevices) and (tv.selected.Level<>2) then
  2026.         pmProps.Visible:=False;
  2027.       pmSave.Enabled:=Assigned(tv.Selected);
  2028.       pmRefs.Visible:=False;
  2029.       pmDelete.Visible:=False;
  2030.       pmSave.Visible:=True;
  2031.     end;
  2032. end;
  2033.  
  2034. procedure TfrmMain.cmProps(Sender: TObject);
  2035. begin
  2036.   if ActiveControl=lv then begin
  2037.     lvDblClick(nil);
  2038.   end else
  2039.     if ActiveControl=tv then begin
  2040.       tvDblClick(nil);
  2041.     end;
  2042. end;
  2043.  
  2044. procedure TfrmMain.cmCloseItem(Sender: TObject);
  2045. begin
  2046.   case lv.Selected.ImageIndex of
  2047.      iiOpenFiles:
  2048.         CloseOpenFile(ShareNT.OpenFiles[lv.Selected.Index]^.ID);
  2049.      iiSessions:
  2050.        if IsNT then
  2051.          CloseSession(ShareNT.Sessions[lv.Selected.Index]^.Name,ShareNT.Sessions[lv.Selected.Index]^.UserName);
  2052.   end;
  2053. end;
  2054.  
  2055. procedure TfrmMain.cmSave(Sender: TObject);
  2056. begin
  2057.   MessageDlg('Not implemented yet.',mtInformation,[mbOK],0);
  2058. end;
  2059.  
  2060. procedure TfrmMain.cmRefs(Sender: TObject);
  2061. begin
  2062.   ShowRefsDlg(lv.Selected.Caption,RefList[lv.Selected.Index]);
  2063. end;
  2064.  
  2065. procedure TfrmMain.RefreshJobs(AListView: TListViewClass;
  2066.   AImageIndex: integer);
  2067. var
  2068.   i,n: integer;
  2069. begin
  2070.   try
  2071.     Screen.Cursor:=crHourGlass;
  2072.     SetDetail(Notebook,dtDefault);
  2073.     sb.Panels[0].Text:='';
  2074.     Update;
  2075.     SetHeader(AListView,htJobs);
  2076.     if not Assigned(JobNT) then
  2077.       JobNT:=TNTJobs.Create;
  2078.     with AListView, Items, JobNT do begin
  2079.       Machine:=Computer;
  2080.       Refresh;
  2081.       n:=JobCount;
  2082.       BeginUpdate;
  2083.       for i:=0 to n-1 do
  2084.         with Add, Jobs[i]^ do begin
  2085.           Caption:=Format('0x%x',[ID]);
  2086.           SubItems.Add(TimeToStr(JobTime));
  2087.           SubItems.Add(DaysOfMonth.CommaText);
  2088.           SubItems.Add(DaysOfWeek.CommaText);
  2089.           SubItems.Add(GetJobFlagsStr(Flags));
  2090.           SubItems.Add(Command);
  2091.           ImageIndex:=AImageIndex;
  2092.         end;
  2093.       EndUpdate;
  2094.     end;
  2095.   finally
  2096.     Screen.Cursor:=crDefault;
  2097.     SetDetail(Notebook,dtList);
  2098.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2099.   end;
  2100. end;
  2101.  
  2102. procedure TfrmMain.cmDelete(Sender: TObject);
  2103. begin
  2104.   DeleteJob(JobNT.Jobs[lv.Selected.Index]^.ID);
  2105. end;
  2106.  
  2107. procedure TfrmMain.DeleteJob(AID: DWORD);
  2108. var
  2109.   n: DWORD;
  2110.   Buf: array[0..256] of WideChar;
  2111. begin
  2112.   if MessageDlg('Delete task?',mtConfirmation,[mbyes,mbNo],0)=mryes then begin
  2113.  
  2114.     n:=NetScheduleJobDel(StringToWideChar(Computer,Buf,256),AID,AID);
  2115.     if n<>ERROR_SUCCESS then
  2116.       raise Exception.Create(GetErrorMessage(n))
  2117.     else
  2118.       RefreshJobs(lv,iiTask);
  2119.   end;
  2120. end;
  2121.  
  2122. procedure TfrmMain.cmCP(Sender: TObject);
  2123. begin
  2124.   ShellExecute(Application.Handle,'open','rundll32.exe',
  2125.       PChar(ControlPanelRun[TComponent(sender).Tag]),nil,SW_NORMAL);
  2126. end;
  2127.  
  2128. procedure TfrmMain.FreeWindowList(AList: TStringList);
  2129. var
  2130.   pw: PWindow;
  2131. begin
  2132.   while AList.count>0 do begin
  2133.     pw:=PWindow(AList.Objects[AList.Count-1]);
  2134.     Dispose(pw);
  2135.     AList.Delete(AList.Count-1);
  2136.   end;
  2137. end;
  2138.  
  2139. procedure TfrmMain.Refresh;
  2140. begin
  2141.   SetTopics(Tree,(Pos(MachineName,Computer)>0));
  2142.   SetDetail(Notebook,dtDefault);
  2143.   try
  2144.     Tree.Selected:=Tree.Items[0];
  2145.     TreeChange(Tree,Tree.Selected);
  2146.     cmAction(nil);
  2147.   except
  2148.   end;
  2149. end;
  2150.  
  2151. procedure TfrmMain.RefreshWkstaTrans(AListView: TListViewClass;
  2152.   AImageIndex: integer);
  2153. var
  2154.   i,n: integer;
  2155. begin
  2156.   try
  2157.     Screen.Cursor:=crHourGlass;
  2158.     SetDetail(Notebook,dtDefault);
  2159.     sb.Panels[0].Text:='';
  2160.     Update;
  2161.     SetHeader(AListView,htWkstaTrans);
  2162.     if not Assigned(Wksta) then
  2163.       Wksta:=TNTWksta.Create;
  2164.     with AListView, Items, Wksta do begin
  2165.       Machine:=Computer;
  2166.       RefreshTrans;
  2167.       n:=TransportCount;
  2168.       BeginUpdate;
  2169.       for i:=0 to n-1 do
  2170.         with Add, Transports[i]^ do begin
  2171.           Caption:=Name;
  2172.           SubItems.Add(Address);
  2173.           SubItems.Add(IntToStr(Quality));
  2174.           SubItems.Add(IntToStr(VCSCount));
  2175.           if IsWAN then
  2176.             SubItems.Add('Yes')
  2177.           else
  2178.             SubItems.Add('No');
  2179.           ImageIndex:=AImageIndex;
  2180.         end;
  2181.       EndUpdate;
  2182.     end;
  2183.   finally
  2184.     Screen.Cursor:=crDefault;
  2185.     SetDetail(Notebook,dtList);
  2186.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2187.   end;
  2188. end;
  2189.  
  2190. procedure TfrmMain.RefreshWkstaUsers(AListView: TListViewClass;
  2191.   AImageIndex: integer);
  2192. var
  2193.   i,n: integer;
  2194. begin
  2195.   try
  2196.     Screen.Cursor:=crHourGlass;
  2197.     SetDetail(Notebook,dtDefault);
  2198.     sb.Panels[0].Text:='';
  2199.     Update;
  2200.     SetHeader(AListView,htWkstaUsers);
  2201.     if not Assigned(Wksta) then
  2202.       Wksta:=TNTWksta.Create;
  2203.     with AListView, Items, Wksta do begin
  2204.       Machine:=Computer;
  2205.       RefreshUsers;
  2206.       n:=UserCount;
  2207.       BeginUpdate;
  2208.       for i:=0 to n-1 do
  2209.         with Add, Users[i]^ do begin
  2210.           Caption:=Name;
  2211.           SubItems.Add(Domain);
  2212.           SubItems.Add(Server);
  2213.           ImageIndex:=AImageIndex;
  2214.         end;
  2215.       EndUpdate;
  2216.     end;
  2217.   finally
  2218.     Screen.Cursor:=crDefault;
  2219.     SetDetail(Notebook,dtList);
  2220.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2221.   end;
  2222. end;
  2223.  
  2224. procedure TfrmMain.RefreshGlobalGroups(AListView: TListViewClass;
  2225.   AImageIndex: Integer);
  2226. var
  2227.   i,n: integer;
  2228. begin
  2229.   try
  2230.     Screen.Cursor:=crHourGlass;
  2231.     SetDetail(Notebook,dtDefault);
  2232.     sb.Panels[0].Text:='';
  2233.     Update;
  2234.     SetHeader(AListView,htGroups);
  2235.     if not Assigned(Accounts) then
  2236.       Accounts:=TAccounts.Create;
  2237.     Accounts.Machine:=Computer;
  2238.     Accounts.RefreshGlobalGroups;
  2239.     n:=Accounts.GlobalGroupCount;
  2240.     with AListView, Items do begin
  2241.       BeginUpdate;
  2242.       for i:=0 to n-1 do
  2243.         with Add, Accounts.GlobalGroups[i]^ do begin
  2244.           Caption:=Name;
  2245.           SubItems.Add(Comment);
  2246.           ImageIndex:=AImageIndex;
  2247.         end;
  2248.       EndUpdate;
  2249.     end;
  2250.   finally
  2251.     Screen.Cursor:=crDefault;
  2252.     SetDetail(Notebook,dtList);
  2253.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2254.   end;
  2255. end;
  2256.  
  2257. procedure TfrmMain.RefreshServers;
  2258. begin
  2259.   {if IsNT then begin
  2260.     GetServerList(SV_TYPE_ALL,'',ServerList);
  2261.     cbMachine.Items.Clear;
  2262.     for i:=0 to ServerList.Count-1 do
  2263.       cbMachine.Items.Add(ServerList[i]);//+' ('+GetServerTypeStr(PServer(ServerList.Objects[i])^.ServerType)+')');
  2264.   end;
  2265.   cbMachine.ItemIndex:=cbMachine.Items.IndexOf(MachineName);}
  2266.   FSingleMachine:=(ServerList.Count=0);
  2267.   Refresh;
  2268. end;
  2269.  
  2270. procedure TfrmMain.RefreshWkstaInfo;
  2271. begin
  2272.   try
  2273.     Screen.Cursor:=crHourGlass;
  2274.     SetDetail(Notebook,dtDefault);
  2275.     sb.Panels[0].Text:='';
  2276.     Update;
  2277.     SetHeader(AListView,htItem);
  2278.     if not Assigned(Wksta) then
  2279.       Wksta:=TNTWksta.Create;
  2280.     Wksta.Machine:=Computer;
  2281.     Wksta.RefreshInfo;
  2282.     with AListView, Items do begin
  2283.       BeginUpdate;
  2284.       with Add, Wksta do begin
  2285.         Caption:='Name';
  2286.         SubItems.Add(Computername);
  2287.         ImageIndex:=AImageIndex;
  2288.       end;
  2289.       with Add, Wksta do begin
  2290.         Caption:='Domain';
  2291.         SubItems.Add(DomainName);
  2292.         ImageIndex:=AImageIndex;
  2293.       end;
  2294.       with Add, Wksta do begin
  2295.         Caption:='PlatformId';
  2296.         SubItems.Add(IntToStr(PlatformId));
  2297.         ImageIndex:=AImageIndex;
  2298.       end;
  2299.       with Add, Wksta do begin
  2300.         Caption:='Platform Version';
  2301.         SubItems.Add(Format('%d.%d',[MajorVersion,MinorVersion]));
  2302.         ImageIndex:=AImageIndex;
  2303.       end;
  2304.       EndUpdate;
  2305.     end;
  2306.   finally
  2307.     Screen.Cursor:=crDefault;
  2308.     SetDetail(Notebook,dtList);
  2309.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2310.   end;
  2311. end;
  2312.  
  2313. procedure TfrmMain.RefreshServerTrans(AListView: TListViewClass;
  2314.   AImageIndex: integer);
  2315. var
  2316.   i,n: integer;
  2317. begin
  2318.   try
  2319.     Screen.Cursor:=crHourGlass;
  2320.     SetDetail(Notebook,dtDefault);
  2321.     sb.Panels[0].Text:='';
  2322.     Update;
  2323.     SetHeader(AListView,htSrvTrans);
  2324.     if not Assigned(Server) then
  2325.       Server:=TNTServer.Create;
  2326.     with AListView, Items, Server do begin
  2327.       Machine:=Computer;
  2328.       RefreshTrans;
  2329.       n:=TransportCount;
  2330.       BeginUpdate;
  2331.       for i:=0 to n-1 do
  2332.         with Add, Transports[i]^ do begin
  2333.           Caption:=Name;
  2334.           SubItems.Add(Domain);
  2335.           SubItems.Add(NetAddress+' ('+IntToStr(Address)+')');
  2336.           SubItems.Add(IntToStr(VCSCount));
  2337.           ImageIndex:=AImageIndex;
  2338.         end;
  2339.       EndUpdate;
  2340.     end;
  2341.   finally
  2342.     Screen.Cursor:=crDefault;
  2343.     SetDetail(Notebook,dtList);
  2344.     sb.Panels[0].Text:=Format('%d items',[AListView.Items.Count]);
  2345.   end;
  2346. end;
  2347.  
  2348. procedure TfrmMain.RefreshDevices(ATreeView: TTreeView);
  2349. var
  2350.   i,c: integer;
  2351.   r,n: TTreeNode;
  2352.   cn,dn: string;
  2353.   pi: PInteger;
  2354.   ldc: TDeviceClass;
  2355. begin
  2356.   try
  2357.     Screen.Cursor:=crHourGlass;
  2358.     TreeTitle.Caption:='  Device Manager';
  2359.     Splitter2.Hide;
  2360.     InstPanel.Hide;
  2361.     ValPanel.Hide;
  2362.     Splitter3.Hide;
  2363.     SetDetail(Notebook,dtDefault);
  2364.     sb.Panels[0].Text:='';
  2365.     Update;
  2366.     with SystemInfo,Devices, ATreeView,Items do begin
  2367.       GetInfo;
  2368.       Images:=imgDevices;
  2369.       c:=DeviceCount-1;
  2370.       BeginUpdate;
  2371.       Clear;
  2372.       r:=Add(nil,GetMachine);
  2373.       r.ImageIndex:=0;
  2374.       r.SelectedIndex:=r.ImageIndex;
  2375.       n:=nil;
  2376.       for i:=0 to c do begin
  2377.         if Trim(Devices[i].ClassDesc)<>'' then
  2378.           cn:=Devices[i].ClassDesc
  2379.         else
  2380.           cn:=Devices[i].ClassName;
  2381.         if not Assigned(n) or (Devices[i].DeviceClass<>ldc) then begin
  2382.           ldc:=Devices[i].DeviceClass;
  2383.           n:=AddChild(r,cn);
  2384.           n.ImageIndex:=integer(Devices[i].DeviceClass)+1;
  2385.           n.SelectedIndex:=n.ImageIndex;
  2386.         end;
  2387.         if Trim(Devices[i].FriendlyName)='' then
  2388.           dn:=Devices[i].Description
  2389.         else
  2390.           dn:=Devices[i].FriendlyName;
  2391.         with AddChild(n,dn) do begin
  2392.           ImageIndex:=n.ImageIndex;
  2393.           SelectedIndex:=ImageIndex;
  2394.           new(pi);
  2395.           pi^:=i;
  2396.           Data:=pi;
  2397.         end;
  2398.         n.AlphaSort;
  2399.       end;
  2400.       r.AlphaSort;
  2401.       r.Expand(False);
  2402.       EndUpdate;
  2403.     end;
  2404.   finally
  2405.     SetDetail(Notebook,dtTree);
  2406.     Screen.Cursor:=crDefault;
  2407.     sb.Panels[0].Text:=Format('%d items',[ATreeView.Items.Count]);
  2408.   end;
  2409. end;
  2410.  
  2411. procedure TfrmMain.cmAction(Sender: TObject);
  2412. begin
  2413.   mmProps.Enabled:=Assigned(lv.Selected);
  2414.   if IsNT then
  2415.     mmProps.Visible:=Assigned(lv.Selected) and not(lv.Selected.ImageIndex in [iiDrivers,iiEnvVar,iiSessions,iiOpenFiles,iiTask,iiWkstaTrans,iiWkstaUsers,iiWkstaInfo])
  2416.   else
  2417.     mmProps.Visible:=Assigned(lv.Selected) and not(lv.Selected.ImageIndex in [iiDrivers,iiEnvVar,iiSessions,iiOpenFiles,iiShares,iiTask,iiWkstaTrans,iiWkstaUsers,iiWkstaInfo]);
  2418.   mmRefs.Visible:=Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiModules]);
  2419.   mmCloseItem.Enabled:=Assigned(lv.Selected);
  2420.   mmCloseItem.Visible:=IsNT and Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiSessions,iiOpenFiles]);
  2421.   mmDelete.Enabled:=Assigned(lv.Selected);
  2422.   mmDelete.Visible:=IsNT and Assigned(lv.Selected) and (lv.Selected.ImageIndex in [iiTask]);
  2423.   mmSave.Enabled:=Assigned(lv.Selected);
  2424.   mmSave.Visible:=Assigned(lv.Selected) and (lv.ViewStyle<>vsIcon);
  2425. end;
  2426.  
  2427. procedure TfrmMain.lvChange(Sender: TObject; Item: TListItem;
  2428.   Change: TItemChange);
  2429. begin
  2430.   cmAction(nil);
  2431. end;
  2432.  
  2433. procedure TfrmMain.mmSIClick(Sender: TObject);
  2434. begin
  2435.   SystemInfo.ShowModalOverviewWithAbout;
  2436. end;
  2437.  
  2438. end.
  2439.