📄 jwanetsh.pas
字号:
{$EXTERNALSYM PFN_HANDLE_CMD}
TFnHandleCmd = FN_HANDLE_CMD;
PFnHandleCmd = PFN_HANDLE_CMD;
NS_OSVERSIONCHECK = function (CIMOSType, CIMOSProductSuite: UINT; CIMOSVersion, CIMOSBuildNumber, CIMServicePackMajorVersion,
CIMServicePackMinorVersion: LPCWSTR; CIMProcessorArchitecture: UINT; dwReserved: DWORD): BOOL; stdcall;
{$EXTERNALSYM NS_OSVERSIONCHECK}
PNS_OSVERSIONCHECK = ^NS_OSVERSIONCHECK;
{$EXTERNALSYM PNS_OSVERSIONCHECK}
TNsOSVersionCheck = NS_OSVERSIONCHECK;
PNsOSVersionCheck = PNS_OSVERSIONCHECK;
// Structures
_NS_HELPER_ATTRIBUTES = record
Union: record
case Integer of
0: (
dwVersion: DWORD;
dwReserved: DWORD);
1: (
_ullAlign: ULONGLONG);
end;
guidHelper: TGUID; // GUID associated with the helper
pfnStart: PNS_HELPER_START_FN; // Function to start this helper
pfnStop: PNS_HELPER_STOP_FN; // Function to stop this helper
end;
{$EXTERNALSYM _NS_HELPER_ATTRIBUTES}
NS_HELPER_ATTRIBUTES = _NS_HELPER_ATTRIBUTES;
{$EXTERNALSYM NS_HELPER_ATTRIBUTES}
PNS_HELPER_ATTRIBUTES = ^NS_HELPER_ATTRIBUTES;
{$EXTERNALSYM PNS_HELPER_ATTRIBUTES}
TNsHelperAttributes = NS_HELPER_ATTRIBUTES;
PNsHelperAttributes = PNS_HELPER_ATTRIBUTES;
PCMD_ENTRY = ^CMD_ENTRY;
{$EXTERNALSYM PCMD_ENTRY}
_CMD_ENTRY = record
pwszCmdToken: LPCWSTR; // The token for the command
pfnCmdHandler: PFN_HANDLE_CMD; // The function which handles this command
dwShortCmdHelpToken: DWORD; // The short help message
dwCmdHlpToken: DWORD; // The message to display if the only thing after the command is a help token (HELP, /?, -?, ?)
dwFlags: DWORD; // Flags (see CMD_FLAGS_xxx above)
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
end;
{$EXTERNALSYM _CMD_ENTRY}
CMD_ENTRY = _CMD_ENTRY;
{$EXTERNALSYM CMD_ENTRY}
TCmdEntry = CMD_ENTRY;
PCmdEntry = PCMD_ENTRY;
PCMD_GROUP_ENTRY = ^CMD_GROUP_ENTRY;
{$EXTERNALSYM PCMD_GROUP_ENTRY}
_CMD_GROUP_ENTRY = record
pwszCmdGroupToken: LPCWSTR; // The token for the command verb
dwShortCmdHelpToken: DWORD; // The message to display in a command listing.
ulCmdGroupSize: ULONG; // The number of entries in the cmd table
dwFlags: DWORD; // Flags (see CMD_FLAG_xxx)
pCmdGroup: PCMD_ENTRY; // The command table
pOsVersionCheck: PNS_OSVERSIONCHECK; // Check for the version of the OS this command can run against
end;
{$EXTERNALSYM _CMD_GROUP_ENTRY}
CMD_GROUP_ENTRY = _CMD_GROUP_ENTRY;
{$EXTERNALSYM CMD_GROUP_ENTRY}
TCmdGroupEntry = CMD_GROUP_ENTRY;
PCmdGroupEntry = PCMD_GROUP_ENTRY;
_NS_CONTEXT_ATTRIBUTES = record
Union: record
case Integer of
0: (
dwVersion: DWORD;
dwReserved: DWORD);
1: (
_ullAlign: ULONGLONG);
end;
pwszContext: LPWSTR; // Name of the context
guidHelper: TGUID; // GUID of the helper servicing this context
dwFlags: DWORD; // Flags limiting when context is available. (See CMD_FLAG_xxx)
ulPriority: ULONG; // Priority field is only relevant if CMD_FLAG_PRIORITY is set in dwFlags
ulNumTopCmds: ULONG; // Number of top-level commands
pTopCmds: PCMD_ENTRY; // Array of top-level commands
ulNumGroups: ULONG; // Number of command groups
pCmdGroups: PCMD_GROUP_ENTRY; // Array of command groups
pfnCommitFn: PNS_CONTEXT_COMMIT_FN;
pfnDumpFn: PNS_CONTEXT_DUMP_FN;
pfnConnectFn: PNS_CONTEXT_CONNECT_FN;
pReserved: PVOID;
pfnOsVersionCheck: PNS_OSVERSIONCHECK;
end;
{$EXTERNALSYM _NS_CONTEXT_ATTRIBUTES}
NS_CONTEXT_ATTRIBUTES = _NS_CONTEXT_ATTRIBUTES;
{$EXTERNALSYM NS_CONTEXT_ATTRIBUTES}
PNS_CONTEXT_ATTRIBUTES = ^NS_CONTEXT_ATTRIBUTES;
{$EXTERNALSYM PNS_CONTEXT_ATTRIBUTES}
TNsContextAttributes = NS_CONTEXT_ATTRIBUTES;
PNsContextAttributes = PNS_CONTEXT_ATTRIBUTES;
PCNS_CONTEXT_ATTRIBUTES = ^_NS_CONTEXT_ATTRIBUTES;
{$EXTERNALSYM PCNS_CONTEXT_ATTRIBUTES}
PTAG_TYPE = ^TAG_TYPE;
{$EXTERNALSYM PTAG_TYPE}
_TAG_TYPE = record
pwszTag: LPCWSTR; // tag string
dwRequired: DWORD; // required or not
bPresent: BOOL; // present or not
end;
{$EXTERNALSYM _TAG_TYPE}
TAG_TYPE = _TAG_TYPE;
{$EXTERNALSYM TAG_TYPE}
TTagType = TAG_TYPE;
PTagType = PTAG_TYPE;
type
NS_DLL_INIT_FN = function (dwNetshVersion: DWORD; pReserved: PVOID): DWORD; stdcall;
{$EXTERNALSYM NS_DLL_INIT_FN}
PNS_DLL_INIT_FN = ^NS_DLL_INIT_FN;
{$EXTERNALSYM PNS_DLL_INIT_FN}
TNdDllInitFn = NS_DLL_INIT_FN;
PNdDllInitFn = PNS_DLL_INIT_FN;
// Exports
function GetHostMachineInfo(var puiCIMOSType, puiCIMOSProductSuite: UINT; pszCIMOSVersion, pszCIMOSBuildNumber,
pszCIMServicePackMajorVersion, pszCIMServicePackMinorVersion: LPWSTR; var puiCIMProcessorArchitecture: UINT): DWORD; stdcall;
{$EXTERNALSYM GetHostMachineInfo}
function MatchEnumTag(hModule: HANDLE; pwcArg: LPCWSTR; dwNumArg: DWORD; pEnumTable: PTOKEN_VALUE; pdwValue: PDWORD): DWORD; stdcall;
{$EXTERNALSYM MatchEnumTag}
function MatchToken(pwszUserToken, pwszCmdToken: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM MatchToken}
function PreprocessCommand(hModule: HANDLE; var ppwcArguments: LPWSTR; dwCurrentIndex, dwArgCount: DWORD; pttTags: PTAG_TYPE;
dwTagCount, dwMinArgs, dwMaxArgs: DWORD; var pdwTagType: DWORD): DWORD; stdcall;
{$EXTERNALSYM PreprocessCommand}
(* TODO
DWORD PrintError(
IN HANDLE hModule, OPTIONAL
IN DWORD dwErrId,
...
);
DWORD PrintMessageFromModule(
IN HANDLE hModule,
IN DWORD dwMsgId,
...
);
DWORD PrintMessage(
IN LPCWSTR pwszFormat,
...
);
*)
function RegisterContext(pChildContext: PNS_CONTEXT_ATTRIBUTES): DWORD; stdcall;
{$EXTERNALSYM RegisterContext}
function RegisterHelper(const pguidParentContext: TGUID; pfnRegisterSubContext: PNS_HELPER_ATTRIBUTES): DWORD; stdcall;
{$EXTERNALSYM RegisterHelper}
implementation
const
netsh = 'netsh.exe';
{$IFDEF DYNAMIC_LINK}
var
_GetHostMachineInfo: Pointer;
function GetHostMachineInfo;
begin
GetProcedureAddress(_GetHostMachineInfo, netsh, 'GetHostMachineInfo');
asm
mov esp, ebp
pop ebp
jmp [_GetHostMachineInfo]
end;
end;
{$ELSE}
function GetHostMachineInfo; external netsh name 'GetHostMachineInfo';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_MatchEnumTag: Pointer;
function MatchEnumTag;
begin
GetProcedureAddress(_MatchEnumTag, netsh, 'MatchEnumTag');
asm
mov esp, ebp
pop ebp
jmp [_MatchEnumTag]
end;
end;
{$ELSE}
function MatchEnumTag; external netsh name 'MatchEnumTag';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_MatchToken: Pointer;
function MatchToken;
begin
GetProcedureAddress(_MatchToken, netsh, 'MatchToken');
asm
mov esp, ebp
pop ebp
jmp [_MatchToken]
end;
end;
{$ELSE}
function MatchToken; external netsh name 'MatchToken';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_PreprocessCommand: Pointer;
function PreprocessCommand;
begin
GetProcedureAddress(_PreprocessCommand, netsh, 'PreprocessCommand');
asm
mov esp, ebp
pop ebp
jmp [_PreprocessCommand]
end;
end;
{$ELSE}
function PreprocessCommand; external netsh name 'PreprocessCommand';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_RegisterContext: Pointer;
function RegisterContext;
begin
GetProcedureAddress(_RegisterContext, netsh, 'RegisterContext');
asm
mov esp, ebp
pop ebp
jmp [_RegisterContext]
end;
end;
{$ELSE}
function RegisterContext; external netsh name 'RegisterContext';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_RegisterHelper: Pointer;
function RegisterHelper;
begin
GetProcedureAddress(_RegisterHelper, netsh, 'RegisterHelper');
asm
mov esp, ebp
pop ebp
jmp [_RegisterHelper]
end;
end;
{$ELSE}
function RegisterHelper; external netsh name 'RegisterHelper';
{$ENDIF DYNAMIC_LINK}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -