我尝试了通常的Windows方式,将nullptr作为输出缓冲区指针,大小为0。AcceptSecurityContext
失败,出现错误SEC_E_INSUFFICIENT_MEMORY
。我本来希望在OutSecBuff.cbBuffer
中得到所需的大小,但它是0。我用巨大的缓冲区再次调用它。调用成功,但上下文无效,以后的调用失败。
// Query needed buffer size
secStatus = AcceptSecurityContext(&hcred,&hctxt, &InBuffDesc,attr,SECURITY_NATIVE_DREP,
&hctxt,&OutBuffDesc,&attr,nullptr);
if(SEC_E_INSUFFICIENT_MEMORY == ss)
{
// Allocate buffer of needed size, big enough
OutSecBuff.cbBuffer = *pcbOut;
OutSecBuff.pvBuffer = pOut;
// Call with buffer of required size
secStatus = AcceptSecurityContext(&hcred,&hctxt, InBuffDesc,
attr,SECURITY_NATIVE_DREP,&hctxt,&OutBuffDesc,&attr,nullptr);
}
如果我预先分配了巨大的缓冲区,一切都会很好
我想动态分配所需大小的缓冲区。
SSAPI采用不同的方法。查询安全包QuerySecurityPackageInfo
时,在字段cbMaxToken
中返回输出缓冲区的最大大小。您只需分配一次缓冲区,就可以确保缓冲区大小足以满足所有请求。