簡體   English   中英

Visual Studio 2017中未處理的異常:在內存位置0x0023F6A0處無符號長

[英]Unhandled Exception in Visual Studio 2017 : unsigned long at memory location 0x0023F6A0

我正在嘗試使用VC ++確定在Visual Studio 2017中運行的應用程序中的用戶帳戶是否屬於Admin組。 但是當我在IDE中運行程序時,它在給定函數結束時停止,異常對話框顯示“Target.exe中0x7697B022處的未處理異常: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;
}

我想知道我在做什么錯,應該做些什么來消除這個異常。

這是一個try-catch塊錯誤。 當我從代碼中刪除版本檢查邏輯時,它開始工作。 可能“OSVERSIONINFOEX ptrVerInfo”這個變量初始化已經跳過了一些如何導致錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM