Skip to content

Instantly share code, notes, and snippets.

@cheatfate
Created March 23, 2017 21:57
Show Gist options
  • Save cheatfate/1211c9625649472d4a5b07a6c28008cd to your computer and use it in GitHub Desktop.
Save cheatfate/1211c9625649472d4a5b07a6c28008cd to your computer and use it in GitHub Desktop.
import wincom, strutils
type
FILETIME = object
dwLowDateTime: DWORD
dwHighDateTime: DWORD
LPFILETIME = ptr FILETIME
const
CLSID_SetupConfiguration = DEFGUID("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")
IID_ISetupInstance = DEFGUID("B41463C3-8866-43B5-BC33-2B0676F7F42E")
IID_ISetupConfiguration = DEFGUID("42843719-DB4C-46C2-8E7C-64F1816EFD5B")
IID_IEnumSetupInstances = DEFGUID("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")
IID_ISetupHelper = DEFGUID("42b21b78-6192-463e-87bf-d577838f1d5c")
INTERFACE(ISetupHelper, IUnknown):
proc ParseVersion(pwszVersion: LPOLESTR, pullVersion: PULONGLONG): HRESULT
proc ParseVersionRange(pwszVersionRange: LPOLESTR,
pullMinVersion: PULONGLONG,
pullMaxVersion: PULONGLONG): HRESULT
type PISetupHelper = ptr ISetupHelper
INTERFACE(ISetupInstance, IUnknown):
proc GetInstanceId(pbstrInstanceId: ptr BSTR): HRESULT
proc GetInstallDate(pInstallDate: LPFILETIME): HRESULT
proc GetInstallationName(pbstrInstallationName: ptr BSTR): HRESULT
proc GetInstallationPath(pbstrInstallationPath: ptr BSTR): HRESULT
proc GetInstallationVersion(pbstrInstallationVersion: ptr BSTR): HRESULT
proc GetDisplayName(lcid: LCID, pbstrDisplayName: ptr BSTR): HRESULT
proc GetDescription(lcid: LCID, pbstrDescription: ptr BSTR): HRESULT
proc ResolvePath(pwszRelativePath: LPOLESTR,
pbstrAbsolutePath: ptr BSTR): HRESULT
type PISetupInstance = ptr ISetupInstance
INTERFACE(IEnumSetupInstances, IUnknown):
proc Next(celt: ULONG, rgelt: ptr PISetupInstance,
pceltFetched: ptr ULONG): HRESULT
proc Skip(celt: ULONG): HRESULT
proc Reset(): HRESULT
proc Clone(ppenum: pointer): HRESULT
type PIEnumSetupInstances = ptr IEnumSetupInstances
INTERFACE(ISetupConfiguration, IUnknown):
proc EnumInstances(ppEnumInstances: ptr PIEnumSetupInstances): HRESULT
proc GetInstanceForCurrentProcess(ppInstance: ptr PISetupInstance): HRESULT
proc GetInstanceForPath(wzPath: pointer,
ppInstance: ptr PISetupInstance): HRESULT
type PISetupConfiguration = ptr ISetupConfiguration
when isMainModule:
var pcf: PIClassFactory = nil
var clsid = CLSID_SetupConfiguration
var iid = IID_IClassFactory
var iid2 = IID_ISetupConfiguration
var psc: PISetupConfiguration = nil
var pesi: PIEnumSetupInstances = nil
var p: pointer
echo toHex(cast[uint64](pcf))
var res = CoGetClassObject(addr(clsid),
CLSCTX_LOCAL_SERVER or CLSCTX_INPROC_SERVER,
nil, addr(iid), addr(pcf))
if SUCCEEDED(res):
res = pcf.CreateInstance(nil, cast[REFIID](addr(iid2)), cast[pointer](addr(psc)))
if SUCCEEDED(res):
res = psc.EnumInstances(addr(pesi))
if SUCCEEDED(res):
discard
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment