Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.2 KiB

  1. // auto_sid.h
  2. //
  3. #pragma once
  4. class auto_sid
  5. {
  6. public:
  7. explicit auto_sid(SID* p = 0)
  8. : m_psid(p) {};
  9. auto_sid(auto_sid& rhs)
  10. : m_psid(rhs.release()) {};
  11. ~auto_sid()
  12. { if (m_psid) FreeSid(m_psid); };
  13. auto_sid& operator= (auto_sid& rhs)
  14. { if (this != rhs.getThis())
  15. reset (rhs.release() );
  16. return *this;
  17. };
  18. SID operator*() const
  19. { return *m_psid; };
  20. void** operator& ()
  21. { reset(); return (void**)&m_psid; };
  22. operator SID* ()
  23. { return m_psid; };
  24. // Checks for NULL
  25. BOOL operator== (LPVOID lpv)
  26. { return m_psid == lpv; };
  27. BOOL operator!= (LPVOID lpv)
  28. { return m_psid != lpv; };
  29. // return value of current dumb pointer
  30. SID* get() const
  31. { return m_psid; };
  32. // relinquish ownership
  33. SID* release()
  34. { SID* oldpsid = m_psid;
  35. m_psid = 0;
  36. return oldpsid;
  37. };
  38. // delete owned pointer; assume ownership of p
  39. void reset (SID* p = 0)
  40. {
  41. if (m_psid)
  42. FreeSid(m_psid);
  43. m_psid = p;
  44. };
  45. private:
  46. // operator& throws off operator=
  47. const auto_sid* getThis() const
  48. { return this; };
  49. SID* m_psid;
  50. };