jwanetsh.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. {******************************************************************************}
  2. { }
  3. { Net Shell 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: netsh.h, released August 2001. The original Pascal }
  9. { code is: NetSh.pas, released December 2001. 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: JwaNetSh.pas,v 1.10 2005/09/08 07:49:25 marquardt Exp $
  43. unit JwaNetSh;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "netsh.h"'}
  47. {$HPPEMIT ''}
  48. {$I jediapilib.inc}
  49. interface
  50. uses
  51. JwaWindows;
  52. // This file contains definitions which are needed by all NetSh helper DLLs.
  53. //
  54. // Error codes
  55. //
  56. const
  57. NETSH_ERROR_BASE = 15000;
  58. {$EXTERNALSYM NETSH_ERROR_BASE}
  59. ERROR_NO_ENTRIES = NETSH_ERROR_BASE + 0;
  60. {$EXTERNALSYM ERROR_NO_ENTRIES}
  61. ERROR_INVALID_SYNTAX = NETSH_ERROR_BASE + 1;
  62. {$EXTERNALSYM ERROR_INVALID_SYNTAX}
  63. ERROR_PROTOCOL_NOT_IN_TRANSPORT = NETSH_ERROR_BASE + 2;
  64. {$EXTERNALSYM ERROR_PROTOCOL_NOT_IN_TRANSPORT}
  65. ERROR_NO_CHANGE = NETSH_ERROR_BASE + 3;
  66. {$EXTERNALSYM ERROR_NO_CHANGE}
  67. ERROR_CMD_NOT_FOUND = NETSH_ERROR_BASE + 4;
  68. {$EXTERNALSYM ERROR_CMD_NOT_FOUND}
  69. ERROR_ENTRY_PT_NOT_FOUND = NETSH_ERROR_BASE + 5;
  70. {$EXTERNALSYM ERROR_ENTRY_PT_NOT_FOUND}
  71. ERROR_DLL_LOAD_FAILED = NETSH_ERROR_BASE + 6;
  72. {$EXTERNALSYM ERROR_DLL_LOAD_FAILED}
  73. ERROR_INIT_DISPLAY = NETSH_ERROR_BASE + 7;
  74. {$EXTERNALSYM ERROR_INIT_DISPLAY}
  75. ERROR_TAG_ALREADY_PRESENT = NETSH_ERROR_BASE + 8;
  76. {$EXTERNALSYM ERROR_TAG_ALREADY_PRESENT}
  77. ERROR_INVALID_OPTION_TAG = NETSH_ERROR_BASE + 9;
  78. {$EXTERNALSYM ERROR_INVALID_OPTION_TAG}
  79. ERROR_NO_TAG = NETSH_ERROR_BASE + 10;
  80. {$EXTERNALSYM ERROR_NO_TAG}
  81. ERROR_MISSING_OPTION = NETSH_ERROR_BASE + 11;
  82. {$EXTERNALSYM ERROR_MISSING_OPTION}
  83. ERROR_TRANSPORT_NOT_PRESENT = NETSH_ERROR_BASE + 12;
  84. {$EXTERNALSYM ERROR_TRANSPORT_NOT_PRESENT}
  85. ERROR_SHOW_USAGE = NETSH_ERROR_BASE + 13;
  86. {$EXTERNALSYM ERROR_SHOW_USAGE}
  87. ERROR_INVALID_OPTION_VALUE = NETSH_ERROR_BASE + 14;
  88. {$EXTERNALSYM ERROR_INVALID_OPTION_VALUE}
  89. ERROR_OKAY = NETSH_ERROR_BASE + 15;
  90. {$EXTERNALSYM ERROR_OKAY}
  91. ERROR_CONTINUE_IN_PARENT_CONTEXT = NETSH_ERROR_BASE + 16;
  92. {$EXTERNALSYM ERROR_CONTINUE_IN_PARENT_CONTEXT}
  93. ERROR_SUPPRESS_OUTPUT = NETSH_ERROR_BASE + 17;
  94. {$EXTERNALSYM ERROR_SUPPRESS_OUTPUT}
  95. ERROR_HELPER_ALREADY_REGISTERED = NETSH_ERROR_BASE + 18;
  96. {$EXTERNALSYM ERROR_HELPER_ALREADY_REGISTERED}
  97. ERROR_CONTEXT_ALREADY_REGISTERED = NETSH_ERROR_BASE + 19;
  98. {$EXTERNALSYM ERROR_CONTEXT_ALREADY_REGISTERED}
  99. NETSH_ERROR_END = ERROR_CONTEXT_ALREADY_REGISTERED;
  100. {$EXTERNALSYM NETSH_ERROR_END}
  101. // Flags
  102. type
  103. NS_CMD_FLAGS = DWORD;
  104. {$EXTERNALSYM NS_CMD_FLAGS}
  105. TNsCmdFlags = NS_CMD_FLAGS;
  106. const
  107. CMD_FLAG_PRIVATE = $01; // not valid in sub-contexts
  108. {$EXTERNALSYM CMD_FLAG_PRIVATE}
  109. CMD_FLAG_INTERACTIVE = $02; // not valid from outside netsh
  110. {$EXTERNALSYM CMD_FLAG_INTERACTIVE}
  111. CMD_FLAG_LOCAL = $08; // not valid from a remote machine
  112. {$EXTERNALSYM CMD_FLAG_LOCAL}
  113. CMD_FLAG_ONLINE = $10; // not valid in offline/non-commit mode
  114. {$EXTERNALSYM CMD_FLAG_ONLINE}
  115. CMD_FLAG_HIDDEN = $20; // hide from help but allow execution
  116. {$EXTERNALSYM CMD_FLAG_HIDDEN}
  117. CMD_FLAG_LIMIT_MASK = $ffff;
  118. {$EXTERNALSYM CMD_FLAG_LIMIT_MASK}
  119. CMD_FLAG_PRIORITY = DWORD($80000000); // ulPriority field is used
  120. {$EXTERNALSYM CMD_FLAG_PRIORITY}
  121. type
  122. NS_REQS = (
  123. NS_REQ_ZERO,
  124. NS_REQ_PRESENT,
  125. NS_REQ_ALLOW_MULTIPLE,
  126. NS_REQ_ONE_OR_MORE);
  127. {$EXTERNALSYM NS_REQS}
  128. TNsReqs = NS_REQS;
  129. NS_EVENTS = DWORD;
  130. {$EXTERNALSYM NS_EVENTS}
  131. TNsEvents = NS_EVENTS;
  132. const
  133. NS_EVENT_LOOP = $00010000;
  134. {$EXTERNALSYM NS_EVENT_LOOP}
  135. NS_EVENT_LAST_N = $00000001;
  136. {$EXTERNALSYM NS_EVENT_LAST_N}
  137. NS_EVENT_LAST_SECS = $00000002;
  138. {$EXTERNALSYM NS_EVENT_LAST_SECS}
  139. NS_EVENT_FROM_N = $00000004;
  140. {$EXTERNALSYM NS_EVENT_FROM_N}
  141. NS_EVENT_FROM_START = $00000008;
  142. {$EXTERNALSYM NS_EVENT_FROM_START}
  143. type
  144. NS_MODE_CHANGE = (
  145. NETSH_COMMIT,
  146. NETSH_UNCOMMIT,
  147. NETSH_FLUSH,
  148. NETSH_COMMIT_STATE,
  149. NETSH_SAVE);
  150. {$EXTERNALSYM NS_MODE_CHANGE}
  151. TNsModeChange = NS_MODE_CHANGE;
  152. const
  153. NS_GET_EVENT_IDS_FN_NAME = 'GetEventIds';
  154. {$EXTERNALSYM NS_GET_EVENT_IDS_FN_NAME}
  155. // todo where is MAX_DLL_NAME
  156. // MAX_NAME_LEN = MAX_DLL_NAME;
  157. // {$EXTERNALSYM MAX_NAME_LEN}
  158. NETSH_VERSION_50 = $0005000;
  159. {$EXTERNALSYM NETSH_VERSION_50}
  160. NETSH_ARG_DELIMITER = WideString('=');
  161. {$EXTERNALSYM NETSH_ARG_DELIMITER}
  162. NETSH_CMD_DELIMITER = WideString(' ');
  163. {$EXTERNALSYM NETSH_CMD_DELIMITER}
  164. NETSH_MAX_TOKEN_LENGTH = 64;
  165. {$EXTERNALSYM NETSH_MAX_TOKEN_LENGTH}
  166. NETSH_MAX_CMD_TOKEN_LENGTH = 128;
  167. {$EXTERNALSYM NETSH_MAX_CMD_TOKEN_LENGTH}
  168. NETSH_ROOT_GUID: TGUID = (
  169. D1: 0; D2: 0; D3: 0; D4: (0, 0, 0, 0, 0, 0, 0, 0));
  170. {$EXTERNALSYM NETSH_ROOT_GUID}
  171. DEFAULT_CONTEXT_PRIORITY = 100;
  172. {$EXTERNALSYM DEFAULT_CONTEXT_PRIORITY}
  173. type
  174. PTOKEN_VALUE = ^TOKEN_VALUE;
  175. {$EXTERNALSYM PTOKEN_VALUE}
  176. _TOKEN_VALUE = record
  177. pwszToken: LPCWSTR; // literal token string
  178. dwValue: DWORD; // ID of info string
  179. end;
  180. {$EXTERNALSYM _TOKEN_VALUE}
  181. TOKEN_VALUE = _TOKEN_VALUE;
  182. {$EXTERNALSYM TOKEN_VALUE}
  183. TTokenValue = TOKEN_VALUE;
  184. PTokenValue = PTOKEN_VALUE;
  185. // Macros
  186. (* (rom) not convertible token pasting is specific to the C preprocessor
  187. #define CREATE_CMD_ENTRY(t,f) {CMD_##t, f, HLP_##t, HLP_##t##_EX, CMD_FLAG_PRIVATE, NULL}
  188. #define CREATE_CMD_ENTRY_EX(t,f,i) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, NULL}
  189. #define CREATE_CMD_ENTRY_EX_VER(t,f,i,v) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, v}
  190. #define CREATE_CMD_GROUP_ENTRY(t,s) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), 0, s, NULL }
  191. #define CREATE_CMD_GROUP_ENTRY_EX(t,s,i) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, NULL }
  192. #define CREATE_CMD_GROUP_ENTRY_EX_VER(t,s,i,v) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, v }
  193. (rom) not convertible call by name is specific to the C preprocessor
  194. #define NUM_TOKENS_IN_TABLE(TokenArray) sizeof(TokenArray)/sizeof(TOKEN_VALUE)
  195. #define NUM_TAGS_IN_TABLE(TagsArray) sizeof(TagsArray)/sizeof(TAG_TYPE)
  196. *)
  197. // Callbacks
  198. type
  199. NS_CONTEXT_COMMIT_FN = function(dwAction: DWORD): DWORD; stdcall;
  200. {$EXTERNALSYM NS_CONTEXT_COMMIT_FN}
  201. PNS_CONTEXT_COMMIT_FN = ^NS_CONTEXT_COMMIT_FN;
  202. {$EXTERNALSYM PNS_CONTEXT_COMMIT_FN}
  203. TNsContextCommitFn = NS_CONTEXT_COMMIT_FN;
  204. PNsContextCommitFn = PNS_CONTEXT_COMMIT_FN;
  205. NS_CONTEXT_CONNECT_FN = function(pwszMachine: LPCWSTR): DWORD; stdcall;
  206. {$EXTERNALSYM NS_CONTEXT_CONNECT_FN}
  207. PNS_CONTEXT_CONNECT_FN = ^NS_CONTEXT_CONNECT_FN;
  208. {$EXTERNALSYM PNS_CONTEXT_CONNECT_FN}
  209. TNsContextConnextFn = NS_CONTEXT_CONNECT_FN;
  210. PNsContextConnextFn = PNS_CONTEXT_CONNECT_FN;
  211. NS_CONTEXT_DUMP_FN = function(pwszRouter: LPCWSTR; var ppwcArguments: LPWSTR; dwArgCount: DWORD; pvData: LPCVOID): DWORD; stdcall;
  212. {$EXTERNALSYM NS_CONTEXT_DUMP_FN}
  213. PNS_CONTEXT_DUMP_FN = ^NS_CONTEXT_DUMP_FN;
  214. {$EXTERNALSYM PNS_CONTEXT_DUMP_FN}
  215. TNsContextDumpFn = NS_CONTEXT_DUMP_FN;
  216. PNsContextDumpFn = PNS_CONTEXT_DUMP_FN;
  217. NS_DLL_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
  218. {$EXTERNALSYM NS_DLL_STOP_FN}
  219. PNS_DLL_STOP_FN = ^NS_DLL_STOP_FN;
  220. {$EXTERNALSYM PNS_DLL_STOP_FN}
  221. TNsDllStopFn = NS_DLL_STOP_FN;
  222. PNsDllStopFn = PNS_DLL_STOP_FN;
  223. NS_HELPER_START_FN = function(const pguidParent: TGUID; dwVersion: DWORD): DWORD; stdcall;
  224. {$EXTERNALSYM NS_HELPER_START_FN}
  225. PNS_HELPER_START_FN = NS_HELPER_START_FN;
  226. {$EXTERNALSYM PNS_HELPER_START_FN}
  227. TNsHelperStartFn = NS_HELPER_START_FN;
  228. PNsHelperStartFn = PNS_HELPER_START_FN;
  229. NS_HELPER_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
  230. {$EXTERNALSYM NS_HELPER_STOP_FN}
  231. PNS_HELPER_STOP_FN = ^NS_HELPER_STOP_FN;
  232. {$EXTERNALSYM PNS_HELPER_STOP_FN}
  233. TNsHelperStopFn = NS_HELPER_STOP_FN;
  234. PNsHelperStopFn = PNS_HELPER_STOP_FN;
  235. FN_HANDLE_CMD = function(pwszMachine: LPCWSTR; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount,
  236. dwFlags: DWORD; pvData: LPCVOID; var pbDone: BOOL): DWORD; stdcall;
  237. {$EXTERNALSYM FN_HANDLE_CMD}
  238. PFN_HANDLE_CMD = ^FN_HANDLE_CMD;
  239. {$EXTERNALSYM PFN_HANDLE_CMD}
  240. TFnHandleCmd = FN_HANDLE_CMD;
  241. PFnHandleCmd = PFN_HANDLE_CMD;
  242. NS_OSVERSIONCHECK = function(CIMOSType, CIMOSProductSuite: UINT; CIMOSVersion, CIMOSBuildNumber, CIMServicePackMajorVersion,
  243. CIMServicePackMinorVersion: LPCWSTR; CIMProcessorArchitecture: UINT; dwReserved: DWORD): BOOL; stdcall;
  244. {$EXTERNALSYM NS_OSVERSIONCHECK}
  245. PNS_OSVERSIONCHECK = ^NS_OSVERSIONCHECK;
  246. {$EXTERNALSYM PNS_OSVERSIONCHECK}
  247. TNsOSVersionCheck = NS_OSVERSIONCHECK;
  248. PNsOSVersionCheck = PNS_OSVERSIONCHECK;
  249. // Structures
  250. _NS_HELPER_ATTRIBUTES = record
  251. Union: record
  252. case Integer of
  253. 0: (
  254. dwVersion: DWORD;
  255. dwReserved: DWORD);
  256. 1: (
  257. _ullAlign: ULONGLONG);
  258. end;
  259. guidHelper: TGUID; // GUID associated with the helper
  260. pfnStart: PNS_HELPER_START_FN; // Function to start this helper
  261. pfnStop: PNS_HELPER_STOP_FN; // Function to stop this helper
  262. end;
  263. {$EXTERNALSYM _NS_HELPER_ATTRIBUTES}
  264. NS_HELPER_ATTRIBUTES = _NS_HELPER_ATTRIBUTES;
  265. {$EXTERNALSYM NS_HELPER_ATTRIBUTES}
  266. PNS_HELPER_ATTRIBUTES = ^NS_HELPER_ATTRIBUTES;
  267. {$EXTERNALSYM PNS_HELPER_ATTRIBUTES}
  268. TNsHelperAttributes = NS_HELPER_ATTRIBUTES;
  269. PNsHelperAttributes = PNS_HELPER_ATTRIBUTES;
  270. PCMD_ENTRY = ^CMD_ENTRY;
  271. {$EXTERNALSYM PCMD_ENTRY}
  272. _CMD_ENTRY = record
  273. pwszCmdToken: LPCWSTR; // The token for the command
  274. pfnCmdHandler: PFN_HANDLE_CMD; // The function which handles this command
  275. dwShortCmdHelpToken: DWORD; // The short help message
  276. dwCmdHlpToken: DWORD; // The message to display if the only thing after the command is a help token (HELP, /?, -?, ?)
  277. dwFlags: DWORD; // Flags (see CMD_FLAGS_xxx above)
  278. pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
  279. end;
  280. {$EXTERNALSYM _CMD_ENTRY}
  281. CMD_ENTRY = _CMD_ENTRY;
  282. {$EXTERNALSYM CMD_ENTRY}
  283. TCmdEntry = CMD_ENTRY;
  284. PCmdEntry = PCMD_ENTRY;
  285. PCMD_GROUP_ENTRY = ^CMD_GROUP_ENTRY;
  286. {$EXTERNALSYM PCMD_GROUP_ENTRY}
  287. _CMD_GROUP_ENTRY = record
  288. pwszCmdGroupToken: LPCWSTR; // The token for the command verb
  289. dwShortCmdHelpToken: DWORD; // The message to display in a command listing.
  290. ulCmdGroupSize: ULONG; // The number of entries in the cmd table
  291. dwFlags: DWORD; // Flags (see CMD_FLAG_xxx)
  292. pCmdGroup: PCMD_ENTRY; // The command table
  293. pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
  294. end;
  295. {$EXTERNALSYM _CMD_GROUP_ENTRY}
  296. CMD_GROUP_ENTRY = _CMD_GROUP_ENTRY;
  297. {$EXTERNALSYM CMD_GROUP_ENTRY}
  298. TCmdGroupEntry = CMD_GROUP_ENTRY;
  299. PCmdGroupEntry = PCMD_GROUP_ENTRY;
  300. _NS_CONTEXT_ATTRIBUTES = record
  301. Union: record
  302. case Integer of
  303. 0: (
  304. dwVersion: DWORD;
  305. dwReserved: DWORD);
  306. 1: (
  307. _ullAlign: ULONGLONG);
  308. end;
  309. pwszContext: LPWSTR; // Name of the context
  310. guidHelper: TGUID; // GUID of the helper servicing this context
  311. dwFlags: DWORD; // Flags limiting when context is available. (See CMD_FLAG_xxx)
  312. ulPriority: ULONG; // Priority field is only relevant if CMD_FLAG_PRIORITY is set in dwFlags
  313. ulNumTopCmds: ULONG; // Number of top-level commands
  314. pTopCmds: PCMD_ENTRY; // Array of top-level commands
  315. ulNumGroups: ULONG; // Number of command groups
  316. pCmdGroups: PCMD_GROUP_ENTRY; // Array of command groups
  317. pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
  318. pfnDumpFn: PNS_CONTEXT_DUMP_FN;
  319. pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
  320. pReserved: PVOID;
  321. pfnOsVersionCheck: PNS_OSVERSIONCHECK;
  322. end;
  323. {$EXTERNALSYM _NS_CONTEXT_ATTRIBUTES}
  324. NS_CONTEXT_ATTRIBUTES = _NS_CONTEXT_ATTRIBUTES;
  325. {$EXTERNALSYM NS_CONTEXT_ATTRIBUTES}
  326. PNS_CONTEXT_ATTRIBUTES = ^NS_CONTEXT_ATTRIBUTES;
  327. {$EXTERNALSYM PNS_CONTEXT_ATTRIBUTES}
  328. TNsContextAttributes = NS_CONTEXT_ATTRIBUTES;
  329. PNsContextAttributes = PNS_CONTEXT_ATTRIBUTES;
  330. PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
  331. {$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
  332. PTAG_TYPE = ^TAG_TYPE;
  333. {$EXTERNALSYM PTAG_TYPE}
  334. _TAG_TYPE = record
  335. pwszTag: LPCWSTR; // tag string
  336. dwRequired: DWORD; // required or not
  337. bPresent: BOOL; // present or not
  338. end;
  339. {$EXTERNALSYM _TAG_TYPE}
  340. TAG_TYPE = _TAG_TYPE;
  341. {$EXTERNALSYM TAG_TYPE}
  342. TTagType = TAG_TYPE;
  343. PTagType = PTAG_TYPE;
  344. type
  345. NS_DLL_INIT_FN = function(dwNetshVersion: DWORD; pReserved: PVOID): DWORD; stdcall;
  346. {$EXTERNALSYM NS_DLL_INIT_FN}
  347. PNS_DLL_INIT_FN = ^NS_DLL_INIT_FN;
  348. {$EXTERNALSYM PNS_DLL_INIT_FN}
  349. TNdDllInitFn = NS_DLL_INIT_FN;
  350. PNdDllInitFn = PNS_DLL_INIT_FN;
  351. // Exports
  352. function GetHostMachineInfo(var puiCIMOSType, puiCIMOSProductSuite: UINT; pszCIMOSVersion, pszCIMOSBuildNumber,
  353. pszCIMServicePackMajorVersion, pszCIMServicePackMinorVersion: LPWSTR; var puiCIMProcessorArchitecture: UINT): DWORD; stdcall;
  354. {$EXTERNALSYM GetHostMachineInfo}
  355. function MatchEnumTag(hModule: HANDLE; pwcArg: LPCWSTR; dwNumArg: DWORD; pEnumTable: PTOKEN_VALUE; pdwValue: PDWORD): DWORD; stdcall;
  356. {$EXTERNALSYM MatchEnumTag}
  357. function MatchToken(pwszUserToken, pwszCmdToken: LPCWSTR): BOOL; stdcall;
  358. {$EXTERNALSYM MatchToken}
  359. function PreprocessCommand(hModule: HANDLE; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount: DWORD; pttTags: PTAG_TYPE;
  360. dwTagCount, dwMinArgs, dwMaxArgs: DWORD; var pdwTagType: DWORD): DWORD; stdcall;
  361. {$EXTERNALSYM PreprocessCommand}
  362. (* TODO
  363. DWORD PrintError(
  364. IN HANDLE hModule, OPTIONAL
  365. IN DWORD dwErrId,
  366. ...
  367. );
  368. DWORD PrintMessageFromModule(
  369. IN HANDLE hModule,
  370. IN DWORD dwMsgId,
  371. ...
  372. );
  373. DWORD PrintMessage(
  374. IN LPCWSTR pwszFormat,
  375. ...
  376. );
  377. *)
  378. function RegisterContext(pChildContext: PNS_CONTEXT_ATTRIBUTES): DWORD; stdcall;
  379. {$EXTERNALSYM RegisterContext}
  380. function RegisterHelper(const pguidParentContext: TGUID; pfnRegisterSubContext: PNS_HELPER_ATTRIBUTES): DWORD; stdcall;
  381. {$EXTERNALSYM RegisterHelper}
  382. implementation
  383. uses
  384. JwaWinDLLNames;
  385. {$IFDEF DYNAMIC_LINK}
  386. var
  387. _GetHostMachineInfo: Pointer;
  388. function GetHostMachineInfo;
  389. begin
  390. GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
  391. asm
  392. MOV ESP, EBP
  393. POP EBP
  394. JMP [_GetHostMachineInfo]
  395. end;
  396. end;
  397. var
  398. _MatchEnumTag: Pointer;
  399. function MatchEnumTag;
  400. begin
  401. GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
  402. asm
  403. MOV ESP, EBP
  404. POP EBP
  405. JMP [_MatchEnumTag]
  406. end;
  407. end;
  408. var
  409. _MatchToken: Pointer;
  410. function MatchToken;
  411. begin
  412. GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
  413. asm
  414. MOV ESP, EBP
  415. POP EBP
  416. JMP [_MatchToken]
  417. end;
  418. end;
  419. var
  420. _PreprocessCommand: Pointer;
  421. function PreprocessCommand;
  422. begin
  423. GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
  424. asm
  425. MOV ESP, EBP
  426. POP EBP
  427. JMP [_PreprocessCommand]
  428. end;
  429. end;
  430. var
  431. _RegisterContext: Pointer;
  432. function RegisterContext;
  433. begin
  434. GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
  435. asm
  436. MOV ESP, EBP
  437. POP EBP
  438. JMP [_RegisterContext]
  439. end;
  440. end;
  441. var
  442. _RegisterHelper: Pointer;
  443. function RegisterHelper;
  444. begin
  445. GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
  446. asm
  447. MOV ESP, EBP
  448. POP EBP
  449. JMP [_RegisterHelper]
  450. end;
  451. end;
  452. {$ELSE}
  453. function GetHostMachineInfo; external netsh name 'GetHostMachineInfo';
  454. function MatchEnumTag; external netsh name 'MatchEnumTag';
  455. function MatchToken; external netsh name 'MatchToken';
  456. function PreprocessCommand; external netsh name 'PreprocessCommand';
  457. function RegisterContext; external netsh name 'RegisterContext';
  458. function RegisterHelper; external netsh name 'RegisterHelper';
  459. {$ENDIF DYNAMIC_LINK}
  460. end.