ReactOS  0.4.14-dev-49-gfb4591c
cmhvlist.c File Reference
#include "ntoskrnl.h"
#include "debug.h"
Include dependency graph for cmhvlist.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

BOOLEAN NTAPI CmpGetHiveName (IN PCMHIVE Hive, OUT PUNICODE_STRING HiveName)
 
NTSTATUS NTAPI CmpAddToHiveFileList (IN PCMHIVE Hive)
 
VOID NTAPI CmpRemoveFromHiveFileList (IN PCMHIVE Hive)
 

Variables

UNICODE_STRING HiveListValueName = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\hivelist")
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file cmhvlist.c.

Function Documentation

◆ CmpAddToHiveFileList()

NTSTATUS NTAPI CmpAddToHiveFileList ( IN PCMHIVE  Hive)

Definition at line 130 of file cmhvlist.c.

131 {
135  UNICODE_STRING HivePath;
137  ULONG Length;
138  OBJECT_NAME_INFORMATION DummyNameInfo;
139  POBJECT_NAME_INFORMATION FileNameInfo;
140 
141  HivePath.Buffer = NULL;
142  FileNameInfo = NULL;
143 
144  /* Create or open the hive list key */
148  NULL,
149  NULL);
150  Status = ZwCreateKey(&KeyHandle,
153  0,
154  NULL,
156  NULL);
157  if (!NT_SUCCESS(Status))
158  {
159  /* Fail */
160  DPRINT1("CmpAddToHiveFileList: Creation or opening of the hive list failed, status = 0x%08lx\n", Status);
161  return Status;
162  }
163 
164  /* Retrieve the name of the hive */
165  if (!CmpGetHiveName(Hive, &HivePath))
166  {
167  /* Fail */
168  DPRINT1("CmpAddToHiveFileList: Unable to retrieve the hive name\n");
170  goto Quickie;
171  }
172 
173  /* Get the name of the corresponding file */
174  if (!(Hive->Hive.HiveFlags & HIVE_VOLATILE))
175  {
176  /* Determine the right buffer size and allocate */
177  Status = ZwQueryObject(Hive->FileHandles[HFILE_TYPE_PRIMARY],
179  &DummyNameInfo,
180  sizeof(DummyNameInfo),
181  &Length);
183  {
184  DPRINT1("CmpAddToHiveFileList: Hive file name size query failed, status = 0x%08lx\n", Status);
185  goto Quickie;
186  }
187 
188  FileNameInfo = ExAllocatePoolWithTag(PagedPool,
189  Length + sizeof(UNICODE_NULL),
190  TAG_CM);
191  if (FileNameInfo == NULL)
192  {
194  goto Quickie;
195  }
196 
197  /* Try to get the value */
198  Status = ZwQueryObject(Hive->FileHandles[HFILE_TYPE_PRIMARY],
200  FileNameInfo,
201  Length,
202  &Length);
203  if (NT_SUCCESS(Status))
204  {
205  /* Null-terminate and add the length of the terminator */
206  Length -= sizeof(OBJECT_NAME_INFORMATION);
207  FilePath = FileNameInfo->Name.Buffer;
208  FilePath[Length / sizeof(WCHAR)] = UNICODE_NULL;
209  Length += sizeof(UNICODE_NULL);
210  }
211  else
212  {
213  /* Fail */
214  DPRINT1("CmpAddToHiveFileList: Hive file name query failed, status = 0x%08lx\n", Status);
215  goto Quickie;
216  }
217  }
218  else
219  {
220  /* No name */
221  FilePath = L"";
222  Length = sizeof(UNICODE_NULL);
223  }
224 
225  /* Set the entry in the hive list */
226  Status = ZwSetValueKey(KeyHandle,
227  &HivePath,
228  0,
229  REG_SZ,
230  FilePath,
231  Length);
232  if (!NT_SUCCESS(Status))
233  {
234  /* Fail */
235  DPRINT1("CmpAddToHiveFileList: Setting of entry in the hive list failed, status = 0x%08lx\n", Status);
236  }
237 
238 Quickie:
239  /* Cleanup and return status */
240  if (HivePath.Buffer)
241  {
242  ExFreePoolWithTag(HivePath.Buffer, TAG_CM);
243  }
244  if (FileNameInfo)
245  {
246  ExFreePoolWithTag(FileNameInfo, TAG_CM);
247  }
249  return Status;
250 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
BOOLEAN NTAPI CmpGetHiveName(IN PCMHIVE Hive, OUT PUNICODE_STRING HiveName)
Definition: cmhvlist.c:24
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4711
#define KEY_READ
Definition: nt_native.h:1023
#define HIVE_VOLATILE
Definition: hivedata.h:23
LONG NTSTATUS
Definition: precomp.h:26
UNICODE_STRING HiveListValueName
Definition: cmhvlist.c:17
uint16_t * PWCHAR
Definition: typedefs.h:54
UNICODE_STRING Name
Definition: nt_native.h:1270
PCWSTR FilePath
#define UNICODE_NULL
struct _OBJECT_NAME_INFORMATION OBJECT_NAME_INFORMATION
smooth NULL
Definition: ftsmooth.c:416
#define KEY_WRITE
Definition: nt_native.h:1031
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TAG_CM
Definition: cmlib.h:203
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:61
#define HFILE_TYPE_PRIMARY
Definition: hivedata.h:33
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define REG_SZ
Definition: layer.c:22

Referenced by CmInitSystem1(), CmLoadKey(), and CmpInitializeHiveList().

◆ CmpGetHiveName()

BOOLEAN NTAPI CmpGetHiveName ( IN PCMHIVE  Hive,
OUT PUNICODE_STRING  HiveName 
)

Definition at line 24 of file cmhvlist.c.

26 {
27  HCELL_INDEX RootCell, LinkCell;
28  PCELL_DATA RootData, LinkData, ParentData;
29  ULONG ParentNameSize, LinkNameSize;
30  SIZE_T NameSize;
31  PWCHAR p;
32  UNICODE_STRING RegistryName = RTL_CONSTANT_STRING(L"\\REGISTRY\\");
33 
34  /* Get the root cell of this hive */
35  RootCell = Hive->Hive.BaseBlock->RootCell;
36  RootData = HvGetCell(&Hive->Hive, RootCell);
37  if (!RootData) return FALSE;
38 
39  /* Get the cell index at which this hive is linked to, and its parent */
40  LinkCell = RootData->u.KeyNode.Parent;
41  HvReleaseCell(&Hive->Hive, RootCell);
42 
43  /* Sanity check */
44  ASSERT((&CmiVolatileHive->Hive)->ReleaseCellRoutine == NULL);
45 
46  /* Get the cell data for link and parent */
47  LinkData = HvGetCell(&CmiVolatileHive->Hive, LinkCell);
48  if (!LinkData) return FALSE;
49  ParentData = HvGetCell(&CmiVolatileHive->Hive, LinkData->u.KeyNode.Parent);
50  if (!ParentData) return FALSE;
51 
52  /* Get the size of the parent name */
53  if (ParentData->u.KeyNode.Flags & KEY_COMP_NAME)
54  {
55  ParentNameSize = CmpCompressedNameSize(ParentData->u.KeyNode.Name,
56  ParentData->u.KeyNode.NameLength);
57  }
58  else
59  {
60  ParentNameSize = ParentData->u.KeyNode.NameLength;
61  }
62 
63  /* Get the size of the link name */
64  if (LinkData->u.KeyNode.Flags & KEY_COMP_NAME)
65  {
66  LinkNameSize = CmpCompressedNameSize(LinkData->u.KeyNode.Name,
67  LinkData->u.KeyNode.NameLength);
68  }
69  else
70  {
71  LinkNameSize = LinkData->u.KeyNode.NameLength;
72  }
73 
74  /* No need to account for terminal NULL character since we deal with counted UNICODE strings */
75  NameSize = RegistryName.Length + ParentNameSize + sizeof(WCHAR) + LinkNameSize;
76 
77  /* Allocate the memory */
78  HiveName->Buffer = ExAllocatePoolWithTag(PagedPool, NameSize, TAG_CM);
79  if (!HiveName->Buffer)
80  {
81  /* Fail */
82  DPRINT1("CmpGetHiveName: Unable to allocate memory\n");
83  return FALSE;
84  }
85 
86  /* Build the string for it */
87  HiveName->Length = HiveName->MaximumLength = (USHORT)NameSize;
88  p = HiveName->Buffer;
89 
90  /* Copy the parent name */
91  RtlCopyMemory(p, RegistryName.Buffer, RegistryName.Length);
92  p += RegistryName.Length / sizeof(WCHAR);
93  if (ParentData->u.KeyNode.Flags & KEY_COMP_NAME)
94  {
96  ParentNameSize,
97  ParentData->u.KeyNode.Name,
98  ParentData->u.KeyNode.NameLength);
99  }
100  else
101  {
102  RtlCopyMemory(p, ParentData->u.KeyNode.Name, ParentNameSize);
103  }
104 
105  /* Add a path separator between parent and link */
106  p += ParentNameSize / sizeof(WCHAR);
108  ++p;
109 
110  /* Now copy the link name */
111  if (LinkData->u.KeyNode.Flags & KEY_COMP_NAME)
112  {
114  LinkNameSize,
115  LinkData->u.KeyNode.Name,
116  LinkData->u.KeyNode.NameLength);
117 
118  }
119  else
120  {
121  RtlCopyMemory(p, LinkData->u.KeyNode.Name, LinkNameSize);
122  }
123 
124  /* All done */
125  return TRUE;
126 }
#define KEY_COMP_NAME
Definition: cmdata.h:35
WCHAR Name[ANYSIZE_ARRAY]
Definition: cmdata.h:116
CM_KEY_NODE KeyNode
Definition: cmdata.h:200
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define HvReleaseCell(h, c)
Definition: cmlib.h:390
uint16_t * PWCHAR
Definition: typedefs.h:54
USHORT NameLength
Definition: cmdata.h:114
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
VOID NTAPI CmpCopyCompressedName(OUT PWCHAR Destination, IN ULONG DestinationLength, IN PWCHAR Source, IN ULONG SourceLength)
Definition: cmname.c:56
PVOID CMAPI HvGetCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
Definition: hivecell.c:67
smooth NULL
Definition: ftsmooth.c:416
HHIVE Hive
Definition: cm.h:393
PCMHIVE CmiVolatileHive
Definition: cmsysini.c:17
__wchar_t WCHAR
Definition: xmlstorage.h:180
HCELL_INDEX Parent
Definition: cmdata.h:96
ULONG HCELL_INDEX
Definition: hivedata.h:80
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define TAG_CM
Definition: cmlib.h:203
static const WCHAR L[]
Definition: oid.c:1250
ULONG_PTR SIZE_T
Definition: typedefs.h:78
unsigned short USHORT
Definition: pedump.c:61
union _CELL_DATA::@3902 u
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
GLfloat GLfloat p
Definition: glext.h:8902
USHORT NTAPI CmpCompressedNameSize(IN PWCHAR Name, IN ULONG Length)
Definition: cmname.c:95
USHORT Flags
Definition: cmdata.h:93
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14

Referenced by CmpAddToHiveFileList(), and CmpRemoveFromHiveFileList().

◆ CmpRemoveFromHiveFileList()

VOID NTAPI CmpRemoveFromHiveFileList ( IN PCMHIVE  Hive)

Definition at line 254 of file cmhvlist.c.

255 {
259  UNICODE_STRING HivePath;
260 
261  /* Open the hive list key */
265  NULL,
266  NULL);
267  Status = ZwOpenKey(&KeyHandle,
270  if (!NT_SUCCESS(Status))
271  {
272  /* Fail */
273  DPRINT1("CmpRemoveFromHiveFileList: Opening of the hive list failed, status = 0x%08lx\n", Status);
274  return;
275  }
276 
277  /* Get the hive path name */
278  CmpGetHiveName(Hive, &HivePath);
279 
280  /* Delete the hive path name from the list */
281  ZwDeleteValueKey(KeyHandle, &HivePath);
282 
283  /* Cleanup allocation and handle */
284  ExFreePoolWithTag(HivePath.Buffer, TAG_CM);
286 }
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
BOOLEAN NTAPI CmpGetHiveName(IN PCMHIVE Hive, OUT PUNICODE_STRING HiveName)
Definition: cmhvlist.c:24
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4711
#define KEY_READ
Definition: nt_native.h:1023
LONG NTSTATUS
Definition: precomp.h:26
UNICODE_STRING HiveListValueName
Definition: cmhvlist.c:17
smooth NULL
Definition: ftsmooth.c:416
#define KEY_WRITE
Definition: nt_native.h:1031
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define TAG_CM
Definition: cmlib.h:203
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
Status
Definition: gdiplustypes.h:24
#define DPRINT1
Definition: precomp.h:8
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231

Referenced by CmUnloadKey().

Variable Documentation

◆ HiveListValueName

UNICODE_STRING HiveListValueName = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control\\hivelist")

Definition at line 17 of file cmhvlist.c.

Referenced by CmpAddToHiveFileList(), and CmpRemoveFromHiveFileList().