{******************************************************************************}
{                                                                              }
{ DHCP Server Management API interface Unit for Object Pascal                  }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: dhcpsapi.h, released Feb 2003. The original Pascal     }
{ code is: DhcpsApi.pas, released December 2003. 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: JwaDhcpsApi.pas,v 1.12 2007/09/06 14:57:11 marquardt Exp $
{$IFNDEF JWA_OMIT_SECTIONS}
unit JwaDhcpsApi;

{$WEAKPACKAGEUNIT}

{$ENDIF JWA_OMIT_SECTIONS}

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

{$IFNDEF JWA_OMIT_SECTIONS}
{$I jediapilib.inc}

interface

uses
  JwaWinType;
{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_IMPLEMENTATIONSECTION}

type
  {$IFNDEF JWA_INCLUDEMODE}
  DHCP_IP_ADDRESS = DWORD;
  {$ENDIF JWA_INCLUDEMODE}

  {$EXTERNALSYM DHCP_IP_ADDRESS}
  PDHCP_IP_ADDRESS = ^DHCP_IP_ADDRESS;
  {$EXTERNALSYM PDHCP_IP_ADDRESS}

  {$IFNDEF JWA_INCLUDEMODE}
  LPDHCP_IP_ADDRESS = ^DHCP_IP_ADDRESS;
  {$EXTERNALSYM LPDHCP_IP_ADDRESS}
  {$ENDIF JWA_INCLUDEMODE}

  {$IFNDEF JWA_INCLUDEMODE}
  TDhcpIpAddress = DHCP_IP_ADDRESS;
  PDhcpIpAddress = ^DHCP_IP_ADDRESS;
  {$ENDIF JWA_INCLUDEMODE}

  DHCP_IP_MASK = DWORD;
  {$EXTERNALSYM DHCP_IP_MASK}
  TDhcpIpMask = DHCP_IP_MASK;
  DHCP_RESUME_HANDLE = DWORD;
  {$EXTERNALSYM DHCP_RESUME_HANDLE}
  TDhcpResumeHandle = DHCP_RESUME_HANDLE;

  DHCP_OPTION_ID = DWORD;
  {$EXTERNALSYM DHCP_OPTION_ID}
  TDhcpOptionID = DHCP_OPTION_ID;

  _DATE_TIME = record
    dwLowDateTime: DWORD;
    dwHighDateTime: DWORD;
  end;
  {$EXTERNALSYM _DATE_TIME}
  DATE_TIME = _DATE_TIME;
  {$EXTERNALSYM DATE_TIME}
  LPDATE_TIME = ^DATE_TIME;
  {$EXTERNALSYM LPDATE_TIME}

  {$IFNDEF JWA_INCLUDEMODE}
  TDateTime = DATE_TIME;
  PDateTime = ^DATE_TIME;
  {$ENDIF JWA_INCLUDEMODE}

  _DWORD_DWORD = record
    DWord1: DWORD;
    DWord2: DWORD;
  end;
  {$EXTERNALSYM _DWORD_DWORD}
  DWORD_DWORD = _DWORD_DWORD;
  {$EXTERNALSYM DWORD_DWORD}
  LPDWORD_DWORD = ^DWORD_DWORD;
  {$EXTERNALSYM LPDWORD_DWORD}
  TDwordDword = DWORD_DWORD;
  PDwordDword = ^DWORD_DWORD;

  _DHCP_BINARY_DATA = record
    DataLength: DWORD;
    Data: LPBYTE;
  end;
  {$EXTERNALSYM _DHCP_BINARY_DATA}
  DHCP_BINARY_DATA = _DHCP_BINARY_DATA;
  {$EXTERNALSYM DHCP_BINARY_DATA}
  LPDHCP_BINARY_DATA = ^DHCP_BINARY_DATA;
  {$EXTERNALSYM LPDHCP_BINARY_DATA}
  TDhcpBinaryData = DHCP_BINARY_DATA;
  PDhcpBinaryData = ^DHCP_BINARY_DATA;

  DHCP_CLIENT_UID = DHCP_BINARY_DATA;
  {$EXTERNALSYM DHCP_CLIENT_UID}
  TDhcpClientUid = DHCP_CLIENT_UID;

const
  DHCP_ENDPOINT_FLAG_CANT_MODIFY = $01;
  {$EXTERNALSYM DHCP_ENDPOINT_FLAG_CANT_MODIFY}

type
  _DHCP_BIND_ELEMENT = record
    Flags: ULONG;
    fBoundToDHCPServer: BOOL;
    AdapterPrimaryAddress: DHCP_IP_ADDRESS;
    AdapterSubnetAddress: DHCP_IP_ADDRESS;
    IfDescription: LPWSTR;
    IfIdSize: ULONG;
    IfId: LPBYTE;
  end;
  {$EXTERNALSYM _DHCP_BIND_ELEMENT}
  DHCP_BIND_ELEMENT = _DHCP_BIND_ELEMENT;
  {$EXTERNALSYM DHCP_BIND_ELEMENT}
  LPDHCP_BIND_ELEMENT = ^DHCP_BIND_ELEMENT;
  {$EXTERNALSYM LPDHCP_BIND_ELEMENT}
  TDhcpBindElement = DHCP_BIND_ELEMENT;
  PDhcpBindElement = ^DHCP_BIND_ELEMENT;

  _DHCP_BIND_ELEMENT_ARRAY = record
    NumElements: DWORD;
    Elements: LPDHCP_BIND_ELEMENT; //array
  end;
  {$EXTERNALSYM _DHCP_BIND_ELEMENT_ARRAY}
  DHCP_BIND_ELEMENT_ARRAY = _DHCP_BIND_ELEMENT_ARRAY;
  {$EXTERNALSYM DHCP_BIND_ELEMENT_ARRAY}
  LPDHCP_BIND_ELEMENT_ARRAY = ^DHCP_BIND_ELEMENT_ARRAY;
  {$EXTERNALSYM LPDHCP_BIND_ELEMENT_ARRAY}
  TDhcpBindElementArray = DHCP_BIND_ELEMENT_ARRAY;
  PDhcpBindElementArray = ^DHCP_BIND_ELEMENT_ARRAY;

  _DHCP_CLIENT_SEARCH_TYPE = (
    DhcpClientIpAddress,
    DhcpClientHardwareAddress,
    DhcpClientName);
  {$EXTERNALSYM _DHCP_CLIENT_SEARCH_TYPE}
  DHCP_SEARCH_INFO_TYPE = _DHCP_CLIENT_SEARCH_TYPE;
  {$EXTERNALSYM DHCP_SEARCH_INFO_TYPE}
  LPDHCP_SEARCH_INFO_TYPE = ^DHCP_SEARCH_INFO_TYPE;
  {$EXTERNALSYM LPDHCP_SEARCH_INFO_TYPE}
  TDhcpSearchInfoType = DHCP_SEARCH_INFO_TYPE;
  PDhcpSearchInfoType = ^DHCP_SEARCH_INFO_TYPE;

  _DHCP_CLIENT_SEARCH_UNION = record
    case Integer of
      0: (ClientIpAddress: DHCP_IP_ADDRESS);
      1: (ClientHardwareAddress: DHCP_CLIENT_UID);
      2: (ClientName: LPWSTR);
  end;
  {$EXTERNALSYM _DHCP_CLIENT_SEARCH_UNION}

  _DHCP_CLIENT_SEARCH_INFO = record
    SearchType: DHCP_SEARCH_INFO_TYPE;
    SearchInfo: _DHCP_CLIENT_SEARCH_UNION;
  end;
  {$EXTERNALSYM _DHCP_CLIENT_SEARCH_INFO}
  DHCP_SEARCH_INFO = _DHCP_CLIENT_SEARCH_INFO;
  {$EXTERNALSYM DHCP_SEARCH_INFO}
  LPDHCP_SEARCH_INFO = ^DHCP_SEARCH_INFO;
  {$EXTERNALSYM LPDHCP_SEARCH_INFO}
  TDhcpSearchInfo = DHCP_SEARCH_INFO;
  PDhcpSearchInfo = ^DHCP_SEARCH_INFO;

  _DHCP_OPTION_SCOPE_TYPE = (
    DhcpDefaultOptions,
    DhcpGlobalOptions,
    DhcpSubnetOptions,
    DhcpReservedOptions,
    DhcpMScopeOptions);
  {$EXTERNALSYM _DHCP_OPTION_SCOPE_TYPE}
  DHCP_OPTION_SCOPE_TYPE = _DHCP_OPTION_SCOPE_TYPE;
  {$EXTERNALSYM DHCP_OPTION_SCOPE_TYPE}
  LPDHCP_OPTION_SCOPE_TYPE = ^DHCP_OPTION_SCOPE_TYPE;
  {$EXTERNALSYM LPDHCP_OPTION_SCOPE_TYPE}
  TDhcpOptionScopeType = DHCP_OPTION_SCOPE_TYPE;
  PDhcpOptionScopeType = ^DHCP_OPTION_SCOPE_TYPE;

  _DHCP_RESERVED_SCOPE = record
    ReservedIpAddress: DHCP_IP_ADDRESS;
    ReservedIpSubnetAddress: DHCP_IP_ADDRESS;
  end;
  {$EXTERNALSYM _DHCP_RESERVED_SCOPE}
  DHCP_RESERVED_SCOPE = _DHCP_RESERVED_SCOPE;
  {$EXTERNALSYM DHCP_RESERVED_SCOPE}
  LPDHCP_RESERVED_SCOPE = ^DHCP_RESERVED_SCOPE;
  {$EXTERNALSYM LPDHCP_RESERVED_SCOPE}
  TDhcpReservedScope = DHCP_RESERVED_SCOPE;
  PDhcpReservedScope = ^DHCP_RESERVED_SCOPE;

  _DHCP_OPTION_SCOPE_UNION = record
    case Integer of
      0: (DefaultScopeInfo: PVOID); // must be NULL
      1: (GlobalScopeInfo: PVOID);  // must be NULL
      2: (SubnetScopeInfo: DHCP_IP_ADDRESS);
      3: (ReservedScopeInfo: DHCP_RESERVED_SCOPE);
      4: (MScopeInfo: LPWSTR);
  end;
  {$EXTERNALSYM _DHCP_OPTION_SCOPE_UNION}

  _DHCP_OPTION_SCOPE_INFO = record
    ScopeType: DHCP_OPTION_SCOPE_TYPE;
    ScopeInfo: _DHCP_OPTION_SCOPE_UNION;
  end;
  {$EXTERNALSYM _DHCP_OPTION_SCOPE_INFO}
  DHCP_OPTION_SCOPE_INFO = _DHCP_OPTION_SCOPE_INFO;
  {$EXTERNALSYM DHCP_OPTION_SCOPE_INFO}
  LPDHCP_OPTION_SCOPE_INFO = ^DHCP_OPTION_SCOPE_INFO;
  {$EXTERNALSYM LPDHCP_OPTION_SCOPE_INFO}
  TDhcpOptionScopeInfo = DHCP_OPTION_SCOPE_INFO;
  PDhcpOptionScopeInfo = ^DHCP_OPTION_SCOPE_INFO;

  _DHCP_HOST_INFO = record
    IpAddress: DHCP_IP_ADDRESS;      // minimum information always available
    NetBiosName: LPWSTR;             // optional information
    HostName: LPWSTR;                // optional information
  end;
  {$EXTERNALSYM _DHCP_HOST_INFO}
  DHCP_HOST_INFO = _DHCP_HOST_INFO;
  {$EXTERNALSYM DHCP_HOST_INFO}
  LPDHCP_HOST_INFO = ^DHCP_HOST_INFO;
  {$EXTERNALSYM LPDHCP_HOST_INFO}
  TDhcpHostInfo = DHCP_HOST_INFO;
  PDhcpHostInfo = ^DHCP_HOST_INFO;

  _DHCP_CLIENT_INFO = record
    ClientIpAddress: DHCP_IP_ADDRESS;    // currently assigned IP address.
    SubnetMask: DHCP_IP_MASK;
    ClientHardwareAddress: DHCP_CLIENT_UID;
    ClientName: LPWSTR;                  // optional.
    ClientComment: LPWSTR;
    ClientLeaseExpires: DATE_TIME;       // UTC time in FILE_TIME format.
    OwnerHost: DHCP_HOST_INFO;           // host that distributed this IP address.
  end;
  {$EXTERNALSYM _DHCP_CLIENT_INFO}
  DHCP_CLIENT_INFO = _DHCP_CLIENT_INFO;
  {$EXTERNALSYM DHCP_CLIENT_INFO}
  LPDHCP_CLIENT_INFO = ^DHCP_CLIENT_INFO;
  {$EXTERNALSYM LPDHCP_CLIENT_INFO}
  TDhcpClientInfo = DHCP_CLIENT_INFO;
  PDhcpClientInfo = ^DHCP_CLIENT_INFO;

  _DHCP_CLIENT_INFO_ARRAY = record
    NumElements: DWORD;
    Clients: ^LPDHCP_CLIENT_INFO; // array of pointers\
  end;
  {$EXTERNALSYM _DHCP_CLIENT_INFO_ARRAY}
  DHCP_CLIENT_INFO_ARRAY = _DHCP_CLIENT_INFO_ARRAY;
  {$EXTERNALSYM DHCP_CLIENT_INFO_ARRAY}
  LPDHCP_CLIENT_INFO_ARRAY = ^DHCP_CLIENT_INFO_ARRAY;
  {$EXTERNALSYM LPDHCP_CLIENT_INFO_ARRAY}
  TDhcpClientInfoArray = DHCP_CLIENT_INFO_ARRAY;
  PDhcpClientInfoArray = ^DHCP_CLIENT_INFO_ARRAY;

  _DHCP_IP_ARRAY = record
    NumElements: DWORD;
    Elements: LPDHCP_IP_ADDRESS; //array
  end;
  {$EXTERNALSYM _DHCP_IP_ARRAY}
  DHCP_IP_ARRAY = _DHCP_IP_ARRAY;
  {$EXTERNALSYM DHCP_IP_ARRAY}
  LPDHCP_IP_ARRAY = ^DHCP_IP_ARRAY;
  {$EXTERNALSYM LPDHCP_IP_ARRAY}
  TDhcpIpArray = DHCP_IP_ARRAY;
  PDhcpIpArray = ^DHCP_IP_ARRAY;

//
// Subnet State.
//
// Currently a Subnet scope can be Enabled or Disabled.
//
// If the state is Enabled State,
//  The server distributes address to the client, extends leases and
//  accepts releases.
//
// If the state is Disabled State,
//  The server does not distribute address to any new client, and does
//  extent (and sends NACK) old leases, but the servers accepts lease
//  releases.
//
// The idea behind this subnet state is, when the admin wants to stop
//  serving a subnet, he moves the state from Enbaled to Disabled so
//  that the clients from the subnets smoothly move to another servers
//  serving that subnet. When all or most of the clients move to
//  another server, the admin can delete the subnet without any force
//  if no client left in that subnet, otherwise the admin should use
//  full force to delete the subnet.
//

type
  _DHCP_SUBNET_STATE = (
{$IFDEF COMPILER6_UP}
  DhcpSubnetEnabled = 0,
{$ELSE}
  DhcpSubnetEnabled,
{$ENDIF}


    DhcpSubnetDisabled,
    DhcpSubnetEnabledSwitched,
    DhcpSubnetDisabledSwitched,
    DhcpSubnetInvalidState);
  {$EXTERNALSYM _DHCP_SUBNET_STATE}
  DHCP_SUBNET_STATE = _DHCP_SUBNET_STATE;
  {$EXTERNALSYM DHCP_SUBNET_STATE}
  LPDHCP_SUBNET_STATE = ^DHCP_SUBNET_STATE;
  {$EXTERNALSYM LPDHCP_SUBNET_STATE}
  TDhcpSubnetState = DHCP_SUBNET_STATE;
  PDhcpSubnetState = ^DHCP_SUBNET_STATE;

//
// Subnet related data structures.
//

  _DHCP_SUBNET_INFO = record
    SubnetAddress: DHCP_IP_ADDRESS;
    SubnetMask: DHCP_IP_MASK;
    SubnetName: LPWSTR;
    SubnetComment: LPWSTR;
    PrimaryHost: DHCP_HOST_INFO;
    SubnetState: DHCP_SUBNET_STATE;
  end;
  {$EXTERNALSYM _DHCP_SUBNET_INFO}
  DHCP_SUBNET_INFO = _DHCP_SUBNET_INFO;
  {$EXTERNALSYM DHCP_SUBNET_INFO}
  LPDHCP_SUBNET_INFO = ^DHCP_SUBNET_INFO;
  {$EXTERNALSYM LPDHCP_SUBNET_INFO}
  TDhcpSubnetInfo = DHCP_SUBNET_INFO;
  PDhcpSubnetInfo = ^DHCP_SUBNET_INFO;

//
// DHCP Options related data structures.
//

  _DHCP_OPTION_DATA_TYPE = (
    DhcpByteOption,
    DhcpWordOption,
    DhcpDWordOption,
    DhcpDWordDWordOption,
    DhcpIpAddressOption,
    DhcpStringDataOption,
    DhcpBinaryDataOption,
    DhcpEncapsulatedDataOption);
  {$EXTERNALSYM _DHCP_OPTION_DATA_TYPE}
  DHCP_OPTION_DATA_TYPE = _DHCP_OPTION_DATA_TYPE;
  {$EXTERNALSYM DHCP_OPTION_DATA_TYPE}
  LPDHCP_OPTION_DATA_TYPE = ^DHCP_OPTION_DATA_TYPE;
  {$EXTERNALSYM LPDHCP_OPTION_DATA_TYPE}
  TDhcpOptionDataType = DHCP_OPTION_DATA_TYPE;
  PDhcpOptionDataType = ^DHCP_OPTION_DATA_TYPE;

  _DHCP_OPTION_ELEMENT_UNION = record
    case Integer of
      0: (ByteOption: BYTE);
      1: (WordOption: WORD);
      2: (DWordOption: DWORD);
      3: (DWordDWordOption: DWORD_DWORD);
      4: (IpAddressOption: DHCP_IP_ADDRESS);
      5: (StringDataOption: LPWSTR);
      6: (BinaryDataOption: DHCP_BINARY_DATA);
      7: (EncapsulatedDataOption: DHCP_BINARY_DATA);
      // for vendor specific information option.
  end;
  {$EXTERNALSYM _DHCP_OPTION_ELEMENT_UNION}

  _DHCP_OPTION_DATA_ELEMENT = record
    OptionType: DHCP_OPTION_DATA_TYPE;
    Element: _DHCP_OPTION_ELEMENT_UNION;
  end;
  {$EXTERNALSYM _DHCP_OPTION_DATA_ELEMENT}
  DHCP_OPTION_DATA_ELEMENT = _DHCP_OPTION_DATA_ELEMENT;
  {$EXTERNALSYM DHCP_OPTION_DATA_ELEMENT}
  LPDHCP_OPTION_DATA_ELEMENT = ^DHCP_OPTION_DATA_ELEMENT;
  {$EXTERNALSYM LPDHCP_OPTION_DATA_ELEMENT}
  TDhcpOptionDataElement = DHCP_OPTION_DATA_ELEMENT;
  PDhcpOptionDataElement = ^DHCP_OPTION_DATA_ELEMENT;

  _DHCP_OPTION_DATA = record
    NumElements: DWORD; // number of option elements in the pointed array
    Elements: LPDHCP_OPTION_DATA_ELEMENT; //array
  end;
  {$EXTERNALSYM _DHCP_OPTION_DATA}
  DHCP_OPTION_DATA = _DHCP_OPTION_DATA;
  {$EXTERNALSYM DHCP_OPTION_DATA}
  LPDHCP_OPTION_DATA = ^DHCP_OPTION_DATA;
  {$EXTERNALSYM LPDHCP_OPTION_DATA}
  TDhcpOptionData = DHCP_OPTION_DATA;
  PDhcpOptionData = ^DHCP_OPTION_DATA;

  _DHCP_OPTION_VALUE = record
    OptionID: DHCP_OPTION_ID;
    Value: DHCP_OPTION_DATA;
  end;
  {$EXTERNALSYM _DHCP_OPTION_VALUE}
  DHCP_OPTION_VALUE = _DHCP_OPTION_VALUE;
  {$EXTERNALSYM DHCP_OPTION_VALUE}
  LPDHCP_OPTION_VALUE = ^DHCP_OPTION_VALUE;
  {$EXTERNALSYM LPDHCP_OPTION_VALUE}
  TDhcpOptionValue = DHCP_OPTION_VALUE;
  PDhcpOptionValue = ^DHCP_OPTION_VALUE;




function DhcpGetVersion(ServerIpAddress: LPWSTR; MajorVersion, MinorVersion: LPDWORD): DWORD; stdcall;
{$EXTERNALSYM DhcpGetVersion}
function DhcpSetServerBindingInfo(ServerIpAddress: PWideChar; Flags: ULONG; BindElementInfo: LPDHCP_BIND_ELEMENT_ARRAY): DWORD; stdcall;
{$EXTERNALSYM DhcpSetServerBindingInfo}
function DhcpGetServerBindingInfo(ServerIpAddress: PWideChar; Flags: ULONG; out BindElementsInfo: LPDHCP_BIND_ELEMENT_ARRAY): DWORD; stdcall;
{$EXTERNALSYM DhcpGetServerBindingInfo}
function DhcpCreateClientInfo(ServerIpAddress: PWideChar; ClientInfo: LPDHCP_CLIENT_INFO): DWORD; stdcall;
{$EXTERNALSYM DhcpCreateClientInfo}
function DhcpSetClientInfo(ServerIpAddress: PWideChar; ClientInfo: LPDHCP_CLIENT_INFO): DWORD; stdcall;
{$EXTERNALSYM DhcpSetClientInfo}
function DhcpGetClientInfo(ServerIpAddress: PWideChar; SearchInfo: LPDHCP_SEARCH_INFO; ClientInfo: LPDHCP_CLIENT_INFO): DWORD; stdcall;
{$EXTERNALSYM DhcpGetClientInfo}
function DhcpDeleteClientInfo(ServerIpAddress: PWideChar; ClientInfo: LPDHCP_SEARCH_INFO): DWORD; stdcall;
{$EXTERNALSYM DhcpDeleteClientInfo}
function DhcpEnumSubnetClients(ServerIpAddress: PWideChar; SubnetAddress: DHCP_IP_ADDRESS; var ResumeHandle: DHCP_RESUME_HANDLE; PreferredMaximum: DWORD; out ClientInfo: LPDHCP_CLIENT_INFO_ARRAY; out ClientsRead, ClientsTotal: DWORD): DWORD; stdcall;
{$EXTERNALSYM DhcpEnumSubnetClients}
function DhcpEnumSubnets(ServerIpAddress: PWideChar; var ResumeHandle: DHCP_RESUME_HANDLE; PreferredMaximum: DWORD; EnumInfo: LPDHCP_IP_ARRAY; out ElementsRead, ElementsTotal: DWORD): DWORD; stdcall;
{$EXTERNALSYM DhcpEnumSubnets}
function DhcpGetSubnetInfo(ServerIpAddress: PWideChar; SubnetAddress: DHCP_IP_ADDRESS; out SubnetInfo: LPDHCP_SUBNET_INFO): DWORD; stdcall;
{$EXTERNALSYM DhcpGetSubnetInfo}
function DhcpGetOptionValue(ServerIpAddress: PWideChar; OptionID: DHCP_OPTION_ID; const ScopeInfo: DHCP_OPTION_SCOPE_INFO; out OptionValue: LPDHCP_OPTION_VALUE): DWORD; stdcall;
{$EXTERNALSYM DhcpGetOptionValue}
procedure DhcpRpcFreeMemory(BufferPointer: PVOID); stdcall;
{$EXTERNALSYM DhcpRpcFreeMemory}     

{$ENDIF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
implementation
//uses ...
{$ENDIF JWA_OMIT_SECTIONS}


{$IFNDEF JWA_INTERFACESECTION}

{$IFNDEF JWA_INCLUDEMODE}
const
  dhcplib = 'dhcpsapi.dll';
{$ENDIF JWA_INCLUDEMODE}

{$IFDEF DYNAMIC_LINK}

var
  _DhcpGetVersion: Pointer;

function DhcpGetVersion;
begin
  GetProcedureAddress(_DhcpGetVersion, dhcplib, 'DhcpGetVersion');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpGetVersion]
  end;
end;

var
  _DhcpSetServerBindingInfo: Pointer;

function DhcpSetServerBindingInfo;
begin
  GetProcedureAddress(_DhcpSetServerBindingInfo, dhcplib, 'DhcpSetServerBindingInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpSetServerBindingInfo]
  end;
end;

var
  _DhcpGetServerBindingInfo: Pointer;

function DhcpGetServerBindingInfo;
begin
  GetProcedureAddress(_DhcpGetServerBindingInfo, dhcplib, 'DhcpGetServerBindingInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpGetServerBindingInfo]
  end;
end;

var
  _DhcpCreateClientInfo: Pointer;

function DhcpCreateClientInfo;
begin
  GetProcedureAddress(_DhcpCreateClientInfo, dhcplib, 'DhcpCreateClientInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpCreateClientInfo]
  end;
end;

var
  _DhcpSetClientInfo: Pointer;

function DhcpSetClientInfo;
begin
  GetProcedureAddress(_DhcpSetClientInfo, dhcplib, 'DhcpSetClientInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpSetClientInfo]
  end;
end;

var
  _DhcpGetClientInfo: Pointer;

function DhcpGetClientInfo;
begin
  GetProcedureAddress(_DhcpGetClientInfo, dhcplib, 'DhcpGetClientInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpGetClientInfo]
  end;
end;

var
  _DhcpDeleteClientInfo: Pointer;

function DhcpDeleteClientInfo;
begin
  GetProcedureAddress(_DhcpDeleteClientInfo, dhcplib, 'DhcpDeleteClientInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpDeleteClientInfo]
  end;
end;

var
  _DhcpEnumSubnetClients: Pointer;

function DhcpEnumSubnetClients;
begin
  GetProcedureAddress(_DhcpEnumSubnetClients, dhcplib, 'DhcpEnumSubnetClients');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpEnumSubnetClients]
  end;
end;

var
  _DhcpEnumSubnets: Pointer;

function DhcpEnumSubnets;
begin
  GetProcedureAddress(_DhcpEnumSubnets, dhcplib, 'DhcpEnumSubnets');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpEnumSubnets]
  end;
end;

var
  _DhcpGetSubnetInfo: Pointer;

function DhcpGetSubnetInfo;
begin
  GetProcedureAddress(_DhcpGetSubnetInfo, dhcplib, 'DhcpGetSubnetInfo');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpGetSubnetInfo]
  end;
end;

var
  _DhcpGetOptionValue: Pointer;

function DhcpGetOptionValue;
begin
  GetProcedureAddress(_DhcpGetOptionValue, dhcplib, 'DhcpGetOptionValue');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpGetOptionValue]
  end;
end;

var
  _DhcpRpcFreeMemory: Pointer;

procedure DhcpRpcFreeMemory;
begin
  GetProcedureAddress(_DhcpRpcFreeMemory, dhcplib, 'DhcpRpcFreeMemory');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DhcpRpcFreeMemory]
  end;
end;     

{$ELSE}

function DhcpGetVersion; external dhcplib name 'DhcpGetVersion';
function DhcpSetServerBindingInfo; external dhcplib name 'DhcpSetServerBindingInfo';
function DhcpGetServerBindingInfo; external dhcplib name 'DhcpGetServerBindingInfo';
function DhcpCreateClientInfo; external dhcplib name 'DhcpCreateClientInfo';
function DhcpSetClientInfo; external dhcplib name 'DhcpSetClientInfo';
function DhcpGetClientInfo; external dhcplib name 'DhcpGetClientInfo';
function DhcpDeleteClientInfo; external dhcplib name 'DhcpDeleteClientInfo';
function DhcpEnumSubnetClients; external dhcplib name 'DhcpEnumSubnetClients';
function DhcpEnumSubnets; external dhcplib name 'DhcpEnumSubnets';
function DhcpGetSubnetInfo; external dhcplib name 'DhcpGetSubnetInfo';
function DhcpGetOptionValue; external dhcplib name 'DhcpGetOptionValue';
procedure DhcpRpcFreeMemory; external dhcplib name 'DhcpRpcFreeMemory';

{$ENDIF DYNAMIC_LINK}

{$ENDIF JWA_INTERFACESECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}

