mirror of
https://github.com/zodiacon/WindowsInternals
synced 2026-08-09 13:18:09 +00:00
215 lines
8.4 KiB
C++
215 lines
8.4 KiB
C++
// SlPolicy.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
extern "C" NTSYSCALLAPI
|
|
NTSTATUS NTAPI NtQueryLicenseValue(PUNICODE_STRING ValueName, PULONG Type, PVOID Data, ULONG DataSize, PULONG ResultDataSize);
|
|
|
|
#pragma comment(lib, "ntdll")
|
|
|
|
enum class ValueType {
|
|
Dword,
|
|
Bool
|
|
};
|
|
|
|
const int MaxValuesInFacility = 24;
|
|
|
|
struct LicenseFacility {
|
|
PCWSTR FacilityName;
|
|
PCWSTR AlternateName;
|
|
struct LicenseValue {
|
|
PCWSTR Name;
|
|
PCSTR Description;
|
|
ValueType Type;
|
|
} Values[MaxValuesInFacility];
|
|
} facilities[] = {
|
|
{ L"Desktop Windows Manager", L"DWM", {
|
|
{ L"Microsoft-Windows-DesktopWindowManager-Core-AnimatedTransitionsAllowed", "Animated Transitions allowed", ValueType::Bool },
|
|
{ L"Microsoft-Windows-DesktopWindowManager-Core-LivePreviewAllowed", "Live preview allowed", ValueType::Bool },
|
|
{ L"Microsoft-Windows-DesktopWindowManager-Core-Flip3dAllowed", "Flip 3D allowed", ValueType::Bool },
|
|
{ L"Microsoft-Windows-DesktopWindowManager-Core-TransparencyAllowed", "Transparency allowed", ValueType::Bool },
|
|
{ L"Microsoft-Windows-DesktopWindowManager-Core-ThumbnailsAllowed", "Thumbnails allowed", ValueType::Bool },
|
|
}
|
|
},
|
|
|
|
{ L"Explorer", nullptr, {
|
|
{ L"explorer-AeroAnimationAllowed", "Aero animation allowed", ValueType::Bool },
|
|
{ L"explorer-AeroShakeAllowed", "Aero shake allowed", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Fax", nullptr, {
|
|
{ L"Microsoft-Windows-Fax-Common-EnableServerPolicy", "Enable server policy", ValueType::Bool },
|
|
{ L"Microsoft-Windows-Fax-Common-DeviceLimit", "Device limit" }
|
|
}
|
|
},
|
|
|
|
{ L"IIS", nullptr, {
|
|
{ L"IIS-W3SVC-MaxConcurrentRequests", "Maximum concurrent requests" }
|
|
}
|
|
},
|
|
|
|
{ L"Kernel", nullptr, {
|
|
{ L"Kernel-RegisteredProcessors", "Maximum allowed processor sockets" },
|
|
{ L"Kernel-WindowsMaxMemAllowedx86", "Maximum memory allowed in MB (x86)" },
|
|
{ L"Kernel-WindowsMaxMemAllowedx64", "Maximum memory allowed in MB (x64)" },
|
|
{ L"Kernel-WindowsMaxMemAllowedia64", "Maximum memory allowed in MB (IA64)" },
|
|
{ L"Kernel-WindowsMaxMemAllowedArm", "Maximum memory allowed in MB (ARM)" },
|
|
{ L"Kernel-WindowsMaxMemAllowedArm64", "Maximum memory allowed in MB (ARM64)" },
|
|
{ L"Kernel-PhysicalMemoryAddAllowed", "Add physical memory allowed", ValueType::Bool },
|
|
{ L"Kernel-VmPhysicalMemoryAddAllowed", "Add VM physical memory allowed", ValueType::Bool },
|
|
{ L"Kernel-MaxPhysicalPage", "Maximum physical page in bytes" },
|
|
{ L"Kernel-OneCore-DeviceFamilyID", "Device Family ID" },
|
|
{ L"Kernel-NativeVHDBoot", "Native VHD boot", ValueType::Bool },
|
|
{ L"Kernel-DynamicPartitioningSupported", "Dynamic Partitioning supported", ValueType::Bool },
|
|
{ L"Kernel-VirtualDynamicPartitioningSupported", "Virtual Dynamic Partitioning supported", ValueType::Bool },
|
|
{ L"Kernel-MemoryMirroringSupported", "Memory Mirroring supported", ValueType::Bool },
|
|
{ L"Kernel-PersistDefectiveMemoryList", "Persist defective memory list", ValueType::Bool },
|
|
{ L"Kernel-ProductInfo", "Product info" }
|
|
}
|
|
},
|
|
|
|
{ L"LSA Policy", L"LSA", {
|
|
{ L"LSA-Policy-EnableCredentialIsolation", "Enable credential isolation", ValueType::Bool },
|
|
{ L"LSA-Policy-EnableTrustedDomains", "Enable transted domains", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Offline Files", nullptr, {
|
|
{ L"Microsoft-Windows-OfflineFiles-Core-FeatureEnabled", "Enabled", ValueType::Bool },
|
|
{ L"Microsoft-Windows-OfflineFiles-Core-BranchCachingEnabled", "Branch caching enabled", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"OMD", nullptr, {
|
|
{ L"OMD-API-Enabled", "API enabled", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Parental Controls", nullptr, {
|
|
{ L"parentalcontrols-EnableFeature", "Enabled", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Print Spooler", L"Spooler", {
|
|
{ L"Printing-Spooler-Core-Spoolss-Licensing-Enabled", "Spooler licensing enabled", ValueType::Bool },
|
|
{ L"Printing-Spooler-Pmc-Licensing-Enabled", "Spooler PMC licensing enabled", ValueType::Bool },
|
|
{ L"Printing-Spooler-Core-Localspl-Licensing-Enabled", "Spooler SPL licensing enabled", ValueType::Bool },
|
|
{ L"Printing-Spooler-Core-Spoolss-Licensing-Network-Default-Printer-Enabled", "Spooler licensing network default enabled", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Shell Inbox Games", L"Games", {
|
|
{ L"Shell-InBoxGames-FreeCell-EnableGame", "FreeCell enabled", ValueType::Bool },
|
|
{ L"Shell-InBoxGames-Hearts-EnableGame", "Hearts enabled", ValueType::Bool },
|
|
{ L"SShell-InBoxGames-Minesweeper-EnableGame", "Minesweeper enabled", ValueType::Bool },
|
|
{ L"Shell-InBoxGames-PurblePlace-EnableGame", "Purble Place enabled enabled", ValueType::Bool },
|
|
{ L"Shell-InBoxGames-Shanghai-EnableGame", "Shanghai enabled", ValueType::Bool },
|
|
{ L"Shell-InBoxGames-Solitaire-EnableGame", "Solitaire enabled", ValueType::Bool },
|
|
{ L"Shell-InBoxGames-SpiderSolitaire-EnableGame", "Spider Solitaire enabled", ValueType::Bool },
|
|
}
|
|
},
|
|
|
|
{ L"Telnet", nullptr, {
|
|
{ L"Telnet-Client-EnableTelnetClient", "Telnet client enabled", ValueType::Bool },
|
|
{ L"Telnet-Server-EnableTelnetServer", "Telnet server enabled", ValueType::Bool },
|
|
}
|
|
},
|
|
|
|
{ L"Terminal Services", L"TermSvc", {
|
|
{ L"TerminalServices-RemoteConnectionManager-UiEffects-DWMRemotingAllowed", "DWM remoting allowed", ValueType::Bool },
|
|
{ L"TerminalServices-RemoteConnectionManager-AllowD3DRemoting", "3D remoting allowed", ValueType::Bool },
|
|
{ L"TerminalServices-DeviceRedirection-Licenses-PnpRedirectionAllowed", "PnP redirection allowed", ValueType::Bool },
|
|
{ L"TerminalServices-DeviceRedirection-Licenses-TSMFPluginAllowed", "TSMF plugin allowed", ValueType::Bool },
|
|
{ L"TerminalServices-DeviceRedirection-Licenses-TSEasyPrintAllowed", "Easy print allowed", ValueType::Bool },
|
|
{ L"TerminalServices-DeviceRedirection-Licenses-TSAudioCaptureAllowed", "Audio capture allowed", ValueType::Bool },
|
|
{ L"TerminalServices-RemoteApplications-ClientSku-RAILAllowed", "RAIL allowed", ValueType::Bool },
|
|
{ L"TerminalServices-RDP-7-Advanced-Compression-Allowed", "Advanced compression allowed", ValueType::Bool },
|
|
{ L"TerminalServices-RemoteConnectionManager-AllowRemoteConnections", "Allow remote connections", ValueType::Bool },
|
|
{ L"TerminalServices-RemoteConnectionManager-AllowMultimon", "Allow multi monitors", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Windows Media Player", L"WMP", {
|
|
{ L"WMPPlayer-HMEAllowed", "Home Media Ecosystem allowed", ValueType::Bool },
|
|
{ L"WMPPlayer-RMEAllowed", "Remote Media Ecosystem allowed", ValueType::Bool }
|
|
}
|
|
},
|
|
|
|
{ L"Workstation Service", L"WksSvc", {
|
|
{ L"WorkstationService-DomainJoinEnabled", "Domain Join enabled", ValueType::Bool }
|
|
}
|
|
}
|
|
};
|
|
|
|
void ListValuesInFacility(int facility) {
|
|
UNICODE_STRING name;
|
|
const auto& facilityName = facilities[facility];
|
|
printf("%ws", facilityName.FacilityName);
|
|
if (facilityName.AlternateName)
|
|
printf(" (%ws)", facilityName.AlternateName);
|
|
|
|
printf("\n%s\n", std::string(wcslen(facilityName.FacilityName), '-').c_str());
|
|
for (int i = 0; i < MaxValuesInFacility; i++) {
|
|
const auto& valueName = facilities[facility].Values[i];
|
|
if (valueName.Name == nullptr)
|
|
return;
|
|
|
|
RtlInitUnicodeString(&name, valueName.Name);
|
|
ULONG value = 0, size;
|
|
auto status = NtQueryLicenseValue(&name, nullptr, &value, sizeof(value), &size);
|
|
if (NT_SUCCESS(status)) {
|
|
assert(size <= sizeof(value));
|
|
|
|
printf("%s: ", valueName.Description);
|
|
if (valueName.Type == ValueType::Bool)
|
|
printf("%s\n", value ? "Yes" : "No");
|
|
else
|
|
printf("%d\n", value);
|
|
}
|
|
}
|
|
}
|
|
|
|
int wmain(int argc, const wchar_t* argv[]) {
|
|
printf("Software License Policy Viewer Version 1.0 (C)2016 by Pavel Yosifovich\n\n");
|
|
|
|
if (argc == 1) {
|
|
// list everything
|
|
for (int i = 0; i < _countof(facilities); i++) {
|
|
ListValuesInFacility(i);
|
|
printf("\n");
|
|
}
|
|
}
|
|
else {
|
|
if (_wcsicmp(argv[1], L"/f") == 0 || _wcsicmp(argv[1], L"-f") == 0) {
|
|
if (argc == 2) {
|
|
// list facilities
|
|
for (int i = 0; i < _countof(facilities); i++) {
|
|
printf("%ws", facilities[i].FacilityName);
|
|
if (facilities[i].AlternateName)
|
|
printf(" (%ws)", facilities[i].AlternateName);
|
|
printf("\n");
|
|
}
|
|
}
|
|
else {
|
|
// find facility name
|
|
for (int i = 0; i < _countof(facilities); i++)
|
|
if (_wcsicmp(argv[2], facilities[i].FacilityName) == 0 ||
|
|
(facilities[i].AlternateName && _wcsicmp(argv[2], facilities[i].AlternateName) == 0)) {
|
|
ListValuesInFacility(i);
|
|
return 0;
|
|
}
|
|
printf("Facility not found. Use /f to list facilities.\n");
|
|
}
|
|
}
|
|
else {
|
|
printf("Unknown switch. Usage: Slpolicy [-f] [facilityName]\n");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|