File: wmiquery.nsh

package info (click to toggle)
win32-loader 0.10.6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 1,868 kB
  • sloc: ansic: 2,492; sh: 706; asm: 344; makefile: 338
file content (142 lines) | stat: -rw-r--r-- 4,367 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
; Licensed under the zlib/libpng license (same as NSIS)

!ifndef WMIQUERY_INCLUDED
!define WMIQUERY_INCLUDED

!define WMIQUERY_PREFIX "WMIQUERY_"

!include include\stdmacros.nsh
!include LogicLib.nsh
!include Win\COM.nsh

!define WMIQUERY_FUNCDEF \
  `!insertmacro STDMACROS_FUNCDEF ${WMIQUERY_PREFIX}`
!define WMIQUERY_FUNCPROLOG \
  `!insertmacro STDMACROS_FUNCPROLOG ${WMIQUERY_PREFIX}`

${STDMACROS_DefIfNotDef} VT_I4       3 ; 0x0003
${STDMACROS_DefIfNotDef} VT_BSTR     8 ; 0x0008

${STDMACROS_DefIfNotDef} WBEM_FLAG_FORWARD_ONLY       0x20
${STDMACROS_DefIfNotDef} WBEM_FLAG_RETURN_IMMEDIATELY 0x10
${STDMACROS_DefIfNotDef} WBEM_INFINITE                0xffffffff

${STDMACROS_DefIfNotDef} \
  CLSID_WbemLocator {4590f811-1d3a-11d0-891f-00aa004b2e24}

${STDMACROS_DefIfNotDef} \
  IID_IWbemLocator {dc12a687-737f-11cf-884d-00aa004b2e24}
!ifndef IWbemLocator::ConnectServer
${NSISCOMIFACEDECL}IWbemLocator ConnectServer 3 (w,p,p,p,i,p,p,*p)i
!endif

!ifndef IWbemServices::ExecQuery
${NSISCOMIFACEDECL}IWbemServices ExecQuery 20 (w,w,i,p,*p)i
!endif

!ifndef IEnumWbemClassObject::Next
${NSISCOMIFACEDECL}IEnumWbemClassObject Next 4 (i,i,*p,*p)i
!endif

!ifndef IWbemClassObject::Get
${NSISCOMIFACEDECL}IWbemClassObject Get 4 (w,i,p,i,i)i
!endif

; ${WMIQUERY_SingleProp} property class value
${WMIQUERY_FUNCDEF} SingleProp
!macro WMIQUERY_SingleProp_Call UN PROPERTY CLASS VALUE
  Push "${PROPERTY}"
  Push "${CLASS}"
  Call `${UN}${WMIQUERY_PREFIX}SingleProp`
  Pop ${VALUE}
!macroend

!macro WMIQUERY_SingleProp UN
; Query provided Windows Management Instrumentation (WMI) class for a single property
; Parameters:
;   property - name of the property to be retrieved from WMI class
;   class - WMI class to query
; Return:
;   Empty string in case of error otherwise value of queried property
${WMIQUERY_FUNCPROLOG} "${UN}" SingleProp
  ; Save registers
  System::Store 'S'

  Pop $8
  Pop $7
  ; property=$7, class=$8

  ; Create IWbemLocator interface
  System::Call "ole32::CoCreateInstance(g '${CLSID_WbemLocator}', p 0, \
    i ${CLSCTX_INPROC_SERVER}, g '${IID_IWbemLocator}', *p .r1) i.r0"
  ; locator=$1
  ${If} $0 != 0
    StrCpy $0 "CoCreateInstance: $0"
  ${Else}
    ; IWbemLocator::ConnectServer(objectpath, user, password, locale,
    ;   securityflags, authority, context, services)
    ${IWbemLocator::ConnectServer} $1 "('root/cimv2',0,0,0,0,0,0,.r2).r0"
    ; services=$2
    ${If} $0 != 0
      DetailPrint "IWbemLocator::ConnectServer: $0"
      StrCpy $0 ""
    ${Else}
      ${IWbemServices::ExecQuery} $2 "('WQL','Select $7 from $8',\
	${WBEM_FLAG_FORWARD_ONLY}|${WBEM_FLAG_RETURN_IMMEDIATELY},0,.r3)r0"
      ${If} $0 != 0
        DetailPrint "IWbemServices::ExecQuery: $0"
        StrCpy $0 ""
      ${Else}
        ${IEnumWbemClassObject::Next} $3 "(${WBEM_INFINITE},1,.r4,.r5).r0"
        ${If} $4 != 0
          ; Allocate memory for Variant
	  System::Call "*(&i2 0, &i2 0, &i2 0, &i2 0, p 0, p 0) p.r6"
          ${If} $6 P<> 0
            ${IWbemClassObject::Get} $4 "(r7,0,r6,0,0).r0"
            ${If} $0 != 0
              DetailPrint "IWbemClassObject::Get: $0"
              StrCpy $0 ""
            ${Else}
              ; Check type of variant
              System::Call "*$6(i .r0)"
              IntOp $0 $0 & 0xFFFF
              ${If} $0 = ${VT_I4}
                ; Access 32 bit integer from Variant
                System::Call "*$6(&i2, &i2, &i2, &i2, i .r0)"
              ${ElseIf} $0 = ${VT_BSTR}
                ; Access bstrVal from Variant
                System::Call "*$6(i, i, w .r0)"
              ${Else}
                DetailPrint "VARTYPE: $0"
                StrCpy $0 ""
	      ${EndIf}
              System::Call "ole32::VariantClear(p r6)"
            ${EndIf}
            ; Free variant
            System::Free $6
	    ; Release IWbemClassObject
            ${IUnknown::Release} $4 ""
          ${Else}
            StrCpy $0 ""
          ${EndIf}
        ${Else}
          StrCpy $0 "IEnumWbemClassObject::Next: $0"
        ${EndIf}
        ; Release IEnumWbemClassObject
        ${IUnknown::Release} $3 ""
      ${EndIf}
      ; Release IWbemService
      ${IUnknown::Release} $2 ""
    ${EndIf}
    ; Release IWbemLocator
    ${IUnknown::Release} $1 ""
  ${EndIf}

  Push $0

  ; Restore registers
  System::Store 'L'
FunctionEnd
!macroend ; WMIQUERY_SingleProp

!endif ; WMIQUERY_INCLUDED