LookupAccountSid()中出现错误0x8007000e

Error 0x8007000e in LookupAccountSid()

本文关键字:错误 0x8007000e LookupAccountSid      更新时间:2023-10-16

我有一个相当旧的VS6应用程序,它在调用LookupAccountSid时生成错误0x8007000E(error_OUTOFEMORY"没有足够的存储空间来完成此操作。")。

失败的调用只是试图确定缓冲区需要有多大才能在对LookupAccountSid:的第二次调用中使用

std::string GetNameFromSID(PSID pSid)
{
    if (NULL == pSid)
        return "";
    DWORD        _dwName;   //Size of the name in TCHARs
    DWORD        _dwDomain; //Size of the domain in TCHARs
    SID_NAME_USE _use;      //Usage type of the name (user,group etc).
    BOOL         _b;
    //Determine the buffer sizes we require
    SetLastError(0);
    _b = LookupAccountSid( NULL, pSid, NULL, &_dwName, NULL, &_dwDomain, &_use );
    if ( !_b ) {
        DWORD _dw = GetLastError();
        if ( ERROR_NONE_MAPPED == _dw ) {
            //There is no name for this SID
            return "";
        } else if ( ERROR_INSUFFICIENT_BUFFER == _dw ) {
            //This is expected.
        } else if ( S_OK != _dw ) {
            //This is where we see ERROR_OUTOFMEMORY
            return "";
        }
    }
    //Do some other stuff here...
}

我所期望的是错误0x8007007A:error_INSUFFIENT_BUFFER"传递给系统调用的数据区域太小。"这表明我(毫不奇怪)需要分配更大的缓冲区。

这个系统的内存一点也不低,所以有人能提出原因吗?

如果将_dwName_dwDomain正确初始化为0,则查看它是否有效。

堆栈上可能有一些随机垃圾,但根据http://msdn.microsoft.com/en-us/library/windows/desktop/aa379166(v=vs.85).aspx这些必须实际设置为0才能接收所需的缓冲区大小