📄 jwadhcpssdk.pas
字号:
dropped, the hook is called twice as it is called once again to
note that the packet has been completely processed). The callout
DLL should be prepared to handle this hook multiple times for a
packet. This routine should not block. The ControlCode parameter
defines the reasons for the packet being dropped:
* DHCP_DROP_DUPLICATE - This packet is a duplicate of another
received by the server.
* DHCP_DROP_NOMEM - Not enough memory to process the packet.
* DHCP_DROP_INTERNAL_ERROR - Unexpected nternal error occurred.
* DHCP_DROP_TIMEOUT - The packet is too old to process.
* DHCP_DROP_UNAUTH - The server is not authorized.
* DHCP_DROP_PAUSED - The server is paused.
* DHCP_DROP_NO_SUBNETS - There are no subnets configured.
* DHCP_DROP_INVALID - The packet is invalid or it came on an
invalid socket ..
* DHCP_DROP_WRONG_SERVER - The packet was sent to the wrong DHCP Server.
* DHCP_DROP_NOADDRESS - There is no address to offer.
* DHCP_DROP_PROCESSED - The packet has been processed.
* DHCP_DROP_GEN_FAILURE - An unknown error occurred.
This routine is also called right before a response is sent down
the wire (SendPktHook) and in this case the ControlCode has a
value of DHCP_SEND_PACKET.
Arguments:
Packet - This parameter points to a character buffer that holds
the packet being processed by the DHCP Server.
PacketSize - This parameter points to a variable that holds the
size of the above buffer.
ControlCode - See description for various control codes.
IpAddress - This parameter points to an IPV4 host order IP address
of the socket that this packet was received on.
Reserved - Reserved for future use.
PktContext - This parameter is the packet context that the Callout
DLL NewPkt Hook returned for this packet. This can be used to
track a packet.
}
type
LPDHCP_PROB = function (Packet: LPBYTE; PacketSize, ControlCode, IpAddress,
AltAddress: DWORD; Reserved, PktContext: LPVOID): DWORD; stdcall;
{$EXTERNALSYM LPDHCP_PROB}
PDhcpProb = LPDHCP_PROB;
{
Routine Description:
This routine is called whenever special events occur that cause
the packet to be dropped etc. The possible ControlCodes and their
meanings are as follows:
* DHCP_PROB_CONFLICT - The address attempted to be offered
(AltAddress) is in use in the network already.
* DHCP_PROB_DECLINE - The packet was a DECLINE message for the
address specified in AltAddress.
* DHCP_PROB_RELEASE - The packet was a RELEASE message for the
address specified in AltAddress.
* DHCP_PROB_NACKED - The packet was a REQUEST message for address
specified in AltAddress and it was NACKed by the server.
This routine should not block.
Arguments:
Packet - This parameter is the buffer of the packet being
processed.
PacketSize - This is the size of the above buffer.
ControlCode - Specifies the event. See description below for
control codes and meanings.
IpAddress - IpV4 address of socket this packet was received on.
AltAddress - Request IpV4 Address or Ip address that is in
conflict.
Reserved - Reserve for future use.
PktContext - This is the context returned by the NewPkt hook for
this packet.
}
type
LPDHCP_GIVE_ADDRESS = function (Packet: LPBYTE; PacketSize, ControlCode, IpAddress,
AltAddress, AddrType, LeaseTime: DWORD; Reserved, PktContext: LPVOID): DWORD; stdcall;
{$EXTERNALSYM LPDHCP_GIVE_ADDRESS}
PDhcpGiveAddress = LPDHCP_GIVE_ADDRESS;
{
Routine Description:
This routine is called when the server is about to send an ACK to
a REQUEST message. The ControlCode specifies if the address is a
totally new address or if it an renewal of an old address (with
values DHCP_GIVE_ADDRESS_NEW and DHCP_GIVE_ADDRESS_OLD
respectively). The address being offered is passed as the
AltAddress parameter and the AddrType parameter can be one of
DHCP_CLIENT_BOOTP or DHCP_CLIENT_DHCP indicating whether the
client is using BOOTP or DHCP respectively. This call should not
block.
Arguments:
Packet - This parameter is the buffer of the packet being
processed.
PacketSize - This is the size of the above buffer.
ControlCode - See description above for control codes and
meanings.
IpAddress - IpV4 address of socket this packet was received on.
AltAddress - IpV4 address being ACKed to the client.
AddrType - Is this a DHCP or BOOTP address?
LeaseTime - Lease duration being passed.
Reserved - Reserve for future use.
PktContext - This is the context returned by the NewPkt hook for
this packet.
}
type
LPDHCP_HANDLE_OPTIONS = function (Packet: LPBYTE; PacketSize: DWORD;
Reserved, PktContext: LPVOID; ServerOptions: DHCP_SERVER_OPTIONS): DWORD; stdcall;
{$EXTERNALSYM LPDHCP_HANDLE_OPTIONS}
TDhcpHandleOptions = LPDHCP_HANDLE_OPTIONS;
{
Routine Description:
This routine can be utilized by the CalloutDLL to avoid parsing
the whole packet. The packet is parsed by the server and some
commonly used options are returned in the parsed pointers
structure (see header for definition of DHCP_SERVER_OPTIONS). The
hook is expected to make a copy of the structure pointed to by
ServerOptions if it needs it beyond this function call. This
routine may be called several times for a single packet. This
routine should not block.
Arguments:
Packet - This parameter is the buffer of the packet being
processed.
PacketSize - This is the size of the above buffer.
Reserved - Reserve for future use.
PktContext - This is the context returned by the NewPkt hook for
this packet.
ServerOptions - This parameter is the structure that contains a
bunch of pointers that represent corresponding options.
}
type
LPDHCP_DELETE_CLIENT = function (IpAddress: DWORD; HwAddress: LPBYTE;
HwAddressLength: ULONG; Reserved, ClientType: DWORD): DWORD; stdcall;
{$EXTERNALSYM LPDHCP_DELETE_CLIENT}
PDhcpDeleteClient = LPDHCP_DELETE_CLIENT;
{
Routine Description:
This routine is called before a client lease is deleted off the
active leases database. The ClientType field is currently not
provided and this should not be used. This routine should not
block.
Arguments:
IpAddress - IpV4 address of the client lease being deleted.
HwAddress - Buffer holding the Hardware address of the client (MAC).
HwAddressLength - This specifies the length of the above buffer.
Reserved - Reserved for future use.
ClientType - Reserved for future use.
}
type
_DHCP_CALLOUT_TABLE = record
DhcpControlHook: LPDHCP_CONTROL;
DhcpNewPktHook: LPDHCP_NEWPKT;
DhcpPktDropHook: LPDHCP_DROP_SEND;
DhcpPktSendHook: LPDHCP_DROP_SEND;
DhcpAddressDelHook: LPDHCP_PROB;
DhcpAddressOfferHook: LPDHCP_GIVE_ADDRESS;
DhcpHandleOptionsHook: LPDHCP_HANDLE_OPTIONS;
DhcpDeleteClientHook: LPDHCP_DELETE_CLIENT;
DhcpExtensionHook: LPVOID;
DhcpReservedHook: LPVOID;
end;
{$EXTERNALSYM _DHCP_CALLOUT_TABLE}
DHCP_CALLOUT_TABLE = _DHCP_CALLOUT_TABLE;
{$EXTERNALSYM DHCP_CALLOUT_TABLE}
LPDHCP_CALLOUT_TABLE = ^DHCP_CALLOUT_TABLE;
{$EXTERNALSYM LPDHCP_CALLOUT_TABLE}
TDhcpCalloutTable = DHCP_CALLOUT_TABLE;
PDhcpCalloutTable = LPDHCP_CALLOUT_TABLE;
type
LPDHCP_ENTRY_POINT_FUNC = function (ChainDlls: LPWSTR; CalloutVersion: DWORD;
var CalloutTbl: DHCP_CALLOUT_TABLE): DWORD; stdcall;
{$EXTERNALSYM LPDHCP_ENTRY_POINT_FUNC}
PDhcpEntryPointFunc = LPDHCP_ENTRY_POINT_FUNC;
{
Routine Description:
This is the routine that is called by the DHCP Server when it
successfully loads a DLL. If the routine succeeds, then the
DHCP Server does not attempt to load any of the DLLs specified in
the ChainDlls list of DLLs. If this function fails for some
reason, then the DHCP Server proceeds to the next DLL in the
ChainDlls structure.
Note that for version negotiation, the server may call this
routine several times until a compatible version is found.
It is expected that the entrypoint routine would walk through the
names of the dlls and attempt to load each of them and when it
succeeds in retrieving the entry point, it attempts to get the
cumulative set of hooks by repeating the above procedure (as done
by the DHCP Server).
Arguments:
ChainDlls - This is a set of DLL names in REG_MULTI_SZ format (as
returned by Registry function calls). This does not contain the
name of the current DLL itself, but only the names of all DLLs
that follow the current DLL.
CalloutVersion - This is the version that the Callout DLL is
expected to support. The current version number is 0.
CalloutTbl - This is the cumulative set of Hooks that is needed by
the current DLLs as well as all the DLLs in ChainDlls. It is the
responsibility of the current DLL to retrive the cumulative set of
Hooks and merge that with its own set of hooks and return that in
this table structure. The table structure is defined above.
}
implementation
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -