I'm doing some interop with the PKCS11 Cryptoki interface.  In summary, there 
is a function which takes a c-style array (block of contiguously allocated 
memory).  When my interop definition is just for a single element everything is 
fine.  When I define the function as taking the required array, the details are 
not received correctly by the DLL even in the basic case of a single element.



Here are the details in depth:


There is one function, C_GetAttributeValue which is defined in a C header file:

 C_GetAttributeValue
 (
  CK_SESSION_HANDLE hSession,   /* the session's handle */
  CK_OBJECT_HANDLE  hObject,    /* the object's handle */
  CK_ATTRIBUTE_PTR  pTemplate,  /* specifies attrs; gets vals */
  CK_ULONG          ulCount     /* attributes in template */
);

The CK_ATTRIBUTE_PTR is the problem.

typedef struct CK_ATTRIBUTE {
  CK_ATTRIBUTE_TYPE type;
  CK_VOID_PTR       pValue;  /* ulValueLen went from CK_USHORT to CK_ULONG for 
v2.0 */
  CK_ULONG          ulValueLen;  /* in bytes */
} CK_ATTRIBUTE;

typedef CK_ATTRIBUTE CK_PTR CK_ATTRIBUTE_PTR;




Here are my definitions:
[StructLayout(LayoutKind.Sequential)]
public class CK_ATTRIBUTE_WRAPPED
        {
            public CK_ATTRIBUTE_WRAPPED()
            {
            }

            public CK_ATTRIBUTE_WRAPPED(uint type, IntPtr pValue, uint ulCount)
            {
                this.type = type; this.pValue = pValue; this.ulCount = ulCount;
            }
            public uint type;
            public IntPtr pValue;
            public uint ulCount;
        }




[DllImport("gclib.dll", EntryPoint = "C_GetAttributeValue")]
public unsafe static extern CK_RESULTS Wrapped_C_GetAttributeValue(uint 
hSession, uint hObject, [Out, In] CK_ATTRIBUTE_WRAPPED pTemplate, int ulCount);



Everything works fine with the above definitions if I am just passing in a 
single value.  If I change the definition to be an array CK_ATTRIBUTE_WRAPPED[] 
then even my single value test which works before now no longer works.


[DllImport("gclib.dll", EntryPoint = "C_GetAttributeValue")]
public unsafe static extern CK_RESULTS Wrapped_C_GetAttributeValue(uint 
hSession, uint hObject, [Out, In] CK_ATTRIBUTE_WRAPPED[] pTemplate, int 
ulCount);

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to