jwanetsh.pas 19 KB

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