jwadhcpssdk.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. {******************************************************************************}
  2. { }
  3. { DHCP Callout DLL API interface unit for Object Pascal }
  4. { }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
  6. { Corporation. All Rights Reserved. }
  7. { }
  8. { The original file is: dhcpssdk.h, released June 2000. The original Pascal }
  9. { code is: DhcpSSdk.pas, released December 2000. The initial developer of the }
  10. { Pascal code is Marcel van Brakel (brakelm att chello dott nl). }
  11. { }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
  13. { Marcel van Brakel. All Rights Reserved. }
  14. { }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
  16. { }
  17. { You may retrieve the latest version of this file at the Project JEDI }
  18. { APILIB home page, located at http://jedi-apilib.sourceforge.net }
  19. { }
  20. { The contents of this file are used with permission, subject to the Mozilla }
  21. { Public License Version 1.1 (the "License"); you may not use this file except }
  22. { in compliance with the License. You may obtain a copy of the License at }
  23. { http://www.mozilla.org/MPL/MPL-1.1.html }
  24. { }
  25. { Software distributed under the License is distributed on an "AS IS" basis, }
  26. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  27. { the specific language governing rights and limitations under the License. }
  28. { }
  29. { Alternatively, the contents of this file may be used under the terms of the }
  30. { GNU Lesser General Public License (the "LGPL License"), in which case the }
  31. { provisions of the LGPL License are applicable instead of those above. }
  32. { If you wish to allow use of your version of this file only under the terms }
  33. { of the LGPL License and not to allow others to use your version of this file }
  34. { under the MPL, indicate your decision by deleting the provisions above and }
  35. { replace them with the notice and other provisions required by the LGPL }
  36. { License. If you do not delete the provisions above, a recipient may use }
  37. { your version of this file under either the MPL or the LGPL License. }
  38. { }
  39. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  40. { }
  41. {******************************************************************************}
  42. // $Id: JwaDhcpSSdk.pas,v 1.8 2007/09/05 11:58:49 dezipaitor Exp $
  43. {$IFNDEF JWA_OMIT_SECTIONS}
  44. unit JwaDhcpSSdk;
  45. {$WEAKPACKAGEUNIT}
  46. {$ENDIF JWA_OMIT_SECTIONS}
  47. {$HPPEMIT ''}
  48. {$HPPEMIT '#include "dhcpssdk.h"'}
  49. {$HPPEMIT ''}
  50. {$HPPEMIT 'typedef DHCP_IP_ADDRESS *LPDHCP_IP_ADDRESS;'}
  51. {$HPPEMIT ''}
  52. {$IFNDEF JWA_OMIT_SECTIONS}
  53. {$I jediapilib.inc}
  54. interface
  55. uses
  56. JwaWinNT, JwaWinType;
  57. {$ENDIF JWA_OMIT_SECTIONS}
  58. {$IFNDEF JWA_IMPLEMENTATIONSECTION}
  59. // This structure could change any day. This will be accurate only for version 0 -- which
  60. // has to be checked for by any CalloutDLL that is hooking onto the DhcpHandleOptionsHook.
  61. type
  62. DHCP_IP_ADDRESS = DWORD;
  63. {$EXTERNALSYM DHCP_IP_ADDRESS}
  64. LPDHCP_IP_ADDRESS = ^DHCP_IP_ADDRESS;
  65. {$NODEFINE LPDHCP_IP_ADDRESS}
  66. TDhcpIpAddress = DHCP_IP_ADDRESS;
  67. _DHCP_SERVER_OPTIONS = record
  68. MessageType: LPBYTE;
  69. SubnetMask: LPDHCP_IP_ADDRESS;
  70. RequestedAddress: LPDHCP_IP_ADDRESS;
  71. RequestLeaseTime: LPDWORD;
  72. OverlayFields: LPBYTE;
  73. RouterAddress: LPDHCP_IP_ADDRESS;
  74. Server: LPDHCP_IP_ADDRESS;
  75. ParameterRequestList: LPBYTE;
  76. ParameterRequestListLength: DWORD;
  77. MachineName: PCHAR;
  78. MachineNameLength: DWORD;
  79. ClientHardwareAddressType: BYTE;
  80. ClientHardwareAddressLength: BYTE;
  81. ClientHardwareAddress: LPBYTE;
  82. ClassIdentifier: PCHAR;
  83. ClassIdentifierLength: DWORD;
  84. VendorClass: LPBYTE;
  85. VendorClassLength: DWORD;
  86. DNSFlags: DWORD;
  87. DNSNameLength: DWORD;
  88. DNSName: LPBYTE;
  89. DSDomainNameRequested: LongBool;
  90. DSDomainName: PCHAR;
  91. DSDomainNameLen: DWORD;
  92. ScopeId: LPDWORD;
  93. end;
  94. {$EXTERNALSYM _DHCP_SERVER_OPTIONS}
  95. DHCP_SERVER_OPTIONS = _DHCP_SERVER_OPTIONS;
  96. {$EXTERNALSYM DHCP_SERVER_OPTIONS}
  97. LPDHCP_SERVER_OPTIONS = ^DHCP_SERVER_OPTIONS;
  98. {$EXTERNALSYM LPDHCP_SERVER_OPTIONS}
  99. TDhcpServerOptions = DHCP_SERVER_OPTIONS;
  100. PDhcpServerOptions = LPDHCP_SERVER_OPTIONS;
  101. //
  102. // The location in registry where the REG_MULTI_SZ list of callout DLLs
  103. // that the DHCP Server will try to load.
  104. //
  105. const
  106. DHCP_CALLOUT_LIST_KEY = WideString('System\CurrentControlSet\Services\DHCPServer\Parameters');
  107. {$EXTERNALSYM DHCP_CALLOUT_LIST_KEY}
  108. DHCP_CALLOUT_LIST_VALUE = WideString('CalloutDlls');
  109. {$EXTERNALSYM DHCP_CALLOUT_LIST_VALUE}
  110. DHCP_CALLOUT_LIST_TYPE = REG_MULTI_SZ;
  111. {$EXTERNALSYM DHCP_CALLOUT_LIST_TYPE}
  112. DHCP_CALLOUT_ENTRY_POINT = 'DhcpServerCalloutEntry';
  113. {$EXTERNALSYM DHCP_CALLOUT_ENTRY_POINT}
  114. //
  115. // Control CODES used by DHCP Server to notify server state change.
  116. //
  117. DHCP_CONTROL_START = $00000001;
  118. {$EXTERNALSYM DHCP_CONTROL_START}
  119. DHCP_CONTROL_STOP = $00000002;
  120. {$EXTERNALSYM DHCP_CONTROL_STOP}
  121. DHCP_CONTROL_PAUSE = $00000003;
  122. {$EXTERNALSYM DHCP_CONTROL_PAUSE}
  123. DHCP_CONTROL_CONTINUE = $00000004;
  124. {$EXTERNALSYM DHCP_CONTROL_CONTINUE}
  125. //
  126. // Other ControlCodes used by various Callout HOOKS.
  127. //
  128. DHCP_DROP_DUPLICATE = $00000001; // duplicate of pkt being processed
  129. {$EXTERNALSYM DHCP_DROP_DUPLICATE}
  130. DHCP_DROP_NOMEM = $00000002; // not enough server mem in queues
  131. {$EXTERNALSYM DHCP_DROP_NOMEM}
  132. DHCP_DROP_INTERNAL_ERROR = $00000003; // ooops?
  133. {$EXTERNALSYM DHCP_DROP_INTERNAL_ERROR}
  134. DHCP_DROP_TIMEOUT = $00000004; // too late, pkt is too old
  135. {$EXTERNALSYM DHCP_DROP_TIMEOUT}
  136. DHCP_DROP_UNAUTH = $00000005; // server is not authorized to run
  137. {$EXTERNALSYM DHCP_DROP_UNAUTH}
  138. DHCP_DROP_PAUSED = $00000006; // service is paused
  139. {$EXTERNALSYM DHCP_DROP_PAUSED}
  140. DHCP_DROP_NO_SUBNETS = $00000007; // no subnets configured on server
  141. {$EXTERNALSYM DHCP_DROP_NO_SUBNETS}
  142. DHCP_DROP_INVALID = $00000008; // invalid packet or client
  143. {$EXTERNALSYM DHCP_DROP_INVALID}
  144. DHCP_DROP_WRONG_SERVER = $00000009; // client in different DS enterprise
  145. {$EXTERNALSYM DHCP_DROP_WRONG_SERVER}
  146. DHCP_DROP_NOADDRESS = $0000000A; // no address available to offer
  147. {$EXTERNALSYM DHCP_DROP_NOADDRESS}
  148. DHCP_DROP_PROCESSED = $0000000B; // packet has been processed
  149. {$EXTERNALSYM DHCP_DROP_PROCESSED}
  150. DHCP_DROP_GEN_FAILURE = $00000100; // catch-all error
  151. {$EXTERNALSYM DHCP_DROP_GEN_FAILURE}
  152. DHCP_SEND_PACKET = $10000000; // send the packet on wire
  153. {$EXTERNALSYM DHCP_SEND_PACKET}
  154. DHCP_PROB_CONFLICT = $20000001; // address conflicted..
  155. {$EXTERNALSYM DHCP_PROB_CONFLICT}
  156. DHCP_PROB_DECLINE = $20000002; // an addr got declined
  157. {$EXTERNALSYM DHCP_PROB_DECLINE}
  158. DHCP_PROB_RELEASE = $20000003; // an addr got released
  159. {$EXTERNALSYM DHCP_PROB_RELEASE}
  160. DHCP_PROB_NACKED = $20000004; // a client is being nacked.
  161. {$EXTERNALSYM DHCP_PROB_NACKED}
  162. DHCP_GIVE_ADDRESS_NEW = $30000001; // give client a "new" address
  163. {$EXTERNALSYM DHCP_GIVE_ADDRESS_NEW}
  164. DHCP_GIVE_ADDRESS_OLD = $30000002; // renew client's "old" address
  165. {$EXTERNALSYM DHCP_GIVE_ADDRESS_OLD}
  166. DHCP_CLIENT_BOOTP = $30000003; // client is a BOOTP client
  167. {$EXTERNALSYM DHCP_CLIENT_BOOTP}
  168. DHCP_CLIENT_DHCP = $30000004; // client is a DHCP client
  169. {$EXTERNALSYM DHCP_CLIENT_DHCP}
  170. type
  171. LPDHCP_CONTROL = function(dwControlCode: DWORD; lpReserved: LPVOID): DWORD; stdcall;
  172. {$EXTERNALSYM LPDHCP_CONTROL}
  173. PDhcpControl = LPDHCP_CONTROL;
  174. {
  175. Routine Description:
  176. This routine is called whenever the DHCP Server service is
  177. started, stopped, paused or continued as defined by the values of
  178. the dwControlCode parameter. The lpReserved parameter is reserved
  179. for future use and it should not be interpreted in any way. This
  180. routine should not block.
  181. Arguments:
  182. dwControlCode - one of the DHCP_CONTROL_* values
  183. lpReserved - reserved for future use.
  184. }
  185. type
  186. LPDHCP_NEWPKT = function(var Packet: LPBYTE; var PacketSize: DWORD; IpAddress: DWORD;
  187. Reserved: LPVOID; var PktContext: LPVOID; ProcessIt: LPBOOL): DWORD; stdcall;
  188. {$EXTERNALSYM LPDHCP_NEWPKT}
  189. PDhcpNewPkt = LPDHCP_NEWPKT;
  190. {
  191. Routine Description:
  192. This routine is called soon after the DHCP Server receives a
  193. packet that it attempts to process. This routine is in the
  194. critical path of server execution and should return very fast, as
  195. otherwise server performance will be impacted. The Callout DLL
  196. can modify the buffer or return a new buffer via the Packet,
  197. PacketSize arguments. Also, if the callout DLL has internal
  198. structures to keep track of the packet and its progress, it can
  199. then return a context to this packet in the PktContext parameter.
  200. This context will be passed to almost all other hooks to indicate
  201. the packet being referred to. Also, if the Callout DLL is
  202. planning on processing the packet or for some other reason the
  203. DHCP server is not expected to process this packet, then it can
  204. set the ProcessIt flag to FALSE to indicate that the packet is to
  205. be dropped.
  206. Arguments:
  207. Packet - This parameter points to a character buffer that holds
  208. the actual packet received by the DHCP Server.
  209. PacketSize - This parameter points to a variable that holds the
  210. size of the above buffer.
  211. IpAddress - This parameter points to an IPV4 host order IP address
  212. of the socket that this packet was received on.
  213. Reserved -Reserved for future use.
  214. PktContect - This is an opaque pointer used by the DHCP Server for
  215. future references to this packet. It is expected that the callout
  216. DLL will provide this pointer if it is interested in keeping track
  217. of the packet. (See the descriptions for the hooks below for
  218. other usage of this Context).
  219. ProcessIt - This is a BOOL flag that the CalloutDll can set to
  220. TRUE or reset to indicate if the DHCP Server should continue
  221. processing this packet or not, respectively.
  222. }
  223. type
  224. LPDHCP_DROP_SEND = function(var Packet: LPBYTE; var PacketSize: DWORD;
  225. ControlCode, IpAddress: DWORD; Reserved, PktContext: LPVOID): DWORD; stdcall;
  226. {$EXTERNALSYM LPDHCP_DROP_SEND}
  227. PDhcpDropSend = LPDHCP_DROP_SEND;
  228. {
  229. Routine Description:
  230. This hook is called if a packet is (DropPktHook) dropped for some
  231. reason or if the packet is completely processed. (If a packet is
  232. dropped, the hook is called twice as it is called once again to
  233. note that the packet has been completely processed). The callout
  234. DLL should be prepared to handle this hook multiple times for a
  235. packet. This routine should not block. The ControlCode parameter
  236. defines the reasons for the packet being dropped:
  237. * DHCP_DROP_DUPLICATE - This packet is a duplicate of another
  238. received by the server.
  239. * DHCP_DROP_NOMEM - Not enough memory to process the packet.
  240. * DHCP_DROP_INTERNAL_ERROR - Unexpected nternal error occurred.
  241. * DHCP_DROP_TIMEOUT - The packet is too old to process.
  242. * DHCP_DROP_UNAUTH - The server is not authorized.
  243. * DHCP_DROP_PAUSED - The server is paused.
  244. * DHCP_DROP_NO_SUBNETS - There are no subnets configured.
  245. * DHCP_DROP_INVALID - The packet is invalid or it came on an
  246. invalid socket ..
  247. * DHCP_DROP_WRONG_SERVER - The packet was sent to the wrong DHCP Server.
  248. * DHCP_DROP_NOADDRESS - There is no address to offer.
  249. * DHCP_DROP_PROCESSED - The packet has been processed.
  250. * DHCP_DROP_GEN_FAILURE - An unknown error occurred.
  251. This routine is also called right before a response is sent down
  252. the wire (SendPktHook) and in this case the ControlCode has a
  253. value of DHCP_SEND_PACKET.
  254. Arguments:
  255. Packet - This parameter points to a character buffer that holds
  256. the packet being processed by the DHCP Server.
  257. PacketSize - This parameter points to a variable that holds the
  258. size of the above buffer.
  259. ControlCode - See description for various control codes.
  260. IpAddress - This parameter points to an IPV4 host order IP address
  261. of the socket that this packet was received on.
  262. Reserved - Reserved for future use.
  263. PktContext - This parameter is the packet context that the Callout
  264. DLL NewPkt Hook returned for this packet. This can be used to
  265. track a packet.
  266. }
  267. type
  268. LPDHCP_PROB = function(Packet: LPBYTE; PacketSize, ControlCode, IpAddress,
  269. AltAddress: DWORD; Reserved, PktContext: LPVOID): DWORD; stdcall;
  270. {$EXTERNALSYM LPDHCP_PROB}
  271. PDhcpProb = LPDHCP_PROB;
  272. {
  273. Routine Description:
  274. This routine is called whenever special events occur that cause
  275. the packet to be dropped etc. The possible ControlCodes and their
  276. meanings are as follows:
  277. * DHCP_PROB_CONFLICT - The address attempted to be offered
  278. (AltAddress) is in use in the network already.
  279. * DHCP_PROB_DECLINE - The packet was a DECLINE message for the
  280. address specified in AltAddress.
  281. * DHCP_PROB_RELEASE - The packet was a RELEASE message for the
  282. address specified in AltAddress.
  283. * DHCP_PROB_NACKED - The packet was a REQUEST message for address
  284. specified in AltAddress and it was NACKed by the server.
  285. This routine should not block.
  286. Arguments:
  287. Packet - This parameter is the buffer of the packet being
  288. processed.
  289. PacketSize - This is the size of the above buffer.
  290. ControlCode - Specifies the event. See description below for
  291. control codes and meanings.
  292. IpAddress - IpV4 address of socket this packet was received on.
  293. AltAddress - Request IpV4 Address or Ip address that is in
  294. conflict.
  295. Reserved - Reserve for future use.
  296. PktContext - This is the context returned by the NewPkt hook for
  297. this packet.
  298. }
  299. type
  300. LPDHCP_GIVE_ADDRESS = function(Packet: LPBYTE; PacketSize, ControlCode, IpAddress,
  301. AltAddress, AddrType, LeaseTime: DWORD; Reserved, PktContext: LPVOID): DWORD; stdcall;
  302. {$EXTERNALSYM LPDHCP_GIVE_ADDRESS}
  303. PDhcpGiveAddress = LPDHCP_GIVE_ADDRESS;
  304. {
  305. Routine Description:
  306. This routine is called when the server is about to send an ACK to
  307. a REQUEST message. The ControlCode specifies if the address is a
  308. totally new address or if it an renewal of an old address (with
  309. values DHCP_GIVE_ADDRESS_NEW and DHCP_GIVE_ADDRESS_OLD
  310. respectively). The address being offered is passed as the
  311. AltAddress parameter and the AddrType parameter can be one of
  312. DHCP_CLIENT_BOOTP or DHCP_CLIENT_DHCP indicating whether the
  313. client is using BOOTP or DHCP respectively. This call should not
  314. block.
  315. Arguments:
  316. Packet - This parameter is the buffer of the packet being
  317. processed.
  318. PacketSize - This is the size of the above buffer.
  319. ControlCode - See description above for control codes and
  320. meanings.
  321. IpAddress - IpV4 address of socket this packet was received on.
  322. AltAddress - IpV4 address being ACKed to the client.
  323. AddrType - Is this a DHCP or BOOTP address?
  324. LeaseTime - Lease duration being passed.
  325. Reserved - Reserve for future use.
  326. PktContext - This is the context returned by the NewPkt hook for
  327. this packet.
  328. }
  329. type
  330. LPDHCP_HANDLE_OPTIONS = function(Packet: LPBYTE; PacketSize: DWORD;
  331. Reserved, PktContext: LPVOID; ServerOptions: DHCP_SERVER_OPTIONS): DWORD; stdcall;
  332. {$EXTERNALSYM LPDHCP_HANDLE_OPTIONS}
  333. TDhcpHandleOptions = LPDHCP_HANDLE_OPTIONS;
  334. {
  335. Routine Description:
  336. This routine can be utilized by the CalloutDLL to avoid parsing
  337. the whole packet. The packet is parsed by the server and some
  338. commonly used options are returned in the parsed pointers
  339. structure (see header for definition of DHCP_SERVER_OPTIONS). The
  340. hook is expected to make a copy of the structure pointed to by
  341. ServerOptions if it needs it beyond this function call. This
  342. routine may be called several times for a single packet. This
  343. routine should not block.
  344. Arguments:
  345. Packet - This parameter is the buffer of the packet being
  346. processed.
  347. PacketSize - This is the size of the above buffer.
  348. Reserved - Reserve for future use.
  349. PktContext - This is the context returned by the NewPkt hook for
  350. this packet.
  351. ServerOptions - This parameter is the structure that contains a
  352. bunch of pointers that represent corresponding options.
  353. }
  354. type
  355. LPDHCP_DELETE_CLIENT = function(IpAddress: DWORD; HwAddress: LPBYTE;
  356. HwAddressLength: ULONG; Reserved, ClientType: DWORD): DWORD; stdcall;
  357. {$EXTERNALSYM LPDHCP_DELETE_CLIENT}
  358. PDhcpDeleteClient = LPDHCP_DELETE_CLIENT;
  359. {
  360. Routine Description:
  361. This routine is called before a client lease is deleted off the
  362. active leases database. The ClientType field is currently not
  363. provided and this should not be used. This routine should not
  364. block.
  365. Arguments:
  366. IpAddress - IpV4 address of the client lease being deleted.
  367. HwAddress - Buffer holding the Hardware address of the client (MAC).
  368. HwAddressLength - This specifies the length of the above buffer.
  369. Reserved - Reserved for future use.
  370. ClientType - Reserved for future use.
  371. }
  372. type
  373. _DHCP_CALLOUT_TABLE = record
  374. DhcpControlHook: LPDHCP_CONTROL;
  375. DhcpNewPktHook: LPDHCP_NEWPKT;
  376. DhcpPktDropHook: LPDHCP_DROP_SEND;
  377. DhcpPktSendHook: LPDHCP_DROP_SEND;
  378. DhcpAddressDelHook: LPDHCP_PROB;
  379. DhcpAddressOfferHook: LPDHCP_GIVE_ADDRESS;
  380. DhcpHandleOptionsHook: LPDHCP_HANDLE_OPTIONS;
  381. DhcpDeleteClientHook: LPDHCP_DELETE_CLIENT;
  382. DhcpExtensionHook: LPVOID;
  383. DhcpReservedHook: LPVOID;
  384. end;
  385. {$EXTERNALSYM _DHCP_CALLOUT_TABLE}
  386. DHCP_CALLOUT_TABLE = _DHCP_CALLOUT_TABLE;
  387. {$EXTERNALSYM DHCP_CALLOUT_TABLE}
  388. LPDHCP_CALLOUT_TABLE = ^DHCP_CALLOUT_TABLE;
  389. {$EXTERNALSYM LPDHCP_CALLOUT_TABLE}
  390. TDhcpCalloutTable = DHCP_CALLOUT_TABLE;
  391. PDhcpCalloutTable = LPDHCP_CALLOUT_TABLE;
  392. type
  393. LPDHCP_ENTRY_POINT_FUNC = function(ChainDlls: LPWSTR; CalloutVersion: DWORD;
  394. var CalloutTbl: DHCP_CALLOUT_TABLE): DWORD; stdcall;
  395. {$EXTERNALSYM LPDHCP_ENTRY_POINT_FUNC}
  396. PDhcpEntryPointFunc = LPDHCP_ENTRY_POINT_FUNC;
  397. {
  398. Routine Description:
  399. This is the routine that is called by the DHCP Server when it
  400. successfully loads a DLL. If the routine succeeds, then the
  401. DHCP Server does not attempt to load any of the DLLs specified in
  402. the ChainDlls list of DLLs. If this function fails for some
  403. reason, then the DHCP Server proceeds to the next DLL in the
  404. ChainDlls structure.
  405. Note that for version negotiation, the server may call this
  406. routine several times until a compatible version is found.
  407. It is expected that the entrypoint routine would walk through the
  408. names of the dlls and attempt to load each of them and when it
  409. succeeds in retrieving the entry point, it attempts to get the
  410. cumulative set of hooks by repeating the above procedure(as done
  411. by the DHCP Server).
  412. Arguments:
  413. ChainDlls - This is a set of DLL names in REG_MULTI_SZ format (as
  414. returned by Registry function calls). This does not contain the
  415. name of the current DLL itself, but only the names of all DLLs
  416. that follow the current DLL.
  417. CalloutVersion - This is the version that the Callout DLL is
  418. expected to support. The current version number is 0.
  419. CalloutTbl - This is the cumulative set of Hooks that is needed by
  420. the current DLLs as well as all the DLLs in ChainDlls. It is the
  421. responsibility of the current DLL to retrive the cumulative set of
  422. Hooks and merge that with its own set of hooks and return that in
  423. this table structure. The table structure is defined above.
  424. }
  425. {$ENDIF JWA_IMPLEMENTATIONSECTION}
  426. {$IFNDEF JWA_OMIT_SECTIONS}
  427. implementation
  428. //uses ...
  429. {$ENDIF JWA_OMIT_SECTIONS}
  430. {$IFNDEF JWA_INTERFACESECTION}
  431. //your implementation here
  432. {$ENDIF JWA_INTERFACESECTION}
  433. {$IFNDEF JWA_OMIT_SECTIONS}
  434. end.
  435. {$ENDIF JWA_OMIT_SECTIONS}