gpt4 book ai didi

c++ - 任何人都有使用GetAppContainerNamedObjectPath的经验吗?

转载 作者:行者123 更新时间:2023-12-02 09:51:50 29 4
gpt4 key购买 nike

最近,我遇到了一个名为GetAppContainerNamedObjectPath的Windows API。但是我不知道如何使用它。
我为此API找到了一个msdn页面(https://docs.microsoft.com/en-us/windows/win32/api/securityappcontainer/nf-securityappcontainer-getappcontainernamedobjectpath)。但是它没有正确的示例和说明,参数写得不好。
我最后收到ERROR_INVALID_PARAMETER(87)错误,这告诉我我输入的参数有问题。这是我尝试过的。

#define TokenIsAppContainer 29
#define TokenAppContainerSid 31
#define TokenAppContainerNumber 32

typedef struct _TOKEN_APPCONTAINER_INFORMATION {
PSID TokenAppContainer;
} TOKEN_APPCONTAINER_INFORMATION, *PTOKEN_APPCONTAINER_INFORMATION;

void GetAppContainerProcessInfo(CString & procName)
{
DWORD dwSize = 0;
DWORD dwResult;
HANDLE hToken;
PTOKEN_APPCONTAINER_INFORMATION pAppCoInfo;
WCHAR wcsDebug[1024] = {0,};
WCHAR * pwSID = NULL;

typedef BOOL (WINAPI *_LPGETAPPCONTAINERNAMEOBJECTPATH)(HANDLE, PSID, ULONG, LPWSTR, PULONG);

static _LPGETAPPCONTAINERNAMEOBJECTPATH lpGetAppContainerNamedObjectPath = NULL;

if (0 == lpGetAppContainerNamedObjectPath)
{
HMODULE hKernel32 = LoadLibraryExW(L"kernel32.dll", NULL, 0);
if (hKernel32)
{
lpGetAppContainerNamedObjectPath = reinterpret_cast<_LPGETAPPCONTAINERNAMEOBJECTPATH>(GetProcAddress(hKernel32, "GetAppContainerNamedObjectPath"));
}
}

if (lpGetAppContainerNamedObjectPath)
{
DWORD processId = (DWORD)_ttoi((LPCTSTR)procName);
//HANDLE hProcess = GetProcessHandleByProcessName(procName);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);

if(!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"OpenProcessToken Error(%u) PID(%d)\n", dwResult, processId );
AfxMessageBox(wcsDebug);
return;
}

if (!GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) TokenAppContainerSid, NULL, dwSize, &dwSize))
{
dwResult = GetLastError();
if( dwResult != ERROR_INSUFFICIENT_BUFFER )
{
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetTokenInformation Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
return;
}
}

pAppCoInfo = (PTOKEN_APPCONTAINER_INFORMATION) GlobalAlloc( GPTR, dwSize );

if (!GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) TokenAppContainerSid, pAppCoInfo, dwSize, &dwSize))
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetTokenInformation Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
return;
}

WCHAR wcsNamedObjectPath[MAX_PATH];
ULONG ulRetlen = 0;

BOOL bRet = lpGetAppContainerNamedObjectPath(hToken, pAppCoInfo->TokenAppContainer, _countof(wcsNamedObjectPath), wcsNamedObjectPath, &ulRetlen );
if (bRet)
{
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetAppContainerNamedObjectPath Path(%s)\n", wcsNamedObjectPath );
AfxMessageBox(wcsDebug);
}
else
{
dwResult = GetLastError();
swprintf_s( wcsDebug, _countof(wcsDebug), L"GetAppContainerNamedObjectPath Error %u\n", dwResult );
AfxMessageBox(wcsDebug);
}

if (pwSID)
LocalFree(pwSID);

CloseHandle(hToken)
CloseHandle(hProcess);
}
}
附带说明一下,我尝试使用 wchar_t *并通过两次调用 GetAppContainerNamedObjectPath来动态分配内存缓冲区。但是仍然没有机会。返回长度不返回有意义的值。

最佳答案

如果您在RtlGetLastNtStatus();之后调用GetLastError();而不是GetAppContainerNamedObjectPath,您将获得STATUS_INVALID_PARAMETER_MIX-指定了无效的参数组合。
这给你更多的信息比较简单的无效参数。
然后寻找功能签名

BOOL
WINAPI
GetAppContainerNamedObjectPath(
_In_opt_ HANDLE Token,
_In_opt_ PSID AppContainerSid,
_In_ ULONG ObjectPathLength,
_Out_writes_opt_(ObjectPathLength) LPWSTR ObjectPath,
_Out_ PULONG ReturnLength
);
使用In_opt声明的Token和AppContainerSid-这意味着此参数是可选的,您可以将0传递给其中之一。然后问问自己,您要查询TokenAppContainerSid的 token 吗?如果将此 token 传递给api,系统是否无法为您执行此操作?明显可以。因此您无需自己执行此操作。实际上,您需要将Token传递给api,在这种情况下,AppContainerSid必须为0。或者您可以将AppContainerSid传递给api,并且在这种情况下,Token必须为0。当AppContainerSid和Token都不为零时,您获得了 STATUS_INVALID_PARAMETER_MIX另请注意-如果需要获取 token ,则无需使用 PROCESS_ALL_ACCESS进行开放处理。 PROCESS_QUERY_LIMITED_INFORMATION就足够了

真的api没有做大魔术。它回到你身边
AppContainerNamedObjects\<Sid>
路径,应用容器sid的字符串形式。(类似于S-1-15-2 -...)

关于c++ - 任何人都有使用GetAppContainerNamedObjectPath的经验吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63948391/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com