JwaNetSh.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:19k
源码类别:

Windows编程

开发平台:

Delphi

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