VirtualBox

source: vbox/trunk/include/VBox/cfgm.h@ 4014

Last change on this file since 4014 was 3840, checked in by vboxsync, 17 years ago

Created CFGMR3CreateTree and CFGMR3InsertSubTree.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.0 KB
Line 
1/** @file
2 * CFGM - Configuration Manager
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef ___VBox_cfgm_h
22#define ___VBox_cfgm_h
23
24#include <VBox/cdefs.h>
25#include <VBox/types.h>
26#include <iprt/stdarg.h>
27
28/** @defgroup grp_cfgm The Configuration Manager API
29 * @{
30 */
31
32/** Configuration manager tree node - A key. */
33typedef struct CFGMNODE *PCFGMNODE;
34
35/** Configuration manager tree leaf - A value. */
36typedef struct CFGMLEAF *PCFGMLEAF;
37
38/**
39 * Configuration manager value type.
40 */
41typedef enum CFGMVALUETYPE
42{
43 /** Integer value. */
44 CFGMVALUETYPE_INTEGER = 1,
45 /** String value. */
46 CFGMVALUETYPE_STRING,
47 /** Bytestring value. */
48 CFGMVALUETYPE_BYTES
49} CFGMVALUETYPE;
50/** Pointer to configuration manager property type. */
51typedef CFGMVALUETYPE *PCFGMVALUETYPE;
52
53
54
55__BEGIN_DECLS
56
57#ifdef IN_RING3
58/** @defgroup grp_cfgm_r3 The CFGM Host Context Ring-3 API
59 * @ingroup grp_cfgm
60 * @{
61 */
62
63typedef enum CFGMCONFIGTYPE
64{
65 /** pvConfig points to nothing, use defaults. */
66 CFGMCONFIGTYPE_NONE = 0,
67 /** pvConfig points to a IMachine interface. */
68 CFGMCONFIGTYPE_IMACHINE
69} CFGMCONFIGTYPE;
70
71
72/**
73 * CFGM init callback for constructing the configuration tree.
74 *
75 * This is called from the emulation thread, and the one interfacing the VM
76 * can make any necessary per-thread initializations at this point.
77 *
78 * @returns VBox status code.
79 * @param pVM VM handle.
80 * @param pvUser The argument supplied to VMR3Create().
81 */
82typedef DECLCALLBACK(int) FNCFGMCONSTRUCTOR(PVM pVM, void *pvUser);
83/** Pointer to a FNCFGMCONSTRUCTOR(). */
84typedef FNCFGMCONSTRUCTOR *PFNCFGMCONSTRUCTOR;
85
86
87/**
88 * Constructs the configuration for the VM.
89 *
90 * @returns VBox status code.
91 * @param pVM Pointer to VM which configuration has not yet been loaded.
92 * @param pfnCFGMConstructor Pointer to callback function for constructing the VM configuration tree.
93 * This is called in the EM.
94 * @param pvUser The user argument passed to pfnCFGMConstructor.
95 */
96CFGMR3DECL(int) CFGMR3Init(PVM pVM, PFNCFGMCONSTRUCTOR pfnCFGMConstructor, void *pvUser);
97
98/**
99 * Terminates the configuration manager.
100 *
101 * @returns VBox status code.
102 * @param pVM VM handle.
103 */
104CFGMR3DECL(int) CFGMR3Term(PVM pVM);
105
106
107/** Tree Navigation and Enumeration.
108 * @{
109 */
110
111/**
112 * Gets the root node for the VM.
113 *
114 * @returns Pointer to root node.
115 * @param pVM VM handle.
116 */
117CFGMR3DECL(PCFGMNODE) CFGMR3GetRoot(PVM pVM);
118
119/**
120 * Gets the parent of a CFGM node.
121 *
122 * @returns Pointer to the parent node.
123 * @returns NULL if pNode is Root or pNode is the start of a
124 * restricted subtree (use CFGMr3GetParentEx() for that).
125 *
126 * @param pNode The node which parent we query.
127 */
128CFGMR3DECL(PCFGMNODE) CFGMR3GetParent(PCFGMNODE pNode);
129
130/**
131 * Gets the parent of a CFGM node.
132 *
133 * @returns Pointer to the parent node.
134 * @returns NULL if pNode is Root or pVM is not correct.
135 *
136 * @param pVM The VM handle, used as token that the caller is trusted.
137 * @param pNode The node which parent we query.
138 */
139CFGMR3DECL(PCFGMNODE) CFGMR3GetParentEx(PVM pVM, PCFGMNODE pNode);
140
141/**
142 * Query a child node.
143 *
144 * @returns Pointer to the specified node.
145 * @returns NULL if node was not found or pNode is NULL.
146 * @param pNode Node pszPath is relative to.
147 * @param pszPath Path to the child node or pNode.
148 * It's good style to end this with '/'.
149 */
150CFGMR3DECL(PCFGMNODE) CFGMR3GetChild(PCFGMNODE pNode, const char *pszPath);
151
152/**
153 * Query a child node by a format string.
154 *
155 * @returns Pointer to the specified node.
156 * @returns NULL if node was not found or pNode is NULL.
157 * @param pNode Node pszPath is relative to.
158 * @param pszPathFormat Path to the child node or pNode.
159 * It's good style to end this with '/'.
160 * @param ... Arguments to pszPathFormat.
161 */
162CFGMR3DECL(PCFGMNODE) CFGMR3GetChildF(PCFGMNODE pNode, const char *pszPathFormat, ...);
163
164/**
165 * Query a child node by a format string.
166 *
167 * @returns Pointer to the specified node.
168 * @returns NULL if node was not found or pNode is NULL.
169 * @param pNode Node pszPath is relative to.
170 * @param pszPathFormat Path to the child node or pNode.
171 * It's good style to end this with '/'.
172 * @param Args Arguments to pszPathFormat.
173 */
174CFGMR3DECL(PCFGMNODE) CFGMR3GetChildFV(PCFGMNODE pNode, const char *pszPathFormat, va_list Args);
175
176/**
177 * Gets the first child node.
178 * Use this to start an enumeration of child nodes.
179 *
180 * @returns Pointer to the first child.
181 * @returns NULL if no children.
182 * @param pNode Node to enumerate children for.
183 */
184CFGMR3DECL(PCFGMNODE) CFGMR3GetFirstChild(PCFGMNODE pNode);
185
186/**
187 * Gets the next sibling node.
188 * Use this to continue an enumeration.
189 *
190 * @returns Pointer to the first child.
191 * @returns NULL if no children.
192 * @param pCur Node to returned by a call to CFGMR3GetFirstChild()
193 * or successive calls to this function.
194 */
195CFGMR3DECL(PCFGMNODE) CFGMR3GetNextChild(PCFGMNODE pCur);
196
197/**
198 * Gets the name of the current node.
199 * (Needed for enumeration.)
200 *
201 * @returns VBox status code.
202 * @param pCur Node to returned by a call to CFGMR3GetFirstChild()
203 * or successive calls to CFGMR3GetNextChild().
204 * @param pszName Where to store the node name.
205 * @param cchName Size of the buffer pointed to by pszName (with terminator).
206 */
207CFGMR3DECL(int) CFGMR3GetName(PCFGMNODE pCur, char *pszName, size_t cchName);
208
209/**
210 * Gets the length of the current node's name.
211 * (Needed for enumeration.)
212 *
213 * @returns Node name length in bytes including the terminating null char.
214 * @returns 0 if pCur is NULL.
215 * @param pCur Node returned by a call to CFGMR3GetFirstChild()
216 * or successive calls to CFGMR3GetNextChild().
217 */
218CFGMR3DECL(int) CFGMR3GetNameLen(PCFGMNODE pCur);
219
220/**
221 * Validates that the child nodes are within a set of valid names.
222 *
223 * @returns true if all names are found in pszzAllowed.
224 * @returns false if not.
225 * @param pNode The node which values should be examined.
226 * @param pszzValid List of valid names separated by '\\0' and ending with
227 * a double '\\0'.
228 */
229CFGMR3DECL(bool) CFGMR3AreChildrenValid(PCFGMNODE pNode, const char *pszzValid);
230
231
232/**
233 * Gets the first value of a node.
234 * Use this to start an enumeration of values.
235 *
236 * @returns Pointer to the first value.
237 * @param pCur The node (Key) which values to enumerate.
238 */
239CFGMR3DECL(PCFGMLEAF) CFGMR3GetFirstValue(PCFGMNODE pCur);
240
241/**
242 * Gets the next value in enumeration.
243 *
244 * @returns Pointer to the next value.
245 * @param pCur The current value as returned by this function or CFGMR3GetFirstValue().
246 */
247CFGMR3DECL(PCFGMLEAF) CFGMR3GetNextValue(PCFGMLEAF pCur);
248
249/**
250 * Get the value name.
251 * (Needed for enumeration.)
252 *
253 * @returns VBox status code.
254 * @param pCur Value returned by a call to CFGMR3GetFirstValue()
255 * or successive calls to CFGMR3GetNextValue().
256 * @param pszName Where to store the value name.
257 * @param cchName Size of the buffer pointed to by pszName (with terminator).
258 */
259CFGMR3DECL(int) CFGMR3GetValueName(PCFGMLEAF pCur, char *pszName, size_t cchName);
260
261/**
262 * Gets the length of the current node's name.
263 * (Needed for enumeration.)
264 *
265 * @returns Value name length in bytes including the terminating null char.
266 * @returns 0 if pCur is NULL.
267 * @param pCur Value returned by a call to CFGMR3GetFirstValue()
268 * or successive calls to CFGMR3GetNextValue().
269 */
270CFGMR3DECL(int) CFGMR3GetValueNameLen(PCFGMLEAF pCur);
271
272/**
273 * Gets the value type.
274 * (For enumeration.)
275 *
276 * @returns VBox status code.
277 * @param pCur Value returned by a call to CFGMR3GetFirstValue()
278 * or successive calls to CFGMR3GetNextValue().
279 */
280CFGMR3DECL(CFGMVALUETYPE) CFGMR3GetValueType(PCFGMLEAF pCur);
281
282/**
283 * Validates that the values are within a set of valid names.
284 *
285 * @returns true if all names are found in pszzAllowed.
286 * @returns false if not.
287 * @param pNode The node which values should be examined.
288 * @param pszzValid List of valid names separated by '\\0' and ending with
289 * a double '\\0'.
290 */
291CFGMR3DECL(bool) CFGMR3AreValuesValid(PCFGMNODE pNode, const char *pszzValid);
292
293/** @} */
294
295/**
296 * Query value type.
297 *
298 * @returns VBox status code.
299 * @param pNode Which node to search for pszName in.
300 * @param pszName Name of an integer value.
301 * @param penmType Where to store the type.
302 */
303CFGMR3DECL(int) CFGMR3QueryType(PCFGMNODE pNode, const char *pszName, PCFGMVALUETYPE penmType);
304
305/**
306 * Query value size.
307 * This works on all types of values.
308 *
309 * @returns VBox status code.
310 * @param pNode Which node to search for pszName in.
311 * @param pszName Name of an integer value.
312 * @param pcb Where to store the value size.
313 */
314CFGMR3DECL(int) CFGMR3QuerySize(PCFGMNODE pNode, const char *pszName, size_t *pcb);
315
316/**
317 * Query integer value.
318 *
319 * @returns VBox status code.
320 * @param pNode Which node to search for pszName in.
321 * @param pszName Name of an integer value.
322 * @param pu64 Where to store the integer value.
323 */
324CFGMR3DECL(int) CFGMR3QueryInteger(PCFGMNODE pNode, const char *pszName, uint64_t *pu64);
325
326/**
327 * Query zero terminated character value.
328 *
329 * @returns VBox status code.
330 * @param pNode Which node to search for pszName in.
331 * @param pszName Name of a zero terminate character value.
332 * @param pszString Where to store the string.
333 * @param cchString Size of the string buffer. (Includes terminator.)
334 */
335CFGMR3DECL(int) CFGMR3QueryString(PCFGMNODE pNode, const char *pszName, char *pszString, size_t cchString);
336
337/**
338 * Query byte string value.
339 *
340 * @returns VBox status code.
341 * @param pNode Which node to search for pszName in.
342 * @param pszName Name of a byte string value.
343 * @param pvData Where to store the binary data.
344 * @param cbData Size of buffer pvData points too.
345 */
346CFGMR3DECL(int) CFGMR3QueryBytes(PCFGMNODE pNode, const char *pszName, void *pvData, size_t cbData);
347
348
349/**
350 * Creates a CFGM tree.
351 *
352 * This is intended for creating device/driver configs can be
353 * passed around and later attached to the main tree in the
354 * correct location.
355 *
356 * @returns Pointer to the root node.
357 * @param pVM The VM handle.
358 */
359CFGMR3DECL(PCFGMNODE) CFGMR3CreateTree(PVM pVM);
360
361/**
362 * Insert subtree.
363 *
364 * This function inserts (no duplication) a tree created by CFGMR3CreateTree()
365 * into the main tree.
366 *
367 * The root node of the inserted subtree will need to be reallocated, which
368 * effectually means that the passed in pSubTree handle becomes invalid
369 * upon successful return. Use the value returned in ppChild instead
370 * of pSubTree.
371 *
372 * @returns VBox status code.
373 * @returns VERR_CFGM_NODE_EXISTS if the final child node name component exists.
374 * @param pNode Parent node.
375 * @param pszName Name or path of the new child node.
376 * @param pSubTree The subtree to insert. Must be returned by CFGMR3CreateTree().
377 * @param ppChild Where to store the address of the new child node. (optional)
378 */
379CFGMR3DECL(int) CFGMR3InsertSubTree(PCFGMNODE pNode, const char *pszName, PCFGMNODE pSubTree, PCFGMNODE *ppChild);
380
381/**
382 * Insert a node.
383 *
384 * @returns VBox status code.
385 * @returns VERR_CFGM_NODE_EXISTS if the final child node name component exists.
386 * @param pNode Parent node.
387 * @param pszName Name or path of the new child node.
388 * @param ppChild Where to store the address of the new child node. (optional)
389 */
390CFGMR3DECL(int) CFGMR3InsertNode(PCFGMNODE pNode, const char *pszName, PCFGMNODE *ppChild);
391
392/**
393 * Insert a node, format string name.
394 *
395 * @returns VBox status code.
396 * @param pNode Parent node.
397 * @param ppChild Where to store the address of the new child node. (optional)
398 * @param pszNameFormat Name or path of the new child node.
399 * @param ... Name format arguments.
400 */
401CFGMR3DECL(int) CFGMR3InsertNodeF(PCFGMNODE pNode, PCFGMNODE *ppChild, const char *pszNameFormat, ...);
402
403/**
404 * Insert a node, format string name.
405 *
406 * @returns VBox status code.
407 * @param pNode Parent node.
408 * @param ppChild Where to store the address of the new child node. (optional)
409 * @param pszNameFormat Name or path of the new child node.
410 * @param Args Name format arguments.
411 */
412CFGMR3DECL(int) CFGMR3InsertNodeFV(PCFGMNODE pNode, PCFGMNODE *ppChild, const char *pszNameFormat, va_list Args);
413
414/**
415 * Marks the node as the root of a restricted subtree, i.e. the end of
416 * a CFGMR3GetParent() journey.
417 *
418 * @param pNode The node to mark.
419 */
420CFGMR3DECL(void) CFGMR3SetRestrictedRoot(PCFGMNODE pNode);
421
422/**
423 * Remove a node.
424 *
425 * @param pNode Parent node.
426 */
427CFGMR3DECL(void) CFGMR3RemoveNode(PCFGMNODE pNode);
428
429
430/**
431 * Inserts a new integer value.
432 *
433 * @returns VBox status code.
434 * @param pNode Parent node.
435 * @param pszName Value name.
436 * @param u64Integer The value.
437 */
438CFGMR3DECL(int) CFGMR3InsertInteger(PCFGMNODE pNode, const char *pszName, uint64_t u64Integer);
439
440/**
441 * Inserts a new string value.
442 *
443 * @returns VBox status code.
444 * @param pNode Parent node.
445 * @param pszName Value name.
446 * @param pszString The value.
447 */
448CFGMR3DECL(int) CFGMR3InsertString(PCFGMNODE pNode, const char *pszName, const char *pszString);
449
450/**
451 * Inserts a new integer value.
452 *
453 * @returns VBox status code.
454 * @param pNode Parent node.
455 * @param pszName Value name.
456 * @param pvBytes The value.
457 * @param cbBytes The value size.
458 */
459CFGMR3DECL(int) CFGMR3InsertBytes(PCFGMNODE pNode, const char *pszName, void *pvBytes, size_t cbBytes);
460
461/**
462 * Remove a value.
463 *
464 * @returns VBox status code.
465 * @param pNode Parent node.
466 * @param pszName Name of the new child node.
467 */
468CFGMR3DECL(int) CFGMR3RemoveValue(PCFGMNODE pNode, const char *pszName);
469
470
471
472/** Helpers
473 * @{
474 */
475/**
476 * Query unsigned 64-bit integer value.
477 *
478 * @returns VBox status code.
479 * @param pNode Which node to search for pszName in.
480 * @param pszName Name of an integer value.
481 * @param pu64 Where to store the integer value.
482 */
483CFGMR3DECL(int) CFGMR3QueryU64(PCFGMNODE pNode, const char *pszName, uint64_t *pu64);
484
485/**
486 * Query signed 64-bit integer value.
487 *
488 * @returns VBox status code.
489 * @param pNode Which node to search for pszName in.
490 * @param pszName Name of an integer value.
491 * @param pi64 Where to store the value.
492 */
493CFGMR3DECL(int) CFGMR3QueryS64(PCFGMNODE pNode, const char *pszName, int64_t *pi64);
494
495/**
496 * Query unsigned 32-bit integer value.
497 *
498 * @returns VBox status code.
499 * @param pNode Which node to search for pszName in.
500 * @param pszName Name of an integer value.
501 * @param pu32 Where to store the value.
502 */
503CFGMR3DECL(int) CFGMR3QueryU32(PCFGMNODE pNode, const char *pszName, uint32_t *pu32);
504
505/**
506 * Query signed 32-bit integer value.
507 *
508 * @returns VBox status code.
509 * @param pNode Which node to search for pszName in.
510 * @param pszName Name of an integer value.
511 * @param pi32 Where to store the value.
512 */
513CFGMR3DECL(int) CFGMR3QueryS32(PCFGMNODE pNode, const char *pszName, int32_t *pi32);
514
515/**
516 * Query unsigned 16-bit integer value.
517 *
518 * @returns VBox status code.
519 * @param pNode Which node to search for pszName in.
520 * @param pszName Name of an integer value.
521 * @param pu16 Where to store the value.
522 */
523CFGMR3DECL(int) CFGMR3QueryU16(PCFGMNODE pNode, const char *pszName, uint16_t *pu16);
524
525/**
526 * Query signed 16-bit integer value.
527 *
528 * @returns VBox status code.
529 * @param pNode Which node to search for pszName in.
530 * @param pszName Name of an integer value.
531 * @param pi16 Where to store the value.
532 */
533CFGMR3DECL(int) CFGMR3QueryS16(PCFGMNODE pNode, const char *pszName, int16_t *pi16);
534
535/**
536 * Query unsigned 8-bit integer value.
537 *
538 * @returns VBox status code.
539 * @param pNode Which node to search for pszName in.
540 * @param pszName Name of an integer value.
541 * @param pu8 Where to store the value.
542 */
543CFGMR3DECL(int) CFGMR3QueryU8(PCFGMNODE pNode, const char *pszName, uint8_t *pu8);
544
545/**
546 * Query signed 8-bit integer value.
547 *
548 * @returns VBox status code.
549 * @param pNode Which node to search for pszName in.
550 * @param pszName Name of an integer value.
551 * @param pi8 Where to store the value.
552 */
553CFGMR3DECL(int) CFGMR3QueryS8(PCFGMNODE pNode, const char *pszName, int8_t *pi8);
554
555/**
556 * Query boolean integer value.
557 *
558 * @returns VBox status code.
559 * @param pNode Which node to search for pszName in.
560 * @param pszName Name of an integer value.
561 * @param pf Where to store the value.
562 * @remark This function will interpret any non-zero value as true.
563 */
564CFGMR3DECL(int) CFGMR3QueryBool(PCFGMNODE pNode, const char *pszName, bool *pf);
565
566/**
567 * Query pointer integer value.
568 *
569 * @returns VBox status code.
570 * @param pNode Which node to search for pszName in.
571 * @param pszName Name of an integer value.
572 * @param ppv Where to store the value.
573 */
574CFGMR3DECL(int) CFGMR3QueryPtr(PCFGMNODE pNode, const char *pszName, void **ppv);
575
576/**
577 * Query Guest Context pointer integer value.
578 *
579 * @returns VBox status code.
580 * @param pNode Which node to search for pszName in.
581 * @param pszName Name of an integer value.
582 * @param pGCPtr Where to store the value.
583 */
584CFGMR3DECL(int) CFGMR3QueryGCPtr(PCFGMNODE pNode, const char *pszName, PRTGCPTR pGCPtr);
585
586/**
587 * Query Guest Context unsigned pointer value.
588 *
589 * @returns VBox status code.
590 * @param pNode Which node to search for pszName in.
591 * @param pszName Name of an integer value.
592 * @param pGCPtr Where to store the value.
593 */
594CFGMR3DECL(int) CFGMR3QueryGCPtrU(PCFGMNODE pNode, const char *pszName, PRTGCUINTPTR pGCPtr);
595
596/**
597 * Query Guest Context signed pointer value.
598 *
599 * @returns VBox status code.
600 * @param pNode Which node to search for pszName in.
601 * @param pszName Name of an integer value.
602 * @param pGCPtr Where to store the value.
603 */
604CFGMR3DECL(int) CFGMR3QueryGCPtrS(PCFGMNODE pNode, const char *pszName, PRTGCINTPTR pGCPtr);
605
606/**
607 * Query boolean integer value.
608 *
609 * @returns VBox status code.
610 * @param pNode Which node to search for pszName in.
611 * @param pszName Name of an integer value.
612 * @param pvValue Where to store the value.
613 * @param cbValue The size of the integer value (in bytes).
614 * @param fSigned Whether the integer is signed (true) or not (false).
615 * @remark This function will interpret any non-zero value as true.
616 */
617DECLINLINE(int) CFGMR3QueryIntegerBySize(PCFGMNODE pNode, const char *pszName, void *pvValue, size_t cbValue, bool fSigned)
618{
619 int rc;
620 if (fSigned)
621 {
622 switch (cbValue)
623 {
624 case 8: rc = CFGMR3QueryS8(pNode, pszName, (int8_t *)pvValue); break;
625 case 16: rc = CFGMR3QueryS16(pNode, pszName, (int16_t *)pvValue); break;
626 case 32: rc = CFGMR3QueryS32(pNode, pszName, (int32_t *)pvValue); break;
627 case 64: rc = CFGMR3QueryS64(pNode, pszName, (int64_t *)pvValue); break;
628 default: rc = -1 /* VERR_GENERAL_FAILURE*/; break;
629 }
630 }
631 else
632 {
633 switch (cbValue)
634 {
635 case 8: rc = CFGMR3QueryU8(pNode, pszName, (uint8_t *)pvValue); break;
636 case 16: rc = CFGMR3QueryU16(pNode, pszName, (uint16_t *)pvValue); break;
637 case 32: rc = CFGMR3QueryU32(pNode, pszName, (uint32_t *)pvValue); break;
638 case 64: rc = CFGMR3QueryU64(pNode, pszName, (uint64_t *)pvValue); break;
639 default: rc = -1 /* VERR_GENERAL_FAILURE*/; break;
640 }
641 }
642 return rc;
643}
644
645
646/**
647 * Query I/O port address value (integer).
648 *
649 * @returns VBox status code.
650 * @param pNode Which node to search for pszName in.
651 * @param pszName Name of an integer value.
652 * @param pPort Where to store the value.
653 */
654DECLINLINE(int) CFGMR3QueryPort(PCFGMNODE pNode, const char *pszName, PRTIOPORT pPort)
655{
656 return CFGMR3QueryIntegerBySize(pNode, pszName, pPort, sizeof(*pPort), false);
657}
658
659
660
661/**
662 * Query zero terminated character value storing it in a
663 * buffer allocated from the MM heap.
664 *
665 * @returns VBox status code.
666 * @param pNode Which node to search for pszName in.
667 * @param pszName Value name. This value must be of zero terminated character string type.
668 * @param ppszString Where to store the string pointer.
669 * Free this using MMR3HeapFree().
670 */
671CFGMR3DECL(int) CFGMR3QueryStringAlloc(PCFGMNODE pNode, const char *pszName, char **ppszString);
672
673/** @} */
674
675
676/**
677 * Dumps the configuration (sub)tree.
678 *
679 * @param pRoot The root node of the dump.
680 */
681CFGMR3DECL(void) CFGMR3Dump(PCFGMNODE pRoot);
682
683/** @} */
684#endif /* IN_RING3 */
685
686
687__END_DECLS
688
689/** @} */
690
691#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette