Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NetApiBufferFree返回错误\无效\参数(错误代码87)_C++_C_Winapi_Memory Leaks_Free - Fatal编程技术网

C++ NetApiBufferFree返回错误\无效\参数(错误代码87)

C++ NetApiBufferFree返回错误\无效\参数(错误代码87),c++,c,winapi,memory-leaks,free,C++,C,Winapi,Memory Leaks,Free,我一直在开发一个使用winapi获取管理员组成员的应用程序。为此,我使用了NetLocalGroupGetMembers方法。我的问题是,当我试图释放缓冲区的堆空间时,我从NetApiBufferFree方法中得到错误\u无效\u参数(错误代码87)。我有应用程序的管理员权限 代码如下: #include <stdio.h> #include <windows.h> #include <process.h> #include <lm.h> #inc

我一直在开发一个使用winapi获取管理员组成员的应用程序。为此,我使用了NetLocalGroupGetMembers方法。我的问题是,当我试图释放缓冲区的堆空间时,我从NetApiBufferFree方法中得到错误\u无效\u参数(错误代码87)。我有应用程序的管理员权限

代码如下:

#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <lm.h>
#include <time.h>
#include <assert.h>

#define SLEEP_TIME 2000
#define OS_GROUP_NAME L"administrators"

void createServiceThread();
DWORD WINAPI mainServiceThread( LPVOID lpParam );
char** getUsersByLocalGroup();
void freeNetApiBuffer(LPVOID buffer);

int localGroupUserCount;

int WriteToLog(char* str)
{
    printf("%s\n", str);
    return 0;
}

int main() 
{ 
    createServiceThread();  
}

void createServiceThread(){
    WriteToLog("Application Started...");
    while(TRUE){
        mainServiceThread(NULL);

        Sleep(SLEEP_TIME);
    }
    WriteToLog("Application Closed...");
}

//-------------------------------------------
// A function that represents Main Service Thread
//-------------------------------------------
DWORD WINAPI mainServiceThread( LPVOID lpParam ) 
{
    time_t startTime;
    time (&startTime);
    char startTimeText[30];
    sprintf(startTimeText, "Service Loop Started %s", ctime(&startTime));
    WriteToLog(startTimeText);
    localGroupUserCount = 0;

    char** localGroupUsers = getUsersByLocalGroup();

    WriteToLog("User not found...");

    time_t endTime;
    time (&endTime);
    char endTimeText[30];
    sprintf(endTimeText, "Service Loop Ended %s", ctime(&endTime));
    WriteToLog(endTimeText);
}

char** getUsersByLocalGroup(){
    WriteToLog("getUsersByLocalGroup started");
    LOCALGROUP_MEMBERS_INFO_3 *pBuf;
    DWORD dwLevel = 3;
    DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
    DWORD dwEntriesRead = 0;
    DWORD dwTotalEntries = 0;
    DWORD dwResumeHandle = 0;
    NET_API_STATUS nStatus;

    WriteToLog("Call NetLocalGroupGetMembers"); 
    nStatus = NetLocalGroupGetMembers(
        NULL,
        OS_GROUP_NAME,
        dwLevel,
        (LPBYTE *) &pBuf,
        dwPrefMaxLen,
        &dwEntriesRead,
        &dwTotalEntries,
        NULL
    );  
//  nStatus = ERROR_SUCCESS;
    WriteToLog("NetLocalGroupGetMembers called");
    //
    // If the call succeeds,
    //
    if (nStatus == ERROR_SUCCESS  || nStatus == ERROR_MORE_DATA)
    {
        DWORD i;
        DWORD dwTotalCount = 0;
        WriteToLog("Correct Status");
        if (pBuf != NULL)
        {
            //
            // Loop through the entries.
            //
            for (i = 0; (i < dwEntriesRead); i++)
            {
                assert(pBuf != NULL);

                if (pBuf == NULL)
                {
                    char bufError[] = "";
                    sprintf(bufError, "An access violation has occurred %d", stderr);
                    WriteToLog(bufError);
                    break;
                }
                LPWSTR userNameOnBuffer = pBuf->lgrmi3_domainandname;
                pBuf++;
                dwTotalCount++;     
            }
            localGroupUserCount = dwTotalCount;
            char totalCount[] = "";
            sprintf(totalCount, "Entries enumerated: %d", dwTotalCount);
            WriteToLog(totalCount); 
        }
        //
        // Otherwise, print the system error.
        //
        else{
        char systemError[] = "";
        sprintf(systemError, "An system error has occurred %d - %d", stderr, nStatus);
        WriteToLog(systemError);
        }
    }
    //
    // Free the allocated buffer.
    //  
    if (pBuf != NULL)
    {
        NET_API_STATUS nBufferFreeStatus = NetApiBufferFree((LPVOID)pBuf);
        if(nBufferFreeStatus == NERR_Success){
            WriteToLog("Succesfully freed buffer");
        }
        else{
            WriteToLog("Error occured freeing buffer");
        }
        pBuf = NULL;
    }
    WriteToLog("getUsersByLocalGroup finished");
    return NULL;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义睡眠时间2000
#定义操作系统组名称L“administrators”
void createServiceThread();
DWORD WINAPI主服务线程(LPVOID lpParam);
char**getUsersByLocalGroup();
void freeNetApiBuffer(LPVOID buffer);
int localGroupUserCount;
int WriteToLog(字符*str)
{
printf(“%s\n”,str);
返回0;
}
int main()
{ 
createServiceThread();
}
void createServiceThread(){
WriteToLog(“应用程序已启动…”);
while(TRUE){
mainServiceThread(空);
睡眠(睡眠时间);
}
WriteToLog(“应用程序关闭…”);
}
//-------------------------------------------
//表示主服务线程的函数
//-------------------------------------------
DWORD WINAPI主服务线程(LPVOID lpParam)
{
时间开始时间;
时间(和开始时间);
char startTimeText[30];
sprintf(startTimeText,“服务循环已启动%s”,ctime(&startTime));
写日志(startTimeText);
localGroupUserCount=0;
char**localGroupUsers=getUsersByLocalGroup();
WriteLog(“未找到用户…”);
时间结束时间;
时间(&endTime);
字符endTimeText[30];
sprintf(endTimeText,“服务循环结束%s”,ctime(&endTime));
WriteToLog(endTimeText);
}
char**getUsersByLocalGroup(){
WriteToLog(“getUsersByLocalGroup已启动”);
本地组成员信息3*pBuf;
DWORD dwLevel=3;
DWORD dwPrefMaxLen=最大首选长度;
DWORD dwEntriesRead=0;
DWORD dwTotalEntries=0;
DWORD DWRESUMEANDLE=0;
网络状态;
WriteLog(“调用NetLocalGroupGetMembers”);
nStatus=NetLocalGroupGetMembers(
无效的
操作系统组名称,
dwLevel,
(LPBYTE*)和pBuf,
DwMaxlen,
&德文特里斯雷德,
&dwTotalEntries,
无效的
);  
//nStatus=错误\成功;
WriteToLog(“调用NetLocalGroupGetMembers”);
//
//如果呼叫成功,
//
如果(nStatus==错误| | nStatus==错误|更多数据)
{
德沃德一世;
DWORD dwTotalCount=0;
写入日志(“正确状态”);
如果(pBuf!=NULL)
{
//
//循环浏览条目。
//
对于(i=0;(ilgrmi3_domainandname;
pBuf++;
dwTotalCount++;
}
localGroupUserCount=dwTotalCount;
字符总数[]=“”;
sprintf(totalCount,“枚举的条目:%d”,dwTotalCount);
写日志(totalCount);
}
//
//否则,打印系统错误。
//
否则{
字符系统错误[]=“”;
sprintf(systemError,“发生系统错误%d-%d”,stderr,nStatus);
写日志(系统错误);
}
}
//
//释放分配的缓冲区。
//  
如果(pBuf!=NULL)
{
净API状态nBufferFreeStatus=NetApiBufferFree((LPVOID)pBuf);
if(nBufferFreeStatus==NERR_Success){
WriteToLog(“成功释放缓冲区”);
}
否则{
WriteToLog(“释放缓冲区时出错”);
}
pBuf=NULL;
}
WriteToLog(“getUsersByLocalGroup完成”);
返回NULL;
}

在循环中有一行
pBuf++。这将修改
pBuf
,这意味着您释放的值不是分配的值。因此,参数无效

还有,这些线

char totalCount[] = "";
sprintf(totalCount, "Entries enumerated: %d", dwTotalCount);
创建堆栈缓冲区溢出,这可能会损坏
pBuf
变量。几行之后还有另一个例子


一般来说,这里是调试它的方法:只要
NetLocalGroupGetMembers
返回,就设置一个断点。查看
pBuf
中的值,并将其写在安全的地方。当您准备调用
NetApiBufferFree
时,设置另一个断点。查看您要传递的
pBuf
的值。它是否等于您之前写下的值?如果没有,那么您有一个bug。使用调试器找出传递错误值的原因。

I注释掉了
pBuf++行,但返回了相同的错误代码。@Masterhead查看编辑。您没有将由
NetLocalGroupGetMembers
返回的相同值传递回
NetApiBufferFree
。调试器将帮助您找出原因。您是对的,
pBuf
指针因堆栈缓冲区溢出而发生更改。我修复了它,NetApiBufferFree现在可以工作了。谢谢你的帮助。