[NETSH] Fix version info and add version callback checks

This commit is contained in:
Eric Kohl
2026-07-10 00:20:14 +02:00
parent 2885d40937
commit 1a706d759e
4 changed files with 97 additions and 26 deletions
+33 -11
View File
@@ -90,10 +90,14 @@ PrintShortGroupCommands(
pCommand = pGroup->pCommandListHead;
while (pCommand != NULL)
{
_swprintf(szBuffer1, L"%s %s", pGroup->pwszCmdGroupToken, pCommand->pwszCmdToken);
LoadStringW(pContext->hModule, pCommand->dwShortCmdHelpToken, szBuffer2, _countof(szBuffer2));
DPRINT("CheckVersion (Command) %S %S", pGroup->pwszCmdGroupToken, pCommand->pwszCmdToken);
if (CheckOsVersion(pCommand->pfnOsVersionCheck))
{
_swprintf(szBuffer1, L"%s %s", pGroup->pwszCmdGroupToken, pCommand->pwszCmdToken);
LoadStringW(pContext->hModule, pCommand->dwShortCmdHelpToken, szBuffer2, _countof(szBuffer2));
ConPrintf(StdOut, L"%-15s - %s", szBuffer1, szBuffer2);
ConPrintf(StdOut, L"%-15s - %s", szBuffer1, szBuffer2);
}
pCommand = pCommand->pNext;
}
}
@@ -165,7 +169,7 @@ PrintContext(
pHelpArray[dwIndex].Type = Command;
pHelpArray[dwIndex].pszCommand = pCommand->pwszCmdToken;
pHelpArray[dwIndex].dwHelpId = pCommand->dwShortCmdHelpToken;
// pHelpArray[dwIndex].Pointer.pCommand = pCommand;
pHelpArray[dwIndex].Pointer.pCommand = pCommand;
dwIndex++;
pCommand = pCommand->pNext;
}
@@ -177,7 +181,7 @@ PrintContext(
pHelpArray[dwIndex].Type = Group;
pHelpArray[dwIndex].pszCommand = pGroup->pwszCmdGroupToken;
pHelpArray[dwIndex].dwHelpId = pGroup->dwShortCmdHelpToken;
// pHelpArray[dwIndex].Pointer.pGroup = pGroup;
pHelpArray[dwIndex].Pointer.pGroup = pGroup;
dwIndex++;
pGroup = pGroup->pNext;
}
@@ -200,15 +204,29 @@ PrintContext(
switch (pHelpArray[dwIndex].Type)
{
case Command:
if (CheckOsVersion(pHelpArray[dwIndex].Pointer.pCommand->pfnOsVersionCheck))
{
if (LoadStringW(pContext->hModule, pHelpArray[dwIndex].dwHelpId, szBuffer, _countof(szBuffer)) == 0)
szBuffer[0] = UNICODE_NULL;
ConPrintf(StdOut, L"%-15s - %s", pHelpArray[dwIndex].pszCommand, szBuffer);
}
break;
case Group:
if (LoadStringW(pContext->hModule, pHelpArray[dwIndex].dwHelpId, szBuffer, _countof(szBuffer)) == 0)
szBuffer[0] = UNICODE_NULL;
ConPrintf(StdOut, L"%-15s - %s", pHelpArray[dwIndex].pszCommand, szBuffer);
if (CheckOsVersion(pHelpArray[dwIndex].Pointer.pGroup->pfnOsVersionCheck))
{
if (LoadStringW(pContext->hModule, pHelpArray[dwIndex].dwHelpId, szBuffer, _countof(szBuffer)) == 0)
szBuffer[0] = UNICODE_NULL;
ConPrintf(StdOut, L"%-15s - %s", pHelpArray[dwIndex].pszCommand, szBuffer);
}
break;
case SubContext:
GetContextFullName(pHelpArray[dwIndex].Pointer.pSubContext, szBuffer, _countof(szBuffer));
ConPrintf(StdOut, L"%-15s - Changes to the \"%s\" context.\n", pHelpArray[dwIndex].pszCommand, szBuffer);
if (CheckOsVersion(pHelpArray[dwIndex].Pointer.pSubContext->pfnOsVersionCheck))
{
GetContextFullName(pHelpArray[dwIndex].Pointer.pSubContext, szBuffer, _countof(szBuffer));
ConPrintf(StdOut, L"%-15s - Changes to the \"%s\" context.\n", pHelpArray[dwIndex].pszCommand, szBuffer);
}
break;
}
}
@@ -265,7 +283,8 @@ PrintSubcontexts(
ConResPrintf(StdOut, IDS_SUBCONTEXT_HEADER);
for (dwIndex = 0; dwIndex < dwCount; dwIndex++)
{
ConPrintf(StdOut, L" %s", pSubContextArray[dwIndex]->pszContextName);
if (CheckOsVersion(pSubContextArray[dwIndex]->pfnOsVersionCheck))
ConPrintf(StdOut, L" %s", pSubContextArray[dwIndex]->pszContextName);
}
ConPuts(StdOut, L"\n");
@@ -285,6 +304,9 @@ PrintCommandHelp(
DPRINT("PrintCommandHelp(%p %p %p)\n", pContext, pGroup, pCommand);
if (!CheckOsVersion(pCommand->pfnOsVersionCheck))
return;
dwLength += wcslen(pCommand->pwszCmdToken);
if (pGroup)
dwLength += (wcslen(pGroup->pwszCmdGroupToken) + 1);
@@ -193,6 +193,14 @@ InterpretCommand(
case STATE_COMMAND:
DPRINT("STATE_COMMAND\n");
if (!CheckOsVersion(pCommand->pfnOsVersionCheck))
{
DPRINT("Command: Version check failed!\n");
dwError = ERROR_CMD_NOT_FOUND;
State = STATE_DONE;
break;
}
/* Check for help keywords */
if (((dwArgIndex + 1) == (dwArgCount - 1)) &&
((_wcsicmp(argv[dwArgIndex + 1], L"?") == 0) || (_wcsicmp(argv[dwArgIndex + 1], L"help") == 0)))
@@ -232,6 +240,14 @@ InterpretCommand(
case STATE_GROUP:
DPRINT("STATE_GROUP\n");
if (!CheckOsVersion(pGroup->pfnOsVersionCheck))
{
DPRINT("Group: Version check failed!\n");
dwError = ERROR_CMD_NOT_FOUND;
State = STATE_DONE;
break;
}
/* Check for group without command */
if (dwArgIndex == (dwArgCount - 1))
{
@@ -264,6 +280,14 @@ InterpretCommand(
case STATE_CONTEXT:
DPRINT("STATE_CONTEXT\n");
if (!CheckOsVersion(pTempSubContext->pfnOsVersionCheck))
{
DPRINT("Context: Version check failed!\n");
dwError = ERROR_CMD_NOT_FOUND;
State = STATE_DONE;
break;
}
if (pTempSubContext == pCurrentContext)
{
if (dwArgIndex != (dwArgCount - 1))
+5 -1
View File
@@ -138,7 +138,7 @@ extern PWSTR pszMachine;
extern UINT VersionInfoArchitecture;
extern UINT VersionInfoOsProductSuite;
extern UINT VersionInfoOsType;
extern UINT VersionInfoVersion;
extern WCHAR VersionInfoVersion[MAX_PATH];
extern WCHAR VersionInfoBuildNumber[MAX_PATH];
extern WCHAR VersionInfoServicePackMajorVersion[MAX_PATH];
extern WCHAR VersionInfoServicePackMinorVersion[MAX_PATH];
@@ -288,5 +288,9 @@ MergeStrings(
/* wmi.c */
BOOL
CheckOsVersion(
_In_ PNS_OSVERSIONCHECK pfnOsVersionCheck);
HRESULT
GetWmiVersionInfo(VOID);
+35 -14
View File
@@ -24,13 +24,32 @@
UINT VersionInfoArchitecture;
UINT VersionInfoOsProductSuite;
UINT VersionInfoOsType;
UINT VersionInfoVersion;
WCHAR VersionInfoVersion[MAX_PATH];
WCHAR VersionInfoBuildNumber[MAX_PATH];
WCHAR VersionInfoServicePackMajorVersion[MAX_PATH];
WCHAR VersionInfoServicePackMinorVersion[MAX_PATH];
/* FUNCTIONS ******************************************************************/
BOOL
CheckOsVersion(
_In_ PNS_OSVERSIONCHECK pfnOsVersionCheck)
{
DPRINT("CheckOsVersion(%p)\n", pfnOsVersionCheck);
if (pfnOsVersionCheck == NULL)
return TRUE;
return pfnOsVersionCheck(VersionInfoOsType,
VersionInfoOsProductSuite,
VersionInfoVersion,
VersionInfoBuildNumber,
VersionInfoServicePackMajorVersion,
VersionInfoServicePackMinorVersion,
VersionInfoArchitecture,
0);
}
static
HRESULT
QueryOperatingSystemInfo(
@@ -80,36 +99,36 @@ QueryOperatingSystemInfo(
while (IWbemClassObject_Next(Object, 0, &Name, &Value, &Type, NULL) == S_OK)
{
DPRINT1("Name: %S\n", Name);
DPRINT("Name: %S\n", Name);
if (_wcsicmp(Name, L"BuildNumber") == 0)
{
DPRINT1("BuildNumber %S\n", V_BSTR(&Value));
DPRINT("BuildNumber %S\n", V_BSTR(&Value));
StringCbCopyW(VersionInfoBuildNumber, sizeof(VersionInfoBuildNumber), V_BSTR(&Value));
}
else if (_wcsicmp(Name, L"OSProductSuite") == 0)
{
DPRINT1("OSProductSuite 0x%x\n", V_UINT(&Value));
DPRINT("OSProductSuite 0x%x\n", V_UINT(&Value));
VersionInfoOsProductSuite = V_UINT(&Value);
}
else if (_wcsicmp(Name, L"OSType") == 0)
{
DPRINT1("OSType %u\n", V_UINT(&Value));
DPRINT("OSType %u\n", V_UINT(&Value));
VersionInfoOsType = V_UINT(&Value);
}
else if (_wcsicmp(Name, L"ServicePackMajorVersion") == 0)
{
DPRINT1("ServicePackMajorVersion %S\n", V_BSTR(&Value));
StringCbCopyW(VersionInfoServicePackMajorVersion, sizeof(VersionInfoServicePackMajorVersion), V_BSTR(&Value));
DPRINT("ServicePackMajorVersion %hu\n", V_UINT(&Value));
_swprintf(VersionInfoServicePackMajorVersion, L"%hu", V_UINT(&Value));
}
else if (_wcsicmp(Name, L"ServicePackMinorVersion") == 0)
{
DPRINT1("ServicePackMinorVersion %S\n", V_BSTR(&Value));
StringCbCopyW(VersionInfoServicePackMinorVersion, sizeof(VersionInfoServicePackMinorVersion), V_BSTR(&Value));
DPRINT("ServicePackMinorVersion %hu\n", V_UINT(&Value));
_swprintf(VersionInfoServicePackMinorVersion, L"%hu", V_UINT(&Value));
}
else if (_wcsicmp(Name, L"Version") == 0)
{
DPRINT1("Version %S\n", V_BSTR(&Value));
VersionInfoVersion = V_UINT(&Value);
DPRINT("Version %S\n", V_BSTR(&Value));
StringCbCopyW(VersionInfoVersion, sizeof(VersionInfoVersion), V_BSTR(&Value));
}
SysFreeString(Name);
@@ -189,10 +208,11 @@ QueryProcessorInfo(
while (IWbemClassObject_Next(Object, 0, &Name, &Value, &Type, NULL) == S_OK)
{
DPRINT1("Name: %S\n", Name);
DPRINT("Name: %S\n", Name);
if (_wcsicmp(Name, L"Architecture") == 0)
{
DPRINT1("Architecture %u\n", V_UINT(&Value));
DPRINT("Architecture %u\n", V_UINT(&Value));
VersionInfoArchitecture = V_UINT(&Value);
}
SysFreeString(Name);
@@ -265,7 +285,8 @@ GetWmiVersionInfo(VOID)
}
hr = QueryOperatingSystemInfo(Services);
hr = QueryProcessorInfo(Services);
if (hr == S_OK)
hr = QueryProcessorInfo(Services);
done:
if (Path)