{******************************************************************************}
{                                                                              }
{ Lan Manager Access API interface Unit for Object Pascal                      }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: lmaccess.h, released November 2001. The original Pascal}
{ code is: LmAccess.pas, released Februari 2002. The initial developer of the  }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}

// $Id: JwaLmAccess.pas,v 1.11 2005/09/07 09:54:53 marquardt Exp $

{$IFNDEF JWA_INCLUDEMODE}

unit JwaLmAccess;

{$WEAKPACKAGEUNIT}

{$I jediapilib.inc}

interface

uses
  JwaWindows, JwaLmCons;

{$ENDIF !JWA_INCLUDEMODE}

{$IFDEF JWA_INTERFACESECTION}

{$HPPEMIT ''}
{$HPPEMIT '#include "lmaccess.h"'}
{$HPPEMIT ''}

//
// Function Prototypes - User
//

function NetUserAdd(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserAdd}

function NetUserEnum(servername: LPCWSTR; level, filter: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries, resume_handle: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserEnum}

function NetUserGetInfo(servername, username: LPCWSTR; level: DWORD; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserGetInfo}

function NetUserSetInfo(servername, username: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserSetInfo}

function NetUserDel(servername: LPCWSTR; username: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserDel}

function NetUserGetGroups(servername, username: LPCWSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserGetGroups}

function NetUserSetGroups(servername, username: LPCWSTR; level: DWORD; buf: LPBYTE; num_entries: DWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserSetGroups}

function NetUserGetLocalGroups(servername, username: LPCWSTR; level, flags: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserGetLocalGroups}

function NetUserModalsGet(servername: LPCWSTR; level: DWORD; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserModalsGet}

function NetUserModalsSet(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserModalsSet}

function NetUserChangePassword(domainname, username, oldpassword, newpassword: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetUserChangePassword}

//
//  Data Structures - User
//

type
  LPUSER_INFO_0 = ^USER_INFO_0;
  {$EXTERNALSYM LPUSER_INFO_0}
  PUSER_INFO_0 = ^USER_INFO_0;
  {$EXTERNALSYM PUSER_INFO_0}
  _USER_INFO_0 = record
    usri0_name: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_0}
  USER_INFO_0 = _USER_INFO_0;
  {$EXTERNALSYM USER_INFO_0}
  TUserInfo0 = USER_INFO_0;
  PUserInfo0 = PUSER_INFO_0;

  LPUSER_INFO_1 = ^USER_INFO_1;
  {$EXTERNALSYM LPUSER_INFO_1}
  PUSER_INFO_1 = ^USER_INFO_1;
  {$EXTERNALSYM PUSER_INFO_1}
  _USER_INFO_1 = record
    usri1_name: LPWSTR;
    usri1_password: LPWSTR;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_home_dir: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_script_path: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1}
  USER_INFO_1 = _USER_INFO_1;
  {$EXTERNALSYM USER_INFO_1}
  TUserInfo1 = USER_INFO_1;
  PUserInfo1 = PUSER_INFO_1;

  LPUSER_INFO_2 = ^USER_INFO_2;
  {$EXTERNALSYM LPUSER_INFO_2}
  PUSER_INFO_2 = ^USER_INFO_2;
  {$EXTERNALSYM PUSER_INFO_2}
  _USER_INFO_2 = record
    usri2_name: LPWSTR;
    usri2_password: LPWSTR;
    usri2_password_age: DWORD;
    usri2_priv: DWORD;
    usri2_home_dir: LPWSTR;
    usri2_comment: LPWSTR;
    usri2_flags: DWORD;
    usri2_script_path: LPWSTR;
    usri2_auth_flags: DWORD;
    usri2_full_name: LPWSTR;
    usri2_usr_comment: LPWSTR;
    usri2_parms: LPWSTR;
    usri2_workstations: LPWSTR;
    usri2_last_logon: DWORD;
    usri2_last_logoff: DWORD;
    usri2_acct_expires: DWORD;
    usri2_max_storage: DWORD;
    usri2_units_per_week: DWORD;
    usri2_logon_hours: PBYTE;
    usri2_bad_pw_count: DWORD;
    usri2_num_logons: DWORD;
    usri2_logon_server: LPWSTR;
    usri2_country_code: DWORD;
    usri2_code_page: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_2}
  USER_INFO_2 = _USER_INFO_2;
  {$EXTERNALSYM USER_INFO_2}
  TUserInfo2 = USER_INFO_2;
  PUserInfo2 = PUSER_INFO_2;

  LPUSER_INFO_3 = ^USER_INFO_3;
  {$EXTERNALSYM LPUSER_INFO_3}
  PUSER_INFO_3 = ^USER_INFO_3;
  {$EXTERNALSYM PUSER_INFO_3}
  _USER_INFO_3 = record
    usri3_name: LPWSTR;
    usri3_password: LPWSTR;
    usri3_password_age: DWORD;
    usri3_priv: DWORD;
    usri3_home_dir: LPWSTR;
    usri3_comment: LPWSTR;
    usri3_flags: DWORD;
    usri3_script_path: LPWSTR;
    usri3_auth_flags: DWORD;
    usri3_full_name: LPWSTR;
    usri3_usr_comment: LPWSTR;
    usri3_parms: LPWSTR;
    usri3_workstations: LPWSTR;
    usri3_last_logon: DWORD;
    usri3_last_logoff: DWORD;
    usri3_acct_expires: DWORD;
    usri3_max_storage: DWORD;
    usri3_units_per_week: DWORD;
    usri3_logon_hours: PBYTE;
    usri3_bad_pw_count: DWORD;
    usri3_num_logons: DWORD;
    usri3_logon_server: LPWSTR;
    usri3_country_code: DWORD;
    usri3_code_page: DWORD;
    usri3_user_id: DWORD;
    usri3_primary_group_id: DWORD;
    usri3_profile: LPWSTR;
    usri3_home_dir_drive: LPWSTR;
    usri3_password_expired: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_3}
  USER_INFO_3 = _USER_INFO_3;
  {$EXTERNALSYM USER_INFO_3}
  TUserInfo3 = USER_INFO_3;
  PUserInfo3 = PUSER_INFO_3;

  LPUSER_INFO_4 = ^USER_INFO_4;
  {$EXTERNALSYM LPUSER_INFO_4}
  PUSER_INFO_4 = ^USER_INFO_4;
  {$EXTERNALSYM PUSER_INFO_4}
  _USER_INFO_4 = record
    usri4_name: LPWSTR;
    usri4_password: LPWSTR;
    usri4_password_age: DWORD;
    usri4_priv: DWORD;
    usri4_home_dir: LPWSTR;
    usri4_comment: LPWSTR;
    usri4_flags: DWORD;
    usri4_script_path: LPWSTR;
    usri4_auth_flags: DWORD;
    usri4_full_name: LPWSTR;
    usri4_usr_comment: LPWSTR;
    usri4_parms: LPWSTR;
    usri4_workstations: LPWSTR;
    usri4_last_logon: DWORD;
    usri4_last_logoff: DWORD;
    usri4_acct_expires: DWORD;
    usri4_max_storage: DWORD;
    usri4_units_per_week: DWORD;
    usri4_logon_hours: PBYTE;
    usri4_bad_pw_count: DWORD;
    usri4_num_logons: DWORD;
    usri4_logon_server: LPWSTR;
    usri4_country_code: DWORD;
    usri4_code_page: DWORD;
    usri4_user_sid: PSID;
    usri4_primary_group_id: DWORD;
    usri4_profile: LPWSTR;
    usri4_home_dir_drive: LPWSTR;
    usri4_password_expired: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_4}
  USER_INFO_4 = _USER_INFO_4;
  {$EXTERNALSYM USER_INFO_4}
  TUserInfo4 = USER_INFO_4;
  PUserInfo4 = PUSER_INFO_4;

  LPUSER_INFO_10 = ^USER_INFO_10;
  {$EXTERNALSYM LPUSER_INFO_10}
  PUSER_INFO_10 = ^USER_INFO_10;
  {$EXTERNALSYM PUSER_INFO_10}
  _USER_INFO_10 = record
    usri10_name: LPWSTR;
    usri10_comment: LPWSTR;
    usri10_usr_comment: LPWSTR;
    usri10_full_name: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_10}
  USER_INFO_10 = _USER_INFO_10;
  {$EXTERNALSYM USER_INFO_10}
  TUserInfo10 = USER_INFO_10;
  PUserInfo10 = PUSER_INFO_10;

  LPUSER_INFO_11 = ^USER_INFO_11;
  {$EXTERNALSYM LPUSER_INFO_11}
  PUSER_INFO_11 = ^USER_INFO_11;
  {$EXTERNALSYM PUSER_INFO_11}
  _USER_INFO_11 = record
    usri11_name: LPWSTR;
    usri11_comment: LPWSTR;
    usri11_usr_comment: LPWSTR;
    usri11_full_name: LPWSTR;
    usri11_priv: DWORD;
    usri11_auth_flags: DWORD;
    usri11_password_age: DWORD;
    usri11_home_dir: LPWSTR;
    usri11_parms: LPWSTR;
    usri11_last_logon: DWORD;
    usri11_last_logoff: DWORD;
    usri11_bad_pw_count: DWORD;
    usri11_num_logons: DWORD;
    usri11_logon_server: LPWSTR;
    usri11_country_code: DWORD;
    usri11_workstations: LPWSTR;
    usri11_max_storage: DWORD;
    usri11_units_per_week: DWORD;
    usri11_logon_hours: PBYTE;
    usri11_code_page: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_11}
  USER_INFO_11 = _USER_INFO_11;
  {$EXTERNALSYM USER_INFO_11}
  TUserInfo11 = USER_INFO_11;
  PUserInfo11 = PUSER_INFO_11;

  LPUSER_INFO_20 = ^USER_INFO_20;
  {$EXTERNALSYM LPUSER_INFO_20}
  PUSER_INFO_20 = ^USER_INFO_20;
  {$EXTERNALSYM PUSER_INFO_20}
  _USER_INFO_20 = record
    usri20_name: LPWSTR;
    usri20_full_name: LPWSTR;
    usri20_comment: LPWSTR;
    usri20_flags: DWORD;
    usri20_user_id: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_20}
  USER_INFO_20 = _USER_INFO_20;
  {$EXTERNALSYM USER_INFO_20}
  TUserInfo20 = USER_INFO_20;
  PUserInfo20 = PUSER_INFO_20;

  LPUSER_INFO_21 = ^USER_INFO_21;
  {$EXTERNALSYM LPUSER_INFO_21}
  PUSER_INFO_21 = ^USER_INFO_21;
  {$EXTERNALSYM PUSER_INFO_21}
  _USER_INFO_21 = record
    usri21_password: array [0..ENCRYPTED_PWLEN - 1] of BYTE;
  end;
  {$EXTERNALSYM _USER_INFO_21}
  USER_INFO_21 = _USER_INFO_21;
  {$EXTERNALSYM USER_INFO_21}
  TUserInfo21 = USER_INFO_21;
  PUserInfo21 = PUSER_INFO_21;

  LPUSER_INFO_22 = ^USER_INFO_22;
  {$EXTERNALSYM LPUSER_INFO_22}
  PUSER_INFO_22 = ^USER_INFO_22;
  {$EXTERNALSYM PUSER_INFO_22}
  _USER_INFO_22 = record
    usri22_name: LPWSTR;
    usri22_password: array [0..ENCRYPTED_PWLEN - 1] of BYTE;
    usri22_password_age: DWORD;
    usri22_priv: DWORD;
    usri22_home_dir: LPWSTR;
    usri22_comment: LPWSTR;
    usri22_flags: DWORD;
    usri22_script_path: LPWSTR;
    usri22_auth_flags: DWORD;
    usri22_full_name: LPWSTR;
    usri22_usr_comment: LPWSTR;
    usri22_parms: LPWSTR;
    usri22_workstations: LPWSTR;
    usri22_last_logon: DWORD;
    usri22_last_logoff: DWORD;
    usri22_acct_expires: DWORD;
    usri22_max_storage: DWORD;
    usri22_units_per_week: DWORD;
    usri22_logon_hours: PBYTE;
    usri22_bad_pw_count: DWORD;
    usri22_num_logons: DWORD;
    usri22_logon_server: LPWSTR;
    usri22_country_code: DWORD;
    usri22_code_page: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_22}
  USER_INFO_22 = _USER_INFO_22;
  {$EXTERNALSYM USER_INFO_22}
  TUserInfo22 = USER_INFO_22;
  PUserInfo22 = PUSER_INFO_22;

  LPUSER_INFO_23 = ^USER_INFO_23;
  {$EXTERNALSYM LPUSER_INFO_23}
  PUSER_INFO_23 = ^USER_INFO_23;
  {$EXTERNALSYM PUSER_INFO_23}
  _USER_INFO_23 = record
    usri23_name: LPWSTR;
    usri23_full_name: LPWSTR;
    usri23_comment: LPWSTR;
    usri23_flags: DWORD;
    usri23_user_sid: PSID;
  end;
  {$EXTERNALSYM _USER_INFO_23}
  USER_INFO_23 = _USER_INFO_23;
  {$EXTERNALSYM USER_INFO_23}
  TUserInfo23 = USER_INFO_23;
  PUserInfo23 = PUSER_INFO_23;

  LPUSER_INFO_1003 = ^USER_INFO_1003;
  {$EXTERNALSYM LPUSER_INFO_1003}
  PUSER_INFO_1003 = ^USER_INFO_1003;
  {$EXTERNALSYM PUSER_INFO_1003}
  _USER_INFO_1003 = record
    usri1003_password: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1003}
  USER_INFO_1003 = _USER_INFO_1003;
  {$EXTERNALSYM USER_INFO_1003}
  TUserInfo1003 = USER_INFO_1003;
  PUserInfo1003 = PUSER_INFO_1003;

  LPUSER_INFO_1005 = ^USER_INFO_1005;
  {$EXTERNALSYM LPUSER_INFO_1005}
  PUSER_INFO_1005 = ^USER_INFO_1005;
  {$EXTERNALSYM PUSER_INFO_1005}
  _USER_INFO_1005 = record
    usri1005_priv: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1005}
  USER_INFO_1005 = _USER_INFO_1005;
  {$EXTERNALSYM USER_INFO_1005}
  TUserInfo1005 = USER_INFO_1005;
  PUserInfo1005 = PUSER_INFO_1005;

  LPUSER_INFO_1006 = ^USER_INFO_1006;
  {$EXTERNALSYM LPUSER_INFO_1006}
  PUSER_INFO_1006 = ^USER_INFO_1006;
  {$EXTERNALSYM PUSER_INFO_1006}
  _USER_INFO_1006 = record
    usri1006_home_dir: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1006}
  USER_INFO_1006 = _USER_INFO_1006;
  {$EXTERNALSYM USER_INFO_1006}
  TUserInfo1006 = USER_INFO_1006;
  PUserInfo1006 = PUSER_INFO_1006;

  LPUSER_INFO_1007 = ^USER_INFO_1007;
  {$EXTERNALSYM LPUSER_INFO_1007}
  PUSER_INFO_1007 = ^USER_INFO_1007;
  {$EXTERNALSYM PUSER_INFO_1007}
  _USER_INFO_1007 = record
    usri1007_comment: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1007}
  USER_INFO_1007 = _USER_INFO_1007;
  {$EXTERNALSYM USER_INFO_1007}
  TUserInfo1007 = USER_INFO_1007;
  PUserInfo1007 = PUSER_INFO_1007;

  LPUSER_INFO_1008 = ^USER_INFO_1008;
  {$EXTERNALSYM LPUSER_INFO_1008}
  PUSER_INFO_1008 = ^USER_INFO_1008;
  {$EXTERNALSYM PUSER_INFO_1008}
  _USER_INFO_1008 = record
    usri1008_flags: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1008}
  USER_INFO_1008 = _USER_INFO_1008;
  {$EXTERNALSYM USER_INFO_1008}
  TUserInfo1008 = USER_INFO_1008;
  PUserInfo1008 = PUSER_INFO_1008;

  LPUSER_INFO_1009 = ^USER_INFO_1009;
  {$EXTERNALSYM LPUSER_INFO_1009}
  PUSER_INFO_1009 = ^USER_INFO_1009;
  {$EXTERNALSYM PUSER_INFO_1009}
  _USER_INFO_1009 = record
    usri1009_script_path: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1009}
  USER_INFO_1009 = _USER_INFO_1009;
  {$EXTERNALSYM USER_INFO_1009}
  TUserInfo1009 = USER_INFO_1009;
  PUserInfo1009 = PUSER_INFO_1009;

  LPUSER_INFO_1010 = ^USER_INFO_1010;
  {$EXTERNALSYM LPUSER_INFO_1010}
  PUSER_INFO_1010 = ^USER_INFO_1010;
  {$EXTERNALSYM PUSER_INFO_1010}
  _USER_INFO_1010 = record
    usri1010_auth_flags: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1010}
  USER_INFO_1010 = _USER_INFO_1010;
  {$EXTERNALSYM USER_INFO_1010}
  TUserInfo1010 = USER_INFO_1010;
  PUserInfo1010 = PUSER_INFO_1010;

  LPUSER_INFO_1011 = ^USER_INFO_1011;
  {$EXTERNALSYM LPUSER_INFO_1011}
  PUSER_INFO_1011 = ^USER_INFO_1011;
  {$EXTERNALSYM PUSER_INFO_1011}
  _USER_INFO_1011 = record
    usri1011_full_name: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1011}
  USER_INFO_1011 = _USER_INFO_1011;
  {$EXTERNALSYM USER_INFO_1011}
  TUserInfo1011 = USER_INFO_1011;
  PUserInfo1011 = PUSER_INFO_1011;

  LPUSER_INFO_1012 = ^USER_INFO_1012;
  {$EXTERNALSYM LPUSER_INFO_1012}
  PUSER_INFO_1012 = ^USER_INFO_1012;
  {$EXTERNALSYM PUSER_INFO_1012}
  _USER_INFO_1012 = record
    usri1012_usr_comment: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1012}
  USER_INFO_1012 = _USER_INFO_1012;
  {$EXTERNALSYM USER_INFO_1012}
  TUserInfo1012 = USER_INFO_1012;
  PUserInfo1012 = PUSER_INFO_1012;

  LPUSER_INFO_1013 = ^USER_INFO_1013;
  {$EXTERNALSYM LPUSER_INFO_1013}
  PUSER_INFO_1013 = ^USER_INFO_1013;
  {$EXTERNALSYM PUSER_INFO_1013}
  _USER_INFO_1013 = record
    usri1013_parms: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1013}
  USER_INFO_1013 = _USER_INFO_1013;
  {$EXTERNALSYM USER_INFO_1013}
  TUserInfo1013 = USER_INFO_1013;
  PUserInfo1013 = PUSER_INFO_1013;

  LPUSER_INFO_1014 = ^USER_INFO_1014;
  {$EXTERNALSYM LPUSER_INFO_1014}
  PUSER_INFO_1014 = ^USER_INFO_1014;
  {$EXTERNALSYM PUSER_INFO_1014}
  _USER_INFO_1014 = record
    usri1014_workstations: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1014}
  USER_INFO_1014 = _USER_INFO_1014;
  {$EXTERNALSYM USER_INFO_1014}
  TUserInfo1014 = USER_INFO_1014;
  PUserInfo1014 = PUSER_INFO_1014;

  LPUSER_INFO_1017 = ^USER_INFO_1017;
  {$EXTERNALSYM LPUSER_INFO_1017}
  PUSER_INFO_1017 = ^USER_INFO_1017;
  {$EXTERNALSYM PUSER_INFO_1017}
  _USER_INFO_1017 = record
    usri1017_acct_expires: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1017}
  USER_INFO_1017 = _USER_INFO_1017;
  {$EXTERNALSYM USER_INFO_1017}
  TUserInfo1017 = USER_INFO_1017;
  PUserInfo1017 = PUSER_INFO_1017;

  LPUSER_INFO_1018 = ^USER_INFO_1018;
  {$EXTERNALSYM LPUSER_INFO_1018}
  PUSER_INFO_1018 = ^USER_INFO_1018;
  {$EXTERNALSYM PUSER_INFO_1018}
  _USER_INFO_1018 = record
    usri1018_max_storage: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1018}
  USER_INFO_1018 = _USER_INFO_1018;
  {$EXTERNALSYM USER_INFO_1018}
  TUserInfo1018 = USER_INFO_1018;
  PUserInfo1018 = PUSER_INFO_1018;

  LPUSER_INFO_1020 = ^USER_INFO_1020;
  {$EXTERNALSYM LPUSER_INFO_1020}
  PUSER_INFO_1020 = ^USER_INFO_1020;
  {$EXTERNALSYM PUSER_INFO_1020}
  _USER_INFO_1020 = record
    usri1020_units_per_week: DWORD;
    usri1020_logon_hours: LPBYTE;
  end;
  {$EXTERNALSYM _USER_INFO_1020}
  USER_INFO_1020 = _USER_INFO_1020;
  {$EXTERNALSYM USER_INFO_1020}
  TUserInfo1020 = USER_INFO_1020;
  PUserInfo1020 = PUSER_INFO_1020;

  LPUSER_INFO_1023 = ^USER_INFO_1023;
  {$EXTERNALSYM LPUSER_INFO_1023}
  PUSER_INFO_1023 = ^USER_INFO_1023;
  {$EXTERNALSYM PUSER_INFO_1023}
  _USER_INFO_1023 = record
    usri1023_logon_server: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1023}
  USER_INFO_1023 = _USER_INFO_1023;
  {$EXTERNALSYM USER_INFO_1023}
  TUserInfo1023 = USER_INFO_1023;
  PUserInfo1023 = PUSER_INFO_1023;

  LPUSER_INFO_1024 = ^USER_INFO_1024;
  {$EXTERNALSYM LPUSER_INFO_1024}
  PUSER_INFO_1024 = ^USER_INFO_1024;
  {$EXTERNALSYM PUSER_INFO_1024}
  _USER_INFO_1024 = record
    usri1024_country_code: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1024}
  USER_INFO_1024 = _USER_INFO_1024;
  {$EXTERNALSYM USER_INFO_1024}
  TUserInfo1024 = USER_INFO_1024;
  PUserInfo1024 = PUSER_INFO_1024;

  LPUSER_INFO_1025 = ^USER_INFO_1025;
  {$EXTERNALSYM LPUSER_INFO_1025}
  PUSER_INFO_1025 = ^USER_INFO_1025;
  {$EXTERNALSYM PUSER_INFO_1025}
  _USER_INFO_1025 = record
    usri1025_code_page: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1025}
  USER_INFO_1025 = _USER_INFO_1025;
  {$EXTERNALSYM USER_INFO_1025}
  TUserInfo1025 = USER_INFO_1025;
  PUserInfo1025 = PUSER_INFO_1025;

  LPUSER_INFO_1051 = ^USER_INFO_1051;
  {$EXTERNALSYM LPUSER_INFO_1051}
  PUSER_INFO_1051 = ^USER_INFO_1051;
  {$EXTERNALSYM PUSER_INFO_1051}
  _USER_INFO_1051 = record
    usri1051_primary_group_id: DWORD;
  end;
  {$EXTERNALSYM _USER_INFO_1051}
  USER_INFO_1051 = _USER_INFO_1051;
  {$EXTERNALSYM USER_INFO_1051}
  TUserInfo1051 = USER_INFO_1051;
  PUserInfo1051 = PUSER_INFO_1051;

  LPUSER_INFO_1052 = ^USER_INFO_1052;
  {$EXTERNALSYM LPUSER_INFO_1052}
  PUSER_INFO_1052 = ^USER_INFO_1052;
  {$EXTERNALSYM PUSER_INFO_1052}
  _USER_INFO_1052 = record
    usri1052_profile: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1052}
  USER_INFO_1052 = _USER_INFO_1052;
  {$EXTERNALSYM USER_INFO_1052}
  TUserInfo1052 = USER_INFO_1052;
  PUserInfo1052 = PUSER_INFO_1052;

  LPUSER_INFO_1053 = ^USER_INFO_1053;
  {$EXTERNALSYM LPUSER_INFO_1053}
  PUSER_INFO_1053 = ^USER_INFO_1053;
  {$EXTERNALSYM PUSER_INFO_1053}
  _USER_INFO_1053 = record
    usri1053_home_dir_drive: LPWSTR;
  end;
  {$EXTERNALSYM _USER_INFO_1053}
  USER_INFO_1053 = _USER_INFO_1053;
  {$EXTERNALSYM USER_INFO_1053}
  TUserInfo1053 = USER_INFO_1053;
  PUserInfo1053 = PUSER_INFO_1053;

//
//  Data Structures - User Modals
//

  LPUSER_MODALS_INFO_0 = ^USER_MODALS_INFO_0;
  {$EXTERNALSYM LPUSER_MODALS_INFO_0}
  PUSER_MODALS_INFO_0 = ^USER_MODALS_INFO_0;
  {$EXTERNALSYM PUSER_MODALS_INFO_0}
  _USER_MODALS_INFO_0 = record
    usrmod0_min_passwd_len: DWORD;
    usrmod0_max_passwd_age: DWORD;
    usrmod0_min_passwd_age: DWORD;
    usrmod0_force_logoff: DWORD;
    usrmod0_password_hist_len: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_0}
  USER_MODALS_INFO_0 = _USER_MODALS_INFO_0;
  {$EXTERNALSYM USER_MODALS_INFO_0}
  TUserModalsInfo0 = USER_MODALS_INFO_0;
  PUserModalsInfo0 = PUSER_MODALS_INFO_0;

  LPUSER_MODALS_INFO_1 = ^USER_MODALS_INFO_1;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1}
  PUSER_MODALS_INFO_1 = ^USER_MODALS_INFO_1;
  {$EXTERNALSYM PUSER_MODALS_INFO_1}
  _USER_MODALS_INFO_1 = record
    usrmod1_role: DWORD;
    usrmod1_primary: LPWSTR;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1}
  USER_MODALS_INFO_1 = _USER_MODALS_INFO_1;
  {$EXTERNALSYM USER_MODALS_INFO_1}
  TUserModalsInfo1 = USER_MODALS_INFO_1;
  PUserModalsInfo1 = PUSER_MODALS_INFO_1;

  LPUSER_MODALS_INFO_2 = ^USER_MODALS_INFO_2;
  {$EXTERNALSYM LPUSER_MODALS_INFO_2}
  PUSER_MODALS_INFO_2 = ^USER_MODALS_INFO_2;
  {$EXTERNALSYM PUSER_MODALS_INFO_2}
  _USER_MODALS_INFO_2 = record
    usrmod2_domain_name: LPWSTR;
    usrmod2_domain_id: PSID;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_2}
  USER_MODALS_INFO_2 = _USER_MODALS_INFO_2;
  {$EXTERNALSYM USER_MODALS_INFO_2}
  TUserModalsInfo2 = USER_MODALS_INFO_2;
  PUserModalsInfo2 = PUSER_MODALS_INFO_2;

  LPUSER_MODALS_INFO_3 = ^USER_MODALS_INFO_3;
  {$EXTERNALSYM LPUSER_MODALS_INFO_3}
  PUSER_MODALS_INFO_3 = ^USER_MODALS_INFO_3;
  {$EXTERNALSYM PUSER_MODALS_INFO_3}
  _USER_MODALS_INFO_3 = record
    usrmod3_lockout_duration: DWORD;
    usrmod3_lockout_observation_window: DWORD;
    usrmod3_lockout_threshold: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_3}
  USER_MODALS_INFO_3 = _USER_MODALS_INFO_3;
  {$EXTERNALSYM USER_MODALS_INFO_3}
  TUserModalsInfo3 = USER_MODALS_INFO_3;
  PUserModalsInfo3 = PUSER_MODALS_INFO_3;

  LPUSER_MODALS_INFO_1001 = ^USER_MODALS_INFO_1001;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1001}
  PUSER_MODALS_INFO_1001 = ^USER_MODALS_INFO_1001;
  {$EXTERNALSYM PUSER_MODALS_INFO_1001}
  _USER_MODALS_INFO_1001 = record
    usrmod1001_min_passwd_len: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1001}
  USER_MODALS_INFO_1001 = _USER_MODALS_INFO_1001;
  {$EXTERNALSYM USER_MODALS_INFO_1001}
  TUserModalsInfo1001 = USER_MODALS_INFO_1001;
  PUserModalsInfo1001 = PUSER_MODALS_INFO_1001;

  LPUSER_MODALS_INFO_1002 = ^USER_MODALS_INFO_1002;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1002}
  PUSER_MODALS_INFO_1002 = ^USER_MODALS_INFO_1002;
  {$EXTERNALSYM PUSER_MODALS_INFO_1002}
  _USER_MODALS_INFO_1002 = record
    usrmod1002_max_passwd_age: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1002}
  USER_MODALS_INFO_1002 = _USER_MODALS_INFO_1002;
  {$EXTERNALSYM USER_MODALS_INFO_1002}
  TUserModalsInfo1002 = USER_MODALS_INFO_1002;
  PUserModalsInfo1002 = PUSER_MODALS_INFO_1002;

  LPUSER_MODALS_INFO_1003 = ^USER_MODALS_INFO_1003;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1003}
  PUSER_MODALS_INFO_1003 = ^USER_MODALS_INFO_1003;
  {$EXTERNALSYM PUSER_MODALS_INFO_1003}
  _USER_MODALS_INFO_1003 = record
    usrmod1003_min_passwd_age: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1003}
  USER_MODALS_INFO_1003 = _USER_MODALS_INFO_1003;
  {$EXTERNALSYM USER_MODALS_INFO_1003}
  TUserModalsInfo1003 = USER_MODALS_INFO_1003;
  PUserModalsInfo1003 = PUSER_MODALS_INFO_1003;

  LPUSER_MODALS_INFO_1004 = ^USER_MODALS_INFO_1004;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1004}
  PUSER_MODALS_INFO_1004 = ^USER_MODALS_INFO_1004;
  {$EXTERNALSYM PUSER_MODALS_INFO_1004}
  _USER_MODALS_INFO_1004 = record
    usrmod1004_force_logoff: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1004}
  USER_MODALS_INFO_1004 = _USER_MODALS_INFO_1004;
  {$EXTERNALSYM USER_MODALS_INFO_1004}
  TUserModalsInfo1004 = USER_MODALS_INFO_1004;
  PUserModalsInfo1004 = PUSER_MODALS_INFO_1004;

  LPUSER_MODALS_INFO_1005 = ^USER_MODALS_INFO_1005;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1005}
  PUSER_MODALS_INFO_1005 = ^USER_MODALS_INFO_1005;
  {$EXTERNALSYM PUSER_MODALS_INFO_1005}
  _USER_MODALS_INFO_1005 = record
    usrmod1005_password_hist_len: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1005}
  USER_MODALS_INFO_1005 = _USER_MODALS_INFO_1005;
  {$EXTERNALSYM USER_MODALS_INFO_1005}
  TUserModalsInfo1005 = USER_MODALS_INFO_1005;
  PUserModalsInfo1005 = PUSER_MODALS_INFO_1005;

  LPUSER_MODALS_INFO_1006 = ^USER_MODALS_INFO_1006;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1006}
  PUSER_MODALS_INFO_1006 = ^USER_MODALS_INFO_1006;
  {$EXTERNALSYM PUSER_MODALS_INFO_1006}
  _USER_MODALS_INFO_1006 = record
    usrmod1006_role: DWORD;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1006}
  USER_MODALS_INFO_1006 = _USER_MODALS_INFO_1006;
  {$EXTERNALSYM USER_MODALS_INFO_1006}
  TUserModalsInfo1006 = USER_MODALS_INFO_1006;
  PUserModalsInfo1006 = PUSER_MODALS_INFO_1006;

  LPUSER_MODALS_INFO_1007 = ^USER_MODALS_INFO_1007;
  {$EXTERNALSYM LPUSER_MODALS_INFO_1007}
  PUSER_MODALS_INFO_1007 = ^USER_MODALS_INFO_1007;
  {$EXTERNALSYM PUSER_MODALS_INFO_1007}
  _USER_MODALS_INFO_1007 = record
    usrmod1007_primary: LPWSTR;
  end;
  {$EXTERNALSYM _USER_MODALS_INFO_1007}
  USER_MODALS_INFO_1007 = _USER_MODALS_INFO_1007;
  {$EXTERNALSYM USER_MODALS_INFO_1007}
  TUserModalsInfo1007 = USER_MODALS_INFO_1007;
  PUserModalsInfo1007 = PUSER_MODALS_INFO_1007;

//
// Special Values and Constants - User
//

//
//  Bit masks for field usriX_flags of USER_INFO_X (X = 0/1).
//

const
  UF_SCRIPT                          = $0001;
  {$EXTERNALSYM UF_SCRIPT}
  UF_ACCOUNTDISABLE                  = $0002;
  {$EXTERNALSYM UF_ACCOUNTDISABLE}
  UF_HOMEDIR_REQUIRED                = $0008;
  {$EXTERNALSYM UF_HOMEDIR_REQUIRED}
  UF_LOCKOUT                         = $0010;
  {$EXTERNALSYM UF_LOCKOUT}
  UF_PASSWD_NOTREQD                  = $0020;
  {$EXTERNALSYM UF_PASSWD_NOTREQD}
  UF_PASSWD_CANT_CHANGE              = $0040;
  {$EXTERNALSYM UF_PASSWD_CANT_CHANGE}
  UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = $0080;
  {$EXTERNALSYM UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED}

//
// Account type bits as part of usri_flags.
//

  UF_TEMP_DUPLICATE_ACCOUNT    = $0100;
  {$EXTERNALSYM UF_TEMP_DUPLICATE_ACCOUNT}
  UF_NORMAL_ACCOUNT            = $0200;
  {$EXTERNALSYM UF_NORMAL_ACCOUNT}
  UF_INTERDOMAIN_TRUST_ACCOUNT = $0800;
  {$EXTERNALSYM UF_INTERDOMAIN_TRUST_ACCOUNT}
  UF_WORKSTATION_TRUST_ACCOUNT = $1000;
  {$EXTERNALSYM UF_WORKSTATION_TRUST_ACCOUNT}
  UF_SERVER_TRUST_ACCOUNT      = $2000;
  {$EXTERNALSYM UF_SERVER_TRUST_ACCOUNT}

  UF_MACHINE_ACCOUNT_MASK = UF_INTERDOMAIN_TRUST_ACCOUNT or UF_WORKSTATION_TRUST_ACCOUNT or UF_SERVER_TRUST_ACCOUNT;
  {$EXTERNALSYM UF_MACHINE_ACCOUNT_MASK}

  UF_ACCOUNT_TYPE_MASK = UF_TEMP_DUPLICATE_ACCOUNT or UF_NORMAL_ACCOUNT or UF_INTERDOMAIN_TRUST_ACCOUNT or UF_WORKSTATION_TRUST_ACCOUNT or UF_SERVER_TRUST_ACCOUNT;
  {$EXTERNALSYM UF_ACCOUNT_TYPE_MASK}

  UF_DONT_EXPIRE_PASSWD                     = $10000;
  {$EXTERNALSYM UF_DONT_EXPIRE_PASSWD}
  UF_MNS_LOGON_ACCOUNT                      = $20000;
  {$EXTERNALSYM UF_MNS_LOGON_ACCOUNT}
  UF_SMARTCARD_REQUIRED                     = $40000;
  {$EXTERNALSYM UF_SMARTCARD_REQUIRED}
  UF_TRUSTED_FOR_DELEGATION                 = $80000;
  {$EXTERNALSYM UF_TRUSTED_FOR_DELEGATION}
  UF_NOT_DELEGATED                          = $100000;
  {$EXTERNALSYM UF_NOT_DELEGATED}
  UF_USE_DES_KEY_ONLY                       = $200000;
  {$EXTERNALSYM UF_USE_DES_KEY_ONLY}
  UF_DONT_REQUIRE_PREAUTH                   = $400000;
  {$EXTERNALSYM UF_DONT_REQUIRE_PREAUTH}
  UF_PASSWORD_EXPIRED                       = DWORD($800000);
  {$EXTERNALSYM UF_PASSWORD_EXPIRED}
  UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = $1000000;
  {$EXTERNALSYM UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION}

  UF_SETTABLE_BITS =
                    UF_SCRIPT or
                    UF_ACCOUNTDISABLE or
                    UF_LOCKOUT or
                    UF_HOMEDIR_REQUIRED or
                    UF_PASSWD_NOTREQD or
                    UF_PASSWD_CANT_CHANGE or
                    UF_ACCOUNT_TYPE_MASK or
                    UF_DONT_EXPIRE_PASSWD or
                    UF_MNS_LOGON_ACCOUNT or
                    UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED or
                    UF_SMARTCARD_REQUIRED or
                    UF_TRUSTED_FOR_DELEGATION or
                    UF_NOT_DELEGATED or
                    UF_USE_DES_KEY_ONLY or
                    UF_DONT_REQUIRE_PREAUTH or
                    UF_PASSWORD_EXPIRED or
                    UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION;
  {$EXTERNALSYM UF_SETTABLE_BITS}

//
// bit masks for the NetUserEnum filter parameter.
//

  FILTER_TEMP_DUPLICATE_ACCOUNT = $0001;
  {$EXTERNALSYM FILTER_TEMP_DUPLICATE_ACCOUNT}
  FILTER_NORMAL_ACCOUNT         = $0002;
  {$EXTERNALSYM FILTER_NORMAL_ACCOUNT}
// #define FILTER_PROXY_ACCOUNT                (0x0004)
  FILTER_INTERDOMAIN_TRUST_ACCOUNT = $0008;
  {$EXTERNALSYM FILTER_INTERDOMAIN_TRUST_ACCOUNT}
  FILTER_WORKSTATION_TRUST_ACCOUNT = $0010;
  {$EXTERNALSYM FILTER_WORKSTATION_TRUST_ACCOUNT}
  FILTER_SERVER_TRUST_ACCOUNT      = $0020;
  {$EXTERNALSYM FILTER_SERVER_TRUST_ACCOUNT}

//
// bit masks for the NetUserGetLocalGroups flags
//

  LG_INCLUDE_INDIRECT = $0001;
  {$EXTERNALSYM LG_INCLUDE_INDIRECT}

//
//  Bit masks for field usri2_auth_flags of USER_INFO_2.
//

  AF_OP_PRINT      = $1;
  {$EXTERNALSYM AF_OP_PRINT}
  AF_OP_COMM       = $2;
  {$EXTERNALSYM AF_OP_COMM}
  AF_OP_SERVER     = $4;
  {$EXTERNALSYM AF_OP_SERVER}
  AF_OP_ACCOUNTS   = $8;
  {$EXTERNALSYM AF_OP_ACCOUNTS}
  AF_SETTABLE_BITS = AF_OP_PRINT or AF_OP_COMM or AF_OP_SERVER or AF_OP_ACCOUNTS;
  {$EXTERNALSYM AF_SETTABLE_BITS}

//
//  UAS role manifests under NETLOGON
//

  UAS_ROLE_STANDALONE = 0;
  {$EXTERNALSYM UAS_ROLE_STANDALONE}
  UAS_ROLE_MEMBER     = 1;
  {$EXTERNALSYM UAS_ROLE_MEMBER}
  UAS_ROLE_BACKUP     = 2;
  {$EXTERNALSYM UAS_ROLE_BACKUP}
  UAS_ROLE_PRIMARY    = 3;
  {$EXTERNALSYM UAS_ROLE_PRIMARY}

//
//  Values for ParmError for NetUserSetInfo.
//

  USER_NAME_PARMNUM           = 1;
  {$EXTERNALSYM USER_NAME_PARMNUM}
  USER_PASSWORD_PARMNUM       = 3;
  {$EXTERNALSYM USER_PASSWORD_PARMNUM}
  USER_PASSWORD_AGE_PARMNUM   = 4;
  {$EXTERNALSYM USER_PASSWORD_AGE_PARMNUM}
  USER_PRIV_PARMNUM           = 5;
  {$EXTERNALSYM USER_PRIV_PARMNUM}
  USER_HOME_DIR_PARMNUM       = 6;
  {$EXTERNALSYM USER_HOME_DIR_PARMNUM}
  USER_COMMENT_PARMNUM        = 7;
  {$EXTERNALSYM USER_COMMENT_PARMNUM}
  USER_FLAGS_PARMNUM          = 8;
  {$EXTERNALSYM USER_FLAGS_PARMNUM}
  USER_SCRIPT_PATH_PARMNUM    = 9;
  {$EXTERNALSYM USER_SCRIPT_PATH_PARMNUM}
  USER_AUTH_FLAGS_PARMNUM     = 10;
  {$EXTERNALSYM USER_AUTH_FLAGS_PARMNUM}
  USER_FULL_NAME_PARMNUM      = 11;
  {$EXTERNALSYM USER_FULL_NAME_PARMNUM}
  USER_USR_COMMENT_PARMNUM    = 12;
  {$EXTERNALSYM USER_USR_COMMENT_PARMNUM}
  USER_PARMS_PARMNUM          = 13;
  {$EXTERNALSYM USER_PARMS_PARMNUM}
  USER_WORKSTATIONS_PARMNUM   = 14;
  {$EXTERNALSYM USER_WORKSTATIONS_PARMNUM}
  USER_LAST_LOGON_PARMNUM     = 15;
  {$EXTERNALSYM USER_LAST_LOGON_PARMNUM}
  USER_LAST_LOGOFF_PARMNUM    = 16;
  {$EXTERNALSYM USER_LAST_LOGOFF_PARMNUM}
  USER_ACCT_EXPIRES_PARMNUM   = 17;
  {$EXTERNALSYM USER_ACCT_EXPIRES_PARMNUM}
  USER_MAX_STORAGE_PARMNUM    = 18;
  {$EXTERNALSYM USER_MAX_STORAGE_PARMNUM}
  USER_UNITS_PER_WEEK_PARMNUM = 19;
  {$EXTERNALSYM USER_UNITS_PER_WEEK_PARMNUM}
  USER_LOGON_HOURS_PARMNUM    = 20;
  {$EXTERNALSYM USER_LOGON_HOURS_PARMNUM}
  USER_PAD_PW_COUNT_PARMNUM   = 21;
  {$EXTERNALSYM USER_PAD_PW_COUNT_PARMNUM}
  USER_NUM_LOGONS_PARMNUM     = 22;
  {$EXTERNALSYM USER_NUM_LOGONS_PARMNUM}
  USER_LOGON_SERVER_PARMNUM   = 23;
  {$EXTERNALSYM USER_LOGON_SERVER_PARMNUM}
  USER_COUNTRY_CODE_PARMNUM   = 24;
  {$EXTERNALSYM USER_COUNTRY_CODE_PARMNUM}
  USER_CODE_PAGE_PARMNUM      = 25;
  {$EXTERNALSYM USER_CODE_PAGE_PARMNUM}
  USER_PRIMARY_GROUP_PARMNUM  = 51;
  {$EXTERNALSYM USER_PRIMARY_GROUP_PARMNUM}
  USER_PROFILE                = 52; // ?? Delete when convenient
  {$EXTERNALSYM USER_PROFILE}
  USER_PROFILE_PARMNUM        = 52;
  {$EXTERNALSYM USER_PROFILE_PARMNUM}
  USER_HOME_DIR_DRIVE_PARMNUM = 53;
  {$EXTERNALSYM USER_HOME_DIR_DRIVE_PARMNUM}

//
// the new infolevel counterparts of the old info level + parmnum
//

  USER_NAME_INFOLEVEL           = PARMNUM_BASE_INFOLEVEL + USER_NAME_PARMNUM;
  {$EXTERNALSYM USER_NAME_INFOLEVEL}
  USER_PASSWORD_INFOLEVEL       = PARMNUM_BASE_INFOLEVEL + USER_PASSWORD_PARMNUM;
  {$EXTERNALSYM USER_PASSWORD_INFOLEVEL}
  USER_PASSWORD_AGE_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_PASSWORD_AGE_PARMNUM;
  {$EXTERNALSYM USER_PASSWORD_AGE_INFOLEVEL}
  USER_PRIV_INFOLEVEL           = PARMNUM_BASE_INFOLEVEL + USER_PRIV_PARMNUM;
  {$EXTERNALSYM USER_PRIV_INFOLEVEL}
  USER_HOME_DIR_INFOLEVEL       = PARMNUM_BASE_INFOLEVEL + USER_HOME_DIR_PARMNUM;
  {$EXTERNALSYM USER_HOME_DIR_INFOLEVEL}
  USER_COMMENT_INFOLEVEL        = PARMNUM_BASE_INFOLEVEL + USER_COMMENT_PARMNUM;
  {$EXTERNALSYM USER_COMMENT_INFOLEVEL}
  USER_FLAGS_INFOLEVEL          = PARMNUM_BASE_INFOLEVEL + USER_FLAGS_PARMNUM;
  {$EXTERNALSYM USER_FLAGS_INFOLEVEL}
  USER_SCRIPT_PATH_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + USER_SCRIPT_PATH_PARMNUM;
  {$EXTERNALSYM USER_SCRIPT_PATH_INFOLEVEL}
  USER_AUTH_FLAGS_INFOLEVEL     = PARMNUM_BASE_INFOLEVEL + USER_AUTH_FLAGS_PARMNUM;
  {$EXTERNALSYM USER_AUTH_FLAGS_INFOLEVEL}
  USER_FULL_NAME_INFOLEVEL      = PARMNUM_BASE_INFOLEVEL + USER_FULL_NAME_PARMNUM;
  {$EXTERNALSYM USER_FULL_NAME_INFOLEVEL}
  USER_USR_COMMENT_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + USER_USR_COMMENT_PARMNUM;
  {$EXTERNALSYM USER_USR_COMMENT_INFOLEVEL}
  USER_PARMS_INFOLEVEL          = PARMNUM_BASE_INFOLEVEL + USER_PARMS_PARMNUM;
  {$EXTERNALSYM USER_PARMS_INFOLEVEL}
  USER_WORKSTATIONS_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_WORKSTATIONS_PARMNUM;
  {$EXTERNALSYM USER_WORKSTATIONS_INFOLEVEL}
  USER_LAST_LOGON_INFOLEVEL     = PARMNUM_BASE_INFOLEVEL + USER_LAST_LOGON_PARMNUM;
  {$EXTERNALSYM USER_LAST_LOGON_INFOLEVEL}
  USER_LAST_LOGOFF_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + USER_LAST_LOGOFF_PARMNUM;
  {$EXTERNALSYM USER_LAST_LOGOFF_INFOLEVEL}
  USER_ACCT_EXPIRES_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_ACCT_EXPIRES_PARMNUM;
  {$EXTERNALSYM USER_ACCT_EXPIRES_INFOLEVEL}
  USER_MAX_STORAGE_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + USER_MAX_STORAGE_PARMNUM;
  {$EXTERNALSYM USER_MAX_STORAGE_INFOLEVEL}
  USER_UNITS_PER_WEEK_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + USER_UNITS_PER_WEEK_PARMNUM;
  {$EXTERNALSYM USER_UNITS_PER_WEEK_INFOLEVEL}
  USER_LOGON_HOURS_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + USER_LOGON_HOURS_PARMNUM;
  {$EXTERNALSYM USER_LOGON_HOURS_INFOLEVEL}
  USER_PAD_PW_COUNT_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_PAD_PW_COUNT_PARMNUM;
  {$EXTERNALSYM USER_PAD_PW_COUNT_INFOLEVEL}
  USER_NUM_LOGONS_INFOLEVEL     = PARMNUM_BASE_INFOLEVEL + USER_NUM_LOGONS_PARMNUM;
  {$EXTERNALSYM USER_NUM_LOGONS_INFOLEVEL}
  USER_LOGON_SERVER_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_LOGON_SERVER_PARMNUM;
  {$EXTERNALSYM USER_LOGON_SERVER_INFOLEVEL}
  USER_COUNTRY_CODE_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + USER_COUNTRY_CODE_PARMNUM;
  {$EXTERNALSYM USER_COUNTRY_CODE_INFOLEVEL}
  USER_CODE_PAGE_INFOLEVEL      = PARMNUM_BASE_INFOLEVEL + USER_CODE_PAGE_PARMNUM;
  {$EXTERNALSYM USER_CODE_PAGE_INFOLEVEL}
  USER_PRIMARY_GROUP_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL + USER_PRIMARY_GROUP_PARMNUM;
  {$EXTERNALSYM USER_PRIMARY_GROUP_INFOLEVEL}
//  todo USER_POSIX_ID_PARMNUM where is it defined?
//  USER_POSIX_ID_INFOLEVEL       = PARMNUM_BASE_INFOLEVEL + USER_POSIX_ID_PARMNUM;
//  {$EXTERNALSYM USER_POSIX_ID_INFOLEVEL}
  USER_HOME_DIR_DRIVE_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + USER_HOME_DIR_DRIVE_PARMNUM;
  {$EXTERNALSYM USER_HOME_DIR_DRIVE_INFOLEVEL}

//
//  For SetInfo call (parmnum 0) when password change not required
//

  NULL_USERSETINFO_PASSWD = '              ';
  {$EXTERNALSYM NULL_USERSETINFO_PASSWD}

  TIMEQ_FOREVER             = ULONG(-1);
  {$EXTERNALSYM TIMEQ_FOREVER}
  USER_MAXSTORAGE_UNLIMITED = ULONG(-1);
  {$EXTERNALSYM USER_MAXSTORAGE_UNLIMITED}
  USER_NO_LOGOFF            = ULONG(-1);
  {$EXTERNALSYM USER_NO_LOGOFF}
  UNITS_PER_DAY             = 24;
  {$EXTERNALSYM UNITS_PER_DAY}
  UNITS_PER_WEEK            = UNITS_PER_DAY * 7;
  {$EXTERNALSYM UNITS_PER_WEEK}

//
// Privilege levels (USER_INFO_X field usriX_priv (X = 0/1)).
//

  USER_PRIV_MASK  = $3;
  {$EXTERNALSYM USER_PRIV_MASK}
  USER_PRIV_GUEST = 0;
  {$EXTERNALSYM USER_PRIV_GUEST}
  USER_PRIV_USER  = 1;
  {$EXTERNALSYM USER_PRIV_USER}
  USER_PRIV_ADMIN = 2;
  {$EXTERNALSYM USER_PRIV_ADMIN}

//
// user modals related defaults
//

  MAX_PASSWD_LEN   = PWLEN;
  {$EXTERNALSYM MAX_PASSWD_LEN}
  DEF_MIN_PWLEN    = 6;
  {$EXTERNALSYM DEF_MIN_PWLEN}
  DEF_PWUNIQUENESS = 5;
  {$EXTERNALSYM DEF_PWUNIQUENESS}
  DEF_MAX_PWHIST   = 8;
  {$EXTERNALSYM DEF_MAX_PWHIST}

  DEF_MAX_PWAGE    = TIMEQ_FOREVER; // forever
  {$EXTERNALSYM DEF_MAX_PWAGE}
  DEF_MIN_PWAGE    = 0; // 0 days
  {$EXTERNALSYM DEF_MIN_PWAGE}
  DEF_FORCE_LOGOFF = ULONG($ffffffff); // never
  {$EXTERNALSYM DEF_FORCE_LOGOFF}
  DEF_MAX_BADPW    = 0; // no limit
  {$EXTERNALSYM DEF_MAX_BADPW}
  ONE_DAY          = ULONG(01*24*3600); // 01 day
  {$EXTERNALSYM ONE_DAY}

//
// User Logon Validation (codes returned)
//

  VALIDATED_LOGON     = 0;
  {$EXTERNALSYM VALIDATED_LOGON}
  PASSWORD_EXPIRED    = 2;
  {$EXTERNALSYM PASSWORD_EXPIRED}
  NON_VALIDATED_LOGON = 3;
  {$EXTERNALSYM NON_VALIDATED_LOGON}

  VALID_LOGOFF = 1;
  {$EXTERNALSYM VALID_LOGOFF}

//
// parmnum manifests for user modals
//

  MODALS_MIN_PASSWD_LEN_PARMNUM             = 1;
  {$EXTERNALSYM MODALS_MIN_PASSWD_LEN_PARMNUM}
  MODALS_MAX_PASSWD_AGE_PARMNUM             = 2;
  {$EXTERNALSYM MODALS_MAX_PASSWD_AGE_PARMNUM}
  MODALS_MIN_PASSWD_AGE_PARMNUM             = 3;
  {$EXTERNALSYM MODALS_MIN_PASSWD_AGE_PARMNUM}
  MODALS_FORCE_LOGOFF_PARMNUM               = 4;
  {$EXTERNALSYM MODALS_FORCE_LOGOFF_PARMNUM}
  MODALS_PASSWD_HIST_LEN_PARMNUM            = 5;
  {$EXTERNALSYM MODALS_PASSWD_HIST_LEN_PARMNUM}
  MODALS_ROLE_PARMNUM                       = 6;
  {$EXTERNALSYM MODALS_ROLE_PARMNUM}
  MODALS_PRIMARY_PARMNUM                    = 7;
  {$EXTERNALSYM MODALS_PRIMARY_PARMNUM}
  MODALS_DOMAIN_NAME_PARMNUM                = 8;
  {$EXTERNALSYM MODALS_DOMAIN_NAME_PARMNUM}
  MODALS_DOMAIN_ID_PARMNUM                  = 9;
  {$EXTERNALSYM MODALS_DOMAIN_ID_PARMNUM}
  MODALS_LOCKOUT_DURATION_PARMNUM           = 10;
  {$EXTERNALSYM MODALS_LOCKOUT_DURATION_PARMNUM}
  MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM = 11;
  {$EXTERNALSYM MODALS_LOCKOUT_OBSERVATION_WINDOW_PARMNUM}
  MODALS_LOCKOUT_THRESHOLD_PARMNUM          = 12;
  {$EXTERNALSYM MODALS_LOCKOUT_THRESHOLD_PARMNUM}

//
// the new infolevel counterparts of the old info level + parmnum
//

  MODALS_MIN_PASSWD_LEN_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL + MODALS_MIN_PASSWD_LEN_PARMNUM;
  {$EXTERNALSYM MODALS_MIN_PASSWD_LEN_INFOLEVEL}
  MODALS_MAX_PASSWD_AGE_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL + MODALS_MAX_PASSWD_AGE_PARMNUM;
  {$EXTERNALSYM MODALS_MAX_PASSWD_AGE_INFOLEVEL}
  MODALS_MIN_PASSWD_AGE_INFOLEVEL  = PARMNUM_BASE_INFOLEVEL + MODALS_MIN_PASSWD_AGE_PARMNUM;
  {$EXTERNALSYM MODALS_MIN_PASSWD_AGE_INFOLEVEL}
  MODALS_FORCE_LOGOFF_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + MODALS_FORCE_LOGOFF_PARMNUM;
  {$EXTERNALSYM MODALS_FORCE_LOGOFF_INFOLEVEL}
  MODALS_PASSWD_HIST_LEN_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + MODALS_PASSWD_HIST_LEN_PARMNUM;
  {$EXTERNALSYM MODALS_PASSWD_HIST_LEN_INFOLEVEL}
  MODALS_ROLE_INFOLEVEL            = PARMNUM_BASE_INFOLEVEL + MODALS_ROLE_PARMNUM;
  {$EXTERNALSYM MODALS_ROLE_INFOLEVEL}
  MODALS_PRIMARY_INFOLEVEL         = PARMNUM_BASE_INFOLEVEL + MODALS_PRIMARY_PARMNUM;
  {$EXTERNALSYM MODALS_PRIMARY_INFOLEVEL}
  MODALS_DOMAIN_NAME_INFOLEVEL     = PARMNUM_BASE_INFOLEVEL + MODALS_DOMAIN_NAME_PARMNUM;
  {$EXTERNALSYM MODALS_DOMAIN_NAME_INFOLEVEL}
  MODALS_DOMAIN_ID_INFOLEVEL       = PARMNUM_BASE_INFOLEVEL + MODALS_DOMAIN_ID_PARMNUM;
  {$EXTERNALSYM MODALS_DOMAIN_ID_INFOLEVEL}

//
// Group Class
//

//
// Function Prototypes
//

function NetGroupAdd(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupAdd}

function NetGroupAddUser(servername, GroupName, username: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupAddUser}

function NetGroupEnum(servername: LPCWSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD; resume_handle: PDWORD_PTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupEnum}

function NetGroupGetInfo(servername, groupname: LPCWSTR; level: DWORD; bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupGetInfo}

function NetGroupSetInfo(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupSetInfo}

function NetGroupDel(servername: LPCWSTR; groupname: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupDel}

function NetGroupDelUser(servername: LPCWSTR; GroupName: LPCWSTR; Username: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupDelUser}

function NetGroupGetUsers(servername, groupname: LPCWSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD; ResumeHandle: PDWORD_PTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupGetUsers}

function NetGroupSetUsers(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; totalentries: DWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGroupSetUsers}

//
//  Data Structures - Group
//

type
  LPGROUP_INFO_0 = ^GROUP_INFO_0;
  {$EXTERNALSYM LPGROUP_INFO_0}
  PGROUP_INFO_0 = ^GROUP_INFO_0;
  {$EXTERNALSYM PGROUP_INFO_0}
  _GROUP_INFO_0 = record
    grpi0_name: LPWSTR;
  end;
  {$EXTERNALSYM _GROUP_INFO_0}
  GROUP_INFO_0 = _GROUP_INFO_0;
  {$EXTERNALSYM GROUP_INFO_0}
  TGroupInfo0 = GROUP_INFO_0;
  PGroupInfo0 = PGROUP_INFO_0;

  LPGROUP_INFO_1 = ^GROUP_INFO_1;
  {$EXTERNALSYM LPGROUP_INFO_1}
  PGROUP_INFO_1 = ^GROUP_INFO_1;
  {$EXTERNALSYM PGROUP_INFO_1}
  _GROUP_INFO_1 = record
    grpi1_name: LPWSTR;
    grpi1_comment: LPWSTR;
  end;
  {$EXTERNALSYM _GROUP_INFO_1}
  GROUP_INFO_1 = _GROUP_INFO_1;
  {$EXTERNALSYM GROUP_INFO_1}
  TGroupInfo1 = GROUP_INFO_1;
  PGroupInfo1 = PGROUP_INFO_1;

  LPGROUP_INFO_2 = ^GROUP_INFO_2;
  {$EXTERNALSYM LPGROUP_INFO_2}
  PGROUP_INFO_2 = ^GROUP_INFO_2;
  {$EXTERNALSYM PGROUP_INFO_2}
  _GROUP_INFO_2 = record
    grpi2_name: LPWSTR;
    grpi2_comment: LPWSTR;
    grpi2_group_id: DWORD;
    grpi2_attributes: DWORD;
  end;
  {$EXTERNALSYM _GROUP_INFO_2}
  GROUP_INFO_2 = _GROUP_INFO_2;
  {$EXTERNALSYM GROUP_INFO_2}
  TGroupInfo2 = GROUP_INFO_2;
  PGroupInfo2 = PGROUP_INFO_2;

  LPGROUP_INFO_3 = ^GROUP_INFO_3;
  {$EXTERNALSYM LPGROUP_INFO_3}
  PGROUP_INFO_3 = ^GROUP_INFO_3;
  {$EXTERNALSYM PGROUP_INFO_3}
  _GROUP_INFO_3 = record
    grpi3_name: LPWSTR;
    grpi3_comment: LPWSTR;
    grpi3_group_sid: PSID;
    grpi3_attributes: DWORD;
  end;
  {$EXTERNALSYM _GROUP_INFO_3}
  GROUP_INFO_3 = _GROUP_INFO_3;
  {$EXTERNALSYM GROUP_INFO_3}
  TGroupInfo3 = GROUP_INFO_3;
  PGroupInfo3 = PGROUP_INFO_3;

  LPGROUP_INFO_1002 = ^GROUP_INFO_1002;
  {$EXTERNALSYM LPGROUP_INFO_1002}
  PGROUP_INFO_1002 = ^GROUP_INFO_1002;
  {$EXTERNALSYM PGROUP_INFO_1002}
  _GROUP_INFO_1002 = record
    grpi1002_comment: LPWSTR;
  end;
  {$EXTERNALSYM _GROUP_INFO_1002}
  GROUP_INFO_1002 = _GROUP_INFO_1002;
  {$EXTERNALSYM GROUP_INFO_1002}
  TGroupInfo1002 = GROUP_INFO_1002;
  PGroupInfo1002 = PGROUP_INFO_1002;

  LPGROUP_INFO_1005 = ^GROUP_INFO_1005;
  {$EXTERNALSYM LPGROUP_INFO_1005}
  PGROUP_INFO_1005 = ^GROUP_INFO_1005;
  {$EXTERNALSYM PGROUP_INFO_1005}
  _GROUP_INFO_1005 = record
    grpi1005_attributes: DWORD;
  end;
  {$EXTERNALSYM _GROUP_INFO_1005}
  GROUP_INFO_1005 = _GROUP_INFO_1005;
  {$EXTERNALSYM GROUP_INFO_1005}
  TGroupInfo1005 = GROUP_INFO_1005;
  PGroupInfo1005 = PGROUP_INFO_1005;

  LPGROUP_USERS_INFO_0 = ^GROUP_USERS_INFO_0;
  {$EXTERNALSYM LPGROUP_USERS_INFO_0}
  PGROUP_USERS_INFO_0 = ^GROUP_USERS_INFO_0;
  {$EXTERNALSYM PGROUP_USERS_INFO_0}
  _GROUP_USERS_INFO_0 = record
    grui0_name: LPWSTR;
  end;
  {$EXTERNALSYM _GROUP_USERS_INFO_0}
  GROUP_USERS_INFO_0 = _GROUP_USERS_INFO_0;
  {$EXTERNALSYM GROUP_USERS_INFO_0}
  TGroupUsersInfo0 = GROUP_USERS_INFO_0;
  PGroupUsersInfo0 = PGROUP_USERS_INFO_0;

  LPGROUP_USERS_INFO_1 = ^GROUP_USERS_INFO_1;
  {$EXTERNALSYM LPGROUP_USERS_INFO_1}
  PGROUP_USERS_INFO_1 = ^GROUP_USERS_INFO_1;
  {$EXTERNALSYM PGROUP_USERS_INFO_1}
  _GROUP_USERS_INFO_1 = record
    grui1_name: LPWSTR;
    grui1_attributes: DWORD;
  end;
  {$EXTERNALSYM _GROUP_USERS_INFO_1}
  GROUP_USERS_INFO_1 = _GROUP_USERS_INFO_1;
  {$EXTERNALSYM GROUP_USERS_INFO_1}
  TGroupUsersInfo1 = GROUP_USERS_INFO_1;
  PGroupUsersInfo1 = PGROUP_USERS_INFO_1;

//
// Special Values and Constants - Group
//

const
  GROUPIDMASK = $8000; // MSB set if uid refers to a group
  {$EXTERNALSYM GROUPIDMASK}

//
// Predefined group for all normal users, administrators and guests
// LOCAL is a special group for pinball local security.
//

  GROUP_SPECIALGRP_USERS  = WideString('USERS');
  {$EXTERNALSYM GROUP_SPECIALGRP_USERS}
  GROUP_SPECIALGRP_ADMINS = WideString('ADMINS');
  {$EXTERNALSYM GROUP_SPECIALGRP_ADMINS}
  GROUP_SPECIALGRP_GUESTS = WideString('GUESTS');
  {$EXTERNALSYM GROUP_SPECIALGRP_GUESTS}
  GROUP_SPECIALGRP_LOCAL  = WideString('LOCAL');
  {$EXTERNALSYM GROUP_SPECIALGRP_LOCAL}

//
// parmnum manifests for SetInfo calls (only comment is settable)
//

  GROUP_ALL_PARMNUM        = 0;
  {$EXTERNALSYM GROUP_ALL_PARMNUM}
  GROUP_NAME_PARMNUM       = 1;
  {$EXTERNALSYM GROUP_NAME_PARMNUM}
  GROUP_COMMENT_PARMNUM    = 2;
  {$EXTERNALSYM GROUP_COMMENT_PARMNUM}
  GROUP_ATTRIBUTES_PARMNUM = 3;
  {$EXTERNALSYM GROUP_ATTRIBUTES_PARMNUM}

//
// the new infolevel counterparts of the old info level + parmnum
//

  GROUP_ALL_INFOLEVEL        = PARMNUM_BASE_INFOLEVEL + GROUP_ALL_PARMNUM;
  {$EXTERNALSYM GROUP_ALL_INFOLEVEL}
  GROUP_NAME_INFOLEVEL       = PARMNUM_BASE_INFOLEVEL + GROUP_NAME_PARMNUM;
  {$EXTERNALSYM GROUP_NAME_INFOLEVEL}
  GROUP_COMMENT_INFOLEVEL    = PARMNUM_BASE_INFOLEVEL + GROUP_COMMENT_PARMNUM;
  {$EXTERNALSYM GROUP_COMMENT_INFOLEVEL}
  GROUP_ATTRIBUTES_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + GROUP_ATTRIBUTES_PARMNUM;
  {$EXTERNALSYM GROUP_ATTRIBUTES_INFOLEVEL}
//  todo see GROUP_POSIX_ID_PARMNUM
//  GROUP_POSIX_ID_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + GROUP_POSIX_ID_PARMNUM;
//  {$EXTERNALSYM GROUP_POSIX_ID_INFOLEVEL}

//
// LocalGroup Class
//

//
// Function Prototypes
//

function NetLocalGroupAdd(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupAdd}

function NetLocalGroupAddMember(servername, groupname: LPCWSTR; membersid: PSID): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupAddMember}

function NetLocalGroupEnum(servername: LPCWSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD; resumehandle: PDWORD_PTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupEnum}

function NetLocalGroupGetInfo(servername, groupname: LPCWSTR; level: DWORD; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupGetInfo}

function NetLocalGroupSetInfo(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupSetInfo}

function NetLocalGroupDel(servername: LPCWSTR; groupname: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupDel}

function NetLocalGroupDelMember(servername: LPCWSTR; groupname: LPCWSTR; membersid: PSID): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupDelMember}

function NetLocalGroupGetMembers(servername, localgroupname: LPCWSTR; level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries: LPDWORD; resumehandle: PDWORD_PTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupGetMembers}

function NetLocalGroupSetMembers(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; totalentries: DWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupSetMembers}

function NetLocalGroupAddMembers(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; totalentries: DWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupAddMembers}

function NetLocalGroupDelMembers(servername, groupname: LPCWSTR; level: DWORD; buf: LPBYTE; totalentries: DWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetLocalGroupDelMembers}

//
//  Data Structures - LocalGroup
//

type
  LPLOCALGROUP_INFO_0 = ^LOCALGROUP_INFO_0;
  {$EXTERNALSYM LPLOCALGROUP_INFO_0}
  PLOCALGROUP_INFO_0 = ^LOCALGROUP_INFO_0;
  {$EXTERNALSYM PLOCALGROUP_INFO_0}
  _LOCALGROUP_INFO_0 = record
    lgrpi0_name: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_INFO_0}
  LOCALGROUP_INFO_0 = _LOCALGROUP_INFO_0;
  {$EXTERNALSYM LOCALGROUP_INFO_0}
  TLocalGroupInfo0 = LOCALGROUP_INFO_0;
  PLocalGroupInfo0 = PLOCALGROUP_INFO_0;

  LPLOCALGROUP_INFO_1 = ^LOCALGROUP_INFO_1;
  {$EXTERNALSYM LPLOCALGROUP_INFO_1}
  PLOCALGROUP_INFO_1 = ^LOCALGROUP_INFO_1;
  {$EXTERNALSYM PLOCALGROUP_INFO_1}
  _LOCALGROUP_INFO_1 = record
    lgrpi1_name: LPWSTR;
    lgrpi1_comment: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_INFO_1}
  LOCALGROUP_INFO_1 = _LOCALGROUP_INFO_1;
  {$EXTERNALSYM LOCALGROUP_INFO_1}
  TLocalGroupInfo1 = LOCALGROUP_INFO_1;
  PLocalGroupInfo1 = PLOCALGROUP_INFO_1;

  LPLOCALGROUP_INFO_1002 = ^LOCALGROUP_INFO_1002;
  {$EXTERNALSYM LPLOCALGROUP_INFO_1002}
  PLOCALGROUP_INFO_1002 = ^LOCALGROUP_INFO_1002;
  {$EXTERNALSYM PLOCALGROUP_INFO_1002}
  _LOCALGROUP_INFO_1002 = record
    lgrpi1002_comment: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_INFO_1002}
  LOCALGROUP_INFO_1002 = _LOCALGROUP_INFO_1002;
  {$EXTERNALSYM LOCALGROUP_INFO_1002}
  TLocalGroupInfo1002 = LOCALGROUP_INFO_1002;
  PLocalGroupInfo1002 = PLOCALGROUP_INFO_1002;

  LPLOCALGROUP_MEMBERS_INFO_0 = ^LOCALGROUP_MEMBERS_INFO_0;
  {$EXTERNALSYM LPLOCALGROUP_MEMBERS_INFO_0}
  PLOCALGROUP_MEMBERS_INFO_0 = ^LOCALGROUP_MEMBERS_INFO_0;
  {$EXTERNALSYM PLOCALGROUP_MEMBERS_INFO_0}
  _LOCALGROUP_MEMBERS_INFO_0 = record
    lgrmi0_sid: PSID;
  end;
  {$EXTERNALSYM _LOCALGROUP_MEMBERS_INFO_0}
  LOCALGROUP_MEMBERS_INFO_0 = _LOCALGROUP_MEMBERS_INFO_0;
  {$EXTERNALSYM LOCALGROUP_MEMBERS_INFO_0}
  TLocalGroupMembersInfo0 = LOCALGROUP_MEMBERS_INFO_0;
  PLocalGroupMembersInfo0 = PLOCALGROUP_MEMBERS_INFO_0;

  LPLOCALGROUP_MEMBERS_INFO_1 = ^LOCALGROUP_MEMBERS_INFO_1;
  {$EXTERNALSYM LPLOCALGROUP_MEMBERS_INFO_1}
  PLOCALGROUP_MEMBERS_INFO_1 = ^LOCALGROUP_MEMBERS_INFO_1;
  {$EXTERNALSYM PLOCALGROUP_MEMBERS_INFO_1}
  _LOCALGROUP_MEMBERS_INFO_1 = record
    lgrmi1_sid: PSID;
    lgrmi1_sidusage: SID_NAME_USE;
    lgrmi1_name: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_MEMBERS_INFO_1}
  LOCALGROUP_MEMBERS_INFO_1 = _LOCALGROUP_MEMBERS_INFO_1;
  {$EXTERNALSYM LOCALGROUP_MEMBERS_INFO_1}
  TLocalGroupMembersInfo1 = LOCALGROUP_MEMBERS_INFO_1;
  PLocalGroupMembersInfo1 = PLOCALGROUP_MEMBERS_INFO_1;

  LPLOCALGROUP_MEMBERS_INFO_2 = ^LOCALGROUP_MEMBERS_INFO_2;
  {$EXTERNALSYM LPLOCALGROUP_MEMBERS_INFO_2}
  PLOCALGROUP_MEMBERS_INFO_2 = ^LOCALGROUP_MEMBERS_INFO_2;
  {$EXTERNALSYM PLOCALGROUP_MEMBERS_INFO_2}
  _LOCALGROUP_MEMBERS_INFO_2 = record
    lgrmi2_sid: PSID;
    lgrmi2_sidusage: SID_NAME_USE;
    lgrmi2_domainandname: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_MEMBERS_INFO_2}
  LOCALGROUP_MEMBERS_INFO_2 = _LOCALGROUP_MEMBERS_INFO_2;
  {$EXTERNALSYM LOCALGROUP_MEMBERS_INFO_2}
  TLocalGroupMembersInfo2 = LOCALGROUP_MEMBERS_INFO_2;
  PLocalGroupMembersInfo2 = PLOCALGROUP_MEMBERS_INFO_2;

  LPLOCALGROUP_MEMBERS_INFO_3 = ^LOCALGROUP_MEMBERS_INFO_3;
  {$EXTERNALSYM LPLOCALGROUP_MEMBERS_INFO_3}
  PLOCALGROUP_MEMBERS_INFO_3 = ^LOCALGROUP_MEMBERS_INFO_3;
  {$EXTERNALSYM PLOCALGROUP_MEMBERS_INFO_3}
  _LOCALGROUP_MEMBERS_INFO_3 = record
    lgrmi3_domainandname: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_MEMBERS_INFO_3}
  LOCALGROUP_MEMBERS_INFO_3 = _LOCALGROUP_MEMBERS_INFO_3;
  {$EXTERNALSYM LOCALGROUP_MEMBERS_INFO_3}
  TLocalGroupMembersInfo3 = LOCALGROUP_MEMBERS_INFO_3;
  PLocalGroupMembersInfo3 = PLOCALGROUP_MEMBERS_INFO_3;

  LPLOCALGROUP_USERS_INFO_0 = ^LOCALGROUP_USERS_INFO_0;
  {$EXTERNALSYM LPLOCALGROUP_USERS_INFO_0}
  PLOCALGROUP_USERS_INFO_0 = ^LOCALGROUP_USERS_INFO_0;
  {$EXTERNALSYM PLOCALGROUP_USERS_INFO_0}
  _LOCALGROUP_USERS_INFO_0 = record
    lgrui0_name: LPWSTR;
  end;
  {$EXTERNALSYM _LOCALGROUP_USERS_INFO_0}
  LOCALGROUP_USERS_INFO_0 = _LOCALGROUP_USERS_INFO_0;
  {$EXTERNALSYM LOCALGROUP_USERS_INFO_0}
  TLocalGroupUsersInfo0 = LOCALGROUP_USERS_INFO_0;
  PLocalGroupUsersInfo0 = PLOCALGROUP_USERS_INFO_0;

const
  LOCALGROUP_NAME_PARMNUM    = 1;
  {$EXTERNALSYM LOCALGROUP_NAME_PARMNUM}
  LOCALGROUP_COMMENT_PARMNUM = 2;
  {$EXTERNALSYM LOCALGROUP_COMMENT_PARMNUM}

//
// Display Information APIs
//

function NetQueryDisplayInformation(ServerName: LPCWSTR; Level, Index, EntriesRequested, PreferredMaximumLength: DWORD; ReturnedEntryCount: LPDWORD; var SortedBuffer: PVOID): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetQueryDisplayInformation}

function NetGetDisplayInformationIndex(ServerName: LPCWSTR; Level: DWORD; Prefix: LPCWSTR; Index: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGetDisplayInformationIndex}

//
// QueryDisplayInformation levels

type
  PNET_DISPLAY_USER = ^NET_DISPLAY_USER;
  {$EXTERNALSYM PNET_DISPLAY_USER}
  _NET_DISPLAY_USER = record
    usri1_name: LPWSTR;
    usri1_comment: LPWSTR;
    usri1_flags: DWORD;
    usri1_full_name: LPWSTR;
    usri1_user_id: DWORD;
    usri1_next_index: DWORD;
  end;
  {$EXTERNALSYM _NET_DISPLAY_USER}
  NET_DISPLAY_USER = _NET_DISPLAY_USER;
  {$EXTERNALSYM NET_DISPLAY_USER}
  TNetDisplayUser = NET_DISPLAY_USER;
  PNetDisplayUser = PNET_DISPLAY_USER;

  PNET_DISPLAY_MACHINE = ^NET_DISPLAY_MACHINE;
  {$EXTERNALSYM PNET_DISPLAY_MACHINE}
  _NET_DISPLAY_MACHINE = record
    usri2_name: LPWSTR;
    usri2_comment: LPWSTR;
    usri2_flags: DWORD;
    usri2_user_id: DWORD;
    usri2_next_index: DWORD;
  end;
  {$EXTERNALSYM _NET_DISPLAY_MACHINE}
  NET_DISPLAY_MACHINE = _NET_DISPLAY_MACHINE;
  {$EXTERNALSYM NET_DISPLAY_MACHINE}
  TNetDisplayMachine = NET_DISPLAY_MACHINE;
  PNetDisplayMachine = PNET_DISPLAY_MACHINE;

  PNET_DISPLAY_GROUP = ^NET_DISPLAY_GROUP;
  {$EXTERNALSYM PNET_DISPLAY_GROUP}
  _NET_DISPLAY_GROUP = record
    grpi3_name: LPWSTR;
    grpi3_comment: LPWSTR;
    grpi3_group_id: DWORD;
    grpi3_attributes: DWORD;
    grpi3_next_index: DWORD;
  end;
  {$EXTERNALSYM _NET_DISPLAY_GROUP}
  NET_DISPLAY_GROUP = _NET_DISPLAY_GROUP;
  {$EXTERNALSYM NET_DISPLAY_GROUP}
  TNetDisplayGroup = NET_DISPLAY_GROUP;
  PNetDisplayGroup = PNET_DISPLAY_GROUP;

//
// Access Class
//

//
// Function Prototypes - Access
//
//
// The NetAccess APIs are only available to downlevel
//

//#define NetAccessAdd RxNetAccessAdd

function NetAccessAdd(servername: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessAdd}

//#define NetAccessEnum RxNetAccessEnum

function NetAccessEnum(servername, BasePath: LPCWSTR; Recursive, level: DWORD; var bufptr: LPBYTE; prefmaxlen: DWORD; entriesread, totalentries, resume_handle: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessEnum}

//#define NetAccessGetInfo RxNetAccessGetInfo

function NetAccessGetInfo(servername, resource: LPCWSTR; level: DWORD; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessGetInfo}

//#define NetAccessSetInfo RxNetAccessSetInfo

function NetAccessSetInfo(servername, resource: LPCWSTR; level: DWORD; buf: LPBYTE; parm_err: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessSetInfo}

//#define NetAccessDel RxNetAccessDel

function NetAccessDel(servername: LPCWSTR; resource: LPCWSTR): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessDel}

//#define NetAccessGetUserPerms RxNetAccessGetUserPerms

function NetAccessGetUserPerms(servername, UGname, resource: LPCWSTR; Perms: LPDWORD): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetAccessGetUserPerms}

//
// Data Structures - Access
//

type
  LPACCESS_INFO_0 = ^ACCESS_INFO_0;
  {$EXTERNALSYM LPACCESS_INFO_0}
  PACCESS_INFO_0 = ^ACCESS_INFO_0;
  {$EXTERNALSYM PACCESS_INFO_0}
  _ACCESS_INFO_0 = record
    acc0_resource_name: LPWSTR;
  end;
  {$EXTERNALSYM _ACCESS_INFO_0}
  ACCESS_INFO_0 = _ACCESS_INFO_0;
  {$EXTERNALSYM ACCESS_INFO_0}
  TAccessInfo0 = ACCESS_INFO_0;
  PAccessInfo0 = PACCESS_INFO_0;

  LPACCESS_INFO_1 = ^ACCESS_INFO_1;
  {$EXTERNALSYM LPACCESS_INFO_1}
  PACCESS_INFO_1 = ^ACCESS_INFO_1;
  {$EXTERNALSYM PACCESS_INFO_1}
  _ACCESS_INFO_1 = record
    acc1_resource_name: LPWSTR;
    acc1_attr: DWORD;
    acc1_count: DWORD;
  end;
  {$EXTERNALSYM _ACCESS_INFO_1}
  ACCESS_INFO_1 = _ACCESS_INFO_1;
  {$EXTERNALSYM ACCESS_INFO_1}
  TAccessInfo1 = ACCESS_INFO_1;
  PAccessInfo1 = PACCESS_INFO_1;

  LPACCESS_INFO_1002 = ^ACCESS_INFO_1002;
  {$EXTERNALSYM LPACCESS_INFO_1002}
  PACCESS_INFO_1002 = ^ACCESS_INFO_1002;
  {$EXTERNALSYM PACCESS_INFO_1002}
  _ACCESS_INFO_1002 = record
    acc1002_attr: DWORD;
  end;
  {$EXTERNALSYM _ACCESS_INFO_1002}
  ACCESS_INFO_1002 = _ACCESS_INFO_1002;
  {$EXTERNALSYM ACCESS_INFO_1002}
  TAccessInfo1002 = ACCESS_INFO_1002;
  PAccessInfo1002 = PACCESS_INFO_1002;

  LPACCESS_LIST = ^ACCESS_LIST;
  {$EXTERNALSYM LPACCESS_LIST}
  PACCESS_LIST = ^ACCESS_LIST;
  {$EXTERNALSYM PACCESS_LIST}
  _ACCESS_LIST = record
    acl_ugname: LPWSTR;
    acl_access: DWORD;
  end;
  {$EXTERNALSYM _ACCESS_LIST}
  ACCESS_LIST = _ACCESS_LIST;
  {$EXTERNALSYM ACCESS_LIST}
  TAccessList = ACCESS_LIST;
  PAccessList = PACCESS_LIST;

//
// Special Values and Constants - Access
//

//
// Maximum number of permission entries for each resource.
//

const
  MAXPERMENTRIES = 64;
  {$EXTERNALSYM MAXPERMENTRIES}

//
//  Bit values for the access permissions.  ACCESS_ALL is a handy
//  way to specify maximum permissions.  These are used in
//  acl_access field of access_list structures.
//

  ACCESS_READ   = $01;
  {$EXTERNALSYM ACCESS_READ}
  ACCESS_WRITE  = $02;
  {$EXTERNALSYM ACCESS_WRITE}
  ACCESS_CREATE = $04;
  {$EXTERNALSYM ACCESS_CREATE}
  ACCESS_EXEC   = $08;
  {$EXTERNALSYM ACCESS_EXEC}
  ACCESS_DELETE = $10;
  {$EXTERNALSYM ACCESS_DELETE}
  ACCESS_ATRIB  = $20;
  {$EXTERNALSYM ACCESS_ATRIB}
  ACCESS_PERM   = $40;
  {$EXTERNALSYM ACCESS_PERM}

  ACCESS_GROUP = $8000;
  {$EXTERNALSYM ACCESS_GROUP}

  ACCESS_NONE = 0;
  {$EXTERNALSYM ACCESS_NONE}
  ACCESS_ALL  = ACCESS_READ or ACCESS_WRITE or ACCESS_CREATE or ACCESS_EXEC or ACCESS_DELETE or ACCESS_ATRIB or ACCESS_PERM;
  {$EXTERNALSYM ACCESS_ALL}
  
//
// Bit values for the acc1_attr field of the ACCESS_INFO_1 structure.
//

  ACCESS_AUDIT = $1;
  {$EXTERNALSYM ACCESS_AUDIT}

  ACCESS_SUCCESS_OPEN   = $10;
  {$EXTERNALSYM ACCESS_SUCCESS_OPEN}
  ACCESS_SUCCESS_WRITE  = $20;
  {$EXTERNALSYM ACCESS_SUCCESS_WRITE}
  ACCESS_SUCCESS_DELETE = $40;
  {$EXTERNALSYM ACCESS_SUCCESS_DELETE}
  ACCESS_SUCCESS_ACL    = $80;
  {$EXTERNALSYM ACCESS_SUCCESS_ACL}
  ACCESS_SUCCESS_MASK   = $F0;
  {$EXTERNALSYM ACCESS_SUCCESS_MASK}

  ACCESS_FAIL_OPEN   = $100;
  {$EXTERNALSYM ACCESS_FAIL_OPEN}
  ACCESS_FAIL_WRITE  = $200;
  {$EXTERNALSYM ACCESS_FAIL_WRITE}
  ACCESS_FAIL_DELETE = $400;
  {$EXTERNALSYM ACCESS_FAIL_DELETE}
  ACCESS_FAIL_ACL    = $800;
  {$EXTERNALSYM ACCESS_FAIL_ACL}
  ACCESS_FAIL_MASK   = $F00;
  {$EXTERNALSYM ACCESS_FAIL_MASK}

  ACCESS_FAIL_SHIFT = 4;
  {$EXTERNALSYM ACCESS_FAIL_SHIFT}

//
// Parmnum value for NetAccessSetInfo.
//

  ACCESS_RESOURCE_NAME_PARMNUM = 1;
  {$EXTERNALSYM ACCESS_RESOURCE_NAME_PARMNUM}
  ACCESS_ATTR_PARMNUM          = 2;
  {$EXTERNALSYM ACCESS_ATTR_PARMNUM}
  ACCESS_COUNT_PARMNUM         = 3;
  {$EXTERNALSYM ACCESS_COUNT_PARMNUM}
  ACCESS_ACCESS_LIST_PARMNUM   = 4;
  {$EXTERNALSYM ACCESS_ACCESS_LIST_PARMNUM}

//
// the new infolevel counterparts of the old info level + parmnum
//

  ACCESS_RESOURCE_NAME_INFOLEVEL = PARMNUM_BASE_INFOLEVEL + ACCESS_RESOURCE_NAME_PARMNUM;
  {$EXTERNALSYM ACCESS_RESOURCE_NAME_INFOLEVEL}
  ACCESS_ATTR_INFOLEVEL          = PARMNUM_BASE_INFOLEVEL + ACCESS_ATTR_PARMNUM;
  {$EXTERNALSYM ACCESS_ATTR_INFOLEVEL}
  ACCESS_COUNT_INFOLEVEL         = PARMNUM_BASE_INFOLEVEL + ACCESS_COUNT_PARMNUM;
  {$EXTERNALSYM ACCESS_COUNT_INFOLEVEL}
  ACCESS_ACCESS_LIST_INFOLEVEL   = PARMNUM_BASE_INFOLEVEL + ACCESS_ACCESS_LIST_PARMNUM;
  {$EXTERNALSYM ACCESS_ACCESS_LIST_INFOLEVEL}

//
// ACCESS_LETTERS defines a letter for each bit position in
// the acl_access field of struct access_list.  Note that some
// bits have a corresponding letter of ' ' (space).
//

  ACCESS_LETTERS = 'RWCXDAP         ';
  {$EXTERNALSYM ACCESS_LETTERS}

//    ********************************
//
//    Password Checking API structures
//
//    ********************************

//
//    What kind of password checking is to be performed?
//        NetValidateAuthentication : Check if the authentication can be done
//        NetValidatePasswordChange: Check if the password can be changed
//        NetValidatePasswordReset: Reset the password to the given value
//

type
  _NET_VALIDATE_PASSWORD_TYPE = (
    NetValidateFiller0,
    NetValidateAuthentication,
    NetValidatePasswordChange,
    NetValidatePasswordReset);
  {$EXTERNALSYM _NET_VALIDATE_PASSWORD_TYPE}
  NET_VALIDATE_PASSWORD_TYPE = _NET_VALIDATE_PASSWORD_TYPE;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_TYPE}
  PNET_VALIDATE_PASSWORD_TYPE = ^NET_VALIDATE_PASSWORD_TYPE;
  {$EXTERNALSYM PNET_VALIDATE_PASSWORD_TYPE}
  TNetValidatePasswordType = NET_VALIDATE_PASSWORD_TYPE;
  PNetValidatePasswordType = PNET_VALIDATE_PASSWORD_TYPE;

//
//    Structure to keep the password hash
//

  _NET_VALIDATE_PASSWORD_HASH = record
    Length: ULONG;
    Hash: LPBYTE;
  end;
  {$EXTERNALSYM _NET_VALIDATE_PASSWORD_HASH}
  NET_VALIDATE_PASSWORD_HASH = _NET_VALIDATE_PASSWORD_HASH;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_HASH}
  PNET_VALIDATE_PASSWORD_HASH = ^NET_VALIDATE_PASSWORD_HASH;
  {$EXTERNALSYM PNET_VALIDATE_PASSWORD_HASH}
  TNetValidatePasswordHash = NET_VALIDATE_PASSWORD_HASH;
  PNetValidatePasswordHash = PNET_VALIDATE_PASSWORD_HASH;

// To be used with PresentFields member of NET_VALIDATE_PERSISTED_FIELDS

const
  NET_VALIDATE_PASSWORD_LAST_SET         = $00000001;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_LAST_SET}
  NET_VALIDATE_BAD_PASSWORD_TIME         = $00000002;
  {$EXTERNALSYM NET_VALIDATE_BAD_PASSWORD_TIME}
  NET_VALIDATE_LOCKOUT_TIME              = $00000004;
  {$EXTERNALSYM NET_VALIDATE_LOCKOUT_TIME}
  NET_VALIDATE_BAD_PASSWORD_COUNT        = $00000008;
  {$EXTERNALSYM NET_VALIDATE_BAD_PASSWORD_COUNT}
  NET_VALIDATE_PASSWORD_HISTORY_LENGTH   = $00000010;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_HISTORY_LENGTH}
  NET_VALIDATE_PASSWORD_HISTORY          = $00000020;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_HISTORY}

//
//    Structure to keep information about the password and related things.
//        Present Fields: (used only in output args) which fields are changed.
//            See the constants above.
//        PasswordLastSet: When the password is last set.
//        BadPasswordTime: When the password was incorrect for the last time.
//        LockoutTime: When the account is locked out. If the account is not locked out
//            it is 0.
//        BadPasswordCount: How many times the password has given incorrectly in the
//            Observation Window.
//        PasswordHistoryLength: How many passwords are kept in the history
//        PasswordHistory: Password hashes that are in the history
//

type
  _NET_VALIDATE_PERSISTED_FIELDS = record
    PresentFields: ULONG;
    PasswordLastSet: FILETIME;
    BadPasswordTime: FILETIME;
    LockoutTime: FILETIME;
    BadPasswordCount: ULONG;
    PasswordHistoryLength: ULONG;
    PasswordHistory: PNET_VALIDATE_PASSWORD_HASH;
  end;
  {$EXTERNALSYM _NET_VALIDATE_PERSISTED_FIELDS}
  NET_VALIDATE_PERSISTED_FIELDS = _NET_VALIDATE_PERSISTED_FIELDS;
  {$EXTERNALSYM NET_VALIDATE_PERSISTED_FIELDS}
  PNET_VALIDATE_PERSISTED_FIELDS = ^NET_VALIDATE_PERSISTED_FIELDS;
  {$EXTERNALSYM PNET_VALIDATE_PERSISTED_FIELDS}
  TNetValidatePersistedFields = NET_VALIDATE_PERSISTED_FIELDS;
  PNetValidatePersistedFields = PNET_VALIDATE_PERSISTED_FIELDS;

//
//    Output Arg
//        ChangedPersistedFields: Any changes to the password related info
//        ValidationStatus: Shows the result of the request
//

  _NET_VALIDATE_OUTPUT_ARG = record
    ChangedPersistedFields: NET_VALIDATE_PERSISTED_FIELDS;
    ValidationStatus: NET_API_STATUS;
  end;
  {$EXTERNALSYM _NET_VALIDATE_OUTPUT_ARG}
  NET_VALIDATE_OUTPUT_ARG = _NET_VALIDATE_OUTPUT_ARG;
  {$EXTERNALSYM NET_VALIDATE_OUTPUT_ARG}
  PNET_VALIDATE_OUTPUT_ARG = ^NET_VALIDATE_OUTPUT_ARG;
  {$EXTERNALSYM PNET_VALIDATE_OUTPUT_ARG}
  TNetValidateOutputArg = NET_VALIDATE_OUTPUT_ARG;
  PNetValidateOutputArg = PNET_VALIDATE_OUTPUT_ARG;  

//
//    If authentication type of password check is to be made,
//        this kind of input must be used
//        
//    InputPersistedFields: Information about the account to be logged into
//    PasswordMatched: Indicates the result of the application's authentication of the supplied password 
//

  _NET_VALIDATE_AUTHENTICATION_INPUT_ARG = record
    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS;
    PasswordMatched: BOOLEAN;
  end;
  {$EXTERNALSYM _NET_VALIDATE_AUTHENTICATION_INPUT_ARG}
  NET_VALIDATE_AUTHENTICATION_INPUT_ARG = _NET_VALIDATE_AUTHENTICATION_INPUT_ARG;
  {$EXTERNALSYM NET_VALIDATE_AUTHENTICATION_INPUT_ARG}
  PNET_VALIDATE_AUTHENTICATION_INPUT_ARG = ^NET_VALIDATE_AUTHENTICATION_INPUT_ARG;
  {$EXTERNALSYM PNET_VALIDATE_AUTHENTICATION_INPUT_ARG}
  TNetValidateAuthenticationInputArg = NET_VALIDATE_AUTHENTICATION_INPUT_ARG;
  PNetValidateAuthenticationInputArg = PNET_VALIDATE_AUTHENTICATION_INPUT_ARG;

//
//    If password change type of check is to be made,
//        this kind of input must be used
//
//    InputPersistedFields: Information about the account to be logged into
//    ClearPassword: The string which password is going to be
//    UserAccountName: Name of the user account
//    HashedPassword: Hash of the string that the password is going to be
//    PasswordMatch: denotes if the old password supplied by user matched or not
//

  _NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG = record
    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS;
    ClearPassword: LPWSTR;
    UserAccountName: LPWSTR;
    HashedPassword: NET_VALIDATE_PASSWORD_HASH;
    PasswordMatch: BOOLEAN;
  end;
  {$EXTERNALSYM _NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG}
  NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG = _NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG}
  PNET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG = ^NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;
  {$EXTERNALSYM PNET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG}
  TNetValidatePasswordChangeInputArg = NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;
  PNetValidatePasswordChangeInputArg = PNET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG;

//
//    If password reset type of check is to be made,
//        this kind of input must be used
//
//    InputPersistedFields: Information about the account to be logged into
//    ClearPassword: The string which password is going to be
//    UserAccountName: Name of the user account
//    HashedPassword: Hash of the string that the password is going to be
//    PasswordMustChangeAtNextLogon: Password must change for the user to be logged in
//    ClearLockout: If the account was locked out, this field can be used to clear lockout
//

  _NET_VALIDATE_PASSWORD_RESET_INPUT_ARG = record
    InputPersistedFields: NET_VALIDATE_PERSISTED_FIELDS;
    ClearPassword: LPWSTR;
    UserAccountName: LPWSTR;
    HashedPassword: NET_VALIDATE_PASSWORD_HASH;
    PasswordMustChangeAtNextLogon: BOOLEAN;
    ClearLockout: BOOLEAN;
  end;
  {$EXTERNALSYM _NET_VALIDATE_PASSWORD_RESET_INPUT_ARG}
  NET_VALIDATE_PASSWORD_RESET_INPUT_ARG = _NET_VALIDATE_PASSWORD_RESET_INPUT_ARG;
  {$EXTERNALSYM NET_VALIDATE_PASSWORD_RESET_INPUT_ARG}
  PNET_VALIDATE_PASSWORD_RESET_INPUT_ARG = ^NET_VALIDATE_PASSWORD_RESET_INPUT_ARG;
  {$EXTERNALSYM PNET_VALIDATE_PASSWORD_RESET_INPUT_ARG}
  TNetValidatePasswordResetInputArg = NET_VALIDATE_PASSWORD_RESET_INPUT_ARG;
  PNetValidatePasswordResetInputArg = PNET_VALIDATE_PASSWORD_RESET_INPUT_ARG;  

//
//    Password Checking API structures end here
//

function NetValidatePasswordPolicy(ServerName: LPWSTR; Qualifier: LPVOID; ValidationType: NET_VALIDATE_PASSWORD_TYPE;
  InputArg: LPVOID; var OutputArg: LPVOID): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetValidatePasswordPolicy}

function NetValidatePasswordPolicyFree(var OutputArg: LPVOID): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetValidatePasswordPolicyFree}

//
// Domain Class
//

//
// Function Prototypes - Domain
//

function NetGetDCName(servername, domainname: LPCWSTR; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGetDCName}

function NetGetAnyDCName(servername, domainname: LPCWSTR; var bufptr: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM NetGetAnyDCName}

function I_NetLogonControl(ServerName: LPCWSTR; FunctionCode, QueryLevel: DWORD; var Buffer: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM I_NetLogonControl}

function I_NetLogonControl2(ServerName: LPCWSTR; FunctionCode, QueryLevel: DWORD; Data: LPBYTE; var Buffer: LPBYTE): NET_API_STATUS; stdcall;
{$EXTERNALSYM I_NetLogonControl2}

function NetEnumerateTrustedDomains(ServerName: LPWSTR; var DomainNames: LPWSTR): NTSTATUS; stdcall;
{$EXTERNALSYM NetEnumerateTrustedDomains}

//
// Special Values and Constants - Domain
//

//
// FunctionCode values for I_NetLogonControl.
//
// NOTE : if you change the following NETLOGON_CONTROL_* values,
// change them in net\svcdlls\logonsrv\logon.idl file also.
//

const
  NETLOGON_CONTROL_QUERY            = 1; // No-op: just query
  {$EXTERNALSYM NETLOGON_CONTROL_QUERY}
  NETLOGON_CONTROL_REPLICATE        = 2; // Force replicate on BDC
  {$EXTERNALSYM NETLOGON_CONTROL_REPLICATE}
  NETLOGON_CONTROL_SYNCHRONIZE      = 3; // Force synchronize on BDC
  {$EXTERNALSYM NETLOGON_CONTROL_SYNCHRONIZE}
  NETLOGON_CONTROL_PDC_REPLICATE    = 4; // Force PDC to broadcast change
  {$EXTERNALSYM NETLOGON_CONTROL_PDC_REPLICATE}
  NETLOGON_CONTROL_REDISCOVER       = 5; // Force to re-discover trusted domain DCs
  {$EXTERNALSYM NETLOGON_CONTROL_REDISCOVER}
  NETLOGON_CONTROL_TC_QUERY         = 6; // Query status of specified trusted channel status
  {$EXTERNALSYM NETLOGON_CONTROL_TC_QUERY}
  NETLOGON_CONTROL_TRANSPORT_NOTIFY = 7; // Notify netlogon that a new transport has come online
  {$EXTERNALSYM NETLOGON_CONTROL_TRANSPORT_NOTIFY}
  NETLOGON_CONTROL_FIND_USER        = 8; // Find named user in a trusted domain
  {$EXTERNALSYM NETLOGON_CONTROL_FIND_USER}
  NETLOGON_CONTROL_CHANGE_PASSWORD  = 9; // Change machine password on a secure channel to a trusted domain
  {$EXTERNALSYM NETLOGON_CONTROL_CHANGE_PASSWORD}
  NETLOGON_CONTROL_TC_VERIFY        = 10; // Verify status of specified trusted channel
  {$EXTERNALSYM NETLOGON_CONTROL_TC_VERIFY}
  NETLOGON_CONTROL_FORCE_DNS_REG    = 11; // Force DNS re-registration of all registered records
  {$EXTERNALSYM NETLOGON_CONTROL_FORCE_DNS_REG}
  NETLOGON_CONTROL_QUERY_DNS_REG    = 12; // Query the status of DNS updates
  {$EXTERNALSYM NETLOGON_CONTROL_QUERY_DNS_REG}

// Debug function codes

  NETLOGON_CONTROL_UNLOAD_NETLOGON_DLL = $FFFB;
  {$EXTERNALSYM NETLOGON_CONTROL_UNLOAD_NETLOGON_DLL}
  NETLOGON_CONTROL_BACKUP_CHANGE_LOG   = $FFFC;
  {$EXTERNALSYM NETLOGON_CONTROL_BACKUP_CHANGE_LOG}
  NETLOGON_CONTROL_TRUNCATE_LOG        = $FFFD;
  {$EXTERNALSYM NETLOGON_CONTROL_TRUNCATE_LOG}
  NETLOGON_CONTROL_SET_DBFLAG          = $FFFE;
  {$EXTERNALSYM NETLOGON_CONTROL_SET_DBFLAG}
  NETLOGON_CONTROL_BREAKPOINT          = $FFFF;
  {$EXTERNALSYM NETLOGON_CONTROL_BREAKPOINT}

//
// Query level 1 for I_NetLogonControl
//

type
  PNETLOGON_INFO_1 = ^NETLOGON_INFO_1;
  {$EXTERNALSYM PNETLOGON_INFO_1}
  _NETLOGON_INFO_1 = record
    netlog1_flags: DWORD;
    netlog1_pdc_connection_status: NET_API_STATUS;
  end;
  {$EXTERNALSYM _NETLOGON_INFO_1}
  NETLOGON_INFO_1 = _NETLOGON_INFO_1;
  {$EXTERNALSYM NETLOGON_INFO_1}
  TNetLogonInfo1 = NETLOGON_INFO_1;
  PNetLogonInfo1 = PNETLOGON_INFO_1;

  PNETLOGON_INFO_2 = ^NETLOGON_INFO_2;
  {$EXTERNALSYM PNETLOGON_INFO_2}
  _NETLOGON_INFO_2 = record
    netlog2_flags: DWORD;
    //
    // If NETLOGON_VERIFY_STATUS_RETURNED bit is set in
    //  netlog2_flags, the following field will return
    //  the status of trust verification. Otherwise,
    //  the field will return the status of the secure
    //  channel to the primary domain of the machine
    //  (useful for BDCs only).
    //
    netlog2_pdc_connection_status: NET_API_STATUS;
    netlog2_trusted_dc_name: LPWSTR;
    netlog2_tc_connection_status: NET_API_STATUS;
  end;
  {$EXTERNALSYM _NETLOGON_INFO_2}
  NETLOGON_INFO_2 = _NETLOGON_INFO_2;
  {$EXTERNALSYM NETLOGON_INFO_2}
  TNetLogonInfo2 = NETLOGON_INFO_2;
  PNetLogonInfo2 = PNETLOGON_INFO_2;

  PNETLOGON_INFO_3 = ^NETLOGON_INFO_3;
  {$EXTERNALSYM PNETLOGON_INFO_3}
  _NETLOGON_INFO_3 = record
    netlog3_flags: DWORD;
    netlog3_logon_attempts: DWORD;
    netlog3_reserved1: DWORD;
    netlog3_reserved2: DWORD;
    netlog3_reserved3: DWORD;
    netlog3_reserved4: DWORD;
    netlog3_reserved5: DWORD;
  end;
  {$EXTERNALSYM _NETLOGON_INFO_3}
  NETLOGON_INFO_3 = _NETLOGON_INFO_3;
  {$EXTERNALSYM NETLOGON_INFO_3}
  TNetLogonInfo3 = NETLOGON_INFO_3;
  PNetLogonInfo3 = PNETLOGON_INFO_3;

  PNETLOGON_INFO_4 = ^NETLOGON_INFO_4;
  {$EXTERNALSYM PNETLOGON_INFO_4}
  _NETLOGON_INFO_4 = record
    netlog4_trusted_dc_name: LPWSTR;
    netlog4_trusted_domain_name: LPWSTR;
  end;
  {$EXTERNALSYM _NETLOGON_INFO_4}
  NETLOGON_INFO_4 = _NETLOGON_INFO_4;
  {$EXTERNALSYM NETLOGON_INFO_4}
  TNetLogonInfo4 = NETLOGON_INFO_4;
  PNetLogonInfo4 = PNETLOGON_INFO_4;

//
// Values of netlog1_flags
//

const
  NETLOGON_REPLICATION_NEEDED      = $01; // Database is out of date
  {$EXTERNALSYM NETLOGON_REPLICATION_NEEDED}
  NETLOGON_REPLICATION_IN_PROGRESS = $02; // Replication is happening now
  {$EXTERNALSYM NETLOGON_REPLICATION_IN_PROGRESS}
  NETLOGON_FULL_SYNC_REPLICATION   = $04; // full sync replication required/progress
  {$EXTERNALSYM NETLOGON_FULL_SYNC_REPLICATION}
  NETLOGON_REDO_NEEDED             = $08; // Redo of previous replication needed
  {$EXTERNALSYM NETLOGON_REDO_NEEDED}
  NETLOGON_HAS_IP                  = $10; // The trusted domain DC has an IP address
  {$EXTERNALSYM NETLOGON_HAS_IP}
  NETLOGON_HAS_TIMESERV            = $20; // The trusted domain DC runs the Windows Time Service
  {$EXTERNALSYM NETLOGON_HAS_TIMESERV}
  NETLOGON_DNS_UPDATE_FAILURE      = $40; // There was a failure in the last update for one of the DNS records
  {$EXTERNALSYM NETLOGON_DNS_UPDATE_FAILURE}
  NETLOGON_VERIFY_STATUS_RETURNED  = $80; // Trust verification status returned in netlog2_pdc_connection_status
  {$EXTERNALSYM NETLOGON_VERIFY_STATUS_RETURNED}

{$ENDIF JWA_INTERFACESECTION}

{$IFNDEF JWA_INCLUDEMODE}

implementation

uses
  JwaWinDLLNames;

{$ENDIF !JWA_INCLUDEMODE}

{$IFDEF JWA_IMPLEMENTATIONSECTION}

{$IFDEF DYNAMIC_LINK}

var
  _NetUserAdd: Pointer;

function NetUserAdd;
begin
  GetProcedureAddress(_NetUserAdd, netapi32, 'NetUserAdd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserAdd]
  end;
end;

var
  _NetUserEnum: Pointer;

function NetUserEnum;
begin
  GetProcedureAddress(_NetUserEnum, netapi32, 'NetUserEnum');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserEnum]
  end;
end;

var
  _NetUserGetInfo: Pointer;

function NetUserGetInfo;
begin
  GetProcedureAddress(_NetUserGetInfo, netapi32, 'NetUserGetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserGetInfo]
  end;
end;

var
  _NetUserSetInfo: Pointer;

function NetUserSetInfo;
begin
  GetProcedureAddress(_NetUserSetInfo, netapi32, 'NetUserSetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserSetInfo]
  end;
end;

var
  _NetUserDel: Pointer;

function NetUserDel;
begin
  GetProcedureAddress(_NetUserDel, netapi32, 'NetUserDel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserDel]
  end;
end;

var
  _NetUserGetGroups: Pointer;

function NetUserGetGroups;
begin
  GetProcedureAddress(_NetUserGetGroups, netapi32, 'NetUserGetGroups');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserGetGroups]
  end;
end;

var
  _NetUserSetGroups: Pointer;

function NetUserSetGroups;
begin
  GetProcedureAddress(_NetUserSetGroups, netapi32, 'NetUserSetGroups');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserSetGroups]
  end;
end;

var
  _NetUserGetLocalGroups: Pointer;

function NetUserGetLocalGroups;
begin
  GetProcedureAddress(_NetUserGetLocalGroups, netapi32, 'NetUserGetLocalGroups');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserGetLocalGroups]
  end;
end;

var
  _NetUserModalsGet: Pointer;

function NetUserModalsGet;
begin
  GetProcedureAddress(_NetUserModalsGet, netapi32, 'NetUserModalsGet');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserModalsGet]
  end;
end;

var
  _NetUserModalsSet: Pointer;

function NetUserModalsSet;
begin
  GetProcedureAddress(_NetUserModalsSet, netapi32, 'NetUserModalsSet');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserModalsSet]
  end;
end;

var
  _NetUserChangePassword: Pointer;

function NetUserChangePassword;
begin
  GetProcedureAddress(_NetUserChangePassword, netapi32, 'NetUserChangePassword');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetUserChangePassword]
  end;
end;

var
  _NetGroupAdd: Pointer;

function NetGroupAdd;
begin
  GetProcedureAddress(_NetGroupAdd, netapi32, 'NetGroupAdd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupAdd]
  end;
end;

var
  _NetGroupAddUser: Pointer;

function NetGroupAddUser;
begin
  GetProcedureAddress(_NetGroupAddUser, netapi32, 'NetGroupAddUser');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupAddUser]
  end;
end;

var
  _NetGroupEnum: Pointer;

function NetGroupEnum;
begin
  GetProcedureAddress(_NetGroupEnum, netapi32, 'NetGroupEnum');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupEnum]
  end;
end;

var
  _NetGroupGetInfo: Pointer;

function NetGroupGetInfo;
begin
  GetProcedureAddress(_NetGroupGetInfo, netapi32, 'NetGroupGetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupGetInfo]
  end;
end;

var
  _NetGroupSetInfo: Pointer;

function NetGroupSetInfo;
begin
  GetProcedureAddress(_NetGroupSetInfo, netapi32, 'NetGroupSetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupSetInfo]
  end;
end;

var
  _NetGroupDel: Pointer;

function NetGroupDel;
begin
  GetProcedureAddress(_NetGroupDel, netapi32, 'NetGroupDel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupDel]
  end;
end;

var
  _NetGroupDelUser: Pointer;

function NetGroupDelUser;
begin
  GetProcedureAddress(_NetGroupDelUser, netapi32, 'NetGroupDelUser');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupDelUser]
  end;
end;

var
  _NetGroupGetUsers: Pointer;

function NetGroupGetUsers;
begin
  GetProcedureAddress(_NetGroupGetUsers, netapi32, 'NetGroupGetUsers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupGetUsers]
  end;
end;

var
  _NetGroupSetUsers: Pointer;

function NetGroupSetUsers;
begin
  GetProcedureAddress(_NetGroupSetUsers, netapi32, 'NetGroupSetUsers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGroupSetUsers]
  end;
end;

var
  _NetLocalGroupAdd: Pointer;

function NetLocalGroupAdd;
begin
  GetProcedureAddress(_NetLocalGroupAdd, netapi32, 'NetLocalGroupAdd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupAdd]
  end;
end;

var
  _NetLocalGroupAddMember: Pointer;

function NetLocalGroupAddMember;
begin
  GetProcedureAddress(_NetLocalGroupAddMember, netapi32, 'NetLocalGroupAddMember');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupAddMember]
  end;
end;

var
  _NetLocalGroupEnum: Pointer;

function NetLocalGroupEnum;
begin
  GetProcedureAddress(_NetLocalGroupEnum, netapi32, 'NetLocalGroupEnum');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupEnum]
  end;
end;

var
  _NetLocalGroupGetInfo: Pointer;

function NetLocalGroupGetInfo;
begin
  GetProcedureAddress(_NetLocalGroupGetInfo, netapi32, 'NetLocalGroupGetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupGetInfo]
  end;
end;

var
  _NetLocalGroupSetInfo: Pointer;

function NetLocalGroupSetInfo;
begin
  GetProcedureAddress(_NetLocalGroupSetInfo, netapi32, 'NetLocalGroupSetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupSetInfo]
  end;
end;

var
  _NetLocalGroupDel: Pointer;

function NetLocalGroupDel;
begin
  GetProcedureAddress(_NetLocalGroupDel, netapi32, 'NetLocalGroupDel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupDel]
  end;
end;

var
  _NetLocalGroupDelMember: Pointer;

function NetLocalGroupDelMember;
begin
  GetProcedureAddress(_NetLocalGroupDelMember, netapi32, 'NetLocalGroupDelMember');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupDelMember]
  end;
end;

var
  _NetLocalGroupGetMembers: Pointer;

function NetLocalGroupGetMembers;
begin
  GetProcedureAddress(_NetLocalGroupGetMembers, netapi32, 'NetLocalGroupGetMembers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupGetMembers]
  end;
end;

var
  _NetLocalGroupSetMembers: Pointer;

function NetLocalGroupSetMembers;
begin
  GetProcedureAddress(_NetLocalGroupSetMembers, netapi32, 'NetLocalGroupSetMembers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupSetMembers]
  end;
end;

var
  _NetLocalGroupAddMembers: Pointer;

function NetLocalGroupAddMembers;
begin
  GetProcedureAddress(_NetLocalGroupAddMembers, netapi32, 'NetLocalGroupAddMembers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupAddMembers]
  end;
end;

var
  _NetLocalGroupDelMembers: Pointer;

function NetLocalGroupDelMembers;
begin
  GetProcedureAddress(_NetLocalGroupDelMembers, netapi32, 'NetLocalGroupDelMembers');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetLocalGroupDelMembers]
  end;
end;

var
  _NetQueryDisplayInformation: Pointer;

function NetQueryDisplayInformation;
begin
  GetProcedureAddress(_NetQueryDisplayInformation, netapi32, 'NetQueryDisplayInformation');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetQueryDisplayInformation]
  end;
end;

var
  _NetGetDisplayInformationIndex: Pointer;

function NetGetDisplayInformationIndex;
begin
  GetProcedureAddress(_NetGetDisplayInformationIndex, netapi32, 'NetGetDisplayInformationIndex');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGetDisplayInformationIndex]
  end;
end;

var
  _NetAccessAdd: Pointer;

function NetAccessAdd;
begin
  GetProcedureAddress(_NetAccessAdd, netapi32, 'NetAccessAdd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessAdd]
  end;
end;

var
  _NetAccessEnum: Pointer;

function NetAccessEnum;
begin
  GetProcedureAddress(_NetAccessEnum, netapi32, 'NetAccessEnum');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessEnum]
  end;
end;

var
  _NetAccessGetInfo: Pointer;

function NetAccessGetInfo;
begin
  GetProcedureAddress(_NetAccessGetInfo, netapi32, 'NetAccessGetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessGetInfo]
  end;
end;

var
  _NetAccessSetInfo: Pointer;

function NetAccessSetInfo;
begin
  GetProcedureAddress(_NetAccessSetInfo, netapi32, 'NetAccessSetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessSetInfo]
  end;
end;

var
  _NetAccessDel: Pointer;

function NetAccessDel;
begin
  GetProcedureAddress(_NetAccessDel, netapi32, 'NetAccessDel');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessDel]
  end;
end;

var
  _NetAccessGetUserPerms: Pointer;

function NetAccessGetUserPerms;
begin
  GetProcedureAddress(_NetAccessGetUserPerms, netapi32, 'NetAccessGetUserPerms');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetAccessGetUserPerms]
  end;
end;

var
  _NetValidatePasswordPolicy: Pointer;

function NetValidatePasswordPolicy;
begin
  GetProcedureAddress(_NetValidatePasswordPolicy, netapi32, 'NetValidatePasswordPolicy');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetValidatePasswordPolicy]
  end;
end;

var
  _NetValidatePasswordPolicyFree: Pointer;

function NetValidatePasswordPolicyFree;
begin
  GetProcedureAddress(_NetValidatePasswordPolicyFree, netapi32, 'NetValidatePasswordPolicyFree');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetValidatePasswordPolicyFree]
  end;
end;

var
  _NetGetDCName: Pointer;

function NetGetDCName;
begin
  GetProcedureAddress(_NetGetDCName, netapi32, 'NetGetDCName');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGetDCName]
  end;
end;

var
  _NetGetAnyDCName: Pointer;

function NetGetAnyDCName;
begin
  GetProcedureAddress(_NetGetAnyDCName, netapi32, 'NetGetAnyDCName');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetGetAnyDCName]
  end;
end;

var
  _I_NetLogonControl: Pointer;

function I_NetLogonControl;
begin
  GetProcedureAddress(_I_NetLogonControl, netapi32, 'I_NetLogonControl');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_I_NetLogonControl]
  end;
end;

var
  _I_NetLogonControl2: Pointer;

function I_NetLogonControl2;
begin
  GetProcedureAddress(_I_NetLogonControl2, netapi32, 'I_NetLogonControl2');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_I_NetLogonControl2]
  end;
end;

var
  _NetEnumerateTrustedDomains: Pointer;

function NetEnumerateTrustedDomains;
begin
  GetProcedureAddress(_NetEnumerateTrustedDomains, netapi32, 'NetEnumerateTrustedDomains');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_NetEnumerateTrustedDomains]
  end;
end;

{$ELSE}

function NetUserAdd; external netapi32 name 'NetUserAdd';
function NetUserEnum; external netapi32 name 'NetUserEnum';
function NetUserGetInfo; external netapi32 name 'NetUserGetInfo';
function NetUserSetInfo; external netapi32 name 'NetUserSetInfo';
function NetUserDel; external netapi32 name 'NetUserDel';
function NetUserGetGroups; external netapi32 name 'NetUserGetGroups';
function NetUserSetGroups; external netapi32 name 'NetUserSetGroups';
function NetUserGetLocalGroups; external netapi32 name 'NetUserGetLocalGroups';
function NetUserModalsGet; external netapi32 name 'NetUserModalsGet';
function NetUserModalsSet; external netapi32 name 'NetUserModalsSet';
function NetUserChangePassword; external netapi32 name 'NetUserChangePassword';
function NetGroupAdd; external netapi32 name 'NetGroupAdd';
function NetGroupAddUser; external netapi32 name 'NetGroupAddUser';
function NetGroupEnum; external netapi32 name 'NetGroupEnum';
function NetGroupGetInfo; external netapi32 name 'NetGroupGetInfo';
function NetGroupSetInfo; external netapi32 name 'NetGroupSetInfo';
function NetGroupDel; external netapi32 name 'NetGroupDel';
function NetGroupDelUser; external netapi32 name 'NetGroupDelUser';
function NetGroupGetUsers; external netapi32 name 'NetGroupGetUsers';
function NetGroupSetUsers; external netapi32 name 'NetGroupSetUsers';
function NetLocalGroupAdd; external netapi32 name 'NetLocalGroupAdd';
function NetLocalGroupAddMember; external netapi32 name 'NetLocalGroupAddMember';
function NetLocalGroupEnum; external netapi32 name 'NetLocalGroupEnum';
function NetLocalGroupGetInfo; external netapi32 name 'NetLocalGroupGetInfo';
function NetLocalGroupSetInfo; external netapi32 name 'NetLocalGroupSetInfo';
function NetLocalGroupDel; external netapi32 name 'NetLocalGroupDel';
function NetLocalGroupDelMember; external netapi32 name 'NetLocalGroupDelMember';
function NetLocalGroupGetMembers; external netapi32 name 'NetLocalGroupGetMembers';
function NetLocalGroupSetMembers; external netapi32 name 'NetLocalGroupSetMembers';
function NetLocalGroupAddMembers; external netapi32 name 'NetLocalGroupAddMembers';
function NetLocalGroupDelMembers; external netapi32 name 'NetLocalGroupDelMembers';
function NetQueryDisplayInformation; external netapi32 name 'NetQueryDisplayInformation';
function NetGetDisplayInformationIndex; external netapi32 name 'NetGetDisplayInformationIndex';
function NetAccessAdd; external netapi32 name 'NetAccessAdd';
function NetAccessEnum; external netapi32 name 'NetAccessEnum';
function NetAccessGetInfo; external netapi32 name 'NetAccessGetInfo';
function NetAccessSetInfo; external netapi32 name 'NetAccessSetInfo';
function NetAccessDel; external netapi32 name 'NetAccessDel';
function NetAccessGetUserPerms; external netapi32 name 'NetAccessGetUserPerms';
function NetValidatePasswordPolicy; external netapi32 name 'NetValidatePasswordPolicy';
function NetValidatePasswordPolicyFree; external netapi32 name 'NetValidatePasswordPolicyFree';
function NetGetDCName; external netapi32 name 'NetGetDCName';
function NetGetAnyDCName; external netapi32 name 'NetGetAnyDCName';
function I_NetLogonControl; external netapi32 name 'I_NetLogonControl';
function I_NetLogonControl2; external netapi32 name 'I_NetLogonControl2';
function NetEnumerateTrustedDomains; external netapi32 name 'NetEnumerateTrustedDomains';

{$ENDIF DYNAMIC_LINK}

{$ENDIF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_INCLUDEMODE}
end.
{$ENDIF !JWA_INCLUDEMODE}
