127 lines
4.5 KiB
C#
127 lines
4.5 KiB
C#
|
namespace LibTSforge.Activators
|
||
|
{
|
||
|
using System;
|
||
|
using LibTSforge.PhysicalStore;
|
||
|
using LibTSforge.SPP;
|
||
|
|
||
|
public static class AVMA4k
|
||
|
{
|
||
|
public static void Activate(PSVersion version, bool production, Guid actId)
|
||
|
{
|
||
|
if (version != PSVersion.WinModern)
|
||
|
{
|
||
|
throw new NotSupportedException("AVMA licenses are not available for this product.");
|
||
|
}
|
||
|
|
||
|
Guid appId;
|
||
|
if (actId == Guid.Empty)
|
||
|
{
|
||
|
appId = SLApi.WINDOWS_APP_ID;
|
||
|
actId = SLApi.GetDefaultActivationID(appId, false);
|
||
|
|
||
|
if (actId == Guid.Empty)
|
||
|
{
|
||
|
throw new NotSupportedException("No applicable activation IDs found.");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
appId = SLApi.GetAppId(actId);
|
||
|
}
|
||
|
|
||
|
if (SLApi.GetPKeyChannel(SLApi.GetInstalledPkeyID(actId)) != "VT:IA")
|
||
|
{
|
||
|
throw new NotSupportedException("Non-VT:IA product key installed.");
|
||
|
}
|
||
|
|
||
|
Utils.KillSPP();
|
||
|
|
||
|
Logger.WriteLine("Writing TrustedStore data...");
|
||
|
|
||
|
using (IPhysicalStore store = Utils.GetStore(version, production))
|
||
|
{
|
||
|
string key = string.Format("SPPSVC\\{0}\\{1}", appId, actId);
|
||
|
|
||
|
ulong unknown = 0;
|
||
|
ulong time1;
|
||
|
ulong crcBindTime = (ulong)DateTime.UtcNow.ToFileTime();
|
||
|
ulong timerTime;
|
||
|
|
||
|
ulong expiry = Constants.TimerMax;
|
||
|
|
||
|
long creationTime = BitConverter.ToInt64(store.GetBlock("__##USERSEP##\\$$_RESERVED_$$\\NAMESPACE__", "__##USERSEP-RESERVED##__$$GLOBAL-CREATION-TIME$$").Data, 0);
|
||
|
long tickCount = BitConverter.ToInt64(store.GetBlock("__##USERSEP##\\$$_RESERVED_$$\\NAMESPACE__", "__##USERSEP-RESERVED##__$$GLOBAL-TICKCOUNT-UPTIME$$").Data, 0);
|
||
|
long deltaTime = BitConverter.ToInt64(store.GetBlock(key, "__##USERSEP-RESERVED##__$$UP-TIME-DELTA$$").Data, 0);
|
||
|
|
||
|
time1 = (ulong)(creationTime + tickCount + deltaTime);
|
||
|
timerTime = crcBindTime / 10000;
|
||
|
expiry /= 10000;
|
||
|
|
||
|
VariableBag avmaBinding = new VariableBag();
|
||
|
|
||
|
avmaBinding.Blocks.AddRange(new CRCBlock[]
|
||
|
{
|
||
|
new CRCBlock
|
||
|
{
|
||
|
DataType = CRCBlockType.BINARY,
|
||
|
Key = new byte[] { },
|
||
|
Value = BitConverter.GetBytes(crcBindTime),
|
||
|
},
|
||
|
new CRCBlock
|
||
|
{
|
||
|
DataType = CRCBlockType.STRING,
|
||
|
Key = new byte[] { },
|
||
|
ValueAsStr = "AVMA4K",
|
||
|
},
|
||
|
new CRCBlock
|
||
|
{
|
||
|
DataType = CRCBlockType.STRING,
|
||
|
Key = new byte[] { },
|
||
|
ValueAsStr = "00491-50000-00001-AA666",
|
||
|
}
|
||
|
});
|
||
|
|
||
|
byte[] avmaBindingData = avmaBinding.Serialize();
|
||
|
|
||
|
Timer avmaTimer = new Timer
|
||
|
{
|
||
|
Unknown = unknown,
|
||
|
Time1 = time1,
|
||
|
Time2 = timerTime,
|
||
|
Expiry = expiry
|
||
|
};
|
||
|
|
||
|
string storeVal = string.Format("msft:spp/ia/bind/1.0/store/{0}/{1}", appId, actId);
|
||
|
string timerVal = string.Format("msft:spp/ia/bind/1.0/timer/{0}/{1}", appId, actId);
|
||
|
|
||
|
store.DeleteBlock(key, storeVal);
|
||
|
store.DeleteBlock(key, timerVal);
|
||
|
|
||
|
store.AddBlocks(new PSBlock[]
|
||
|
{
|
||
|
new PSBlock
|
||
|
{
|
||
|
Type = BlockType.NAMED,
|
||
|
Flags = 0x400,
|
||
|
KeyAsStr = key,
|
||
|
ValueAsStr = storeVal,
|
||
|
Data = avmaBindingData,
|
||
|
},
|
||
|
new PSBlock
|
||
|
{
|
||
|
Type = BlockType.TIMER,
|
||
|
Flags = 0x4,
|
||
|
KeyAsStr = key,
|
||
|
ValueAsStr = timerVal,
|
||
|
Data = avmaTimer.CastToArray()
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
SLApi.RefreshLicenseStatus();
|
||
|
SLApi.FireStateChangedEvent(appId);
|
||
|
Logger.WriteLine("Activated using AVMA4k successfully.");
|
||
|
}
|
||
|
}
|
||
|
}
|