[英]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.