~ubuntu-branches/ubuntu/feisty/fpc/feisty

« back to all changes in this revision

Viewing changes to packages/extra/winunits/jwanetsh.pas

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2007-01-27 20:08:50 UTC
  • mfrom: (1.2.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070127200850-9mrptaqqjsx9nwa7
Tags: 2.0.4-5
* Fixed Build-Depends.
* Add myself to Uploaders in debian/control.
* Make sure that the sources are really patched before building them.
* Build unit 'libc' on powerpc too.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
43
 
// $Id: jwanetsh.pas,v 1.1 2005/04/04 07:56:10 marco Exp $
44
 
 
45
 
unit JwaNetSh;
46
 
 
47
 
{$WEAKPACKAGEUNIT}
48
 
 
49
 
{$HPPEMIT ''}
50
 
{$HPPEMIT '#include "netsh.h"'}
51
 
{$HPPEMIT ''}
52
 
 
53
 
{$I jediapilib.inc}
54
 
 
55
 
interface
56
 
 
57
 
uses
58
 
  JwaWinNT, JwaWinType;
59
 
 
60
 
// This file contains definitions which are needed by all NetSh helper DLLs.
61
 
 
62
 
//
63
 
// Error codes
64
 
//
65
 
 
66
 
const
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}
111
 
 
112
 
// Flags
113
 
 
114
 
type
115
 
  NS_CMD_FLAGS = DWORD;
116
 
  {$EXTERNALSYM NS_CMD_FLAGS}
117
 
  TNsCmdFlags = NS_CMD_FLAGS;
118
 
 
119
 
const
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}
134
 
 
135
 
type
136
 
  NS_REQS = (
137
 
    NS_REQ_ZERO,
138
 
    NS_REQ_PRESENT,
139
 
    NS_REQ_ALLOW_MULTIPLE,
140
 
    NS_REQ_ONE_OR_MORE);
141
 
  {$EXTERNALSYM NS_REQS}
142
 
 TNsReqs = NS_REQS;
143
 
 
144
 
  NS_EVENTS = DWORD;
145
 
  {$EXTERNALSYM NS_EVENTS}
146
 
  TNsEvents = NS_EVENTS;
147
 
 
148
 
const
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}
159
 
 
160
 
type
161
 
  NS_MODE_CHANGE = (
162
 
    NETSH_COMMIT,
163
 
    NETSH_UNCOMMIT,
164
 
    NETSH_FLUSH,
165
 
    NETSH_COMMIT_STATE,
166
 
    NETSH_SAVE);
167
 
  {$EXTERNALSYM NS_MODE_CHANGE}
168
 
  TNsModeChange = NS_MODE_CHANGE;
169
 
 
170
 
const
171
 
  NS_GET_EVENT_IDS_FN_NAME = 'GetEventIds';
172
 
  {$EXTERNALSYM NS_GET_EVENT_IDS_FN_NAME}
173
 
 
174
 
// todo where is MAX_DLL_NAME
175
 
//  MAX_NAME_LEN = MAX_DLL_NAME;
176
 
//  {$EXTERNALSYM MAX_NAME_LEN}
177
 
 
178
 
  NETSH_VERSION_50 = $0005000;
179
 
  {$EXTERNALSYM NETSH_VERSION_50}
180
 
 
181
 
  NETSH_ARG_DELIMITER = WideString('=');
182
 
  {$EXTERNALSYM NETSH_ARG_DELIMITER}
183
 
  NETSH_CMD_DELIMITER = WideString(' ');
184
 
  {$EXTERNALSYM NETSH_CMD_DELIMITER}
185
 
 
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}
190
 
 
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}
194
 
 
195
 
  DEFAULT_CONTEXT_PRIORITY = 100;
196
 
  {$EXTERNALSYM DEFAULT_CONTEXT_PRIORITY}
197
 
 
198
 
type
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
204
 
  end;
205
 
  {$EXTERNALSYM _TOKEN_VALUE}
206
 
  TOKEN_VALUE = _TOKEN_VALUE;
207
 
  {$EXTERNALSYM TOKEN_VALUE}
208
 
  TTokenValue = TOKEN_VALUE;
209
 
  PTokenValue = PTOKEN_VALUE;
210
 
 
211
 
// Macros
212
 
 
213
 
(* TODO
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}
217
 
 
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 }
221
 
 
222
 
#define NUM_TOKENS_IN_TABLE(TokenArray) sizeof(TokenArray)/sizeof(TOKEN_VALUE)
223
 
#define NUM_TAGS_IN_TABLE(TagsArray)    sizeof(TagsArray)/sizeof(TAG_TYPE)
224
 
*)
225
 
 
226
 
// Callbacks
227
 
 
228
 
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;
235
 
 
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;  
242
 
 
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;
249
 
 
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;
256
 
    
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;
263
 
 
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;
270
 
 
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;
278
 
 
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;  
286
 
 
287
 
// Structures
288
 
 
289
 
  _NS_HELPER_ATTRIBUTES = record
290
 
    Union: record
291
 
    case Integer of
292
 
      0: (
293
 
        dwVersion: DWORD;
294
 
        dwReserved: DWORD);
295
 
      1: (
296
 
        _ullAlign: ULONGLONG);
297
 
    end;
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
301
 
  end;
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;
309
 
 
310
 
  PCMD_ENTRY = ^CMD_ENTRY;
311
 
  {$EXTERNALSYM PCMD_ENTRY}
312
 
  _CMD_ENTRY = record
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
319
 
  end;
320
 
  {$EXTERNALSYM _CMD_ENTRY}
321
 
  CMD_ENTRY = _CMD_ENTRY;
322
 
  {$EXTERNALSYM CMD_ENTRY}
323
 
  TCmdEntry = CMD_ENTRY;
324
 
  PCmdEntry = PCMD_ENTRY;
325
 
 
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
335
 
  end;
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;
341
 
 
342
 
  _NS_CONTEXT_ATTRIBUTES = record
343
 
    Union: record
344
 
    case Integer of
345
 
      0: (
346
 
        dwVersion: DWORD;
347
 
        dwReserved: DWORD);
348
 
      1: (
349
 
        _ullAlign: ULONGLONG);
350
 
    end;
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
359
 
 
360
 
    pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
361
 
    pfnDumpFn: PNS_CONTEXT_DUMP_FN;
362
 
    pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
363
 
    pReserved: PVOID;
364
 
    pfnOsVersionCheck: PNS_OSVERSIONCHECK;
365
 
  end;
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;  
373
 
 
374
 
  PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
375
 
  {$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
376
 
 
377
 
  PTAG_TYPE = ^TAG_TYPE;
378
 
  {$EXTERNALSYM PTAG_TYPE}
379
 
  _TAG_TYPE = record
380
 
    pwszTag: LPCWSTR;  // tag string
381
 
    dwRequired: DWORD; // required or not
382
 
    bPresent: BOOL;    // present or not
383
 
  end;
384
 
  {$EXTERNALSYM _TAG_TYPE}
385
 
  TAG_TYPE = _TAG_TYPE;
386
 
  {$EXTERNALSYM TAG_TYPE}
387
 
  TTagType = TAG_TYPE;
388
 
  PTagType = PTAG_TYPE;
389
 
 
390
 
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;
397
 
 
398
 
// Exports
399
 
 
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}
410
 
 
411
 
(* TODO
412
 
DWORD PrintError(
413
 
    IN  HANDLE  hModule, OPTIONAL
414
 
    IN  DWORD   dwErrId,
415
 
    ...
416
 
    );
417
 
 
418
 
DWORD PrintMessageFromModule(
419
 
    IN  HANDLE  hModule,
420
 
    IN  DWORD   dwMsgId,
421
 
    ...
422
 
    );
423
 
 
424
 
DWORD PrintMessage(
425
 
    IN  LPCWSTR  pwszFormat,
426
 
    ...
427
 
    );
428
 
*)
429
 
 
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}
434
 
 
435
 
implementation
436
 
 
437
 
const
438
 
  netsh = 'netsh.exe'; 
439
 
 
440
 
{$IFDEF DYNAMIC_LINK}
441
 
 
442
 
var
443
 
  _GetHostMachineInfo: Pointer;
444
 
 
445
 
function GetHostMachineInfo;
446
 
begin
447
 
  GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
448
 
  asm
449
 
        MOV     ESP, EBP
450
 
        POP     EBP
451
 
        JMP     [_GetHostMachineInfo]
452
 
  end;
453
 
end;
454
 
 
455
 
var
456
 
  _MatchEnumTag: Pointer;
457
 
 
458
 
function MatchEnumTag;
459
 
begin
460
 
  GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
461
 
  asm
462
 
        MOV     ESP, EBP
463
 
        POP     EBP
464
 
        JMP     [_MatchEnumTag]
465
 
  end;
466
 
end;
467
 
 
468
 
var
469
 
  _MatchToken: Pointer;
470
 
 
471
 
function MatchToken;
472
 
begin
473
 
  GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
474
 
  asm
475
 
        MOV     ESP, EBP
476
 
        POP     EBP
477
 
        JMP     [_MatchToken]
478
 
  end;
479
 
end;
480
 
 
481
 
var
482
 
  _PreprocessCommand: Pointer;
483
 
 
484
 
function PreprocessCommand;
485
 
begin
486
 
  GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
487
 
  asm
488
 
        MOV     ESP, EBP
489
 
        POP     EBP
490
 
        JMP     [_PreprocessCommand]
491
 
  end;
492
 
end;
493
 
 
494
 
var
495
 
  _RegisterContext: Pointer;
496
 
 
497
 
function RegisterContext;
498
 
begin
499
 
  GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
500
 
  asm
501
 
        MOV     ESP, EBP
502
 
        POP     EBP
503
 
        JMP     [_RegisterContext]
504
 
  end;
505
 
end;
506
 
 
507
 
var
508
 
  _RegisterHelper: Pointer;
509
 
 
510
 
function RegisterHelper;
511
 
begin
512
 
  GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
513
 
  asm
514
 
        MOV     ESP, EBP
515
 
        POP     EBP
516
 
        JMP     [_RegisterHelper]
517
 
  end;
518
 
end;
519
 
 
520
 
{$ELSE}
521
 
 
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';
528
 
 
529
 
{$ENDIF DYNAMIC_LINK}
530
 
 
531
 
end.
 
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
 
 
43
 
 
44
unit JwaNetSh;
 
45
 
 
46
{$WEAKPACKAGEUNIT}
 
47
 
 
48
{$HPPEMIT ''}
 
49
{$HPPEMIT '#include "netsh.h"'}
 
50
{$HPPEMIT ''}
 
51
 
 
52
{$I jediapilib.inc}
 
53
 
 
54
interface
 
55
 
 
56
uses
 
57
  JwaWinNT, JwaWinType;
 
58
 
 
59
// This file contains definitions which are needed by all NetSh helper DLLs.
 
60
 
 
61
//
 
62
// Error codes
 
63
//
 
64
 
 
65
const
 
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}
 
110
 
 
111
// Flags
 
112
 
 
113
type
 
114
  NS_CMD_FLAGS = DWORD;
 
115
  {$EXTERNALSYM NS_CMD_FLAGS}
 
116
  TNsCmdFlags = NS_CMD_FLAGS;
 
117
 
 
118
const
 
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}
 
133
 
 
134
type
 
135
  NS_REQS = (
 
136
    NS_REQ_ZERO,
 
137
    NS_REQ_PRESENT,
 
138
    NS_REQ_ALLOW_MULTIPLE,
 
139
    NS_REQ_ONE_OR_MORE);
 
140
  {$EXTERNALSYM NS_REQS}
 
141
 TNsReqs = NS_REQS;
 
142
 
 
143
  NS_EVENTS = DWORD;
 
144
  {$EXTERNALSYM NS_EVENTS}
 
145
  TNsEvents = NS_EVENTS;
 
146
 
 
147
const
 
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}
 
158
 
 
159
type
 
160
  NS_MODE_CHANGE = (
 
161
    NETSH_COMMIT,
 
162
    NETSH_UNCOMMIT,
 
163
    NETSH_FLUSH,
 
164
    NETSH_COMMIT_STATE,
 
165
    NETSH_SAVE);
 
166
  {$EXTERNALSYM NS_MODE_CHANGE}
 
167
  TNsModeChange = NS_MODE_CHANGE;
 
168
 
 
169
const
 
170
  NS_GET_EVENT_IDS_FN_NAME = 'GetEventIds';
 
171
  {$EXTERNALSYM NS_GET_EVENT_IDS_FN_NAME}
 
172
 
 
173
// todo where is MAX_DLL_NAME
 
174
//  MAX_NAME_LEN = MAX_DLL_NAME;
 
175
//  {$EXTERNALSYM MAX_NAME_LEN}
 
176
 
 
177
  NETSH_VERSION_50 = $0005000;
 
178
  {$EXTERNALSYM NETSH_VERSION_50}
 
179
 
 
180
  NETSH_ARG_DELIMITER = WideString('=');
 
181
  {$EXTERNALSYM NETSH_ARG_DELIMITER}
 
182
  NETSH_CMD_DELIMITER = WideString(' ');
 
183
  {$EXTERNALSYM NETSH_CMD_DELIMITER}
 
184
 
 
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}
 
189
 
 
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}
 
193
 
 
194
  DEFAULT_CONTEXT_PRIORITY = 100;
 
195
  {$EXTERNALSYM DEFAULT_CONTEXT_PRIORITY}
 
196
 
 
197
type
 
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
 
203
  end;
 
204
  {$EXTERNALSYM _TOKEN_VALUE}
 
205
  TOKEN_VALUE = _TOKEN_VALUE;
 
206
  {$EXTERNALSYM TOKEN_VALUE}
 
207
  TTokenValue = TOKEN_VALUE;
 
208
  PTokenValue = PTOKEN_VALUE;
 
209
 
 
210
// Macros
 
211
 
 
212
(* TODO
 
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}
 
216
 
 
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 }
 
220
 
 
221
#define NUM_TOKENS_IN_TABLE(TokenArray) sizeof(TokenArray)/sizeof(TOKEN_VALUE)
 
222
#define NUM_TAGS_IN_TABLE(TagsArray)    sizeof(TagsArray)/sizeof(TAG_TYPE)
 
223
*)
 
224
 
 
225
// Callbacks
 
226
 
 
227
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;
 
234
 
 
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;  
 
241
 
 
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;
 
248
 
 
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;
 
255
    
 
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;
 
262
 
 
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;
 
269
 
 
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;
 
277
 
 
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;  
 
285
 
 
286
// Structures
 
287
 
 
288
  _NS_HELPER_ATTRIBUTES = record
 
289
    Union: record
 
290
    case Integer of
 
291
      0: (
 
292
        dwVersion: DWORD;
 
293
        dwReserved: DWORD);
 
294
      1: (
 
295
        _ullAlign: ULONGLONG);
 
296
    end;
 
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
 
300
  end;
 
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;
 
308
 
 
309
  PCMD_ENTRY = ^CMD_ENTRY;
 
310
  {$EXTERNALSYM PCMD_ENTRY}
 
311
  _CMD_ENTRY = record
 
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
 
318
  end;
 
319
  {$EXTERNALSYM _CMD_ENTRY}
 
320
  CMD_ENTRY = _CMD_ENTRY;
 
321
  {$EXTERNALSYM CMD_ENTRY}
 
322
  TCmdEntry = CMD_ENTRY;
 
323
  PCmdEntry = PCMD_ENTRY;
 
324
 
 
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
 
334
  end;
 
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;
 
340
 
 
341
  _NS_CONTEXT_ATTRIBUTES = record
 
342
    Union: record
 
343
    case Integer of
 
344
      0: (
 
345
        dwVersion: DWORD;
 
346
        dwReserved: DWORD);
 
347
      1: (
 
348
        _ullAlign: ULONGLONG);
 
349
    end;
 
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
 
358
 
 
359
    pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
 
360
    pfnDumpFn: PNS_CONTEXT_DUMP_FN;
 
361
    pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
 
362
    pReserved: PVOID;
 
363
    pfnOsVersionCheck: PNS_OSVERSIONCHECK;
 
364
  end;
 
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;  
 
372
 
 
373
  PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
 
374
  {$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
 
375
 
 
376
  PTAG_TYPE = ^TAG_TYPE;
 
377
  {$EXTERNALSYM PTAG_TYPE}
 
378
  _TAG_TYPE = record
 
379
    pwszTag: LPCWSTR;  // tag string
 
380
    dwRequired: DWORD; // required or not
 
381
    bPresent: BOOL;    // present or not
 
382
  end;
 
383
  {$EXTERNALSYM _TAG_TYPE}
 
384
  TAG_TYPE = _TAG_TYPE;
 
385
  {$EXTERNALSYM TAG_TYPE}
 
386
  TTagType = TAG_TYPE;
 
387
  PTagType = PTAG_TYPE;
 
388
 
 
389
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;
 
396
 
 
397
// Exports
 
398
 
 
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}
 
409
 
 
410
(* TODO
 
411
DWORD PrintError(
 
412
    IN  HANDLE  hModule, OPTIONAL
 
413
    IN  DWORD   dwErrId,
 
414
    ...
 
415
    );
 
416
 
 
417
DWORD PrintMessageFromModule(
 
418
    IN  HANDLE  hModule,
 
419
    IN  DWORD   dwMsgId,
 
420
    ...
 
421
    );
 
422
 
 
423
DWORD PrintMessage(
 
424
    IN  LPCWSTR  pwszFormat,
 
425
    ...
 
426
    );
 
427
*)
 
428
 
 
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}
 
433
 
 
434
implementation
 
435
 
 
436
const
 
437
  netsh = 'netsh.exe'; 
 
438
 
 
439
{$IFDEF DYNAMIC_LINK}
 
440
 
 
441
var
 
442
  _GetHostMachineInfo: Pointer;
 
443
 
 
444
function GetHostMachineInfo;
 
445
begin
 
446
  GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
 
447
  asm
 
448
        MOV     ESP, EBP
 
449
        POP     EBP
 
450
        JMP     [_GetHostMachineInfo]
 
451
  end;
 
452
end;
 
453
 
 
454
var
 
455
  _MatchEnumTag: Pointer;
 
456
 
 
457
function MatchEnumTag;
 
458
begin
 
459
  GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
 
460
  asm
 
461
        MOV     ESP, EBP
 
462
        POP     EBP
 
463
        JMP     [_MatchEnumTag]
 
464
  end;
 
465
end;
 
466
 
 
467
var
 
468
  _MatchToken: Pointer;
 
469
 
 
470
function MatchToken;
 
471
begin
 
472
  GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
 
473
  asm
 
474
        MOV     ESP, EBP
 
475
        POP     EBP
 
476
        JMP     [_MatchToken]
 
477
  end;
 
478
end;
 
479
 
 
480
var
 
481
  _PreprocessCommand: Pointer;
 
482
 
 
483
function PreprocessCommand;
 
484
begin
 
485
  GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
 
486
  asm
 
487
        MOV     ESP, EBP
 
488
        POP     EBP
 
489
        JMP     [_PreprocessCommand]
 
490
  end;
 
491
end;
 
492
 
 
493
var
 
494
  _RegisterContext: Pointer;
 
495
 
 
496
function RegisterContext;
 
497
begin
 
498
  GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
 
499
  asm
 
500
        MOV     ESP, EBP
 
501
        POP     EBP
 
502
        JMP     [_RegisterContext]
 
503
  end;
 
504
end;
 
505
 
 
506
var
 
507
  _RegisterHelper: Pointer;
 
508
 
 
509
function RegisterHelper;
 
510
begin
 
511
  GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
 
512
  asm
 
513
        MOV     ESP, EBP
 
514
        POP     EBP
 
515
        JMP     [_RegisterHelper]
 
516
  end;
 
517
end;
 
518
 
 
519
{$ELSE}
 
520
 
 
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';
 
527
 
 
528
{$ENDIF DYNAMIC_LINK}
 
529
 
 
530
end.