The member "ObjectTypeList" of paramater pRequest must comply to some rules. They are originally defined in doc of AccessCheckByType
(http://msdn2.microsoft.com/en-us/library/aa374826(VS.85).aspx).
Modified quote:
ObjectTypeList
A pointer to an array of OBJECT_TYPE_LIST structures that identify the hierarchy of object types for which to check access. Each element in the array specifies a GUID that identifies the object type and a value indicating the level of the object type in the hierarchy of object types. The array should not have two elements with the same GUID.
The array must have at least one element. The first element in the array must be at level zero and identify the object itself. The array can have only one level zero element. The second element is a subobject, such as a property set, at level 1. Following each level 1 entry are subordinate entries for the level 2 through 4 subobjects. Thus, the levels for the elements in the array might be {0, 1, 2, 2, 1, 2, 3}. If the object type list is out of order,
AuthzAccessCheck fails and GetLastError returns ERROR_INVALID_PARAMETER.
If ObjectTypeList is NULL,
AuthzAccessCheck is the same as the AccessCheck function.
In other words (as sequence):
Array[i].Level = a_i
{ a_i +1 | a_i - a_(i-1) = 1 AND a_i < 4
a_i+1 = { a_i - t | a_i - t AND t >= 0
{ ERROR_INVALID_PARAMETER | else
sequence start: a_0 = 0