app-helpers.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include "app-helpers.h"
  4. #include "nt-stuff.h"
  5. #include "util/base.h"
  6. WINADVAPI BOOL WINAPI ConvertSidToStringSidW(PSID sid, LPWSTR *str);
  7. bool is_app(HANDLE process)
  8. {
  9. DWORD size_ret;
  10. DWORD ret = 0;
  11. HANDLE token;
  12. if (OpenProcessToken(process, TOKEN_QUERY, &token)) {
  13. BOOL success = GetTokenInformation(token, TokenIsAppContainer, &ret, sizeof(ret), &size_ret);
  14. if (!success) {
  15. const DWORD error = GetLastError();
  16. blog(LOG_ERROR, "is_app GetTokenInformation failed: 0x%08lX", error);
  17. }
  18. CloseHandle(token);
  19. }
  20. return !!ret;
  21. }
  22. wchar_t *get_app_sid(HANDLE process)
  23. {
  24. wchar_t *ret = NULL;
  25. DWORD size_ret;
  26. BOOL success;
  27. HANDLE token;
  28. if (OpenProcessToken(process, TOKEN_QUERY, &token)) {
  29. DWORD info_len = GetSidLengthRequired(12) + sizeof(TOKEN_APPCONTAINER_INFORMATION);
  30. PTOKEN_APPCONTAINER_INFORMATION info = malloc(info_len);
  31. success = GetTokenInformation(token, TokenAppContainerSid, info, info_len, &size_ret);
  32. if (success)
  33. ConvertSidToStringSidW(info->TokenAppContainer, &ret);
  34. free(info);
  35. CloseHandle(token);
  36. }
  37. return ret;
  38. }
  39. static const wchar_t *path_format = L"\\Sessions\\%lu\\AppContainerNamedObjects\\%s\\%s";
  40. HANDLE create_app_mutex(const wchar_t *sid, const wchar_t *name)
  41. {
  42. wchar_t path[MAX_PATH];
  43. DWORD session_id = WTSGetActiveConsoleSessionId();
  44. _snwprintf(path, MAX_PATH, path_format, session_id, sid, name);
  45. return nt_create_mutex(path);
  46. }
  47. HANDLE open_app_mutex(const wchar_t *sid, const wchar_t *name)
  48. {
  49. wchar_t path[MAX_PATH];
  50. DWORD session_id = WTSGetActiveConsoleSessionId();
  51. _snwprintf(path, MAX_PATH, path_format, session_id, sid, name);
  52. return nt_open_mutex(path);
  53. }
  54. HANDLE open_app_event(const wchar_t *sid, const wchar_t *name)
  55. {
  56. wchar_t path[MAX_PATH];
  57. DWORD session_id = WTSGetActiveConsoleSessionId();
  58. _snwprintf(path, MAX_PATH, path_format, session_id, sid, name);
  59. return nt_open_event(path);
  60. }
  61. HANDLE open_app_map(const wchar_t *sid, const wchar_t *name)
  62. {
  63. wchar_t path[MAX_PATH];
  64. DWORD session_id = WTSGetActiveConsoleSessionId();
  65. _snwprintf(path, MAX_PATH, path_format, session_id, sid, name);
  66. return nt_open_map(path);
  67. }