diff --git a/base/applications/network/netsh/help.c b/base/applications/network/netsh/help.c index b79494cf3d7..7344400f21c 100644 --- a/base/applications/network/netsh/help.c +++ b/base/applications/network/netsh/help.c @@ -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); diff --git a/base/applications/network/netsh/interpreter.c b/base/applications/network/netsh/interpreter.c index abbb7eecc05..c556b0e78ef 100644 --- a/base/applications/network/netsh/interpreter.c +++ b/base/applications/network/netsh/interpreter.c @@ -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)) diff --git a/base/applications/network/netsh/precomp.h b/base/applications/network/netsh/precomp.h index cde167579e1..3e7a87b97cf 100644 --- a/base/applications/network/netsh/precomp.h +++ b/base/applications/network/netsh/precomp.h @@ -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); diff --git a/base/applications/network/netsh/wmi.c b/base/applications/network/netsh/wmi.c index 960d89bc2c8..8bf97c3e8c1 100644 --- a/base/applications/network/netsh/wmi.c +++ b/base/applications/network/netsh/wmi.c @@ -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)