Changeset 169 for trunk/include/regfi.h


Ignore:
Timestamp:
03/03/10 14:24:58 (14 years ago)
Author:
tim
Message:

filled in additional, minimal documentation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/regfi.h

    r168 r169  
    1 /** @file
    2  * Windows NT (and later) registry parsing library
    3  *
    4  * Branched from Samba project Subversion repository, version #6903:
    5  *   http://viewcvs.samba.org/cgi-bin/viewcvs.cgi/trunk/source/include/regfio.h?rev=6903&view=auto
    6  *
     1/*
    72 * Copyright (C) 2005-2010 Timothy D. Morgan
    83 * Copyright (C) 2005 Gerald (Jerry) Carter
     
    2419 */
    2520
    26 /************************************************************
    27  * Most of this information was obtained from
    28  * http://www.wednesday.demon.co.uk/dosreg.html
    29  * Thanks Nigel!
    30  ***********************************************************/
     21/**
     22 * @file
     23 * Windows NT (and later) read-only registry library
     24 *
     25 * This library is intended for use in digital forensics investigations, but
     26 * is likely useful in other applications.
     27 *
     28 * Branched from Samba project Subversion repository, version #6903:
     29 *   http://viewcvs.samba.org/cgi-bin/viewcvs.cgi/trunk/source/include/regfio.h?rev=6903&view=auto
     30 *
     31 * Since then, it has been heavily rewritten, simplified, and improved.
     32 */
    3133
    3234/**
    3335 * @mainpage Home
    3436 *
    35  * See \ref regfiTopLayer
    36  */
     37 * The regfi library is a read-only NT registry library which serves as the main
     38 * engine behind the reglookup tool.  It is designed with digital forensic
     39 * analysis in mind, but it should also be useful in other tools which need to
     40 * efficiently traverse and query registry data structures.
     41 *
     42 * The library is broken down into four main parts, the
     43 * @ref regfiBase "Base Layer", which any code dependent on the library will
     44 * likely need to rely on, as well as three main functional layers:
     45 * @li @ref regfiIteratorLayer
     46 * @li @ref regfiGlueLayer
     47 * @li @ref regfiParseLayer
     48 *
     49 * Most users will find that a combination of the Base Layer and the Iterator Layer
     50 * will be sufficient for accessing registry hive files.  Those who are wiling
     51 * to dive deep into registry data structures, for instance to recover deleted
     52 * data structures or to research Windows registry behavior in detail, will
     53 * find the Parse Layer to be quite useful.
     54 */
     55
    3756
    3857#ifndef _REGFI_H
     
    4261#include <stdio.h>
    4362#include <stdbool.h>
    44 #include <stdarg.h>
    4563#include <string.h>
    4664#include <errno.h>
     
    5068#include <sys/types.h>
    5169#include <unistd.h>
    52 #include <assert.h>
    5370#include <iconv.h>
    5471
     
    230247
    231248
    232 /* HBIN block */
     249/** HBIN block information
     250 * @ingroup regfiMiddleLayer
     251 */
    233252typedef struct _regfi_hbin
    234253{
    235   uint32_t file_off;       /* my offset in the registry file */
    236   uint32_t ref_count;      /* how many active records are pointing to this
    237                           * block (not used currently)
    238                           */
    239  
    240   uint32_t first_hbin_off; /* offset from first hbin block */
    241   uint32_t block_size;     /* block size of this block
    242                           * Should be a multiple of 4096 (0x1000)
    243                           */
    244   uint32_t next_block;     /* relative offset to next block. 
    245                           * NOTE: This value may be unreliable!
    246                           */
    247 
    248   uint8_t magic[REGFI_HBIN_MAGIC_SIZE]; /* "hbin" */
     254  /** Offset of this HBIN in the registry file */
     255  uint32_t file_off;
     256
     257  /** Number of active records pointing to this block (not used currently) */
     258  uint32_t ref_count;
     259
     260  /** Offset from first hbin block */
     261  uint32_t first_hbin_off;
     262
     263  /** Block size of this block Should be a multiple of 4096 (0x1000) */
     264  uint32_t block_size;
     265
     266  /** Relative offset to next block. 
     267   *
     268   * @note This value may be unreliable!
     269   */
     270  uint32_t next_block;
     271
     272  /** Magic number for the HBIN (should be "hbin"). */
     273  uint8_t magic[REGFI_HBIN_MAGIC_SIZE];
    249274} REGFI_HBIN;
    250275
     
    262287
    263288
     289/** Subkey-list structure
     290 * @ingroup regfiMiddleLayer
     291 */
    264292typedef struct _regfi_subkey_list
    265293{
     
    284312
    285313typedef uint32_t REGFI_VALUE_LIST_ELEM;
     314/** Value-list structure
     315 * @ingroup regfiMiddleLayer
     316 */
    286317typedef struct _regfi_value_list
    287318{
     
    295326
    296327
     328/** Class name structure (used in storing SysKeys)
     329 * @ingroup regfiBase
     330 */
    297331typedef struct _regfi_classname
    298332{
    299   /* As converted to requested character encoding. */
     333  /** As converted to requested REGFI_ENCODING */
    300334  char* interpreted;
    301335
    302   /* Represents raw buffer read from classname cell. */
     336  /** Represents raw buffer read from classname cell.
     337   *
     338   * Length of this item is specified in the size field.
     339   */
    303340  uint8_t* raw;
    304341
    305   /* Length of the raw data. May be shorter than that indicated by parent key.*/
     342  /** Length of the raw data.
     343   *
     344   * May be shorter than that indicated by parent key.
     345   */
    306346  uint16_t size;
    307347} REGFI_CLASSNAME;
    308348
    309349
     350/** Data record structure
     351 * @ingroup regfiBase
     352 */
    310353typedef struct _regfi_data
    311354{
     355  /** Data type of this data, as indicated by the referencing VK record. */
    312356  uint32_t type;
    313357
    314   /* Length of the raw data. */
     358  /** Length of the raw data. */
    315359  uint32_t size;
    316360
    317   /* This is always present, representing the raw data cell contents. */
     361  /** This is always present, representing the raw data cell contents. */
    318362  uint8_t* raw;
    319363
    320   /* Represents the length of the interpreted value. Meaning is type-specific.*/
     364  /** Represents the length of the interpreted value. Meaning is type-specific. */
    321365  uint32_t interpreted_size;
    322366
    323   /* These items represent interpreted versions of the raw attribute above.
    324    * Only use the appropriate member according to the type field. 
    325    * In the event of an unknown type, use only the raw field.
     367  /** These items represent interpreted versions of the REGFI_DATA::raw field.
     368   *
     369   * Only use the appropriate member according to the REGFI_DATA::type field.
     370   * In the event of an unknown type, use only the REGFI_DATA::raw field.
    326371   */
    327372  union _regfi_data_interpreted
    328373  {
    329     uint8_t* none; /* */
     374    /** REG_NONE
     375     *
     376     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
     377     * length.
     378     */
     379    uint8_t* none;
     380
     381    /** REG_SZ
     382     *
     383     * Stored as a NUL terminated string.  Converted to the specified
     384     * REGFI_ENCODING.
     385     */
    330386    uint8_t* string;
     387
     388    /** REG_EXPAND_SZ
     389     *
     390     * Stored as a NUL terminated string.  Converted to the specified
     391     * REGFI_ENCODING.
     392     */
    331393    uint8_t* expand_string;
    332     uint8_t* binary; /* */
     394
     395    /** REG_BINARY
     396     *
     397     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
     398     * length.
     399     */
     400    uint8_t* binary;
     401
     402    /** REG_DWORD */
    333403    uint32_t dword;
     404
     405    /** REG_DWORD_BE */
    334406    uint32_t dword_be;
     407
     408    /** REG_LINK
     409     *
     410     * Stored as a NUL terminated string.  Converted to the specified
     411     * REGFI_ENCODING.
     412     */
    335413    uint8_t* link;
     414
     415    /** REG_MULTI_SZ
     416     *
     417     * Stored as a list of uint8_t* pointers, terminated with a NULL pointer.
     418     * Each string element in the list is NUL terminated, and the character set
     419     * is determined by the specified REGFI_ENCODING.
     420     */
    336421    uint8_t** multiple_string;
     422
     423    /** REG_QWORD */
    337424    uint64_t qword;
    338425
     
    340427     * the future as the formats become better understood.
    341428     */
     429
     430    /** REG_RESOURCE_LIST
     431     *
     432     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
     433     * length.
     434     */
    342435    uint8_t* resource_list;
     436
     437    /** REG_FULL_RESOURCE_DESCRIPTOR
     438     *
     439     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
     440     * length.
     441     */
    343442    uint8_t* full_resource_descriptor;
     443
     444    /** REG_RESOURCE_REQUIREMENTS_LIST
     445     *
     446     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
     447     * length.
     448     */
    344449    uint8_t* resource_requirements_list;
    345450  } interpreted;
     
    347452
    348453
    349 /* Value record */
    350 typedef struct
     454/** Value structure
     455 * @ingroup regfiBase
     456 */
     457typedef struct
    351458{
    352   uint32_t offset;      /* Real offset of this record's cell in the file */
    353   uint32_t cell_size;   /* ((start_offset - end_offset) & 0xfffffff8) */
    354 
    355   REGFI_DATA* data;     /* XXX: deprecated */
    356 
    357   char*  valuename;
     459  /** Real offset of this record's cell in the file */
     460  uint32_t offset;     
     461
     462  /** ((start_offset - end_offset) & 0xfffffff8) */
     463  uint32_t cell_size;
     464
     465  /* XXX: deprecated */
     466  REGFI_DATA* data;
     467
     468  /** The name of this value converted to desired REGFI_ENCODING. 
     469   *
     470   * This conversion typically occurs automatically through REGFI_ITERATOR
     471   * settings.  String is NUL terminated.
     472   */
     473  char*    valuename;
     474
     475  /** The raw value name
     476   *
     477   * Length of the buffer is stored in name_length.
     478   */
    358479  uint8_t* valuename_raw;
     480
     481  /** Length of valuename_raw */
    359482  uint16_t name_length;
    360   uint32_t hbin_off;    /* offset from beginning of this hbin block */
     483
     484  /** Offset from beginning of this hbin block */
     485  uint32_t hbin_off;
    361486 
    362   uint32_t data_size;     /* As reported in the VK record.  May be different than
    363                          * That obtained while parsing the data cell itself. */
    364   uint32_t data_off;      /* Offset of data cell (virtual) */
     487  /** Size of the value's data as reported in the VK record.
     488   *
     489   * May be different than that obtained while parsing the data cell itself.
     490   */
     491  uint32_t data_size;
     492
     493  /** Virtual offset of data cell */
     494  uint32_t data_off;
     495
     496  /** Value's data type */
    365497  uint32_t type;
     498
     499  /** VK record's magic number (should be "vk") */
    366500  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
     501
     502  /** VK record flags */
    367503  uint16_t flags;
     504
     505  /* XXX: A 2-byte field of unknown purpose stored in the VK record */
    368506  uint16_t unknown1;
    369   bool data_in_offset;
     507
     508  /** Whether or not the data record is stored in the VK record's data_off field.
     509   *
     510   * This information is derived from the high bit of the raw data size field.
     511   */
     512  bool     data_in_offset;
    370513} REGFI_VK_REC;
    371514
     
    374517struct _regfi_sk_rec;
    375518
     519/** Security structure
     520 * @ingroup regfiBase
     521 */
    376522typedef struct _regfi_sk_rec
    377523{
    378   uint32_t offset;        /* Real file offset of this record */
    379   uint32_t cell_size;   /* ((start_offset - end_offset) & 0xfffffff8) */
    380 
     524  /** Real file offset of this record */
     525  uint32_t offset;
     526
     527  /** ((start_offset - end_offset) & 0xfffffff8) */
     528  uint32_t cell_size;
     529
     530  /** The stored Windows security descriptor for this SK record */
    381531  WINSEC_DESC* sec_desc;
    382   uint32_t hbin_off;    /* offset from beginning of this hbin block */
     532
     533  /** Offset of this record from beginning of this hbin block */
     534  uint32_t hbin_off;
    383535 
     536  /** Offset of the previous SK record in the linked list of SK records */
    384537  uint32_t prev_sk_off;
     538
     539  /** Offset of the next SK record in the linked list of SK records */
    385540  uint32_t next_sk_off;
     541
     542  /** Number of keys referencing this SK record */
    386543  uint32_t ref_count;
    387   uint32_t desc_size;     /* size of security descriptor */
     544
     545  /** Size of security descriptor (sec_desc) */
     546  uint32_t desc_size;
     547
     548  /* XXX: A 2-byte field of unknown purpose */
    388549  uint16_t unknown_tag;
     550
     551  /** The magic number for this record (should be "sk") */
    389552  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
    390553} REGFI_SK_REC;
    391554
    392555
    393 /* Key Name */
     556/** Key structure
     557 * @ingroup regfiBase
     558 */
    394559typedef struct
    395560{
    396   uint32_t offset;      /* Real offset of this record's cell in the file */
    397   uint32_t cell_size;   /* Actual or estimated length of the cell. 
    398                          * Always in multiples of 8.
    399                          */
    400 
    401   /* link in the other records here */
     561  /** Real offset of this record's cell in the file */
     562  uint32_t offset;
     563
     564  /** Actual or estimated length of the cell. 
     565   * Always in multiples of 8.
     566   */
     567  uint32_t cell_size;
     568
     569  /** Preloaded value-list for this key.
     570   * This element is loaded automatically when using the iterator interface and
     571   * possibly some lower layer interfaces.
     572   */
    402573  REGFI_VALUE_LIST* values;
     574
     575
     576  /** Preloaded subkey-list for this key.
     577   * This element is loaded automatically when using the iterator interface and
     578   * possibly some lower layer interfaces.
     579   */
    403580  REGFI_SUBKEY_LIST* subkeys;
    404581 
    405   /* header information */
     582  /** Key flags */
    406583  uint16_t flags;
     584
     585  /** Magic number of key (should be "nk") */
    407586  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
     587
     588  /** Key's last modification time */
    408589  REGFI_NTTIME mtime;
     590
     591  /** Length of keyname_raw */
    409592  uint16_t name_length;
     593
     594  /** Length of referenced classname */
    410595  uint16_t classname_length;
     596
     597  /** The name of this key converted to desired REGFI_ENCODING. 
     598   *
     599   * This conversion typically occurs automatically through REGFI_ITERATOR
     600   * settings.  String is NUL terminated.
     601   */
    411602  char* keyname;
     603
     604  /** The raw key name
     605   *
     606   * Length of the buffer is stored in name_length.
     607   */
    412608  uint8_t* keyname_raw;
    413   uint32_t parent_off;              /* pointer to parent key */
     609
     610  /** Virutal offset of parent key */
     611  uint32_t parent_off;
     612
     613  /** Virutal offset of classname key */
    414614  uint32_t classname_off;
    415615 
    416   /* max lengths */
    417   uint32_t max_bytes_subkeyname;            /* max subkey name * 2 */
    418   uint32_t max_bytes_subkeyclassname; /* max subkey classname length (as if) */
    419   uint32_t max_bytes_valuename;     /* max valuename * 2 */
    420   uint32_t max_bytes_value;           /* max value data size */
     616  /* XXX: max subkey name * 2 */
     617  uint32_t max_bytes_subkeyname;
     618
     619  /* XXX: max subkey classname length (as if) */
     620  uint32_t max_bytes_subkeyclassname;
     621
     622  /* XXX: max valuename * 2 */
     623  uint32_t max_bytes_valuename;
     624
     625  /* XXX: max value data size */
     626  uint32_t max_bytes_value;
    421627 
    422   /* unknowns */
     628  /* XXX: Fields of unknown purpose */
    423629  uint32_t unknown1;
    424630  uint32_t unknown2;
     
    426632  uint32_t unk_index;               /* nigel says run time index ? */
    427633 
    428   /* children */
     634  /** Number of subkeys */
    429635  uint32_t num_subkeys;
    430   uint32_t subkeys_off; /* offset of subkey list that points to NK records */
     636
     637  /** Virtual offset of subkey-list */
     638  uint32_t subkeys_off;
     639
     640  /** Number of values for this key */
    431641  uint32_t num_values;
    432   uint32_t values_off;  /* value lists which point to VK records */
    433   uint32_t sk_off;      /* offset to SK record */
     642
     643  /** Virtual offset of value-list */
     644  uint32_t values_off;
     645
     646  /** Virtual offset of SK record */
     647  uint32_t sk_off;
    434648} REGFI_NK_REC;
    435649
    436650
    437651
    438 /* REGF block */
     652/** Registry hive file data structure
     653 *
     654 * This essential structure stores run-time information about a single open
     655 * registry hive as well as file header (REGF block) data.  This structure
     656 * also stores a list of warnings and error messages generated while parsing
     657 * the registry hive.  These can be tuned using @ref regfi_set_message_mask. 
     658 * Messages may be retrieved using @ref regfi_get_messages.
     659 *
     660 * @note If the message mask is set to record any messages, dependent code
     661 *       must use @ref regfi_get_messages periodically to clear the message
     662 *       queue. Otherwise, this structure will grow in size over time as
     663 *       messages queue up.
     664 *
     665 * @ingroup regfiBase
     666 */
    439667typedef struct
    440668{
     
    513741
    514742
     743/** Registry hive iterator
     744 * @ingroup regfiIteratorLayer
     745 */
    515746typedef struct _regfi_iterator
    516747{
     748  /** The registry hive this iterator is associated with */
    517749  REGFI_FILE* f;
     750
     751  /** All current parent keys and associated iterator positions */
    518752  void_stack* key_positions;
     753
     754  /** The current key */
    519755  REGFI_NK_REC* cur_key;
     756
     757  /** The encoding that all strings are converted to as set during iterator
     758   *  creation.
     759   */
    520760  REGFI_ENCODING string_encoding;
     761
     762  /** Index of the current subkey */
    521763  uint32_t cur_subkey;
     764
     765  /** Index of the current value */
    522766  uint32_t cur_value;
    523767} REGFI_ITERATOR;
     
    534778
    535779
     780/** General purpose buffer with stored length
     781 * @ingroup regfiBottomLayer
     782 */
    536783typedef struct _regfi_buffer
    537784{
     
    541788
    542789
     790
    543791/******************************************************************************/
    544792/**
    545  * @defgroup regfiBase Base Functions: Usable with Any Layer
    546  *
    547  * These functions don't fit particularly well in any of the other layers or
    548  * are intended for use with any of the API layers.
     793 * @defgroup regfiBase Base Layer: Essential Functions and Data Structures
     794 *
     795 * These functions are either necessary for normal use of the regfi API or just
     796 * don't fit particularly well in any of the other layers.
    549797 */
    550798/******************************************************************************/
    551 
    552799
    553800/** Attempts to open a registry hive and allocate related data structures.
     
    658905/******************************************************************************/
    659906/**
    660  * @defgroup regfiTopLayer Top Layer: Primary regfi Library Interface
     907 * @defgroup regfiIteratorLayer Iterator Layer: Primary regfi Library Interface
    661908 *
    662909 * This top layer of API functions provides an iterator interface which makes
     
    681928 *         Must be free()d with regfi_iterator_free.
    682929 *
    683  * @ingroup regfiTopLayer
     930 * @ingroup regfiIteratorLayer
    684931 */
    685932REGFI_ITERATOR*       regfi_iterator_new(REGFI_FILE* file,
     
    693940 * @param i the iterator to be freed
    694941 *
    695  * @ingroup regfiTopLayer
     942 * @ingroup regfiIteratorLayer
    696943 */
    697944void                  regfi_iterator_free(REGFI_ITERATOR* i);
     
    709956 *          depth-first iteration particularly easy.
    710957 *
    711  * @ingroup regfiTopLayer
     958 * @ingroup regfiIteratorLayer
    712959 */
    713960bool                  regfi_iterator_down(REGFI_ITERATOR* i);
     
    721968 *          associated with the current key is lost.
    722969 *
    723  * @ingroup regfiTopLayer
     970 * @ingroup regfiIteratorLayer
    724971 */
    725972bool                  regfi_iterator_up(REGFI_ITERATOR* i);
     
    732979 * @return true on success, false on failure.
    733980 *
    734  * @ingroup regfiTopLayer
     981 * @ingroup regfiIteratorLayer
    735982 */
    736983bool                  regfi_iterator_to_root(REGFI_ITERATOR* i);
     
    7531000 *                 in its original position.
    7541001 *
    755  * @ingroup regfiTopLayer
     1002 * @ingroup regfiIteratorLayer
    7561003 */
    7571004bool regfi_iterator_walk_path(REGFI_ITERATOR* i, const char** path);
     
    7641011 * @return A read-only key structure for the current key, or NULL on failure.
    7651012 *
    766  * @ingroup regfiTopLayer
     1013 * @ingroup regfiIteratorLayer
    7671014 */
    7681015const REGFI_NK_REC*   regfi_iterator_cur_key(REGFI_ITERATOR* i);
     
    7751022 * @return A read-only SK structure, or NULL on failure.
    7761023 *
    777  * @ingroup regfiTopLayer
     1024 * @ingroup regfiIteratorLayer
    7781025 */
    7791026const REGFI_SK_REC*   regfi_iterator_cur_sk(REGFI_ITERATOR* i);
     
    7901037 *         regfi_free_key.
    7911038 *
    792  * @ingroup regfiTopLayer
     1039 * @ingroup regfiIteratorLayer
    7931040 */
    7941041REGFI_NK_REC*         regfi_iterator_first_subkey(REGFI_ITERATOR* i);
     
    8031050 *         regfi_free_key.
    8041051 *
    805  * @ingroup regfiTopLayer
     1052 * @ingroup regfiIteratorLayer
    8061053 */
    8071054REGFI_NK_REC*         regfi_iterator_cur_subkey(REGFI_ITERATOR* i);
     
    8161063 *         failure.  Newly allocated keys must be freed with regfi_free_key.
    8171064 *
    818  * @ingroup regfiTopLayer
     1065 * @ingroup regfiIteratorLayer
    8191066 */
    8201067REGFI_NK_REC*         regfi_iterator_next_subkey(REGFI_ITERATOR* i);
     
    8301077 *         the subkey index remains at the same location as before the call.
    8311078 *
    832  * @ingroup regfiTopLayer
     1079 * @ingroup regfiIteratorLayer
    8331080 */
    8341081bool                  regfi_iterator_find_subkey(REGFI_ITERATOR* i,
     
    8451092 *          regfi_free_value.
    8461093 *
    847  * @ingroup regfiTopLayer
     1094 * @ingroup regfiIteratorLayer
    8481095 */
    8491096REGFI_VK_REC*         regfi_iterator_first_value(REGFI_ITERATOR* i);
     
    8581105 *         regfi_free_value.
    8591106 *
    860  * @ingroup regfiTopLayer
     1107 * @ingroup regfiIteratorLayer
    8611108 */
    8621109REGFI_VK_REC*         regfi_iterator_cur_value(REGFI_ITERATOR* i);
     
    8711118 *          failure.  Newly allocated keys must be freed with regfi_free_value.
    8721119 *
    873  * @ingroup regfiTopLayer
     1120 * @ingroup regfiIteratorLayer
    8741121 */
    8751122REGFI_VK_REC*         regfi_iterator_next_value(REGFI_ITERATOR* i);
     
    8851132 *         the value index remains at the same location as before the call.
    8861133 *
    887  * @ingroup regfiTopLayer
     1134 * @ingroup regfiIteratorLayer
    8881135 */
    8891136bool                  regfi_iterator_find_value(REGFI_ITERATOR* i,
     
    8981145 *         Classname structures must be freed with regfi_free_classname.
    8991146 *
    900  * @ingroup regfiTopLayer
     1147 * @ingroup regfiIteratorLayer
    9011148 */
    9021149REGFI_CLASSNAME*      regfi_iterator_fetch_classname(REGFI_ITERATOR* i,
     
    9121159 *         Data structures must be freed with regfi_free_data.
    9131160 *
    914  * @ingroup regfiTopLayer
     1161 * @ingroup regfiIteratorLayer
    9151162 */
    9161163REGFI_DATA*           regfi_iterator_fetch_data(REGFI_ITERATOR* i,
     
    9211168/******************************************************************************/
    9221169/**
    923  * @defgroup regfiMiddleLayer Middle Layer: Logical Data Structure Loading
     1170 * @defgroup regfiGlueLayer Glue Layer: Logical Data Structure Loading
    9241171 */
    9251172/******************************************************************************/
     
    9291176 * XXX: finish documenting
    9301177 *
    931  * @ingroup regfiMiddleLayer
     1178 * @ingroup regfiGlueLayer
    9321179 */
    9331180REGFI_NK_REC*         regfi_load_key(REGFI_FILE* file, uint32_t offset,
     
    9401187 * XXX: finish documenting
    9411188 *
    942  * @ingroup regfiMiddleLayer
     1189 * @ingroup regfiGlueLayer
    9431190 */
    9441191REGFI_VK_REC*         regfi_load_value(REGFI_FILE* file, uint32_t offset,
     
    9511198 * XXX: finish documenting
    9521199 *
    953  * @ingroup regfiMiddleLayer
     1200 * @ingroup regfiGlueLayer
    9541201 */
    9551202REGFI_SUBKEY_LIST*    regfi_load_subkeylist(REGFI_FILE* file, uint32_t offset,
     
    9621209 * XXX: finish documenting
    9631210 *
    964  * @ingroup regfiMiddleLayer
     1211 * @ingroup regfiGlueLayer
    9651212 */
    9661213REGFI_VALUE_LIST*     regfi_load_valuelist(REGFI_FILE* file, uint32_t offset,
     
    9741221 * XXX: finish documenting
    9751222 *
    976  * @ingroup regfiMiddleLayer
     1223 * @ingroup regfiGlueLayer
    9771224 */
    9781225REGFI_BUFFER          regfi_load_data(REGFI_FILE* file, uint32_t voffset,
     
    9851232 * XXX: finish documenting
    9861233 *
    987  * @ingroup regfiMiddleLayer
     1234 * @ingroup regfiGlueLayer
    9881235 */
    9891236REGFI_BUFFER          regfi_load_big_data(REGFI_FILE* file, uint32_t offset,
     
    9981245 * XXX: finish documenting
    9991246 *
    1000  * @ingroup regfiMiddleLayer
     1247 * @ingroup regfiGlueLayer
    10011248 */
    10021249bool                  regfi_interpret_data(REGFI_FILE* file,
     
    10091256 * XXX: finish documenting
    10101257 *
    1011  * @ingroup regfiMiddleLayer
     1258 * @ingroup regfiGlueLayer
    10121259 */
    10131260void                  regfi_free_classname(REGFI_CLASSNAME* classname);
     
    10181265 * XXX: finish documenting
    10191266 *
    1020  * @ingroup regfiMiddleLayer
     1267 * @ingroup regfiGlueLayer
    10211268 */
    10221269void                  regfi_free_data(REGFI_DATA* data);
     
    10291276 * XXX: finish documenting
    10301277 *
    1031  * @ingroup regfiMiddleLayer
     1278 * @ingroup regfiGlueLayer
    10321279 */
    10331280const REGFI_SK_REC*   regfi_load_sk(REGFI_FILE* file, uint32_t offset,
     
    10391286 * XXX: finish documenting
    10401287 *
    1041  * @ingroup regfiMiddleLayer
     1288 * @ingroup regfiGlueLayer
    10421289 */
    10431290const REGFI_HBIN*     regfi_lookup_hbin(REGFI_FILE* file, uint32_t offset);
     
    10471294/******************************************************************************/
    10481295/**
    1049  * @defgroup regfiBottomLayer Bottom Layer: Direct Data Structure Access
     1296 * @defgroup regfiParseLayer Parsing Layer: Direct Data Structure Access
    10501297 */
    10511298/******************************************************************************/
     
    10661313 * @return A newly allocated NK record structure, or NULL on failure.
    10671314 *
    1068  * @ingroup regfiBottomLayer
     1315 * @ingroup regfiParseLayer
    10691316 */
    10701317REGFI_NK_REC*         regfi_parse_nk(REGFI_FILE* file, uint32_t offset,
     
    10761323 * XXX: finish documenting
    10771324 *
    1078  * @ingroup regfiBottomLayer
     1325 * @ingroup regfiParseLayer
    10791326 */
    10801327REGFI_SUBKEY_LIST*    regfi_parse_subkeylist(REGFI_FILE* file, uint32_t offset,
     
    10861333 * XXX: finish documenting
    10871334 *
    1088  * @ingroup regfiBottomLayer
     1335 * @ingroup regfiParseLayer
    10891336 */
    10901337REGFI_VK_REC*         regfi_parse_vk(REGFI_FILE* file, uint32_t offset,
     
    10961343 * XXX: finish documenting
    10971344 *
    1098  * @ingroup regfiBottomLayer
     1345 * @ingroup regfiParseLayer
    10991346 */
    11001347REGFI_SK_REC*         regfi_parse_sk(REGFI_FILE* file, uint32_t offset,
     
    11091356 * XXX: finish documenting
    11101357 *
    1111  * @ingroup regfiBottomLayer
     1358 * @ingroup regfiParseLayer
    11121359 */
    11131360range_list*           regfi_parse_unalloc_cells(REGFI_FILE* file);
     
    11181365 * XXX: finish documenting
    11191366 *
    1120  * @ingroup regfiBottomLayer
     1367 * @ingroup regfiParseLayer
    11211368 */
    11221369bool                  regfi_parse_cell(int fd, uint32_t offset,
     
    11291376 * XXX: finish documenting
    11301377 *
    1131  * @ingroup regfiBottomLayer
     1378 * @ingroup regfiParseLayer
    11321379 */
    11331380uint8_t*                regfi_parse_classname(REGFI_FILE* file, uint32_t offset,
     
    11401387 * XXX: finish documenting
    11411388 *
    1142  * @ingroup regfiBottomLayer
     1389 * @ingroup regfiParseLayer
    11431390 */
    11441391REGFI_BUFFER          regfi_parse_data(REGFI_FILE* file, uint32_t offset,
     
    11511398 * XXX: finish documenting
    11521399 *
    1153  * @ingroup regfiBottomLayer
     1400 * @ingroup regfiParseLayer
    11541401 */
    11551402REGFI_BUFFER          regfi_parse_little_data(REGFI_FILE* file, uint32_t voffset,
     
    11631410                                    REGFI_ENCODING output_encoding);
    11641411void                  regfi_subkeylist_free(REGFI_SUBKEY_LIST* list);
    1165 uint32_t                regfi_read(int fd, uint8_t* buf, uint32_t* length);
     1412uint32_t              regfi_read(int fd, uint8_t* buf, uint32_t* length);
    11661413
    11671414const char*           regfi_type_val2str(unsigned int val);
Note: See TracChangeset for help on using the changeset viewer.