1
{******************************************************************************}
3
{ Net Shell API interface Unit for Object Pascal }
5
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
6
{ Corporation. All Rights Reserved. }
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). }
12
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
13
{ Marcel van Brakel. All Rights Reserved. }
15
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
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 }
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 }
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. }
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. }
39
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
41
{******************************************************************************}
43
// $Id: jwanetsh.pas,v 1.1 2005/04/04 07:56:10 marco Exp $
50
{$HPPEMIT '#include "netsh.h"'}
60
// This file contains definitions which are needed by all NetSh helper DLLs.
67
NETSH_ERROR_BASE = 15000;
68
{$EXTERNALSYM NETSH_ERROR_BASE}
69
ERROR_NO_ENTRIES = NETSH_ERROR_BASE + 0;
70
{$EXTERNALSYM ERROR_NO_ENTRIES}
71
ERROR_INVALID_SYNTAX = NETSH_ERROR_BASE + 1;
72
{$EXTERNALSYM ERROR_INVALID_SYNTAX}
73
ERROR_PROTOCOL_NOT_IN_TRANSPORT = NETSH_ERROR_BASE + 2;
74
{$EXTERNALSYM ERROR_PROTOCOL_NOT_IN_TRANSPORT}
75
ERROR_NO_CHANGE = NETSH_ERROR_BASE + 3;
76
{$EXTERNALSYM ERROR_NO_CHANGE}
77
ERROR_CMD_NOT_FOUND = NETSH_ERROR_BASE + 4;
78
{$EXTERNALSYM ERROR_CMD_NOT_FOUND}
79
ERROR_ENTRY_PT_NOT_FOUND = NETSH_ERROR_BASE + 5;
80
{$EXTERNALSYM ERROR_ENTRY_PT_NOT_FOUND}
81
ERROR_DLL_LOAD_FAILED = NETSH_ERROR_BASE + 6;
82
{$EXTERNALSYM ERROR_DLL_LOAD_FAILED}
83
ERROR_INIT_DISPLAY = NETSH_ERROR_BASE + 7;
84
{$EXTERNALSYM ERROR_INIT_DISPLAY}
85
ERROR_TAG_ALREADY_PRESENT = NETSH_ERROR_BASE + 8;
86
{$EXTERNALSYM ERROR_TAG_ALREADY_PRESENT}
87
ERROR_INVALID_OPTION_TAG = NETSH_ERROR_BASE + 9;
88
{$EXTERNALSYM ERROR_INVALID_OPTION_TAG}
89
ERROR_NO_TAG = NETSH_ERROR_BASE + 10;
90
{$EXTERNALSYM ERROR_NO_TAG}
91
ERROR_MISSING_OPTION = NETSH_ERROR_BASE + 11;
92
{$EXTERNALSYM ERROR_MISSING_OPTION}
93
ERROR_TRANSPORT_NOT_PRESENT = NETSH_ERROR_BASE + 12;
94
{$EXTERNALSYM ERROR_TRANSPORT_NOT_PRESENT}
95
ERROR_SHOW_USAGE = NETSH_ERROR_BASE + 13;
96
{$EXTERNALSYM ERROR_SHOW_USAGE}
97
ERROR_INVALID_OPTION_VALUE = NETSH_ERROR_BASE + 14;
98
{$EXTERNALSYM ERROR_INVALID_OPTION_VALUE}
99
ERROR_OKAY = NETSH_ERROR_BASE + 15;
100
{$EXTERNALSYM ERROR_OKAY}
101
ERROR_CONTINUE_IN_PARENT_CONTEXT = NETSH_ERROR_BASE + 16;
102
{$EXTERNALSYM ERROR_CONTINUE_IN_PARENT_CONTEXT}
103
ERROR_SUPPRESS_OUTPUT = NETSH_ERROR_BASE + 17;
104
{$EXTERNALSYM ERROR_SUPPRESS_OUTPUT}
105
ERROR_HELPER_ALREADY_REGISTERED = NETSH_ERROR_BASE + 18;
106
{$EXTERNALSYM ERROR_HELPER_ALREADY_REGISTERED}
107
ERROR_CONTEXT_ALREADY_REGISTERED = NETSH_ERROR_BASE + 19;
108
{$EXTERNALSYM ERROR_CONTEXT_ALREADY_REGISTERED}
109
NETSH_ERROR_END = ERROR_CONTEXT_ALREADY_REGISTERED;
110
{$EXTERNALSYM NETSH_ERROR_END}
115
NS_CMD_FLAGS = DWORD;
116
{$EXTERNALSYM NS_CMD_FLAGS}
117
TNsCmdFlags = NS_CMD_FLAGS;
120
CMD_FLAG_PRIVATE = $01; // not valid in sub-contexts
121
{$EXTERNALSYM CMD_FLAG_PRIVATE}
122
CMD_FLAG_INTERACTIVE = $02; // not valid from outside netsh
123
{$EXTERNALSYM CMD_FLAG_INTERACTIVE}
124
CMD_FLAG_LOCAL = $08; // not valid from a remote machine
125
{$EXTERNALSYM CMD_FLAG_LOCAL}
126
CMD_FLAG_ONLINE = $10; // not valid in offline/non-commit mode
127
{$EXTERNALSYM CMD_FLAG_ONLINE}
128
CMD_FLAG_HIDDEN = $20; // hide from help but allow execution
129
{$EXTERNALSYM CMD_FLAG_HIDDEN}
130
CMD_FLAG_LIMIT_MASK = $ffff;
131
{$EXTERNALSYM CMD_FLAG_LIMIT_MASK}
132
CMD_FLAG_PRIORITY = DWORD($80000000); // ulPriority field is used
133
{$EXTERNALSYM CMD_FLAG_PRIORITY}
139
NS_REQ_ALLOW_MULTIPLE,
141
{$EXTERNALSYM NS_REQS}
145
{$EXTERNALSYM NS_EVENTS}
146
TNsEvents = NS_EVENTS;
149
NS_EVENT_LOOP = $00010000;
150
{$EXTERNALSYM NS_EVENT_LOOP}
151
NS_EVENT_LAST_N = $00000001;
152
{$EXTERNALSYM NS_EVENT_LAST_N}
153
NS_EVENT_LAST_SECS = $00000002;
154
{$EXTERNALSYM NS_EVENT_LAST_SECS}
155
NS_EVENT_FROM_N = $00000004;
156
{$EXTERNALSYM NS_EVENT_FROM_N}
157
NS_EVENT_FROM_START = $00000008;
158
{$EXTERNALSYM NS_EVENT_FROM_START}
167
{$EXTERNALSYM NS_MODE_CHANGE}
168
TNsModeChange = NS_MODE_CHANGE;
171
NS_GET_EVENT_IDS_FN_NAME = 'GetEventIds';
172
{$EXTERNALSYM NS_GET_EVENT_IDS_FN_NAME}
174
// todo where is MAX_DLL_NAME
175
// MAX_NAME_LEN = MAX_DLL_NAME;
176
// {$EXTERNALSYM MAX_NAME_LEN}
178
NETSH_VERSION_50 = $0005000;
179
{$EXTERNALSYM NETSH_VERSION_50}
181
NETSH_ARG_DELIMITER = WideString('=');
182
{$EXTERNALSYM NETSH_ARG_DELIMITER}
183
NETSH_CMD_DELIMITER = WideString(' ');
184
{$EXTERNALSYM NETSH_CMD_DELIMITER}
186
NETSH_MAX_TOKEN_LENGTH = 64;
187
{$EXTERNALSYM NETSH_MAX_TOKEN_LENGTH}
188
NETSH_MAX_CMD_TOKEN_LENGTH = 128;
189
{$EXTERNALSYM NETSH_MAX_CMD_TOKEN_LENGTH}
191
NETSH_ROOT_GUID: TGUID = (
192
D1: 0; D2: 0; D3: 0; D4: (0, 0, 0, 0, 0, 0, 0, 0));
193
{$EXTERNALSYM NETSH_ROOT_GUID}
195
DEFAULT_CONTEXT_PRIORITY = 100;
196
{$EXTERNALSYM DEFAULT_CONTEXT_PRIORITY}
199
PTOKEN_VALUE = ^TOKEN_VALUE;
200
{$EXTERNALSYM PTOKEN_VALUE}
201
_TOKEN_VALUE = record
202
pwszToken: LPCWSTR; // literal token string
203
dwValue: DWORD; // ID of info string
205
{$EXTERNALSYM _TOKEN_VALUE}
206
TOKEN_VALUE = _TOKEN_VALUE;
207
{$EXTERNALSYM TOKEN_VALUE}
208
TTokenValue = TOKEN_VALUE;
209
PTokenValue = PTOKEN_VALUE;
214
#define CREATE_CMD_ENTRY(t,f) {CMD_##t, f, HLP_##t, HLP_##t##_EX, CMD_FLAG_PRIVATE, NULL}
215
#define CREATE_CMD_ENTRY_EX(t,f,i) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, NULL}
216
#define CREATE_CMD_ENTRY_EX_VER(t,f,i,v) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, v}
218
#define CREATE_CMD_GROUP_ENTRY(t,s) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), 0, s, NULL }
219
#define CREATE_CMD_GROUP_ENTRY_EX(t,s,i) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, NULL }
220
#define CREATE_CMD_GROUP_ENTRY_EX_VER(t,s,i,v) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, v }
222
#define NUM_TOKENS_IN_TABLE(TokenArray) sizeof(TokenArray)/sizeof(TOKEN_VALUE)
223
#define NUM_TAGS_IN_TABLE(TagsArray) sizeof(TagsArray)/sizeof(TAG_TYPE)
229
NS_CONTEXT_COMMIT_FN = function(dwAction: DWORD): DWORD; stdcall;
230
{$EXTERNALSYM NS_CONTEXT_COMMIT_FN}
231
PNS_CONTEXT_COMMIT_FN = ^NS_CONTEXT_COMMIT_FN;
232
{$EXTERNALSYM PNS_CONTEXT_COMMIT_FN}
233
TNsContextCommitFn = NS_CONTEXT_COMMIT_FN;
234
PNsContextCommitFn = PNS_CONTEXT_COMMIT_FN;
236
NS_CONTEXT_CONNECT_FN = function(pwszMachine: LPCWSTR): DWORD; stdcall;
237
{$EXTERNALSYM NS_CONTEXT_CONNECT_FN}
238
PNS_CONTEXT_CONNECT_FN = ^NS_CONTEXT_CONNECT_FN;
239
{$EXTERNALSYM PNS_CONTEXT_CONNECT_FN}
240
TNsContextConnextFn = NS_CONTEXT_CONNECT_FN;
241
PNsContextConnextFn = PNS_CONTEXT_CONNECT_FN;
243
NS_CONTEXT_DUMP_FN = function(pwszRouter: LPCWSTR; var ppwcArguments: LPWSTR; dwArgCount: DWORD; pvData: LPCVOID): DWORD; stdcall;
244
{$EXTERNALSYM NS_CONTEXT_DUMP_FN}
245
PNS_CONTEXT_DUMP_FN = ^NS_CONTEXT_DUMP_FN;
246
{$EXTERNALSYM PNS_CONTEXT_DUMP_FN}
247
TNsContextDumpFn = NS_CONTEXT_DUMP_FN;
248
PNsContextDumpFn = PNS_CONTEXT_DUMP_FN;
250
NS_DLL_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
251
{$EXTERNALSYM NS_DLL_STOP_FN}
252
PNS_DLL_STOP_FN = ^NS_DLL_STOP_FN;
253
{$EXTERNALSYM PNS_DLL_STOP_FN}
254
TNsDllStopFn = NS_DLL_STOP_FN;
255
PNsDllStopFn = PNS_DLL_STOP_FN;
257
NS_HELPER_START_FN = function(const pguidParent: TGUID; dwVersion: DWORD): DWORD; stdcall;
258
{$EXTERNALSYM NS_HELPER_START_FN}
259
PNS_HELPER_START_FN = NS_HELPER_START_FN;
260
{$EXTERNALSYM PNS_HELPER_START_FN}
261
TNsHelperStartFn = NS_HELPER_START_FN;
262
PNsHelperStartFn = PNS_HELPER_START_FN;
264
NS_HELPER_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
265
{$EXTERNALSYM NS_HELPER_STOP_FN}
266
PNS_HELPER_STOP_FN = ^NS_HELPER_STOP_FN;
267
{$EXTERNALSYM PNS_HELPER_STOP_FN}
268
TNsHelperStopFn = NS_HELPER_STOP_FN;
269
PNsHelperStopFn = PNS_HELPER_STOP_FN;
271
FN_HANDLE_CMD = function(pwszMachine: LPCWSTR; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount,
272
dwFlags: DWORD; pvData: LPCVOID; var pbDone: BOOL): DWORD; stdcall;
273
{$EXTERNALSYM FN_HANDLE_CMD}
274
PFN_HANDLE_CMD = ^FN_HANDLE_CMD;
275
{$EXTERNALSYM PFN_HANDLE_CMD}
276
TFnHandleCmd = FN_HANDLE_CMD;
277
PFnHandleCmd = PFN_HANDLE_CMD;
279
NS_OSVERSIONCHECK = function(CIMOSType, CIMOSProductSuite: UINT; CIMOSVersion, CIMOSBuildNumber, CIMServicePackMajorVersion,
280
CIMServicePackMinorVersion: LPCWSTR; CIMProcessorArchitecture: UINT; dwReserved: DWORD): BOOL; stdcall;
281
{$EXTERNALSYM NS_OSVERSIONCHECK}
282
PNS_OSVERSIONCHECK = ^NS_OSVERSIONCHECK;
283
{$EXTERNALSYM PNS_OSVERSIONCHECK}
284
TNsOSVersionCheck = NS_OSVERSIONCHECK;
285
PNsOSVersionCheck = PNS_OSVERSIONCHECK;
289
_NS_HELPER_ATTRIBUTES = record
296
_ullAlign: ULONGLONG);
298
guidHelper: TGUID; // GUID associated with the helper
299
pfnStart: PNS_HELPER_START_FN; // Function to start this helper
300
pfnStop: PNS_HELPER_STOP_FN; // Function to stop this helper
302
{$EXTERNALSYM _NS_HELPER_ATTRIBUTES}
303
NS_HELPER_ATTRIBUTES = _NS_HELPER_ATTRIBUTES;
304
{$EXTERNALSYM NS_HELPER_ATTRIBUTES}
305
PNS_HELPER_ATTRIBUTES = ^NS_HELPER_ATTRIBUTES;
306
{$EXTERNALSYM PNS_HELPER_ATTRIBUTES}
307
TNsHelperAttributes = NS_HELPER_ATTRIBUTES;
308
PNsHelperAttributes = PNS_HELPER_ATTRIBUTES;
310
PCMD_ENTRY = ^CMD_ENTRY;
311
{$EXTERNALSYM PCMD_ENTRY}
313
pwszCmdToken: LPCWSTR; // The token for the command
314
pfnCmdHandler: PFN_HANDLE_CMD; // The function which handles this command
315
dwShortCmdHelpToken: DWORD; // The short help message
316
dwCmdHlpToken: DWORD; // The message to display if the only thing after the command is a help token (HELP, /?, -?, ?)
317
dwFlags: DWORD; // Flags (see CMD_FLAGS_xxx above)
318
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
320
{$EXTERNALSYM _CMD_ENTRY}
321
CMD_ENTRY = _CMD_ENTRY;
322
{$EXTERNALSYM CMD_ENTRY}
323
TCmdEntry = CMD_ENTRY;
324
PCmdEntry = PCMD_ENTRY;
326
PCMD_GROUP_ENTRY = ^CMD_GROUP_ENTRY;
327
{$EXTERNALSYM PCMD_GROUP_ENTRY}
328
_CMD_GROUP_ENTRY = record
329
pwszCmdGroupToken: LPCWSTR; // The token for the command verb
330
dwShortCmdHelpToken: DWORD; // The message to display in a command listing.
331
ulCmdGroupSize: ULONG; // The number of entries in the cmd table
332
dwFlags: DWORD; // Flags (see CMD_FLAG_xxx)
333
pCmdGroup: PCMD_ENTRY; // The command table
334
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
336
{$EXTERNALSYM _CMD_GROUP_ENTRY}
337
CMD_GROUP_ENTRY = _CMD_GROUP_ENTRY;
338
{$EXTERNALSYM CMD_GROUP_ENTRY}
339
TCmdGroupEntry = CMD_GROUP_ENTRY;
340
PCmdGroupEntry = PCMD_GROUP_ENTRY;
342
_NS_CONTEXT_ATTRIBUTES = record
349
_ullAlign: ULONGLONG);
351
pwszContext: LPWSTR; // Name of the context
352
guidHelper: TGUID; // GUID of the helper servicing this context
353
dwFlags: DWORD; // Flags limiting when context is available. (See CMD_FLAG_xxx)
354
ulPriority: ULONG; // Priority field is only relevant if CMD_FLAG_PRIORITY is set in dwFlags
355
ulNumTopCmds: ULONG; // Number of top-level commands
356
pTopCmds: PCMD_ENTRY; // Array of top-level commands
357
ulNumGroups: ULONG; // Number of command groups
358
pCmdGroups: PCMD_GROUP_ENTRY; // Array of command groups
360
pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
361
pfnDumpFn: PNS_CONTEXT_DUMP_FN;
362
pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
364
pfnOsVersionCheck: PNS_OSVERSIONCHECK;
366
{$EXTERNALSYM _NS_CONTEXT_ATTRIBUTES}
367
NS_CONTEXT_ATTRIBUTES = _NS_CONTEXT_ATTRIBUTES;
368
{$EXTERNALSYM NS_CONTEXT_ATTRIBUTES}
369
PNS_CONTEXT_ATTRIBUTES = ^NS_CONTEXT_ATTRIBUTES;
370
{$EXTERNALSYM PNS_CONTEXT_ATTRIBUTES}
371
TNsContextAttributes = NS_CONTEXT_ATTRIBUTES;
372
PNsContextAttributes = PNS_CONTEXT_ATTRIBUTES;
374
PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
375
{$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
377
PTAG_TYPE = ^TAG_TYPE;
378
{$EXTERNALSYM PTAG_TYPE}
380
pwszTag: LPCWSTR; // tag string
381
dwRequired: DWORD; // required or not
382
bPresent: BOOL; // present or not
384
{$EXTERNALSYM _TAG_TYPE}
385
TAG_TYPE = _TAG_TYPE;
386
{$EXTERNALSYM TAG_TYPE}
388
PTagType = PTAG_TYPE;
391
NS_DLL_INIT_FN = function(dwNetshVersion: DWORD; pReserved: PVOID): DWORD; stdcall;
392
{$EXTERNALSYM NS_DLL_INIT_FN}
393
PNS_DLL_INIT_FN = ^NS_DLL_INIT_FN;
394
{$EXTERNALSYM PNS_DLL_INIT_FN}
395
TNdDllInitFn = NS_DLL_INIT_FN;
396
PNdDllInitFn = PNS_DLL_INIT_FN;
400
function GetHostMachineInfo(var puiCIMOSType, puiCIMOSProductSuite: UINT; pszCIMOSVersion, pszCIMOSBuildNumber,
401
pszCIMServicePackMajorVersion, pszCIMServicePackMinorVersion: LPWSTR; var puiCIMProcessorArchitecture: UINT): DWORD; stdcall;
402
{$EXTERNALSYM GetHostMachineInfo}
403
function MatchEnumTag(hModule: HANDLE; pwcArg: LPCWSTR; dwNumArg: DWORD; pEnumTable: PTOKEN_VALUE; pdwValue: PDWORD): DWORD; stdcall;
404
{$EXTERNALSYM MatchEnumTag}
405
function MatchToken(pwszUserToken, pwszCmdToken: LPCWSTR): BOOL; stdcall;
406
{$EXTERNALSYM MatchToken}
407
function PreprocessCommand(hModule: HANDLE; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount: DWORD; pttTags: PTAG_TYPE;
408
dwTagCount, dwMinArgs, dwMaxArgs: DWORD; var pdwTagType: DWORD): DWORD; stdcall;
409
{$EXTERNALSYM PreprocessCommand}
413
IN HANDLE hModule, OPTIONAL
418
DWORD PrintMessageFromModule(
425
IN LPCWSTR pwszFormat,
430
function RegisterContext(pChildContext: PNS_CONTEXT_ATTRIBUTES): DWORD; stdcall;
431
{$EXTERNALSYM RegisterContext}
432
function RegisterHelper(const pguidParentContext: TGUID; pfnRegisterSubContext: PNS_HELPER_ATTRIBUTES): DWORD; stdcall;
433
{$EXTERNALSYM RegisterHelper}
440
{$IFDEF DYNAMIC_LINK}
443
_GetHostMachineInfo: Pointer;
445
function GetHostMachineInfo;
447
GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
451
JMP [_GetHostMachineInfo]
456
_MatchEnumTag: Pointer;
458
function MatchEnumTag;
460
GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
469
_MatchToken: Pointer;
473
GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
482
_PreprocessCommand: Pointer;
484
function PreprocessCommand;
486
GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
490
JMP [_PreprocessCommand]
495
_RegisterContext: Pointer;
497
function RegisterContext;
499
GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
503
JMP [_RegisterContext]
508
_RegisterHelper: Pointer;
510
function RegisterHelper;
512
GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
516
JMP [_RegisterHelper]
522
function GetHostMachineInfo; external netsh name 'GetHostMachineInfo';
523
function MatchEnumTag; external netsh name 'MatchEnumTag';
524
function MatchToken; external netsh name 'MatchToken';
525
function PreprocessCommand; external netsh name 'PreprocessCommand';
526
function RegisterContext; external netsh name 'RegisterContext';
527
function RegisterHelper; external netsh name 'RegisterHelper';
529
{$ENDIF DYNAMIC_LINK}
1
{******************************************************************************}
3
{ Net Shell API interface Unit for Object Pascal }
5
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
6
{ Corporation. All Rights Reserved. }
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). }
12
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
13
{ Marcel van Brakel. All Rights Reserved. }
15
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
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 }
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 }
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. }
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. }
39
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
41
{******************************************************************************}
49
{$HPPEMIT '#include "netsh.h"'}
59
// This file contains definitions which are needed by all NetSh helper DLLs.
66
NETSH_ERROR_BASE = 15000;
67
{$EXTERNALSYM NETSH_ERROR_BASE}
68
ERROR_NO_ENTRIES = NETSH_ERROR_BASE + 0;
69
{$EXTERNALSYM ERROR_NO_ENTRIES}
70
ERROR_INVALID_SYNTAX = NETSH_ERROR_BASE + 1;
71
{$EXTERNALSYM ERROR_INVALID_SYNTAX}
72
ERROR_PROTOCOL_NOT_IN_TRANSPORT = NETSH_ERROR_BASE + 2;
73
{$EXTERNALSYM ERROR_PROTOCOL_NOT_IN_TRANSPORT}
74
ERROR_NO_CHANGE = NETSH_ERROR_BASE + 3;
75
{$EXTERNALSYM ERROR_NO_CHANGE}
76
ERROR_CMD_NOT_FOUND = NETSH_ERROR_BASE + 4;
77
{$EXTERNALSYM ERROR_CMD_NOT_FOUND}
78
ERROR_ENTRY_PT_NOT_FOUND = NETSH_ERROR_BASE + 5;
79
{$EXTERNALSYM ERROR_ENTRY_PT_NOT_FOUND}
80
ERROR_DLL_LOAD_FAILED = NETSH_ERROR_BASE + 6;
81
{$EXTERNALSYM ERROR_DLL_LOAD_FAILED}
82
ERROR_INIT_DISPLAY = NETSH_ERROR_BASE + 7;
83
{$EXTERNALSYM ERROR_INIT_DISPLAY}
84
ERROR_TAG_ALREADY_PRESENT = NETSH_ERROR_BASE + 8;
85
{$EXTERNALSYM ERROR_TAG_ALREADY_PRESENT}
86
ERROR_INVALID_OPTION_TAG = NETSH_ERROR_BASE + 9;
87
{$EXTERNALSYM ERROR_INVALID_OPTION_TAG}
88
ERROR_NO_TAG = NETSH_ERROR_BASE + 10;
89
{$EXTERNALSYM ERROR_NO_TAG}
90
ERROR_MISSING_OPTION = NETSH_ERROR_BASE + 11;
91
{$EXTERNALSYM ERROR_MISSING_OPTION}
92
ERROR_TRANSPORT_NOT_PRESENT = NETSH_ERROR_BASE + 12;
93
{$EXTERNALSYM ERROR_TRANSPORT_NOT_PRESENT}
94
ERROR_SHOW_USAGE = NETSH_ERROR_BASE + 13;
95
{$EXTERNALSYM ERROR_SHOW_USAGE}
96
ERROR_INVALID_OPTION_VALUE = NETSH_ERROR_BASE + 14;
97
{$EXTERNALSYM ERROR_INVALID_OPTION_VALUE}
98
ERROR_OKAY = NETSH_ERROR_BASE + 15;
99
{$EXTERNALSYM ERROR_OKAY}
100
ERROR_CONTINUE_IN_PARENT_CONTEXT = NETSH_ERROR_BASE + 16;
101
{$EXTERNALSYM ERROR_CONTINUE_IN_PARENT_CONTEXT}
102
ERROR_SUPPRESS_OUTPUT = NETSH_ERROR_BASE + 17;
103
{$EXTERNALSYM ERROR_SUPPRESS_OUTPUT}
104
ERROR_HELPER_ALREADY_REGISTERED = NETSH_ERROR_BASE + 18;
105
{$EXTERNALSYM ERROR_HELPER_ALREADY_REGISTERED}
106
ERROR_CONTEXT_ALREADY_REGISTERED = NETSH_ERROR_BASE + 19;
107
{$EXTERNALSYM ERROR_CONTEXT_ALREADY_REGISTERED}
108
NETSH_ERROR_END = ERROR_CONTEXT_ALREADY_REGISTERED;
109
{$EXTERNALSYM NETSH_ERROR_END}
114
NS_CMD_FLAGS = DWORD;
115
{$EXTERNALSYM NS_CMD_FLAGS}
116
TNsCmdFlags = NS_CMD_FLAGS;
119
CMD_FLAG_PRIVATE = $01; // not valid in sub-contexts
120
{$EXTERNALSYM CMD_FLAG_PRIVATE}
121
CMD_FLAG_INTERACTIVE = $02; // not valid from outside netsh
122
{$EXTERNALSYM CMD_FLAG_INTERACTIVE}
123
CMD_FLAG_LOCAL = $08; // not valid from a remote machine
124
{$EXTERNALSYM CMD_FLAG_LOCAL}
125
CMD_FLAG_ONLINE = $10; // not valid in offline/non-commit mode
126
{$EXTERNALSYM CMD_FLAG_ONLINE}
127
CMD_FLAG_HIDDEN = $20; // hide from help but allow execution
128
{$EXTERNALSYM CMD_FLAG_HIDDEN}
129
CMD_FLAG_LIMIT_MASK = $ffff;
130
{$EXTERNALSYM CMD_FLAG_LIMIT_MASK}
131
CMD_FLAG_PRIORITY = DWORD($80000000); // ulPriority field is used
132
{$EXTERNALSYM CMD_FLAG_PRIORITY}
138
NS_REQ_ALLOW_MULTIPLE,
140
{$EXTERNALSYM NS_REQS}
144
{$EXTERNALSYM NS_EVENTS}
145
TNsEvents = NS_EVENTS;
148
NS_EVENT_LOOP = $00010000;
149
{$EXTERNALSYM NS_EVENT_LOOP}
150
NS_EVENT_LAST_N = $00000001;
151
{$EXTERNALSYM NS_EVENT_LAST_N}
152
NS_EVENT_LAST_SECS = $00000002;
153
{$EXTERNALSYM NS_EVENT_LAST_SECS}
154
NS_EVENT_FROM_N = $00000004;
155
{$EXTERNALSYM NS_EVENT_FROM_N}
156
NS_EVENT_FROM_START = $00000008;
157
{$EXTERNALSYM NS_EVENT_FROM_START}
166
{$EXTERNALSYM NS_MODE_CHANGE}
167
TNsModeChange = NS_MODE_CHANGE;
170
NS_GET_EVENT_IDS_FN_NAME = 'GetEventIds';
171
{$EXTERNALSYM NS_GET_EVENT_IDS_FN_NAME}
173
// todo where is MAX_DLL_NAME
174
// MAX_NAME_LEN = MAX_DLL_NAME;
175
// {$EXTERNALSYM MAX_NAME_LEN}
177
NETSH_VERSION_50 = $0005000;
178
{$EXTERNALSYM NETSH_VERSION_50}
180
NETSH_ARG_DELIMITER = WideString('=');
181
{$EXTERNALSYM NETSH_ARG_DELIMITER}
182
NETSH_CMD_DELIMITER = WideString(' ');
183
{$EXTERNALSYM NETSH_CMD_DELIMITER}
185
NETSH_MAX_TOKEN_LENGTH = 64;
186
{$EXTERNALSYM NETSH_MAX_TOKEN_LENGTH}
187
NETSH_MAX_CMD_TOKEN_LENGTH = 128;
188
{$EXTERNALSYM NETSH_MAX_CMD_TOKEN_LENGTH}
190
NETSH_ROOT_GUID: TGUID = (
191
D1: 0; D2: 0; D3: 0; D4: (0, 0, 0, 0, 0, 0, 0, 0));
192
{$EXTERNALSYM NETSH_ROOT_GUID}
194
DEFAULT_CONTEXT_PRIORITY = 100;
195
{$EXTERNALSYM DEFAULT_CONTEXT_PRIORITY}
198
PTOKEN_VALUE = ^TOKEN_VALUE;
199
{$EXTERNALSYM PTOKEN_VALUE}
200
_TOKEN_VALUE = record
201
pwszToken: LPCWSTR; // literal token string
202
dwValue: DWORD; // ID of info string
204
{$EXTERNALSYM _TOKEN_VALUE}
205
TOKEN_VALUE = _TOKEN_VALUE;
206
{$EXTERNALSYM TOKEN_VALUE}
207
TTokenValue = TOKEN_VALUE;
208
PTokenValue = PTOKEN_VALUE;
213
#define CREATE_CMD_ENTRY(t,f) {CMD_##t, f, HLP_##t, HLP_##t##_EX, CMD_FLAG_PRIVATE, NULL}
214
#define CREATE_CMD_ENTRY_EX(t,f,i) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, NULL}
215
#define CREATE_CMD_ENTRY_EX_VER(t,f,i,v) {CMD_##t, f, HLP_##t, HLP_##t##_EX, i, v}
217
#define CREATE_CMD_GROUP_ENTRY(t,s) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), 0, s, NULL }
218
#define CREATE_CMD_GROUP_ENTRY_EX(t,s,i) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, NULL }
219
#define CREATE_CMD_GROUP_ENTRY_EX_VER(t,s,i,v) {CMD_##t, HLP_##t, sizeof(s)/sizeof(CMD_ENTRY), i, s, v }
221
#define NUM_TOKENS_IN_TABLE(TokenArray) sizeof(TokenArray)/sizeof(TOKEN_VALUE)
222
#define NUM_TAGS_IN_TABLE(TagsArray) sizeof(TagsArray)/sizeof(TAG_TYPE)
228
NS_CONTEXT_COMMIT_FN = function(dwAction: DWORD): DWORD; stdcall;
229
{$EXTERNALSYM NS_CONTEXT_COMMIT_FN}
230
PNS_CONTEXT_COMMIT_FN = ^NS_CONTEXT_COMMIT_FN;
231
{$EXTERNALSYM PNS_CONTEXT_COMMIT_FN}
232
TNsContextCommitFn = NS_CONTEXT_COMMIT_FN;
233
PNsContextCommitFn = PNS_CONTEXT_COMMIT_FN;
235
NS_CONTEXT_CONNECT_FN = function(pwszMachine: LPCWSTR): DWORD; stdcall;
236
{$EXTERNALSYM NS_CONTEXT_CONNECT_FN}
237
PNS_CONTEXT_CONNECT_FN = ^NS_CONTEXT_CONNECT_FN;
238
{$EXTERNALSYM PNS_CONTEXT_CONNECT_FN}
239
TNsContextConnextFn = NS_CONTEXT_CONNECT_FN;
240
PNsContextConnextFn = PNS_CONTEXT_CONNECT_FN;
242
NS_CONTEXT_DUMP_FN = function(pwszRouter: LPCWSTR; var ppwcArguments: LPWSTR; dwArgCount: DWORD; pvData: LPCVOID): DWORD; stdcall;
243
{$EXTERNALSYM NS_CONTEXT_DUMP_FN}
244
PNS_CONTEXT_DUMP_FN = ^NS_CONTEXT_DUMP_FN;
245
{$EXTERNALSYM PNS_CONTEXT_DUMP_FN}
246
TNsContextDumpFn = NS_CONTEXT_DUMP_FN;
247
PNsContextDumpFn = PNS_CONTEXT_DUMP_FN;
249
NS_DLL_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
250
{$EXTERNALSYM NS_DLL_STOP_FN}
251
PNS_DLL_STOP_FN = ^NS_DLL_STOP_FN;
252
{$EXTERNALSYM PNS_DLL_STOP_FN}
253
TNsDllStopFn = NS_DLL_STOP_FN;
254
PNsDllStopFn = PNS_DLL_STOP_FN;
256
NS_HELPER_START_FN = function(const pguidParent: TGUID; dwVersion: DWORD): DWORD; stdcall;
257
{$EXTERNALSYM NS_HELPER_START_FN}
258
PNS_HELPER_START_FN = NS_HELPER_START_FN;
259
{$EXTERNALSYM PNS_HELPER_START_FN}
260
TNsHelperStartFn = NS_HELPER_START_FN;
261
PNsHelperStartFn = PNS_HELPER_START_FN;
263
NS_HELPER_STOP_FN = function(dwReserved: DWORD): DWORD; stdcall;
264
{$EXTERNALSYM NS_HELPER_STOP_FN}
265
PNS_HELPER_STOP_FN = ^NS_HELPER_STOP_FN;
266
{$EXTERNALSYM PNS_HELPER_STOP_FN}
267
TNsHelperStopFn = NS_HELPER_STOP_FN;
268
PNsHelperStopFn = PNS_HELPER_STOP_FN;
270
FN_HANDLE_CMD = function(pwszMachine: LPCWSTR; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount,
271
dwFlags: DWORD; pvData: LPCVOID; var pbDone: BOOL): DWORD; stdcall;
272
{$EXTERNALSYM FN_HANDLE_CMD}
273
PFN_HANDLE_CMD = ^FN_HANDLE_CMD;
274
{$EXTERNALSYM PFN_HANDLE_CMD}
275
TFnHandleCmd = FN_HANDLE_CMD;
276
PFnHandleCmd = PFN_HANDLE_CMD;
278
NS_OSVERSIONCHECK = function(CIMOSType, CIMOSProductSuite: UINT; CIMOSVersion, CIMOSBuildNumber, CIMServicePackMajorVersion,
279
CIMServicePackMinorVersion: LPCWSTR; CIMProcessorArchitecture: UINT; dwReserved: DWORD): BOOL; stdcall;
280
{$EXTERNALSYM NS_OSVERSIONCHECK}
281
PNS_OSVERSIONCHECK = ^NS_OSVERSIONCHECK;
282
{$EXTERNALSYM PNS_OSVERSIONCHECK}
283
TNsOSVersionCheck = NS_OSVERSIONCHECK;
284
PNsOSVersionCheck = PNS_OSVERSIONCHECK;
288
_NS_HELPER_ATTRIBUTES = record
295
_ullAlign: ULONGLONG);
297
guidHelper: TGUID; // GUID associated with the helper
298
pfnStart: PNS_HELPER_START_FN; // Function to start this helper
299
pfnStop: PNS_HELPER_STOP_FN; // Function to stop this helper
301
{$EXTERNALSYM _NS_HELPER_ATTRIBUTES}
302
NS_HELPER_ATTRIBUTES = _NS_HELPER_ATTRIBUTES;
303
{$EXTERNALSYM NS_HELPER_ATTRIBUTES}
304
PNS_HELPER_ATTRIBUTES = ^NS_HELPER_ATTRIBUTES;
305
{$EXTERNALSYM PNS_HELPER_ATTRIBUTES}
306
TNsHelperAttributes = NS_HELPER_ATTRIBUTES;
307
PNsHelperAttributes = PNS_HELPER_ATTRIBUTES;
309
PCMD_ENTRY = ^CMD_ENTRY;
310
{$EXTERNALSYM PCMD_ENTRY}
312
pwszCmdToken: LPCWSTR; // The token for the command
313
pfnCmdHandler: PFN_HANDLE_CMD; // The function which handles this command
314
dwShortCmdHelpToken: DWORD; // The short help message
315
dwCmdHlpToken: DWORD; // The message to display if the only thing after the command is a help token (HELP, /?, -?, ?)
316
dwFlags: DWORD; // Flags (see CMD_FLAGS_xxx above)
317
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
319
{$EXTERNALSYM _CMD_ENTRY}
320
CMD_ENTRY = _CMD_ENTRY;
321
{$EXTERNALSYM CMD_ENTRY}
322
TCmdEntry = CMD_ENTRY;
323
PCmdEntry = PCMD_ENTRY;
325
PCMD_GROUP_ENTRY = ^CMD_GROUP_ENTRY;
326
{$EXTERNALSYM PCMD_GROUP_ENTRY}
327
_CMD_GROUP_ENTRY = record
328
pwszCmdGroupToken: LPCWSTR; // The token for the command verb
329
dwShortCmdHelpToken: DWORD; // The message to display in a command listing.
330
ulCmdGroupSize: ULONG; // The number of entries in the cmd table
331
dwFlags: DWORD; // Flags (see CMD_FLAG_xxx)
332
pCmdGroup: PCMD_ENTRY; // The command table
333
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
335
{$EXTERNALSYM _CMD_GROUP_ENTRY}
336
CMD_GROUP_ENTRY = _CMD_GROUP_ENTRY;
337
{$EXTERNALSYM CMD_GROUP_ENTRY}
338
TCmdGroupEntry = CMD_GROUP_ENTRY;
339
PCmdGroupEntry = PCMD_GROUP_ENTRY;
341
_NS_CONTEXT_ATTRIBUTES = record
348
_ullAlign: ULONGLONG);
350
pwszContext: LPWSTR; // Name of the context
351
guidHelper: TGUID; // GUID of the helper servicing this context
352
dwFlags: DWORD; // Flags limiting when context is available. (See CMD_FLAG_xxx)
353
ulPriority: ULONG; // Priority field is only relevant if CMD_FLAG_PRIORITY is set in dwFlags
354
ulNumTopCmds: ULONG; // Number of top-level commands
355
pTopCmds: PCMD_ENTRY; // Array of top-level commands
356
ulNumGroups: ULONG; // Number of command groups
357
pCmdGroups: PCMD_GROUP_ENTRY; // Array of command groups
359
pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
360
pfnDumpFn: PNS_CONTEXT_DUMP_FN;
361
pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
363
pfnOsVersionCheck: PNS_OSVERSIONCHECK;
365
{$EXTERNALSYM _NS_CONTEXT_ATTRIBUTES}
366
NS_CONTEXT_ATTRIBUTES = _NS_CONTEXT_ATTRIBUTES;
367
{$EXTERNALSYM NS_CONTEXT_ATTRIBUTES}
368
PNS_CONTEXT_ATTRIBUTES = ^NS_CONTEXT_ATTRIBUTES;
369
{$EXTERNALSYM PNS_CONTEXT_ATTRIBUTES}
370
TNsContextAttributes = NS_CONTEXT_ATTRIBUTES;
371
PNsContextAttributes = PNS_CONTEXT_ATTRIBUTES;
373
PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
374
{$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
376
PTAG_TYPE = ^TAG_TYPE;
377
{$EXTERNALSYM PTAG_TYPE}
379
pwszTag: LPCWSTR; // tag string
380
dwRequired: DWORD; // required or not
381
bPresent: BOOL; // present or not
383
{$EXTERNALSYM _TAG_TYPE}
384
TAG_TYPE = _TAG_TYPE;
385
{$EXTERNALSYM TAG_TYPE}
387
PTagType = PTAG_TYPE;
390
NS_DLL_INIT_FN = function(dwNetshVersion: DWORD; pReserved: PVOID): DWORD; stdcall;
391
{$EXTERNALSYM NS_DLL_INIT_FN}
392
PNS_DLL_INIT_FN = ^NS_DLL_INIT_FN;
393
{$EXTERNALSYM PNS_DLL_INIT_FN}
394
TNdDllInitFn = NS_DLL_INIT_FN;
395
PNdDllInitFn = PNS_DLL_INIT_FN;
399
function GetHostMachineInfo(var puiCIMOSType, puiCIMOSProductSuite: UINT; pszCIMOSVersion, pszCIMOSBuildNumber,
400
pszCIMServicePackMajorVersion, pszCIMServicePackMinorVersion: LPWSTR; var puiCIMProcessorArchitecture: UINT): DWORD; stdcall;
401
{$EXTERNALSYM GetHostMachineInfo}
402
function MatchEnumTag(hModule: HANDLE; pwcArg: LPCWSTR; dwNumArg: DWORD; pEnumTable: PTOKEN_VALUE; pdwValue: PDWORD): DWORD; stdcall;
403
{$EXTERNALSYM MatchEnumTag}
404
function MatchToken(pwszUserToken, pwszCmdToken: LPCWSTR): BOOL; stdcall;
405
{$EXTERNALSYM MatchToken}
406
function PreprocessCommand(hModule: HANDLE; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount: DWORD; pttTags: PTAG_TYPE;
407
dwTagCount, dwMinArgs, dwMaxArgs: DWORD; var pdwTagType: DWORD): DWORD; stdcall;
408
{$EXTERNALSYM PreprocessCommand}
412
IN HANDLE hModule, OPTIONAL
417
DWORD PrintMessageFromModule(
424
IN LPCWSTR pwszFormat,
429
function RegisterContext(pChildContext: PNS_CONTEXT_ATTRIBUTES): DWORD; stdcall;
430
{$EXTERNALSYM RegisterContext}
431
function RegisterHelper(const pguidParentContext: TGUID; pfnRegisterSubContext: PNS_HELPER_ATTRIBUTES): DWORD; stdcall;
432
{$EXTERNALSYM RegisterHelper}
439
{$IFDEF DYNAMIC_LINK}
442
_GetHostMachineInfo: Pointer;
444
function GetHostMachineInfo;
446
GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
450
JMP [_GetHostMachineInfo]
455
_MatchEnumTag: Pointer;
457
function MatchEnumTag;
459
GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
468
_MatchToken: Pointer;
472
GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
481
_PreprocessCommand: Pointer;
483
function PreprocessCommand;
485
GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
489
JMP [_PreprocessCommand]
494
_RegisterContext: Pointer;
496
function RegisterContext;
498
GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
502
JMP [_RegisterContext]
507
_RegisterHelper: Pointer;
509
function RegisterHelper;
511
GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
515
JMP [_RegisterHelper]
521
function GetHostMachineInfo; external netsh name 'GetHostMachineInfo';
522
function MatchEnumTag; external netsh name 'MatchEnumTag';
523
function MatchToken; external netsh name 'MatchToken';
524
function PreprocessCommand; external netsh name 'PreprocessCommand';
525
function RegisterContext; external netsh name 'RegisterContext';
526
function RegisterHelper; external netsh name 'RegisterHelper';
528
{$ENDIF DYNAMIC_LINK}