Необработанное исключение в Visual Studio 2017: длинный без знака в ячейке памяти 0x0023F6A0 - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь определить, принадлежит ли учетная запись пользователя, в котором запущено приложение, к группе администраторов или нет в Visual Studio 2017 с использованием VC ++.Но когда я запускаю Программу в IDE, она останавливается в конце данной функции с диалоговым окном исключения, в котором говорится «Необработанное исключение в 0x7697B022 в Target.exe: исключение Microsoft C ++: произошла ошибка без знака в ячейке памяти 0x00CFF638.Но я нажимаю «Продолжить» в IDE, выполнение продолжается и завершается выполнение Программы.

BOOL TargetAppClass::IsUserInAdminGroup()
{
    BOOL fInAdminGroup = FALSE;
    DWORD dwError = ERROR_SUCCESS;
    HANDLE hToken = NULL;
    HANDLE hTokenToCheck = NULL;
    DWORD cbSize = 0;
    OSVERSIONINFO osver = { sizeof(osver) };

    // Open the primary access token of the process for query and duplicate.
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE,
        &hToken))
    {
        dwError = GetLastError();
    }


    OSVERSIONINFOEX ptrVerInfo;
    ZeroMemory(&ptrVerInfo, sizeof(OSVERSIONINFOEX));
    ptrVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    ptrVerInfo.dwMajorVersion = 10;
    ptrVerInfo.dwMinorVersion = 1;

    DWORDLONG dwlConditionMask = 0;
    int op = VER_GREATER_EQUAL;

    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
    VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
    VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMINOR, op);


    if (!VerifyVersionInfoA(&ptrVerInfo, VER_MAJORVERSION, dwlConditionMask))
    {
        dwError = GetLastError();
    }

    if (ptrVerInfo.dwMajorVersion >= 6)
    {
        TOKEN_ELEVATION_TYPE elevType;
        if (!GetTokenInformation(hToken, TokenElevationType, &elevType,
            sizeof(elevType), &cbSize))
        {
            dwError = GetLastError();
        }

        // If limited, get the linked elevated token for further check.
        if (TokenElevationTypeLimited == elevType)
        {
            if (!GetTokenInformation(hToken, TokenLinkedToken, &hTokenToCheck,
                sizeof(hTokenToCheck), &cbSize))
            {
                dwError = GetLastError();
            }
        }
    }

    if (!hTokenToCheck)
    {
        if (!DuplicateToken(hToken, SecurityIdentification, &hTokenToCheck))
        {
            dwError = GetLastError();
        }
    }

    // Create the SID corresponding to the Administrators group.
    BYTE adminSID[SECURITY_MAX_SID_SIZE];
    cbSize = sizeof(adminSID);
    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, &adminSID,
        &cbSize))
    {
        dwError = GetLastError();
    }

    // To determine whether a SID is enabled in a token, that is, whether it 
    // has the SE_GROUP_ENABLED attribute, call CheckTokenMembership.
    if (!CheckTokenMembership(hTokenToCheck, &adminSID, &fInAdminGroup))
    {
        dwError = GetLastError();
    }

    // Centralized cleanup for all allocated resources.
    if (hToken)
    {
        CloseHandle(hToken);
        hToken = NULL;
    }
    if (hTokenToCheck)
    {
        CloseHandle(hTokenToCheck);
        hTokenToCheck = NULL;
    }

    // Throw the error if something failed in the function.
    if (ERROR_SUCCESS != dwError)
    {
        throw dwError;
    }

    return fInAdminGroup;
}

Я хотел знать, какую ошибку я делаю, что нужно сделать, чтобы устранить это исключение.

1 Ответ

0 голосов
/ 10 июля 2019

Это ошибка блока try-catch.Когда я удалил логику проверки версии из кода, она начинает работать.вероятно, "OSVERSIONINFOEX ptrVerInfo" инициализация этой переменной несколько пропущена, и это вызывает ошибку.

...