home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / BTF521-3.ZIP / NETWARE.LZH / NETBIND.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-05-03  |  28.5 KB  |  1,056 lines

  1. {
  2.   Turbo Pascal Unit of Bindery APIs for NetWare
  3.  
  4.   by Richard S. Sadowsky
  5.  
  6.   Please address questions and comments about this unit to ALL in section 6 of
  7.   the PCVENB forum on Compuserve.
  8. }
  9. {$A-,V-,F-}
  10.  
  11. Unit NetBind;
  12.  
  13. interface
  14.  
  15. Uses
  16.   Dos,
  17.   NetWare;
  18.  
  19. const
  20.   {binery object types}
  21.   bindUnknown          = $0000;
  22.   bindUser             = $0001;
  23.   bindGroup            = $0002;
  24.   bindPrintQueue       = $0003;
  25.   bindFileServer       = $0004;
  26.   bindJobServer        = $0005;
  27.   bindGateway          = $0006;
  28.   bindPrintServer      = $0007;
  29.   bindArchiveQueue     = $0008;
  30.   bindArchiveServer    = $0009;
  31.   bindJobQueue         = $000A;
  32.   bindAdministration   = $000B;
  33.   bindRemoteBridge     = $0026;
  34.   bindAdvertisingPrint = $0047;
  35.   bindWild             = $FFFF;
  36.  
  37.   {Object Security Flags}
  38.   bindAnyOne           = $00;
  39.   bindLogged           = $01;
  40.   bindObject           = $02;
  41.   bindSupervisor       = $03;
  42.   bindNetWare          = $04;
  43.  
  44.   {bindery Property Flags}
  45.   bindStatic           = $00;
  46.   bindDynamic          = $01;
  47.   bindItem             = $00;
  48.   bindSet              = $02;
  49.  
  50.   bindFirstProperty    = -1;
  51.  
  52.   bindSuccess          = $00;
  53.   bindServerOutOfMem   = $96;
  54.   bindMemberAlready    = $E9;
  55.   bindNotGroupProperty = $EB;
  56.   bindNoWildcard       = $F0;
  57.   bindNoPropWritePriv  = $F8;
  58.   bindNoSuchProperty   = $FB;
  59.   bindNoSuchObject     = $FC;
  60.   bindBinderyLocked    = $FE;
  61.   bindBinderyFailure   = $FF;
  62.  
  63. type
  64.   ObjNameStr           = String[47];        {string type for object names}
  65.   ObjNameField         = Array[0..47] of Char;
  66.   PropertyField        = Array[0..15] of Char;
  67.   PropertyStr          = String[15];        {string type for properties}
  68.   PasswordStr          = String[127];       {string type for passwords}
  69.   PropertyValueType    = record
  70.                            case Boolean of
  71.                              True  : (pvItem : Array[1..128] of Char);
  72.                              False : (pvSet  : Array[1..32] of LongInt);
  73.                          end;
  74. const
  75.   LogInControlSt       = 'LOGIN_CONTROL';
  76.   AccountServersSt     = 'ACCOUT_SERVERS';
  77.   AccountBalanceSt     = 'ACCOUNT_BALANCE';
  78.   PasswordSt           = 'PASSWORD';
  79.   SecurityEqualsSt     = 'SECURITY_EQUALS';
  80.   GroupMembersSt       = 'GROUP_MEMBERS';
  81.   GroupsImInSt         = 'GROUPS_I''M_IN';
  82.   NetAddressSt         = 'NET_ADDRESS';
  83.   IdentificationSt     = 'IDENTIFICATION';
  84.   OperatorsSt          = 'OPERATORS';
  85.  
  86.   {bindery function and subfunction numbers}
  87.   BinderyFunc          = $E3;
  88.   SubFAddObjToSet      = $41;
  89.   SubFChangeObjPass    = $40;
  90.   SubFChangeObjSec     = $38;
  91.   SubFChangePropSec    = $3B;
  92.   SubFCloseBindery     = $44;
  93.   SubFCreateObj        = $32;
  94.   SubFCreateProp       = $39;
  95.   SubFDeleteObj        = $33;
  96.   SubFDeleteObjFromSet = $42;
  97.   SubFDeleteProp       = $3A;
  98.   SubFGetAccessLevel   = $46;
  99.   SubFGetObjID         = $35;
  100.   SubFGetObjName       = $36;
  101.   SubFIsObjInSet       = $43;
  102.   SubFOpenBindery      = $45;
  103.   SubFReadPropVal      = $3D;
  104.   SubFRenameObj        = $34;
  105.   SubFScanObj          = $37;
  106.   SubFScanProp         = $3C;
  107.   SubFVerifyPass       = $3F;
  108.  
  109. function AddObjectToSet(ObjType : Word; ObjName : ObjNameStr;
  110.                         PropertyName : PropertyStr;
  111.                         MemberObjType : Word;
  112.                         MemberObjName : ObjNameStr) : Byte;
  113. function ChangePassword(ObjType : Word; ObjName : ObjNameStr;
  114.                         OldPassword, NewPassword : PasswordStr) : Byte;
  115. function ChangeObjectSecurity(ObjType : Word; ObjName : ObjNameStr;
  116.                               NewSecurity : Byte) : Byte;
  117. function ChangePropertySecurity(ObjType : Word; ObjName : ObjNameStr;
  118.                                 PropertyName : PropertyStr;
  119.                                 NewPropertySecurity : Byte) : Byte;
  120. function CloseBindery : Boolean;
  121. function CreateObject(ObjType : Word; ObjName : ObjNameStr;
  122.                       DynamicObj : Boolean;
  123.                       ObjSecurity : Byte) : Byte;
  124. function CreateProperty(ObjType : Word; ObjName : ObjNameStr;
  125.                         PropertyName : PropertyStr;
  126.                         DynamicProp, SetProp : Boolean;
  127.                         PropertySecurity : Byte) : Byte;
  128. function DeleteObject(ObjType : Word; ObjName : ObjNameStr) : Byte;
  129. function DeleteObjectFromSet(ObjType : Word; ObjName : ObjNameStr;
  130.                              PropertyName : PropertyStr;
  131.                              MemberObjType : Word;
  132.                              MemberName : ObjNameStr) : Byte;
  133. function DeleteProperty(ObjType : Word; ObjName : ObjNameStr;
  134.                         PropertyName : PropertyStr) : Byte;
  135. function GetBinderyAccessLevel(var AccessLevel : Byte;
  136.                                var ObjectID : LongInt) : Byte;
  137. function GetObjectID(var ObjType : Word; var ObjName : ObjNameStr;
  138.                      var ObjID : LongInt) : Byte;
  139. function GetObjectName(ObjectID : LongInt;
  140.                        var ObjType : Word;
  141.                        var ObjName : ObjNameStr) : Byte;
  142. function IsObjectInSet(ObjType : Word; ObjName : ObjNameStr;
  143.                        PropertyName  : PropertyStr;
  144.                        MemberObjType : Word;
  145.                        MemberName    : ObjNameStr) : Byte;
  146.   {-Returns 0 as function result if member is in set}
  147. function OpenBindery : Boolean;
  148. function ReadPropertyValue(ObjType : Word; ObjName : ObjNameStr;
  149.                            SegmentNumber : Byte;
  150.                            PropertyName  : PropertyStr;
  151.                            var PropertyValue : PropertyValueType;
  152.                            var PropertyFlags : Byte;
  153.                            var MoreSegments  : Boolean) : Byte;
  154. function RenameObject(ObjType : Word;
  155.                       OldObjName, NewObjName : ObjNameStr) : Byte;
  156. function ScanObject(var ObjType       : Word;
  157.                     var ObjName       : ObjNameStr;
  158.                     var ObjID         : LongInt;
  159.                     var ObjFlag       : Byte;
  160.                     var ObjSecurity   : Byte;
  161.                     var HasProperties : Boolean) : Byte;
  162. function ScanProperty(ObjType : Word; ObjName : ObjNameStr;
  163.                       var Sequence : LongInt;
  164.                       var PropertyName : PropertyStr;
  165.                       var PropertyFlags, PropertySecurity : Byte;
  166.                       var HasValue, MoreProperties : Boolean) : Byte;
  167. function VerifyPassword(ObjType : Word; ObjName : ObjNameStr;
  168.                         Password : PasswordStr) : Byte;
  169.  
  170. function NetWareSwapLong(L : LongInt) : LongInt;
  171. Inline(
  172.   $5A/                   {  pop    dx}
  173.   $86/$D6/               {  xchg   dh,dl}
  174.   $58/                   {  pop    ax}
  175.   $86/$C4);              {  xchg   ah,al}
  176.  
  177. implementation
  178.  
  179. function AddObjectToSet(ObjType : Word; ObjName : ObjNameStr;
  180.                         PropertyName : PropertyStr;
  181.                         MemberObjType : Word;
  182.                         MemberObjName : ObjNameStr) : Byte;
  183.  
  184. var
  185.   RequestBuffer : record
  186.                     Len     : Word;
  187.                     SubF    : Byte;
  188.                     ObjT    : Word;
  189.                     Buf     : Array[1..118] of Byte;
  190.                   end;
  191.   Reply         : Word;
  192.   NovRegs       : Registers;
  193.   Incr          : Word;
  194.   Index         : Byte;
  195. begin
  196.   with RequestBuffer do begin
  197.     SubF   := SubFAddObjToSet;
  198.     ObjT   := Swap(ObjType);
  199.     Index  := 1;
  200.     Incr   := Succ(Length(ObjName));
  201.     Move(ObjName,Buf[Index],Incr);
  202.     Inc(Index,Incr);
  203.  
  204.     Incr   := Succ(Length(PropertyName));
  205.     Move(PropertyName,Buf[Index],Incr);
  206.     Inc(Index,Incr);
  207.     MemberObjType := Swap(MemberObjType);
  208.     Move(MemberObjType,Buf[Index],SizeOf(Word));
  209.     Inc(Index,SizeOf(Word));
  210.     Incr   := Succ(Length(MemberObjName));
  211.     Move(MemberObjName,Buf[Index],Incr);
  212.     Inc(Index,Incr);
  213.     Len := Index + 2; {3?}
  214.   end;
  215.   Reply := 0;
  216.   with NovRegs do begin
  217.     AH := BinderyFunc;
  218.     DS := Seg(RequestBuffer);
  219.     SI := Ofs(RequestBuffer);
  220.     ES := Seg(Reply);
  221.     DI := Ofs(Reply);
  222.     MsDos(NovRegs);
  223.     AddObjectToSet := AL;
  224.   end;
  225. end;
  226.  
  227. function ChangePassword(ObjType : Word; ObjName : ObjNameStr;
  228.                         OldPassword, NewPassword : PasswordStr) : Byte;
  229.  
  230. const
  231.   BufSize = (SizeOf(PasswordStr) * 2) + SizeOf(ObjNameStr);
  232. var
  233.   Request : record
  234.               Len     : Word;
  235.               SubF    : Byte;
  236.               ObjT    : Word;
  237.               Buf     : Array[1..BufSize] of Byte;
  238.             end;
  239.   Reply   : Word;
  240.   NovRegs : Registers;
  241.   Incr    : Word;
  242.   Index   : Word;
  243.  
  244. begin
  245.   with Request do begin
  246.     SubF   := SubFChangeObjPass;
  247.     ObjT   := Swap(ObjType);
  248.     Index  := 1;
  249.     Incr   := Succ(Length(ObjName));
  250.     Move(ObjName,Buf[Index],Incr);
  251.     Inc(Index,Incr);
  252.  
  253.     Incr   := Succ(Length(OldPassword));
  254.     Move(OldPassword,Buf[Index],Incr);
  255.     Inc(Index,Incr);
  256.     Incr   := Succ(Length(NewPassword));
  257.     Move(NewPassword,Buf[Index],Incr);
  258.     Inc(Index,Incr);
  259.     Len := Index + 2; {3?}
  260.   end;
  261.   Reply := 0;
  262.   with NovRegs do begin
  263.     AH := BinderyFunc;
  264.     DS := Seg(Request);
  265.     SI := Ofs(Request);
  266.     ES := Seg(Reply);
  267.     DI := Ofs(Reply);
  268.     MsDos(NovRegs);
  269.     ChangePassword := AL;
  270.   end;
  271. end;
  272.  
  273. function ChangeObjectSecurity(ObjType : Word; ObjName : ObjNameStr;
  274.                               NewSecurity : Byte) : Byte;
  275.  
  276. var
  277.   Request : record
  278.               Len     : Word;
  279.               SubF    : Byte;
  280.               NewSec  : Byte;
  281.               ObjT    : Word;
  282.               ObjN    : ObjNameStr;
  283.             end;
  284.   Reply   : Word;
  285.   NovRegs : Registers;
  286.  
  287. begin
  288.   with Request do begin
  289.     Len     := Length(ObjName) + 4;
  290.     SubF    := SubFChangeObjSec;
  291.     NewSec  := NewSecurity;
  292.     ObjT    := Swap(ObjType);
  293.     ObjN    := ObjName;
  294.   end;
  295.   Reply := 0;
  296.   with NovRegs do begin
  297.     AH := BinderyFunc;
  298.     DS := Seg(Request);
  299.     SI := Ofs(Request);
  300.     ES := Seg(Reply);
  301.     DI := Ofs(Reply);
  302.     MsDos(NovRegs);
  303.     ChangeObjectSecurity := AL;
  304.   end;
  305. end;
  306.  
  307. function ChangePropertySecurity(ObjType : Word; ObjName : ObjNameStr;
  308.                                 PropertyName : PropertyStr;
  309.                                 NewPropertySecurity : Byte) : Byte;
  310.  
  311.  
  312. const
  313.   BufSize = SizeOf(ObjNameStr) + SizeOf(PropertyStr) + SizeOf(Byte);
  314. var
  315.   Request : record
  316.               Len     : Word;
  317.               SubF    : Byte;
  318.               ObjT    : Word;
  319.               Buf     : Array[1..BufSize] of Byte;
  320.             end;
  321.   Reply   : Word;
  322.   NovRegs : Registers;
  323.   Incr    : Word;
  324.   Index   : Word;
  325.  
  326. begin
  327.   with Request do begin
  328.     SubF   := SubFChangePropSec;
  329.     ObjT   := Swap(ObjType);
  330.     Index  := 1;
  331.     Incr   := Succ(Length(ObjName));
  332.     Move(ObjName,Buf[Index],Incr);
  333.     Inc(Index,Incr);
  334.     Buf[Index] := NewPropertySecurity;
  335.     Inc(Index);
  336.  
  337.     Incr   := Succ(Length(PropertyName));
  338.     Move(PropertyName,Buf[Index],Incr);
  339.     Inc(Index,Incr);
  340.     Len := Index + 2; {3?}
  341.   end;
  342.   Reply := 0;
  343.   with NovRegs do begin
  344.     AH := BinderyFunc;
  345.     DS := Seg(Request);
  346.     SI := Ofs(Request);
  347.     ES := Seg(Reply);
  348.     DI := Ofs(Reply);
  349.     MsDos(NovRegs);
  350.     ChangePropertySecurity := AL;
  351.   end;
  352. end;
  353.  
  354. function CloseBindery : Boolean;
  355.  
  356. var
  357.   Request : record
  358.               Len  : Word;
  359.               SubF : Byte;
  360.             end;
  361.   Reply   : Word;
  362.   NovRegs : Registers;
  363.  
  364. begin
  365.   with Request do begin
  366.     Len  := 1;
  367.     SubF := SubFCloseBindery;
  368.   end;
  369.   Reply := 0;
  370.   with NovRegs do begin
  371.     AH := BinderyFunc;
  372.     DS := Seg(Request);
  373.     SI := Ofs(Request);
  374.     ES := Seg(Reply);
  375.     DI := Ofs(Reply);
  376.     MsDos(NovRegs);
  377.     CloseBindery := AL = 0;
  378.   end;
  379. end;
  380.  
  381. function CreateObject(ObjType : Word; ObjName : ObjNameStr;
  382.                       DynamicObj : Boolean;
  383.                       ObjSecurity : Byte) : Byte;
  384. var
  385.   Request : record
  386.               Len    : Word;
  387.               SubF   : Byte;
  388.               ObjF   : Boolean;
  389.               ObjSec : Byte;
  390.               ObjT   : Word;
  391.               ObjN   : ObjNameStr;
  392.             end;
  393.   Reply   : Word;
  394.   NovRegs : Registers;
  395.  
  396. begin
  397.   with Request do begin
  398.     Len     := Length(ObjName) + 6;
  399.     SubF    := SubFCreateObj;
  400.     ObjF    := DynamicObj;
  401.     ObjSec  := ObjSecurity;
  402.     ObjT    := Swap(ObjType);
  403.     ObjN    := ObjName;
  404.   end;
  405.   Reply := 0;
  406.   with NovRegs do begin
  407.     AH := BinderyFunc;
  408.     DS := Seg(Request);
  409.     SI := Ofs(Request);
  410.     ES := Seg(Reply);
  411.     DI := Ofs(Reply);
  412.     MsDos(NovRegs);
  413.     CreateObject := AL;
  414.   end;
  415. end;
  416.  
  417. function CreateProperty(ObjType : Word; ObjName : ObjNameStr;
  418.                         PropertyName : PropertyStr;
  419.                         DynamicProp, SetProp : Boolean;
  420.                         PropertySecurity : Byte) : Byte;
  421. const
  422.   BufSize = SizeOf(ObjNameStr) + (SizeOf(Byte) * 2) + SizeOf(PropertyStr);
  423. var
  424.   Request : record
  425.               Len    : Word;
  426.               SubF   : Byte;
  427.               ObjT   : Word;
  428.               Buf    : Array[1..BufSize] of Byte;
  429.             end;
  430.   Reply   : Word;
  431.   NovRegs : Registers;
  432.   Incr    : Word;
  433.   Index   : Word;
  434. begin
  435.   with Request do begin
  436.     SubF   := SubFCreateProp;
  437.     ObjT   := Swap(ObjType);
  438.     Index  := 1;
  439.     Incr   := Succ(Length(ObjName));
  440.     Move(ObjName,Buf[Index],Incr);
  441.     Inc(Index,Incr);
  442.     Buf[Index] := (Ord(SetProp) shl 1) + Ord(DynamicProp);
  443.     Inc(Index);
  444.     Buf[Index] := PropertySecurity;
  445.     Inc(Index);
  446.     Incr   := Succ(Length(PropertyName));
  447.     Move(PropertyName,Buf[Index],Incr);
  448.     Inc(Index,Incr);
  449.     Len := Index + 2; {3?}
  450.   end;
  451.   Reply := 0;
  452.   with NovRegs do begin
  453.     AH := BinderyFunc;
  454.     DS := Seg(Request);
  455.     SI := Ofs(Request);
  456.     ES := Seg(Reply);
  457.     DI := Ofs(Reply);
  458.     MsDos(NovRegs);
  459.     CreateProperty := AL;
  460.   end;
  461. end;
  462.  
  463. function DeleteObject(ObjType : Word; ObjName : ObjNameStr) : Byte;
  464. var
  465.   Request : record
  466.               Len    : Word;
  467.               SubF   : Byte;
  468.               ObjT   : Word;
  469.               ObjN   : ObjNameStr;
  470.             end;
  471.   Reply   : Word;
  472.   NovRegs : Registers;
  473.  
  474. begin
  475.   with Request do begin
  476.     Len     := Length(ObjName) + 4;
  477.     SubF    := SubFDeleteObj;
  478.     ObjT    := Swap(ObjType);
  479.     ObjN    := ObjName;
  480.   end;
  481.   Reply := 0;
  482.   with NovRegs do begin
  483.     AH := BinderyFunc;
  484.     DS := Seg(Request);
  485.     SI := Ofs(Request);
  486.     ES := Seg(Reply);
  487.     DI := Ofs(Reply);
  488.     MsDos(NovRegs);
  489.     DeleteObject := AL;
  490.   end;
  491. end;
  492.  
  493. function DeleteObjectFromSet(ObjType : Word; ObjName : ObjNameStr;
  494.                              PropertyName : PropertyStr;
  495.                              MemberObjType : Word;
  496.                              MemberName : ObjNameStr) : Byte;
  497.  
  498. const
  499.   BufSize = (SizeOf(ObjNameStr) * 2) + SizeOf(Word) + SizeOf(PropertyStr);
  500. var
  501.   Request : record
  502.               Len    : Word;
  503.               SubF   : Byte;
  504.               ObjT   : Word;
  505.               Buf    : Array[1..BufSize] of Byte;
  506.             end;
  507.   Reply   : Word;
  508.   NovRegs : Registers;
  509.   Incr    : Word;
  510.   Index   : Word;
  511. begin
  512.   with Request do begin
  513.     SubF   := SubFDeleteObjFromSet;
  514.     ObjT   := Swap(ObjType);
  515.     Index  := 1;
  516.     Incr   := Succ(Length(ObjName));
  517.     Move(ObjName,Buf[Index],Incr);
  518.     Inc(Index,Incr);
  519.     Incr   := Succ(Length(PropertyName));
  520.     Move(PropertyName,Buf[Index],Incr);
  521.     Inc(Index,Incr);
  522.     MemberObjType := Swap(MemberObjType);
  523.     Move(MemberObjType,Buf[Index],SizeOf(Word));
  524.     Inc(Index,SizeOf(Word));
  525.     Incr   := Succ(Length(MemberName));
  526.     Move(MemberName,Buf[Index],Incr);
  527.     Inc(Index,Incr);
  528.  
  529.     Len := Index + 2; {3?}
  530.   end;
  531.   Reply := 0;
  532.   with NovRegs do begin
  533.     AH := BinderyFunc;
  534.     DS := Seg(Request);
  535.     SI := Ofs(Request);
  536.     ES := Seg(Reply);
  537.     DI := Ofs(Reply);
  538.     MsDos(NovRegs);
  539.     DeleteObjectFromSet := AL;
  540.   end;
  541. end;
  542.  
  543. function DeleteProperty(ObjType : Word; ObjName : ObjNameStr;
  544.                         PropertyName : PropertyStr) : Byte;
  545.  
  546. const
  547.   BufSize = SizeOf(ObjNameStr) + SizeOf(PropertyStr);
  548.  
  549. var
  550.   Request : record
  551.               Len    : Word;
  552.               SubF   : Byte;
  553.               ObjT   : Word;
  554.               Buf    : Array[1..BufSize] of Byte;
  555.             end;
  556.   Reply   : Word;
  557.   NovRegs : Registers;
  558.   Incr    : Word;
  559.   Index   : Word;
  560.  
  561. begin
  562.   with Request do begin
  563.     SubF   := SubFDeleteProp;
  564.     ObjT   := Swap(ObjType);
  565.     Index  := 1;
  566.     Incr   := Succ(Length(ObjName));
  567.     Move(ObjName,Buf[Index],Incr);
  568.     Inc(Index,Incr);
  569.     Incr   := Succ(Length(PropertyName));
  570.     Move(PropertyName,Buf[Index],Incr);
  571.     Inc(Index,Incr);
  572.  
  573.     Len := Index + 2; {3?}
  574.   end;
  575.   Reply := 0;
  576.   with NovRegs do begin
  577.     AH := BinderyFunc;
  578.     DS := Seg(Request);
  579.     SI := Ofs(Request);
  580.     ES := Seg(Reply);
  581.     DI := Ofs(Reply);
  582.     MsDos(NovRegs);
  583.     DeleteProperty := AL;
  584.   end;
  585. end;
  586.  
  587. function GetBinderyAccessLevel(var AccessLevel : Byte;
  588.                                var ObjectID : LongInt) : Byte;
  589.  
  590. var
  591.   Request   : record
  592.                 Len    : Word;
  593.                 SubF   : Byte;
  594.               end;
  595.   Reply     : record
  596.                 Len    : Word;
  597.                 Level  : Byte;
  598.                 ID     : LongInt;
  599.               end;
  600.   NovRegs   : Registers;
  601.  
  602. begin
  603.   with Request do begin
  604.     Len    := 1;
  605.     SubF   := SubFGetAccessLevel;
  606.   end;
  607.   Reply.Len := SizeOf(Reply) - 2;
  608.   with NovRegs do begin
  609.     AH := BinderyFunc;
  610.     DS := Seg(Request);
  611.     SI := Ofs(Request);
  612.     ES := Seg(Reply);
  613.     DI := Ofs(Reply);
  614.     MsDos(NovRegs);
  615.     GetBinderyAccessLevel := AL;
  616.   end;
  617.   with Reply do begin
  618.     AccessLevel := Level;
  619.     ObjectID    := NetWareSwapLong(ID);
  620.   end;
  621. end;
  622.  
  623. function GetObjectID(var ObjType : Word; var ObjName : ObjNameStr;
  624.                      var ObjID : LongInt) : Byte;
  625. var
  626.   Request   : record
  627.                 Len    : Word;
  628.                 SubF   : Byte;
  629.                 ObjT   : Word;
  630.                 ObjN   : ObjNameStr;
  631.               end;
  632.   Reply     : record
  633.                 Len    : Word;
  634.                 ID     : LongInt;
  635.                 ObjT   : Word;
  636.                 ObjN   : ObjNameStr;
  637.               end;
  638.   NovRegs   : Registers;
  639.  
  640. begin
  641.   with Request do begin
  642.     Len    := Length(ObjName) + 4;
  643.     SubF   := SubFGetObjID;
  644.     ObjT   := Swap(ObjType);
  645.     ObjN   := ObjName;
  646.   end;
  647.   Reply.Len := SizeOf(Reply) - 2;
  648.   with NovRegs do begin
  649.     AH := BinderyFunc;
  650.     DS := Seg(Request);
  651.     SI := Ofs(Request);
  652.     ES := Seg(Reply);
  653.     DI := Ofs(Reply);
  654.     MsDos(NovRegs);
  655.     GetObjectID := AL;
  656.   end;
  657.   with Reply do begin
  658.     ObjID   := NetWareSwapLong(ID);
  659.     ObjType := Swap(ObjT);
  660.     ObjName := ObjN;
  661.   end;
  662. end;
  663.  
  664. function GetObjectName(ObjectID : LongInt;
  665.                        var ObjType : Word;
  666.                        var ObjName : ObjNameStr) : Byte;
  667.  
  668. var
  669.   Request   : record
  670.                 Len    : Word;
  671.                 SubF   : Byte;
  672.                 ID     : LongInt;
  673.               end;
  674.   Reply     : record
  675.                 Len    : Word;
  676.                 ID     : LongInt;
  677.                 ObjT   : Word;
  678.                 ObjN   : ObjNameStr;
  679.               end;
  680.   NovRegs   : Registers;
  681.  
  682. begin
  683.   with Request do begin
  684.     Len    := SizeOf(Request) - 2;
  685.     SubF   := SubFGetObjName;
  686.     ID     := NetWareSwapLong(ObjectID);
  687.   end;
  688.   Reply.Len := SizeOf(Reply) - 2;
  689.   with NovRegs do begin
  690.     AH := BinderyFunc;
  691.     DS := Seg(Request);
  692.     SI := Ofs(Request);
  693.     ES := Seg(Reply);
  694.     DI := Ofs(Reply);
  695.     MsDos(NovRegs);
  696.     GetObjectName := AL;
  697.   end;
  698.   with Reply do begin
  699.     ObjType := Swap(ObjT);
  700.     ObjName := ObjN;
  701.   end;
  702. end;
  703.  
  704. function IsObjectInSet(ObjType : Word; ObjName : ObjNameStr;
  705.                        PropertyName  : PropertyStr;
  706.                        MemberObjType : Word;
  707.                        MemberName    : ObjNameStr) : Byte;
  708.   {-Returns 0 as function result if member is in set}
  709. const
  710.   BufSize = (SizeOf(ObjNameStr) * 2) + SizeOf(Word) + SizeOf(PropertyStr);
  711.  
  712. var
  713.   Request : record
  714.               Len    : Word;
  715.               SubF   : Byte;
  716.               ObjT   : Word;
  717.               Buf    : Array[1..BufSize] of Byte;
  718.             end;
  719.   Reply   : Word;
  720.   NovRegs : Registers;
  721.   Incr    : Word;
  722.   Index   : Word;
  723.  
  724. begin
  725.   with Request do begin
  726.     SubF   := SubFIsObjInSet;
  727.     ObjT   := Swap(ObjType);
  728.     Index  := 1;
  729.     Incr   := Succ(Length(ObjName));
  730.     Move(ObjName,Buf[Index],Incr);
  731.     Inc(Index,Incr);
  732.     Incr   := Succ(Length(PropertyName));
  733.     Move(PropertyName,Buf[Index],Incr);
  734.     Inc(Index,Incr);
  735.     MemberObjType := Swap(MemberObjType);
  736.     Move(MemberObjType,Buf[Index],SizeOf(Word));
  737.     Inc(Index,SizeOf(Word));
  738.     Incr   := Succ(Length(MemberName));
  739.     Move(MemberName,Buf[Index],Incr);
  740.     Inc(Index,Incr);
  741.     Len := Index + 2; {3?}
  742.   end;
  743.   Reply := 0;
  744.   with NovRegs do begin
  745.     AH := BinderyFunc;
  746.     DS := Seg(Request);
  747.     SI := Ofs(Request);
  748.     ES := Seg(Reply);
  749.     DI := Ofs(Reply);
  750.     MsDos(NovRegs);
  751.     IsObjectInSet := AL;
  752.   end;
  753. end;
  754.  
  755. function OpenBindery : Boolean;
  756.  
  757. var
  758.   Request : record
  759.               Len  : Word;
  760.               SubF : Byte;
  761.             end;
  762.   Reply   : Word;
  763.   NovRegs : Registers;
  764.  
  765. begin
  766.   with Request do begin
  767.     Len  := 1;
  768.     SubF := SubFOpenBindery;
  769.   end;
  770.   Reply := 0;
  771.   with NovRegs do begin
  772.     AH := BinderyFunc;
  773.     DS := Seg(Request);
  774.     SI := Ofs(Request);
  775.     ES := Seg(Reply);
  776.     DI := Ofs(Reply);
  777.     MsDos(NovRegs);
  778.     OpenBindery := AL = 0;
  779.   end;
  780. end;
  781.  
  782. function ReadPropertyValue(ObjType : Word; ObjName : ObjNameStr;
  783.                            SegmentNumber : Byte;
  784.                            PropertyName  : PropertyStr;
  785.                            var PropertyValue : PropertyValueType;
  786.                            var PropertyFlags : Byte;
  787.                            var MoreSegments  : Boolean) : Byte;
  788.  
  789. const
  790.   BufSize = SizeOf(ObjNameStr) + SizeOf(Byte) + SizeOf(PropertyStr);
  791.  
  792. var
  793.   Request : record
  794.               Len    : Word;
  795.               SubF   : Byte;
  796.               ObjT   : Word;
  797.               Buf    : Array[1..BufSize] of Byte;
  798.             end;
  799.   Reply   : record
  800.               Len    : Word;
  801.               PVal   : PropertyValueType;
  802.               More   : Byte;
  803.               PFlags : Byte;
  804.             end;
  805.   NovRegs : Registers;
  806.   Incr    : Word;
  807.   Index   : Word;
  808.  
  809. begin
  810.   with Request do begin
  811.     SubF   := SubFReadPropVal;
  812.     ObjT   := Swap(ObjType);
  813.     Index  := 1;
  814.     Incr   := Succ(Length(ObjName));
  815.     Move(ObjName,Buf[Index],Incr);
  816.     Inc(Index,Incr);
  817.     Buf[Index] := SegmentNumber;
  818.     Inc(Index);
  819.     Incr   := Succ(Length(PropertyName));
  820.     Move(PropertyName,Buf[Index],Incr);
  821.     Inc(Index,Incr);
  822.     Len := Index + 2; {3?}
  823.   end;
  824.   Reply.Len := SizeOf(Reply) - 2;
  825.   with NovRegs do begin
  826.     AH := BinderyFunc;
  827.     DS := Seg(Request);
  828.     SI := Ofs(Request);
  829.     ES := Seg(Reply);
  830.     DI := Ofs(Reply);
  831.     MsDos(NovRegs);
  832.     ReadPropertyValue := AL;
  833.   end;
  834.   with Reply do begin
  835.     PropertyValue := PVal;
  836.     MoreSegments  := More <> 0;
  837.     PropertyFlags := PFlags;
  838.   end;
  839. end;
  840.  
  841. function RenameObject(ObjType : Word;
  842.                       OldObjName, NewObjName : ObjNameStr) : Byte;
  843.  
  844. const
  845.   BufSize = SizeOf(ObjNameStr) * 2;
  846.  
  847. var
  848.   Request : record
  849.               Len    : Word;
  850.               SubF   : Byte;
  851.               ObjT   : Word;
  852.               Buf    : Array[1..BufSize] of Byte;
  853.             end;
  854.   Reply   : Word;
  855.   NovRegs : Registers;
  856.   Incr    : Word;
  857.   Index   : Word;
  858.  
  859. begin
  860.   with Request do begin
  861.     SubF   := SubFRenameObj;
  862.     ObjT   := Swap(ObjType);
  863.     Index  := 1;
  864.     Incr   := Succ(Length(OldObjName));
  865.     Move(OldObjName,Buf[Index],Incr);
  866.     Inc(Index,Incr);
  867.     Incr   := Succ(Length(NewObjName));
  868.     Move(NewObjName,Buf[Index],Incr);
  869.     Inc(Index,Incr);
  870.     Len := Index + 2; {3?}
  871.   end;
  872.   Reply := 0;
  873.   with NovRegs do begin
  874.     AH := BinderyFunc;
  875.     DS := Seg(Request);
  876.     SI := Ofs(Request);
  877.     ES := Seg(Reply);
  878.     DI := Ofs(Reply);
  879.     MsDos(NovRegs);
  880.     RenameObject := AL;
  881.   end;
  882. end;
  883.  
  884. function ScanObject(var ObjType       : Word;
  885.                     var ObjName       : ObjNameStr;
  886.                     var ObjID         : LongInt;
  887.                     var ObjFlag       : Byte;
  888.                     var ObjSecurity   : Byte;
  889.                     var HasProperties : Boolean) : Byte;
  890. const
  891.   ReplyBSize = SizeOf(ObjNameStr) + (SizeOf(Byte) * 3);
  892.  
  893. var
  894.   Request : record
  895.               Len    : Word;
  896.               SubF   : Byte;
  897.               LastID : LongInt;
  898.               ObjT   : Word;
  899.               ObjN   : ObjNameStr;
  900.             end;
  901.   Reply   : record
  902.               Len    : Word;
  903.               ID     : LongInt;
  904.               ObjT   : Word;
  905.               ObjN   : ObjNameField;
  906.               ObjF   : Byte;
  907.               ObjSec : Byte;
  908.               HasProp: Byte;
  909.             end;
  910.   NovRegs : Registers;
  911.   Index   : Word;
  912.   L       : Word;
  913.  
  914. begin
  915.   with Request do begin
  916.     SubF   := SubFScanObj;
  917.     LastID := NetWareSwapLong(ObjID);
  918.     ObjT   := Swap(ObjType);
  919.     ObjN   := ObjName;
  920.     Len    := Length(ObjName) + 8;
  921.   end;
  922.   Reply.Len := SizeOf(Reply) - 2;
  923.   with NovRegs do begin
  924.     AH := BinderyFunc;
  925.     DS := Seg(Request);
  926.     SI := Ofs(Request);
  927.     ES := Seg(Reply);
  928.     DI := Ofs(Reply);
  929.     MsDos(NovRegs);
  930.     ScanObject := AL;
  931.     if AL = 0 then
  932.       with Reply do begin
  933.         ObjID         := NetWareSwapLong(ID);
  934.         ObjType       := Swap(ObjT);
  935.         ObjName       := AsciiZ2Str(ObjN,SizeOf(ObjNameStr)-1);
  936.         ObjFlag       := ObjF;
  937.         ObjSecurity   := ObjSec;
  938.         HasProperties := HasProp <> 0;
  939.       end;
  940.   end;
  941. end;
  942.  
  943. function ScanProperty(ObjType : Word; ObjName : ObjNameStr;
  944.                       var Sequence : LongInt;
  945.                       var PropertyName : PropertyStr;
  946.                       var PropertyFlags, PropertySecurity : Byte;
  947.                       var HasValue, MoreProperties : Boolean) : Byte;
  948.  
  949. const
  950.   BufSize = SizeOf(ObjNameStr) + SizeOf(LongInt) + SizeOf(PropertyStr);
  951. var
  952.   Request : record
  953.               Len    : Word;
  954.               SubF   : Byte;
  955.               ObjT   : Word;
  956.               Buf    : Array[1..BufSize] of Byte;
  957.             end;
  958.   Reply   : record
  959.               Len      : Word;
  960.               PropN    : PropertyField;
  961.               PropF    : Byte;
  962.               PropSec  : Byte;
  963.               SeqNum   : LongInt;
  964.               HasVal   : Byte;
  965.               More     : Byte;
  966.             end;
  967.   NovRegs : Registers;
  968.   Index   : Word;
  969.   Incr    : Word;
  970.  
  971. begin
  972.   with Request do begin
  973.     SubF   := SubFScanProp;
  974.     ObjT   := Swap(ObjType);
  975.     Index  := 1;
  976.     Incr   := Succ(Length(ObjName));
  977.     Move(ObjName,Buf[Index],Incr);
  978.     Inc(Index,Incr);
  979.     Move(Sequence,Buf[Index],SizeOf(LongInt));
  980.     Inc(Index,SizeOf(LongInt));
  981.     Incr   := Succ(Length(PropertyName));
  982.     Move(PropertyName,Buf[Index],Incr);
  983.     Inc(Index,Incr);
  984.     Len := Index + 2; {3?}
  985.   end;
  986.   Reply.Len := SizeOf(Reply) - 2;
  987.   with NovRegs do begin
  988.     AH := BinderyFunc;
  989.     DS := Seg(Request);
  990.     SI := Ofs(Request);
  991.     ES := Seg(Reply);
  992.     DI := Ofs(Reply);
  993.     MsDos(NovRegs);
  994.     ScanProperty := AL;
  995.     if AL = 0 then
  996.       with Reply do begin
  997.         PropertyName     := AsciiZ2Str(PropN,SizeOf(PropertyStr) - 1);
  998.         PropertyFlags    := PropF;
  999.         PropertySecurity := PropSec;
  1000.         Sequence         := SeqNum;
  1001.         HasValue         := HasVal <> 0;
  1002.         MoreProperties   := More <> 0;
  1003.       end
  1004.     else begin
  1005.       HasValue         := False;
  1006.       MoreProperties   := False;
  1007.     end;
  1008.   end;
  1009. end;
  1010.  
  1011. function VerifyPassword(ObjType : Word; ObjName : ObjNameStr;
  1012.                         Password : PasswordStr) : Byte;
  1013.  
  1014. const
  1015.   BufSize = SizeOf(PasswordStr) + SizeOf(ObjNameStr);
  1016. var
  1017.   Request : record
  1018.               Len     : Word;
  1019.               SubF    : Byte;
  1020.               ObjT    : Word;
  1021.               Buf     : Array[1..BufSize] of Char;
  1022.             end;
  1023.   Reply   : Word;
  1024.   NovRegs : Registers;
  1025.   Incr    : Word;
  1026.   Index   : Word;
  1027.  
  1028. begin
  1029.   with Request do begin
  1030.     SubF   := SubFVerifyPass;
  1031.     ObjT   := Swap(ObjType);
  1032.     Index  := 1;
  1033.     Incr   := Succ(Length(ObjName));
  1034.     Move(ObjName,Buf[Index],Incr);
  1035.     Inc(Index,Incr);
  1036.  
  1037.     Incr   := Succ(Length(Password));
  1038.     Move(Password,Buf[Index],Incr);
  1039.     Inc(Index,Incr);
  1040.     Len := Index + 2;
  1041.   end;
  1042.   Reply := 0;
  1043.   with NovRegs do begin
  1044.     AH := BinderyFunc;
  1045.     DS := Seg(Request);
  1046.     SI := Ofs(Request);
  1047.     ES := Seg(Reply);
  1048.     DI := Ofs(Reply);
  1049.     MsDos(NovRegs);
  1050.     VerifyPassword := AL;
  1051.   end;
  1052.  
  1053. end;
  1054.  
  1055. end.
  1056.