app-helpers.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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,
  14. &ret, sizeof(ret),
  15. &size_ret);
  16. if (!success) {
  17. const DWORD error = GetLastError();
  18. blog(LOG_ERROR,
  19. "is_app GetTokenInformation failed: 0x%08lX",
  20. error);
  21. }
  22. CloseHandle(token);
  23. }
  24. return !!ret;
  25. }
  26. wchar_t *get_app_sid(HANDLE process)
  27. {
  28. wchar_t *ret = NULL;
  29. DWORD size_ret;
  30. BOOL success;
  31. HANDLE token;
  32. if (OpenProcessToken(process, TOKEN_QUERY, &token)) {
  33. DWORD info_len = GetSidLengthRequired(12) +
  34. sizeof(TOKEN_APPCONTAINER_INFORMATION);
  35. PTOKEN_APPCONTAINER_INFORMATION info = malloc(info_len);
  36. success = GetTokenInformation(token, TokenAppContainerSid, info,
  37. info_len, &size_ret);
  38. if (success)
  39. ConvertSidToStringSidW(info->TokenAppContainer, &ret);
  40. free(info);
  41. CloseHandle(token);
  42. }
  43. return ret;
  44. }
  45. static const wchar_t *path_format =
  46. L"\\Sessions\\%lu\\AppContainerNamedObjects\\%s\\%s";
  47. HANDLE create_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_create_mutex(path);
  53. }
  54. HANDLE open_app_mutex(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_mutex(path);
  60. }
  61. HANDLE open_app_event(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_event(path);
  67. }
  68. HANDLE open_app_map(const wchar_t *sid, const wchar_t *name)
  69. {
  70. wchar_t path[MAX_PATH];
  71. DWORD session_id = WTSGetActiveConsoleSessionId();
  72. _snwprintf(path, MAX_PATH, path_format, session_id, sid, name);
  73. return nt_open_map(path);
  74. }