As mentioned in my previous post, WWSAPI follows a common pattern to set properties (which in most cases are just configuration settings). Each property structure consists of three fields: id, value and valueSize. The field id is an enum value of the property. The enum value has a corresponding type whose size should be set in the field valueSize. The value field is defined as void* and should always be a pointer to the actual type of the property. A common mistake is to assign the actual type to the value field. The result of that is typically Access Violation that brings down the process.

 

For example, WS_XML_SECURITY_TOKEN_PROPERTY is defined this way:

typedef struct _WS_XML_SECURITY_TOKEN_PROPERTY {

    WS_XML_SECURITY_TOKEN_PROPERTY_ID id;

    __field_bcount(valueSize) void* value;

    ULONG valueSize;

} WS_XML_SECURITY_TOKEN_PROPERTY;

 

The WS_XML_SECURITY_TOKEN_PROPERTY_ID enum contains a value WS_XML_SECURITY_TOKEN_PROPERTY_ATTACHED_REFERENCE with a corresponding type WS_XML_BUFFER*. The correct way to use this property is:

WS_XML_SECURITY_TOKEN_PROPERTY tokenProperty[1];

WS_XML_BUFFER* buffer = GetAttachedReference();

tokenProperty[0].id = WS_XML_SECURITY_TOKEN_PROPERTY_ATTACHED_REFERENCE;

tokenProperty[0].value = &buffer;

tokenProperty[0].valueSize = sizeof(buffer);

 

Assigning buffer to tokenProperty[0].value will not give you a compiler error, but will probably lead to AV when you run the program. If the property type is a non-pointer type (BOOL, ULONG, WS_DATETIME, etc), the compiler will catch the error if the value is directly assigned, but the error is less obvious when the type is a pointer type.