[Bug 34770] WMI applications fail when incorrectly passing WBEM_MASK_CONDITION_ORIGIN to IWbemClassObject::GetNames method (DS License Server, some WMI examples)

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Oct 20 12:35:45 CDT 2013


http://bugs.winehq.org/show_bug.cgi?id=34770

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|Installer                   |download, source
             Status|UNCONFIRMED                 |NEW
                URL|                            |http://www.cppfans.com/cntf
                   |                            |ile.asp?fn=wmi_bcb
                 CC|                            |focht at gmx.net
          Component|-unknown                    |wmi&wbemprox
            Summary|DS License Server: Cannot   |WMI applications fail when
                   |obtain a valid computer ID  |incorrectly passing
                   |                            |WBEM_MASK_CONDITION_ORIGIN
                   |                            |to
                   |                            |IWbemClassObject::GetNames
                   |                            |method (DS License Server,
                   |                            |some WMI examples)
     Ever Confirmed|0                           |1

--- Comment #7 from Anastasius Focht <focht at gmx.net> 2013-10-20 12:35:45 CDT ---
Hello folks,

probably another case of broken app code, exhibiting an inconsistency of MSDN
documentation and real implementation.

The flags value 0x00000070 can be also constructed by passing:

(WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN)

The reason the MSDN entry for IWbemClassObject::GetNames() doesn't talk about
WBEM_MASK_xxx values is because they are meant to be used by _implementation_
and not by caller (to filter out some groups).

Source:
http://source.winehq.org/git/wine.git/blob/46cbc36041278dc19c9ea14223325987e629c4c6:/include/wbemcli.idl#l195

--- snip ---
192 typedef [v1_enum] enum tag_WBEM_CONDITION_FLAG_TYPE
193 {
194     WBEM_FLAG_ALWAYS                    = 0,
195     WBEM_FLAG_ONLY_IF_TRUE              = 0x1,
196     WBEM_FLAG_ONLY_IF_FALSE             = 0x2,
197     WBEM_FLAG_ONLY_IF_IDENTICAL         = 0x3,
198     WBEM_MASK_PRIMARY_CONDITION         = 0x3,

199     WBEM_FLAG_KEYS_ONLY                 = 0x4,
200     WBEM_FLAG_REFS_ONLY                 = 0x8,

201     WBEM_FLAG_LOCAL_ONLY                = 0x10,
202     WBEM_FLAG_PROPAGATED_ONLY           = 0x20,
203     WBEM_FLAG_SYSTEM_ONLY               = 0x30,
204     WBEM_FLAG_NONSYSTEM_ONLY            = 0x40,
205     WBEM_MASK_CONDITION_ORIGIN          = 0x70,

206     WBEM_FLAG_CLASS_OVERRIDES_ONLY      = 0x100,
207     WBEM_FLAG_CLASS_LOCAL_AND_OVERRIDES = 0x200,
208     WBEM_MASK_CLASS_CONDITION           = 0x300
209 } WBEM_CONDITION_FLAG_TYPE;
--- snip ---

The MSDN entry for IWbemClassObject::BeginEnumeration() method gives a bit of
hint:

MSDN http://msdn.microsoft.com/en-us/windows/aa391434%28v=vs.71%29.aspx

--- quote ---
WBEM_MASK_CLASS_CONDITION

For classes only. Not a flag - this is just a mask to apply against a flags
variable to check if either WBEM_FLAG_CLASS_OVERRIDES_ONLY or
WBEM_FLAG_CLASS_LOCAL_AND_OVERRIDES is set.
--- quote ---

If you search the web for this strange "WBEM_FLAG_ALWAYS |
WBEM_MASK_CONDITION_ORIGIN" value you will find some source code
examples/snippets.
The majority coming from asian "programming" websites.
It is likely they copied from each other, spreading bad code further.

It could be very well this invalid value passes on Windows despite MSDN saying
otherwise.
"flags from the same group are mutually exclusive" (flags)
"to check if either x or y is set" (mask)

You can download source code and binary that basically does the same (wrong)
thing as the commercial software here:

http://www.cppfans.com/articles/system/bcb_wmi.asp

--- snip ---
...
while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned)
== S_OK)
{
...
    SAFEARRAY *pvNames = NULL;
    if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS |
WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
    {
...
--- snip ---

Refining the bug accordingly.

Regards

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list