RegistryKeyAccessor.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. Формат регистрационного ключа для быстрого поиска:
  3. 0 e s f rrrr.rrrr oooo.oooo gggg.gggg.gggg
  4. 0 - контроль валидности ключа
  5. e 1 - используется в списке исполнения
  6. s 1 - зарегестрированный сервис, иначе объект
  7. f 1 - используется в списке регистрации
  8. r 8 bit - младший байт индекса деклоратора
  9. o 8 bit - младший байт индекса объекта данного типа
  10. g 12 bit - маладшая часть индекса в глобальном списке
  11. */
  12. #ifndef _RegistryKeyAccessor_h_
  13. #define _RegistryKeyAccessor_h_
  14. #include "..\..\common_h\core.h"
  15. class RegistryKeyAccessor
  16. {
  17. protected:
  18. virtual dword & RegistryKey(RegObject * obj) = null;
  19. public:
  20. __forceinline bool IsValidate(RegObject * obj)
  21. {
  22. return !(RegistryKey(obj) & 0x80000000);
  23. };
  24. __forceinline void SetRegistryFlag(RegObject * obj)
  25. {
  26. RegistryKey(obj) |= 0x10000000;
  27. };
  28. __forceinline bool GetRegistryFlag(RegObject * obj)
  29. {
  30. return (RegistryKey(obj) & 0x10000000) != 0;
  31. };
  32. __forceinline void SetServiceFlag(RegObject * obj)
  33. {
  34. RegistryKey(obj) |= 0x20000000;
  35. };
  36. __forceinline bool GetServiceFlag(RegObject * obj)
  37. {
  38. return (RegistryKey(obj) & 0x20000000) != 0;
  39. };
  40. __forceinline void SetExecuteFlag(RegObject * obj)
  41. {
  42. RegistryKey(obj) |= 0x40000000;
  43. };
  44. __forceinline bool GetExecuteFlag(RegObject * obj)
  45. {
  46. return (RegistryKey(obj) & 0x40000000) != 0;
  47. };
  48. __forceinline void SetGlobalIndex(RegObject * obj, dword index)
  49. {
  50. dword & key = RegistryKey(obj);
  51. key = (key & 0xfffff000) | (index & 0xfff);
  52. };
  53. __forceinline dword GetGlobalIndex(RegObject * obj)
  54. {
  55. dword & key = RegistryKey(obj);
  56. return key & 0xfff;
  57. };
  58. static __forceinline dword GetGlobalIndexStep()
  59. {
  60. return 0x1000;
  61. };
  62. __forceinline void SetObjectIndex(RegObject * obj, dword index)
  63. {
  64. dword & key = RegistryKey(obj);
  65. key = (key & 0xfff00fff) | ((index & 0xff) << 12);
  66. };
  67. __forceinline dword GetObjectIndex(RegObject * obj)
  68. {
  69. dword & key = RegistryKey(obj);
  70. return (key >> 12) & 0xff;
  71. };
  72. static __forceinline dword GetObjectIndexStep()
  73. {
  74. return 0x100;
  75. };
  76. __forceinline void SetRegIndex(RegObject * obj, dword index)
  77. {
  78. dword & key = RegistryKey(obj);
  79. key = (key & 0xf00fffff) | ((index & 0xff) << 20);
  80. };
  81. __forceinline dword GetRegIndex(RegObject * obj)
  82. {
  83. dword & key = RegistryKey(obj);
  84. return (key >> 20) & 0xff;
  85. };
  86. static __forceinline dword GetRegIndexStep()
  87. {
  88. return 0x100;
  89. };
  90. __forceinline void Reset(RegObject * obj)
  91. {
  92. RegistryKey(obj) = 0;
  93. }
  94. __forceinline void InvalidateKey(RegObject * obj)
  95. {
  96. RegistryKey(obj) = -1;
  97. }
  98. __forceinline dword GetRegistryKey(RegObject * obj)
  99. {
  100. return RegistryKey(obj);
  101. }
  102. };
  103. #endif