Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.