SCardGetAttrib
SCardGetAttrib 定义在 winscard_clnt.c
实现如下:
2658 LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, 2659 LPDWORD pcbAttrLen) 2660 { 2661 LONG ret; 2662 unsigned char *buf = NULL; 2663 2664 PROFILE_START 2665
2666 if (NULL == pcbAttrLen) 2667 return SCARD_E_INVALID_PARAMETER; 2668 2669 if (SCARD_AUTOALLOCATE == *pcbAttrLen) 2670 { 2671 if (NULL == pbAttr) 2672 return SCARD_E_INVALID_PARAMETER; 2673 2674 *pcbAttrLen = MAX_BUFFER_SIZE; 2675 buf = malloc(*pcbAttrLen); 2676 if (NULL == buf) 2677 return SCARD_E_NO_MEMORY; 2678 2679 *(unsigned char **)pbAttr = buf; 2680 } |
2669 行当传入的 pcbAttrLen 所指内容为 SCARD_AUTOALLOCATE ,则要求 SCardGetAttrib 内部为参数 pbAttr 分配内存。这个在前面也有所提到。
2681 else 2682 { 2683 buf = pbAttr; 2684 2685 /* if only get the length */ 2686 if (NULL == pbAttr) 2687 /* use a reasonable size */ 2688 *pcbAttrLen = MAX_BUFFER_SIZE; 2689 } 2690 2691 ret = SCardGetSetAttrib(hCard, SCARD_GET_ATTRIB, dwAttrId, buf, 2692 pcbAttrLen); 2693 2694 PROFILE_END(ret) 2695 2696 return ret; 2697 } |
2686 行,如果传入的参数 pbAttr 为0,则只是需要返回 pbAttr 可能需要的长度,
在这里,这个长度是固定的, MAX_BUFFER_SIZE 264. 这个在前面也提到了,
用到短 APDU 收发的时候。
现在看看 SCardGetSetAttrib. 为了体现 extract , SCardGetAttrib 用到了 SCardGetSetAttrib ,也就是调用了 SCardGetSetAttrib ,第二个参数是
SCARD_GET_ATTRIB.
SCardGetSetAttrib 定义在 winscard_clnt.c
实现如下:
2750 static LONG SCardGetSetAttrib(SCARDHANDLE hCard, int command, DWORD dwAttrId, 2751 LPBYTE pbAttr, LPDWORD pcbAttrLen) 2752 { 2753 LONG rv; 2754 getset_struct scGetSetStruct; 2755 sharedSegmentMsg msgStruct; 2756 int i; 2757 DWORD dwContextIndex, dwChannelIndex; 2758 |