source: trunk/include/regfi.h @ 250

Last change on this file since 250 was 250, checked in by tim, 13 years ago

added key caching
readded SK caching
fixed races and deadlocks

  • Property svn:keywords set to Id
File size: 48.8 KB
RevLine 
[169]1/*
[168]2 * Copyright (C) 2005-2010 Timothy D. Morgan
[193]3 * Copyright (C) 2010 Michael Cohen
[30]4 * Copyright (C) 2005 Gerald (Jerry) Carter
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
[134]8 * the Free Software Foundation; version 3 of the License.
[30]9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 * $Id: regfi.h 250 2011-05-05 04:00:24Z tim $
20 */
21
[169]22/**
23 * @file
24 * Windows NT (and later) read-only registry library
25 *
26 * This library is intended for use in digital forensics investigations, but
27 * is likely useful in other applications.
28 *
29 * Branched from Samba project Subversion repository, version #6903:
30 *   http://viewcvs.samba.org/cgi-bin/viewcvs.cgi/trunk/source/include/regfio.h?rev=6903&view=auto
31 *
32 * Since then, it has been heavily rewritten, simplified, and improved.
33 */
[30]34
[168]35/**
36 * @mainpage Home
37 *
[169]38 * The regfi library is a read-only NT registry library which serves as the main
39 * engine behind the reglookup tool.  It is designed with digital forensic
40 * analysis in mind, but it should also be useful in other tools which need to
41 * efficiently traverse and query registry data structures.
42 *
43 * The library is broken down into four main parts, the
44 * @ref regfiBase "Base Layer", which any code dependent on the library will
45 * likely need to rely on, as well as three main functional layers:
46 * @li @ref regfiIteratorLayer
47 * @li @ref regfiGlueLayer
48 * @li @ref regfiParseLayer
49 *
50 * Most users will find that a combination of the Base Layer and the Iterator Layer
[185]51 * will be sufficient for accessing registry hive files.  Those who are willing
[169]52 * to dive deep into registry data structures, for instance to recover deleted
53 * data structures or to research Windows registry behavior in detail, will
54 * find the Parse Layer to be quite useful.
[168]55 */
56
[169]57
[78]58#ifndef _REGFI_H
59#define _REGFI_H
[30]60
[31]61#include <stdlib.h>
62#include <stdio.h>
[30]63#include <stdbool.h>
[31]64#include <string.h>
[30]65#include <errno.h>
[31]66#include <time.h>
[30]67#include <fcntl.h>
68#include <sys/stat.h>
69#include <sys/types.h>
70#include <unistd.h>
[159]71#include <iconv.h>
[180]72#include <pthread.h>
[201]73#include <talloc.h>
[30]74
[193]75/* regfi headers */
76#include <byteorder.h>
77#include <winsec.h>
78#include <void_stack.h>
79#include <range_list.h>
80#include <lru_cache.h>
[30]81
[201]82/* GCC-specific macro for library exports */
83#ifdef _EXPORT
84#undef _EXPORT
85#endif
[226]86#ifdef REGFI_WIN32
[238]87#define _EXPORT() __declspec(dllexport)
[226]88#else
[238]89#define _EXPORT() __attribute__((visibility("default")))
[226]90#endif
[184]91
[226]92#ifndef EOVERFLOW
93# define EOVERFLOW E2BIG
94#endif
[185]95
[30]96/******************************************************************************/
[184]97/* Constants for use while interacting with the library                       */
98/******************************************************************************/
[138]99
100/* regfi library error message types */
[182]101#define REGFI_LOG_INFO  0x0001
102#define REGFI_LOG_WARN  0x0004
103#define REGFI_LOG_ERROR 0x0010
[185]104#define REGFI_DEFAULT_LOG_MASK REGFI_LOG_ERROR|REGFI_LOG_WARN
[138]105
[161]106/* regfi library supported character encodings */
107/* UTF16LE is not supported for output */
[193]108typedef enum {
109  REGFI_ENCODING_DEFAULT  = 0,
110  REGFI_ENCODING_ASCII =   0,
111  REGFI_ENCODING_UTF8  =  1,
112  REGFI_ENCODING_UTF16LE = 2,
113  REGFI_NUM_ENCODINGS  =  3
114} REGFI_ENCODING;
[161]115
[32]116/* Registry data types */
[193]117typedef enum {
118  REG_NONE                   =    0,
119  REG_SZ                     =    1,
120  REG_EXPAND_SZ              =    2,
121  REG_BINARY                 =    3,
122  REG_DWORD                  =    4,
123  REG_DWORD_LE               =    4 , /* DWORD, little endian */
124  REG_DWORD_BE               =    5 , /* DWORD, big endian */
125  REG_LINK                   =    6,
126  REG_MULTI_SZ               =    7,
127  REG_RESOURCE_LIST          =    8,
128  REG_FULL_RESOURCE_DESCRIPTOR=   9,
129  REG_RESOURCE_REQUIREMENTS_LIST= 10,
130  REG_QWORD                     = 11, /* 64-bit little endian */
[72]131/* XXX: Has MS defined a REG_QWORD_BE? */
[32]132/* Not a real type in the registry */
[193]133  REG_KEY                 =   0x7FFFFFFF
134} REGFI_DATA_TYPE;
[135]135#define REGFI_OFFSET_NONE          0xffffffff
[30]136
[165]137
[184]138
139/******************************************************************************/
140/* Various resource limits and related constants                              */
141/******************************************************************************/
142
[250]143/* Flags determining how many records to cache internally */
144#define REGFI_CACHE_SK_MAX         64
145#define REGFI_CACHE_NK_MAX         1024
[184]146
[165]147/* This maximum depth is described here:
148 * http://msdn.microsoft.com/en-us/library/ms724872%28VS.85%29.aspx
149 */
150#define REGFI_MAX_DEPTH            512
151
152/* This limit defines the maximum number of levels deep that ri subkey list
153 * trees can go.
154 */
155/* XXX: This is totally arbitrary right now.
156 *      The actual limit may need to be discovered by experimentation.
157 */
[149]158#define REGFI_MAX_SUBKEY_DEPTH     255
[139]159
[165]160
[184]161/******************************************************************************/
162/* Symbols for internal use                                                   */
163/******************************************************************************/
164
165/* Global thread-local storage key */
[185]166pthread_key_t regfi_log_key;
[184]167
[135]168/* Header sizes and magic number lengths for various records */
[147]169#define REGFI_HBIN_ALLOC           0x1000 /* Minimum allocation unit for HBINs */
170#define REGFI_REGF_SIZE            0x1000 /* "regf" header block size */
[135]171#define REGFI_REGF_MAGIC_SIZE      4
[151]172#define REGFI_REGF_NAME_SIZE       64
173#define REGFI_REGF_RESERVED1_SIZE  340
174#define REGFI_REGF_RESERVED2_SIZE  3528
[135]175#define REGFI_HBIN_MAGIC_SIZE      4
176#define REGFI_CELL_MAGIC_SIZE      2
177#define REGFI_HBIN_HEADER_SIZE     0x20
[116]178#define REGFI_NK_MIN_LENGTH        0x4C
179#define REGFI_VK_MIN_LENGTH        0x14
180#define REGFI_SK_MIN_LENGTH        0x14
[127]181#define REGFI_SUBKEY_LIST_MIN_LEN  0x4
[157]182#define REGFI_BIG_DATA_MIN_LENGTH  0xC
[30]183
[135]184
[116]185/* Constants used for validation */
[125]186/* XXX: Can we add clock resolution validation as well as range?  It has
187 *      been reported that Windows timestamps are never more than a
188 *      certain granularity (250ms?), which could be used to help
[147]189 *      eliminate false positives.  Would need to verify this and
[125]190 *      perhaps conservatively implement a check.
191 */
[116]192 /* Minimum time is Jan 1, 1990 00:00:00 */
193#define REGFI_MTIME_MIN_HIGH       0x01B41E6D
[178]194
[116]195 /* Maximum time is Jan 1, 2290 00:00:00
196  * (We hope no one is using Windows by then...)
197  */
198#define REGFI_MTIME_MAX_HIGH       0x03047543
[30]199
[116]200
[30]201/* Flags for the vk records */
[162]202#define REGFI_VK_FLAG_ASCIINAME    0x0001
[135]203#define REGFI_VK_DATA_IN_OFFSET    0x80000000
[152]204#define REGFI_VK_MAX_DATA_LENGTH   1024*1024  /* XXX: This is arbitrary */
[30]205
[137]206
[152]207/* Known key flags */
208/*******************/
[137]209/* These next two show up on normal-seeming keys in Vista and W2K3 registries */
210#define REGFI_NK_FLAG_UNKNOWN1     0x4000
211#define REGFI_NK_FLAG_UNKNOWN2     0x1000
[152]212
[167]213/* This next one shows up in some Vista "software" registries */
214/* XXX: This shows up in the following two SOFTWARE keys in Vista:
215 *   /Wow6432Node/Microsoft
216 *   /Wow6432Node/Microsoft/Cryptography
217 * 
218 * It comes along with UNKNOWN2 and ASCIINAME for a total flags value of 0x10A0
219 */
[137]220#define REGFI_NK_FLAG_UNKNOWN3     0x0080
[30]221
[152]222/* Predefined handle.  Rumor has it that the valuelist count for this key is
223 * where the handle is stored.
224 * http://msdn.microsoft.com/en-us/library/ms724836(VS.85).aspx
225 */
226#define REGFI_NK_FLAG_PREDEF_KEY   0x0040
[137]227
[152]228/* The name will be in ASCII if this next bit is set, otherwise UTF-16LE */
229#define REGFI_NK_FLAG_ASCIINAME    0x0020
230
231/* Symlink key. 
232 * See: http://www.codeproject.com/KB/system/regsymlink.aspx
233 */
234#define REGFI_NK_FLAG_LINK         0x0010
235
236/* This key cannot be deleted */
237#define REGFI_NK_FLAG_NO_RM        0x0008
238
239/* Root of a hive */
240#define REGFI_NK_FLAG_ROOT         0x0004
241
242/* Mount point of another hive.  NULL/(default) value indicates which hive
243 * and where in the hive it points to.
244 */
245#define REGFI_NK_FLAG_HIVE_LINK    0x0002
246
247/* These keys shouldn't be stored on disk, according to:
248 * http://geekswithblogs.net/sdorman/archive/2007/12/24/volatile-registry-keys.aspx
249 */
250#define REGFI_NK_FLAG_VOLATILE     0x0001
251
252/* Useful for identifying unknown flag types */
253#define REGFI_NK_KNOWN_FLAGS       (REGFI_NK_FLAG_PREDEF_KEY\
254                                    | REGFI_NK_FLAG_ASCIINAME\
255                                    | REGFI_NK_FLAG_LINK\
256                                    | REGFI_NK_FLAG_NO_RM\
257                                    | REGFI_NK_FLAG_ROOT\
258                                    | REGFI_NK_FLAG_HIVE_LINK\
259                                    | REGFI_NK_FLAG_VOLATILE\
260                                    | REGFI_NK_FLAG_UNKNOWN1\
[167]261                                    | REGFI_NK_FLAG_UNKNOWN2\
262                                    | REGFI_NK_FLAG_UNKNOWN3)
[152]263
[168]264
[193]265#ifndef CHAR_BIT
[168]266#define CHAR_BIT 8
[193]267#endif
268
[168]269#define TIME_T_MIN ((time_t)0 < (time_t) -1 ? (time_t) 0 \
270                    : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
271#define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
272#define TIME_FIXUP_CONSTANT (369.0*365.25*24*60*60-(3.0*24*60*60+6.0*60*60))
273
[184]274
275
276/******************************************************************************/
277/* Structures                                                                 */
278/******************************************************************************/
279
[168]280typedef struct _regfi_nttime
281{
282  uint32_t low;
283  uint32_t high;
284} REGFI_NTTIME;
285
286
[182]287typedef struct _regfi_log
288{
289  /* Error/warning/info messages returned by lower layer functions */
290  char* messages;
291
292  /* Mask for error message types that will be stored. */
293  uint16_t msg_mask;
294
295} REGFI_LOG;
296
297
[169]298/** HBIN block information
299 * @ingroup regfiMiddleLayer
300 */
[135]301typedef struct _regfi_hbin
[97]302{
[169]303  /** Offset of this HBIN in the registry file */
304  uint32_t file_off;
[97]305
[169]306  /** Number of active records pointing to this block (not used currently) */
307  uint32_t ref_count;
308
309  /** Offset from first hbin block */
310  uint32_t first_hbin_off;
311
312  /** Block size of this block Should be a multiple of 4096 (0x1000) */
313  uint32_t block_size;
314
315  /** Relative offset to next block. 
316   *
317   * @note This value may be unreliable!
318   */
319  uint32_t next_block;
320
321  /** Magic number for the HBIN (should be "hbin"). */
322  uint8_t magic[REGFI_HBIN_MAGIC_SIZE];
[135]323} REGFI_HBIN;
[30]324
[97]325
[127]326/* Subkey List -- list of key offsets and hashed names for consistency */
[97]327typedef struct 
328{
[139]329  /* Virtual offset of NK record or additional subkey list,
330   * depending on this list's type.
331   */
[168]332  uint32_t offset;
[139]333
[168]334  uint32_t hash;
[135]335} REGFI_SUBKEY_LIST_ELEM;
[30]336
[97]337
[169]338/** Subkey-list structure
339 * @ingroup regfiMiddleLayer
340 */
[145]341typedef struct _regfi_subkey_list
[97]342{
[139]343  /* Real offset of this record's cell in the file */
[168]344  uint32_t offset;
[139]345
[168]346  uint32_t cell_size;
[139]347 
348  /* Number of immediate children */
[202]349  uint32_t num_children;
[139]350
[202]351  /* Total number of keys referenced by this list and its children */
352  uint32_t num_keys;
[139]353
[135]354  REGFI_SUBKEY_LIST_ELEM* elements;
[168]355  uint8_t magic[REGFI_CELL_MAGIC_SIZE];
[139]356
357  /* Set if the magic indicates this subkey list points to child subkey lists */
[202]358  bool recursive_type;
[135]359} REGFI_SUBKEY_LIST;
[30]360
[97]361
[168]362typedef uint32_t REGFI_VALUE_LIST_ELEM;
[169]363/** Value-list structure
364 * @ingroup regfiMiddleLayer
365 */
[145]366typedef struct _regfi_value_list
367{
[206]368  /* Real offset of this record's cell in the file */
369  uint32_t offset;
370
371  uint32_t cell_size;
372
[145]373  /* Actual number of values referenced by this list. 
374   * May differ from parent key's num_values if there were parsing errors.
375   */
[168]376  uint32_t num_values;
[145]377
378  REGFI_VALUE_LIST_ELEM* elements;
379} REGFI_VALUE_LIST;
380
381
[169]382/** Class name structure (used in storing SysKeys)
383 * @ingroup regfiBase
384 */
[160]385typedef struct _regfi_classname
386{
[206]387  /** Real offset of this record's cell in the file */
388  uint32_t offset;
389
[169]390  /** As converted to requested REGFI_ENCODING */
[160]391  char* interpreted;
392
[169]393  /** Represents raw buffer read from classname cell.
394   *
395   * Length of this item is specified in the size field.
396   */
[168]397  uint8_t* raw;
[160]398
[169]399  /** Length of the raw data.
400   *
401   * May be shorter than that indicated by parent key.
402   */
[168]403  uint16_t size;
[160]404} REGFI_CLASSNAME;
405
406
[169]407/** Data record structure
408 * @ingroup regfiBase
409 */
[159]410typedef struct _regfi_data
411{
[209]412  /* XXX: this isn't populated yet. Should set it to start of data cell
413   *      or big data cell.
414   */
415  uint32_t offset;
416
[169]417  /** Data type of this data, as indicated by the referencing VK record. */
[193]418  REGFI_DATA_TYPE type;
[159]419
[169]420  /** Length of the raw data. */
[168]421  uint32_t size;
[159]422
[169]423  /** This is always present, representing the raw data cell contents. */
[168]424  uint8_t* raw;
[159]425
[209]426  /** Represents the length of the interpreted value. Meaning is type-specific.
427   *  Will be 0 if interpretation failed for any reason.
428   */
[168]429  uint32_t interpreted_size;
[159]430
[169]431  /** These items represent interpreted versions of the REGFI_DATA::raw field.
432   *
433   * Only use the appropriate member according to the REGFI_DATA::type field.
434   * In the event of an unknown type, use only the REGFI_DATA::raw field.
[159]435   */
436  union _regfi_data_interpreted
437  {
[169]438    /** REG_NONE
439     *
440     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
441     * length.
442     */
443    uint8_t* none; 
444
445    /** REG_SZ
446     *
447     * Stored as a NUL terminated string.  Converted to the specified
448     * REGFI_ENCODING.
449     */
[168]450    uint8_t* string;
[169]451
452    /** REG_EXPAND_SZ
453     *
454     * Stored as a NUL terminated string.  Converted to the specified
455     * REGFI_ENCODING.
456     */
[168]457    uint8_t* expand_string;
[169]458
459    /** REG_BINARY
460     *
461     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
462     * length.
463     */
464    uint8_t* binary;
465
466    /** REG_DWORD */
[168]467    uint32_t dword;
[169]468
469    /** REG_DWORD_BE */
[168]470    uint32_t dword_be;
[169]471
472    /** REG_LINK
473     *
474     * Stored as a NUL terminated string.  Converted to the specified
475     * REGFI_ENCODING.
476     */
[168]477    uint8_t* link;
[169]478
479    /** REG_MULTI_SZ
480     *
481     * Stored as a list of uint8_t* pointers, terminated with a NULL pointer.
482     * Each string element in the list is NUL terminated, and the character set
483     * is determined by the specified REGFI_ENCODING.
484     */
[168]485    uint8_t** multiple_string;
[169]486
487    /** REG_QWORD */
[168]488    uint64_t qword;
[159]489
490    /* The following are treated as binary currently, but this may change in
491     * the future as the formats become better understood.
492     */
[169]493
494    /** REG_RESOURCE_LIST
495     *
496     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
497     * length.
498     */
[168]499    uint8_t* resource_list;
[169]500
501    /** REG_FULL_RESOURCE_DESCRIPTOR
502     *
503     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
504     * length.
505     */
[168]506    uint8_t* full_resource_descriptor;
[169]507
508    /** REG_RESOURCE_REQUIREMENTS_LIST
509     *
510     * Stored as a raw buffer.  Use REGFI_DATA::interpreted_size to determine
511     * length.
512     */
[168]513    uint8_t* resource_requirements_list;
[159]514  } interpreted;
515} REGFI_DATA;
516
517
[169]518/** Value structure
519 * @ingroup regfiBase
520 */
[206]521typedef struct _regfi_vk
[97]522{
[169]523  /** Real offset of this record's cell in the file */
524  uint32_t offset;     
[101]525
[169]526  /** ((start_offset - end_offset) & 0xfffffff8) */
527  uint32_t cell_size;
[159]528
[169]529  /** The name of this value converted to desired REGFI_ENCODING. 
530   *
531   * This conversion typically occurs automatically through REGFI_ITERATOR
532   * settings.  String is NUL terminated.
533   */
[206]534  char* name;
[169]535
536  /** The raw value name
537   *
538   * Length of the buffer is stored in name_length.
539   */
[206]540  uint8_t* name_raw;
[169]541
[206]542  /** Length of name_raw */
[168]543  uint16_t name_length;
[169]544
545  /** Offset from beginning of this hbin block */
546  uint32_t hbin_off;
[53]547 
[169]548  /** Size of the value's data as reported in the VK record.
549   *
550   * May be different than that obtained while parsing the data cell itself.
551   */
552  uint32_t data_size;
553
554  /** Virtual offset of data cell */
555  uint32_t data_off;
556
557  /** Value's data type */
[193]558  REGFI_DATA_TYPE type;
[169]559
560  /** VK record's magic number (should be "vk") */
[168]561  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
[169]562
563  /** VK record flags */
[168]564  uint16_t flags;
[169]565
566  /* XXX: A 2-byte field of unknown purpose stored in the VK record */
[168]567  uint16_t unknown1;
[169]568
569  /** Whether or not the data record is stored in the VK record's data_off field.
570   *
571   * This information is derived from the high bit of the raw data size field.
572   */
573  bool     data_in_offset;
[206]574
575  /* XXX: deprecated */
576  REGFI_DATA* data;
577
[203]578} REGFI_VK;
[30]579
580
581/* Key Security */
[206]582struct _regfi_sk;
[30]583
[169]584/** Security structure
585 * @ingroup regfiBase
586 */
[206]587typedef struct _regfi_sk
[97]588{
[169]589  /** Real file offset of this record */
590  uint32_t offset;
[111]591
[169]592  /** ((start_offset - end_offset) & 0xfffffff8) */
593  uint32_t cell_size;
594
595  /** The stored Windows security descriptor for this SK record */
[134]596  WINSEC_DESC* sec_desc;
[169]597
598  /** Offset of this record from beginning of this hbin block */
599  uint32_t hbin_off;
[53]600 
[169]601  /** Offset of the previous SK record in the linked list of SK records */
[168]602  uint32_t prev_sk_off;
[169]603
604  /** Offset of the next SK record in the linked list of SK records */
[168]605  uint32_t next_sk_off;
[169]606
607  /** Number of keys referencing this SK record */
[168]608  uint32_t ref_count;
[169]609
610  /** Size of security descriptor (sec_desc) */
611  uint32_t desc_size;
612
613  /* XXX: A 2-byte field of unknown purpose */
[168]614  uint16_t unknown_tag;
[169]615
616  /** The magic number for this record (should be "sk") */
[168]617  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
[203]618} REGFI_SK;
[30]619
[81]620
[169]621/** Key structure
622 * @ingroup regfiBase
623 */
[206]624typedef struct _regfi_nk
[97]625{
[169]626  /** Real offset of this record's cell in the file */
627  uint32_t offset;
[84]628
[169]629  /** Actual or estimated length of the cell. 
630   * Always in multiples of 8.
631   */
632  uint32_t cell_size;
633
634  /** Preloaded value-list for this key.
635   * This element is loaded automatically when using the iterator interface and
636   * possibly some lower layer interfaces.
637   */
[145]638  REGFI_VALUE_LIST* values;
[169]639
640
641  /** Preloaded subkey-list for this key.
642   * This element is loaded automatically when using the iterator interface and
643   * possibly some lower layer interfaces.
644   */
[135]645  REGFI_SUBKEY_LIST* subkeys;
[53]646 
[169]647  /** Key flags */
[168]648  uint16_t flags;
[169]649
650  /** Magic number of key (should be "nk") */
[168]651  uint8_t  magic[REGFI_CELL_MAGIC_SIZE];
[169]652
653  /** Key's last modification time */
[168]654  REGFI_NTTIME mtime;
[169]655
[249]656  /** Length of name_raw */
[168]657  uint16_t name_length;
[169]658
659  /** Length of referenced classname */
[168]660  uint16_t classname_length;
[169]661
662  /** The name of this key converted to desired REGFI_ENCODING. 
663   *
664   * This conversion typically occurs automatically through REGFI_ITERATOR
665   * settings.  String is NUL terminated.
666   */
[206]667  char* name;
[169]668
669  /** The raw key name
670   *
671   * Length of the buffer is stored in name_length.
672   */
[206]673  uint8_t* name_raw;
[169]674
[215]675  /** Virtual offset of parent key */
[169]676  uint32_t parent_off;
677
[215]678  /** Virtual offset of classname key */
[168]679  uint32_t classname_off;
[53]680 
[169]681  /* XXX: max subkey name * 2 */
682  uint32_t max_bytes_subkeyname;
683
684  /* XXX: max subkey classname length (as if) */
685  uint32_t max_bytes_subkeyclassname;
686
[206]687  /* XXX: max value name * 2 */
[169]688  uint32_t max_bytes_valuename;
689
690  /* XXX: max value data size */
691  uint32_t max_bytes_value;
[53]692 
[169]693  /* XXX: Fields of unknown purpose */
[168]694  uint32_t unknown1;
695  uint32_t unknown2;
696  uint32_t unknown3;
697  uint32_t unk_index;               /* nigel says run time index ? */
[53]698 
[169]699  /** Number of subkeys */
[168]700  uint32_t num_subkeys;
[169]701
702  /** Virtual offset of subkey-list */
703  uint32_t subkeys_off;
704
705  /** Number of values for this key */
[168]706  uint32_t num_values;
[169]707
708  /** Virtual offset of value-list */
709  uint32_t values_off;
710
711  /** Virtual offset of SK record */
712  uint32_t sk_off;
[203]713} REGFI_NK;
[30]714
[81]715
[178]716typedef struct _regfi_raw_file
717{
[226]718  int64_t  (* seek)(); /* (REGFI_RAW_FILE* self, uint64_t offset, int whence) */
[178]719  ssize_t  (* read)(); /* (REGFI_RAW_FILE* self, void* buf, size_t count) */
[97]720
[178]721  uint64_t cur_off;
722  uint64_t size;
723  void*    state;
724} REGFI_RAW_FILE;
725
726
[169]727/** Registry hive file data structure
728 *
729 * This essential structure stores run-time information about a single open
730 * registry hive as well as file header (REGF block) data.  This structure
731 * also stores a list of warnings and error messages generated while parsing
[238]732 * the registry hive.  These can be tuned using @ref regfi_log_set_mask. 
[202]733 * Messages may be retrieved using @ref regfi_log_get_str.
[169]734 *
735 * @note If the message mask is set to record any messages, dependent code
[202]736 *       must use @ref regfi_log_get_str periodically to clear the message
[169]737 *       queue. Otherwise, this structure will grow in size over time as
738 *       messages queue up.
739 *
740 * @ingroup regfiBase
741 */ 
[178]742typedef struct _regfi_file
[97]743{
[135]744  /* Data parsed from file header */
745  /********************************/
[168]746  uint8_t  magic[REGFI_REGF_MAGIC_SIZE];/* "regf" */
[151]747
748 /* These sequence numbers should match if
749  * the hive was properly synced to disk.
750  */
[168]751  uint32_t sequence1;           
752  uint32_t sequence2;
[151]753
[168]754  REGFI_NTTIME mtime;
755  uint32_t major_version;  /* Set to 1 in all known hives */
756  uint32_t minor_version;  /* Set to 3 or 5 in all known hives */
757  uint32_t type;           /* XXX: Unverified.  Set to 0 in all known hives */
758  uint32_t format;         /* XXX: Unverified.  Set to 1 in all known hives */
[97]759
[168]760  uint32_t root_cell;  /* Offset to root cell in the first (or any?) hbin block */
761  uint32_t last_block; /* Offset to last hbin block in file */
[151]762
[168]763  uint32_t cluster;    /* XXX: Unverified. Set to 1 in all known hives */
[151]764
765  /* Matches hive's base file name. Stored in UTF-16LE */
[168]766  uint8_t file_name[REGFI_REGF_NAME_SIZE];
[151]767
768  WINSEC_UUID* rm_id;       /* XXX: Unverified. */
769  WINSEC_UUID* log_id;      /* XXX: Unverified. */
770  WINSEC_UUID* tm_id;       /* XXX: Unverified. */
[168]771  uint32_t flags;             /* XXX: Unverified. */
772  uint32_t guid_signature;    /* XXX: Unverified. */
[151]773
[168]774  uint32_t checksum;          /* Stored checksum from file */
775  uint32_t computed_checksum; /* Our own calculation of the checksum.
[151]776                             * (XOR of bytes 0x0000 - 0x01FB) */
777
778  WINSEC_UUID* thaw_tm_id;  /* XXX: Unverified. */
779  WINSEC_UUID* thaw_rm_id;  /* XXX: Unverified. */
780  WINSEC_UUID* thaw_log_id; /* XXX: Unverified. */
[168]781  uint32_t boot_type;         /* XXX: Unverified. */
782  uint32_t boot_recover;      /* XXX: Unverified. */
[151]783
784  /* This seems to include random junk.  Possibly unsanitized memory left over
785   * from when header block was written.  For instance, chunks of nk records
786   * can be found, though often it's all 0s. */
[168]787  uint8_t reserved1[REGFI_REGF_RESERVED1_SIZE];
[151]788
789  /* This is likely reserved and unusued currently.  (Should be all 0s.)
790   * Included here for easier access in looking for hidden data
791   * or doing research. */
[168]792  uint8_t reserved2[REGFI_REGF_RESERVED2_SIZE];
[151]793
[203]794
795  /* Run-time information */
796  /************************/
[206]797  /* For sanity checking (not part of the registry header) */
798  uint32_t file_length;
799
800  /** The encoding that all strings are converted to during interpretation.
801   */
802  REGFI_ENCODING string_encoding;
803
[203]804  /* Functions for accessing the file */
805  REGFI_RAW_FILE* cb;
806
807  /* Mutex for all cb access.  This is done to prevent one thread from moving
808   * the file offset while another thread is in the middle of a multi-read
809   * parsing transaction */
810  pthread_mutex_t cb_lock;
811
812  /* Metadata about hbins */
813  range_list* hbins;
814
815  /* Multiple read access allowed, write access is exclusive */
816  pthread_rwlock_t hbins_lock;
817
[250]818  /* Small number of SK records cached */
[203]819  lru_cache* sk_cache;
820
821  /* Need exclusive access for LRUs, since lookups make changes */
822  pthread_mutex_t sk_lock;
823
[250]824  /* Limited number of keys cached */
825  lru_cache* nk_cache;
826
827  /* Need exclusive access for LRUs, since lookups make changes */
828  pthread_mutex_t nk_lock;
829
[228]830  /* Needed to protect various talloc calls */
831  pthread_mutex_t mem_lock;
832
[135]833} REGFI_FILE;
[30]834
835
[249]836typedef struct _regfi_iter_position
837{
838  /* key offset */
839  uint32_t offset;
840
841  /* Index of the current subkey */
842  uint32_t cur_subkey;
843
844  /* Index of the current value */
845  uint32_t cur_value;
846
847  /* The number of subkeys of this key */
848  uint32_t num_subkeys;
849
850  /* The number of values of this key */
851  uint32_t num_values;
852
853} REGFI_ITER_POSITION;
854
855
[169]856/** Registry hive iterator
857 * @ingroup regfiIteratorLayer
858 */
[151]859typedef struct _regfi_iterator
[97]860{
[169]861  /** The registry hive this iterator is associated with */
[135]862  REGFI_FILE* f;
[169]863
864  /** All current parent keys and associated iterator positions */
[80]865  void_stack* key_positions;
[169]866
[249]867  REGFI_ITER_POSITION* cur;
[78]868} REGFI_ITERATOR;
869
[80]870
871
[169]872/** General purpose buffer with stored length
873 * @ingroup regfiBottomLayer
874 */
[151]875typedef struct _regfi_buffer
876{
[168]877  uint8_t* buf;
[151]878  uint32_t len;
879} REGFI_BUFFER;
880
881
[169]882
[54]883/******************************************************************************/
[168]884/**
[169]885 * @defgroup regfiBase Base Layer: Essential Functions and Data Structures
[168]886 *
[169]887 * These functions are either necessary for normal use of the regfi API or just
888 * don't fit particularly well in any of the other layers.
[168]889 */
[135]890/******************************************************************************/
[166]891
[233]892
[238]893
[233]894/** Returns the current regfi library version
895 *
896 * @return A string indicating the version.
897 *
898 * @ingroup regfiBase
899 */
[238]900_EXPORT()
[233]901const char* regfi_version();
902
903
[168]904/** Parses file headers of an already open registry hive file and
905 *  allocates related structures for further parsing.
[166]906 *
[168]907 * @param fd A file descriptor of an already open file.  Must be seekable.
[166]908 *
[168]909 * @return A reference to a newly allocated REGFI_FILE structure, if successful;
[184]910 *         NULL on error.  Use regfi_free to free the returned REGFI_FILE.
[168]911 *
912 * @ingroup regfiBase
[166]913 */
[238]914_EXPORT()
[206]915REGFI_FILE* regfi_alloc(int fd, REGFI_ENCODING output_encoding);
[166]916
917
[178]918/** Parses file headers returned by supplied callback functions.
[166]919 *
[178]920 * This interface is useful if you have a registry hive in memory
921 * or have some other reason to emulate a real file.
[166]922 *
[178]923 * @param file_cb A structure defining the callback functions needed to access the file.
[168]924 *
[178]925 * @return A reference to a newly allocated REGFI_FILE structure, if successful;
[184]926 *         NULL on error.  Use regfi_free to free the returned REGFI_FILE.
[178]927 *
[168]928 * @ingroup regfiBase
[166]929 */
[238]930_EXPORT()
[206]931REGFI_FILE* regfi_alloc_cb(REGFI_RAW_FILE* file_cb,
932                           REGFI_ENCODING output_encoding);
[166]933
934
[168]935/** Frees a hive's data structures without closing the underlying file.
[166]936 *
[168]937 * @param file The registry structure to free.
938 *
939 * @ingroup regfiBase
[166]940 */
[238]941_EXPORT()
[201]942void regfi_free(REGFI_FILE* file);
[166]943
944
[168]945/** Get errors, warnings, and/or verbose information relating to processing of
946 *  the given registry file.
[135]947 *
[168]948 * @return A newly allocated char* which must be free()d by the caller.
949 *
950 * @ingroup regfiBase
[135]951 */
[238]952_EXPORT()
[182]953char* regfi_log_get_str();
[159]954
[166]955
[185]956/** Set the verbosity level of messages generated by the library for the
957 *  current thread.
[166]958 *
[185]959 * @param mask   An integer representing the types of messages desired.
[166]960 *               Acceptable values are created through bitwise ORs of
[185]961 *               REGFI_LOG_* values.  For instance, if only errors and
[166]962 *               informational messages were desired (but not warnings),
[185]963 *               then one would specify: REGFI_LOG_ERROR|REGFI_LOG_INFO
964 *               By default the message mask is: REGFI_LOG_ERROR|REGFI_LOG_WARN.
[166]965 *
[185]966 * @return       true on success and false on failure.  Failure occurs if
967 *               underlying pthread functions fail.  errno is set in this case.
[182]968 *
[185]969 * Message masks are set in a thread-specific way.  If one were to set a message
970 * mask in one thread and then spawn a new thread, then the new thread will have
971 * it's message mask reset to the default.  This function may be called at any
972 * time and will take effect immediately for the current thread.
[182]973 *
[185]974 * @note When a non-zero message mask is set, messages will
975 *       accumulate in memory without limit if they are not fetched using
976 *       @ref regfi_get_log_str and subsequently freed by the caller.  It is
977 *       recommended that messsages be fetched after each regfi API call in
978 *       order to provide the most context.
979 *
[182]980 * @ingroup regfiBase
981 */
[238]982_EXPORT()
[185]983bool regfi_log_set_mask(uint16_t mask);
[182]984
985
[215]986/** Fetches a hive's root key.
987 *
988 * @return Returns the root key or NULL on failure.  Key must be freed using
989 *         @ref regfi_free_record.
990 *
991 * @ingroup regfiBase
992 */
[238]993_EXPORT()
[215]994const REGFI_NK*       regfi_get_rootkey(REGFI_FILE* file);
[168]995
[215]996
[184]997/** Frees a record previously returned by one of the API functions.
[159]998 *
[228]999 * @param file The file from which the record originated. 
1000 *             (This is needed for memory management reasons.)
1001 *
1002 * @param record Any of the following record types: REGFI_NK, REGFI_VK,
1003 *        REGFI_SK, REGFI_DATA, and REGFI_CLASSNAME records.
[159]1004 *
[228]1005 * @note The "const" in the record data type is a bit misleading and is there just for
[184]1006 * convenience.  Since records returned previously must not be modified by users
1007 * of the API due to internal caching, these are returned as const, so this
[215]1008 * function is const to make passing those records back easy.
[168]1009 *
1010 * @ingroup regfiBase
1011 */
[238]1012_EXPORT()
[228]1013void regfi_free_record(REGFI_FILE* file, const void* record);
[168]1014
1015
[224]1016/** Increments reference count on record
1017 *
1018 * Adds an extra internal reference to specified record, making it necessary to
1019 * call regfi_free_record on it an additional time before it is freed.  This is
1020 * useful in cases where multiple threads/structures need access to a record,
1021 * without requiring them to be in sync with when it is freed.
1022 *
[228]1023 * @param file The file from which the record originated. 
1024 *             (This is needed for memory management reasons.)
1025 *
1026 * @param record Any of the following record types: REGFI_NK, REGFI_VK,
1027 *        REGFI_SK, REGFI_DATA, and REGFI_CLASSNAME records.
[224]1028 *
1029 * @return true on success, false otherwise
1030 *
1031 * @ingroup regfiBase
1032 */
[238]1033_EXPORT()
[228]1034bool regfi_reference_record(REGFI_FILE* file, const void* record);
[224]1035
1036
[207]1037/** Retrieves number of subkeys referenced by this key.
1038 *
1039 * Number of subkeyss in key structure and subkey list structure could differ,
1040 * so this provides a standard/sane way of determining the number.
1041 *
1042 * @param key  the key whose number of subkeys is desired
1043 *
1044 * @return Returns the number of subkeys referenced by this key.
1045 *
1046 * @ingroup regfiBase
1047 */
[238]1048_EXPORT()
[207]1049uint32_t regfi_fetch_num_subkeys(const REGFI_NK* key);
1050
1051
1052/** Retrieves number of values referenced by this key.
1053 *
1054 * Number of values in key structure and value list structure could differ,
1055 * so this provides a standard/sane way of determining the number.
1056 *
1057 * @param key  the key whose number of values is desired
1058 *
1059 * @return Returns the number of values referenced by this key.
1060 *
1061 * @ingroup regfiBase
1062 */
[238]1063_EXPORT()
[207]1064uint32_t regfi_fetch_num_values(const REGFI_NK* key);
1065
1066
[206]1067/** Retrieves classname for a given key.
1068 *
1069 * @param file the file from which key is derived
1070 * @param key the key whose classname is desired
1071 *
1072 * @return Returns a newly allocated classname structure, or NULL on failure.
1073 *         Classname structures must be freed with @ref regfi_free_record.
1074 *
1075 * @ingroup regfiBase
1076 */
[238]1077_EXPORT()
[206]1078const REGFI_CLASSNAME* regfi_fetch_classname(REGFI_FILE* file, 
1079                                             const REGFI_NK* key);
1080
1081
1082/** Returns the SK (security) record referenced by the supplied key.
1083 *
1084 * @param file the file from which key is derived
1085 * @param key  the key whose SK record is desired
1086 *
1087 * @return A read-only SK structure, or NULL on failure.
1088 *
1089 * @ingroup regfiBase
1090 */
[238]1091_EXPORT()
[206]1092const REGFI_SK* regfi_fetch_sk(REGFI_FILE* file, const REGFI_NK* key);
1093
1094
1095/** Retrieves data for a given value.
1096 *
1097 * @param file the file from which value is derived
1098 * @param value the value whose data is desired
1099 *
1100 * @return Returns a newly allocated data structure, or NULL on failure.
1101 *         Data structures must be freed with @ref regfi_free_record.
1102 *
1103 * @ingroup regfiBase
1104 */
[238]1105_EXPORT()
[206]1106const REGFI_DATA* regfi_fetch_data(REGFI_FILE* file,
1107                                   const REGFI_VK* value);
1108
1109
[207]1110/** Locates a specific subkey of a given key.
1111 *
1112 * @param file  the file from which key is derived
1113 * @param key   the key whose subkey is desired
1114 * @param name  name of the desired subkey
1115 * @param index a return value: the index of the desired subkey.
1116 *              undefined on error
1117 *
1118 * @return true if the subkey is found, false if an error occurred or if the
1119 *         specified name could not be found. If an error occurs, messages
1120 *         will be written explaining the issue. (See regfi_log_get_str.)
1121 *
1122 * @ingroup regfiBase
1123 */
[238]1124_EXPORT()
[207]1125bool regfi_find_subkey(REGFI_FILE* file, const REGFI_NK* key, 
1126                       const char* name, uint32_t* index);
1127
1128
1129/** Locates a specific value of a given key.
1130 *
1131 * @param file  the file from which key is derived
1132 * @param key   the key whose value is desired
1133 * @param name  name of the desired value
1134 * @param index a return value: the index of the desired value. 
1135 *              undefined on error
1136 *
1137 * @return true if the value is found, false if an error occurred or if the
1138 *         specified name could not be found. If an error occurs, messages
1139 *         will be written explaining the issue. (See regfi_log_get_str.)
1140 *
1141 * @ingroup regfiBase
1142 */
[238]1143_EXPORT()
[207]1144bool regfi_find_value(REGFI_FILE* file, const REGFI_NK* key,
1145                      const char* name, uint32_t* index);
1146
1147
1148/** Retrieves a specific subkey of a given key.
1149 *
1150 * @param file  the file from which key is derived
1151 * @param key   the key whose subkey is desired
1152 * @param index the index of the desired subkey
1153 *
1154 * @return the requested subkey or NULL on error.
1155 *
1156 * @ingroup regfiBase
1157 */
[238]1158_EXPORT()
[207]1159const REGFI_NK* regfi_get_subkey(REGFI_FILE* file, const REGFI_NK* key, 
1160                                 uint32_t index);
1161
1162
1163/** Retrieves a specific value of a given key.
1164 *
1165 * @param file  the file from which key is derived
1166 * @param key   the key whose value is desired
1167 * @param index the index of the desired value
1168 *
1169 * @return the requested value or NULL on error.
1170 *
1171 * @ingroup regfiBase
1172 */
[238]1173_EXPORT()
[207]1174const REGFI_VK* regfi_get_value(REGFI_FILE* file, const REGFI_NK* key, 
1175                                uint32_t index);
1176
1177
1178
[215]1179/** Uses a key's parent_off reference to retrieve it's parent.
1180 *
1181 * @param file  the file from which key is derived
1182 * @param key   the key whose parent is desired
1183 *
1184 * @return the requested subkey or NULL on error.
1185 *
1186 * @ingroup regfiBase
1187 */
[238]1188_EXPORT()
[215]1189const REGFI_NK* regfi_get_parentkey(REGFI_FILE* file, const REGFI_NK* key);
1190
1191
[168]1192/******************************************************************************/
1193/**
[169]1194 * @defgroup regfiIteratorLayer Iterator Layer: Primary regfi Library Interface
[168]1195 *
1196 * This top layer of API functions provides an iterator interface which makes
1197 * traversing registry data structures easy in both single-threaded and
1198 * multi-threaded scenarios.
1199 */
1200/******************************************************************************/
1201
1202/** Creates a new iterator for the provided registry file.
1203 *
1204 * @param file The opened registry file the iterator should be created for.
1205 *
1206 * @param output_encoding Character encoding that strings should be returned in.
1207 *                        Only supply the REGFI_ENCODING_* constants, as others
1208 *                        will be rejected.
1209 *                        The following values are currently accepted:
1210 *                        REGFI_ENCODING_DEFAULT (currently REGFI_ENCODING_ASCII)
1211 *                        REGFI_ENCODING_ASCII
1212 *                        REGFI_ENCODING_UTF8
1213 *
1214 * @return A newly allocated REGFI_ITERATOR.
1215 *         Must be free()d with regfi_iterator_free.
1216 *
[169]1217 * @ingroup regfiIteratorLayer
[168]1218 */
[238]1219_EXPORT()
[206]1220REGFI_ITERATOR* regfi_iterator_new(REGFI_FILE* file);
[166]1221
1222
[168]1223/** Frees a registry file iterator previously created by regfi_iterator_new.
[166]1224 *
1225 * This does not affect the underlying registry file's allocation status.
1226 *
[168]1227 * @param i the iterator to be freed
1228 *
[169]1229 * @ingroup regfiIteratorLayer
[166]1230 */
[238]1231_EXPORT()
[201]1232void regfi_iterator_free(REGFI_ITERATOR* i);
[166]1233
1234
[168]1235/** Traverse deeper into the registry tree at the current subkey.
[166]1236 *
[168]1237 * @param i the iterator
[166]1238 *
[168]1239 * @return  true on success, false on failure. 
1240 *          Note that subkey and value indexes are preserved.  That is, if a
1241 *          regfi_iterator_up call occurs later (reversing the effect of this
1242 *          call) then the subkey and value referenced prior to the
1243 *          regfi_iterator_down call will still be referenced.  This  makes
1244 *          depth-first iteration particularly easy.
1245 *
[169]1246 * @ingroup regfiIteratorLayer
[166]1247 */
[238]1248_EXPORT()
[201]1249bool regfi_iterator_down(REGFI_ITERATOR* i);
[166]1250
1251
[168]1252/** Traverse up to the current key's parent key.
[166]1253 *
[168]1254 * @param i the iterator
[166]1255 *
[168]1256 * @return  true on success, false on failure.  Any subkey or value state
1257 *          associated with the current key is lost.
1258 *
[169]1259 * @ingroup regfiIteratorLayer
[166]1260 */
[238]1261_EXPORT()
[201]1262bool regfi_iterator_up(REGFI_ITERATOR* i);
[166]1263
1264
[168]1265/** Traverse up to the root key of the hive.
[166]1266 *
[168]1267 * @param i the iterator
[166]1268 *
[168]1269 * @return true on success, false on failure.
1270 *
[169]1271 * @ingroup regfiIteratorLayer
[166]1272 */
[238]1273_EXPORT()
[201]1274bool regfi_iterator_to_root(REGFI_ITERATOR* i);
[30]1275
[166]1276
[168]1277/** Traverse down multiple levels in the registry hive.
[166]1278 *
1279 * XXX: This currently only accepts ASCII key names.  Need to look into
1280 *      accepting other encodings.
1281 *
[168]1282 * @param i    the iterator
1283 * @param path a list of key names representing the path.  This list must
1284 *             contain NUL terminated strings.  The list itself is
1285 *             terminated with a NULL pointer.  All path elements must be
1286 *             keys; value names are not accepted (even as the last
1287 *             element).
1288 *
1289 * @return true on success, false on failure.  If any element of path is not
1290 *                 found, false will be returned and the iterator will remain
1291 *                 in its original position.
1292 *
[169]1293 * @ingroup regfiIteratorLayer
[166]1294 */
[238]1295_EXPORT()
[168]1296bool regfi_iterator_walk_path(REGFI_ITERATOR* i, const char** path);
[166]1297
1298
[168]1299/** Returns the currently referenced key.
[166]1300 *
[168]1301 * @param i the iterator
[166]1302 *
[168]1303 * @return A read-only key structure for the current key, or NULL on failure.
[221]1304 *         Data structures must be freed with @ref regfi_free_record.
[168]1305 *
[169]1306 * @ingroup regfiIteratorLayer
[166]1307 */
[238]1308_EXPORT()
[203]1309const REGFI_NK* regfi_iterator_cur_key(REGFI_ITERATOR* i);
[166]1310
1311
[168]1312/** Sets the internal subkey index to the first subkey referenced by the current
[200]1313 *  key.
[166]1314 *
[168]1315 * @param i the iterator
[166]1316 *
[200]1317 * @return True if the current key has any subkeys, false otherwise.
[168]1318 *
[169]1319 * @ingroup regfiIteratorLayer
[166]1320 */
[238]1321_EXPORT()
[199]1322bool regfi_iterator_first_subkey(REGFI_ITERATOR* i);
[166]1323
1324
[168]1325/** Returns the currently indexed subkey.
[166]1326 *
[168]1327 * @param i the iterator
[166]1328 *
[168]1329 * @return A newly allocated key structure for the currently referenced subkey,
1330 *         or NULL on failure.  Newly allocated keys must be freed with
[185]1331 *         @ref regfi_free_record.
[168]1332 *
[169]1333 * @ingroup regfiIteratorLayer
[166]1334 */
[238]1335_EXPORT()
[203]1336const REGFI_NK* regfi_iterator_cur_subkey(REGFI_ITERATOR* i);
[167]1337
1338
[200]1339/** Increments the internal subkey index to the next key in the subkey-list.
[167]1340 *
[168]1341 * @param i the iterator
[167]1342 *
[200]1343 * @return True if another subkey should exist, false otherwise.
[168]1344 *
[169]1345 * @ingroup regfiIteratorLayer
[167]1346 */
[238]1347_EXPORT()
[199]1348bool regfi_iterator_next_subkey(REGFI_ITERATOR* i);
[167]1349
1350
[168]1351/** Searches for a subkey with a given name under the current key.
[167]1352 *
[207]1353 * @param i     the iterator
1354 * @param name  subkey name to search for
[167]1355 *
[168]1356 * @return True if such a subkey was found, false otherwise.  If a subkey is
1357 *         found, the current subkey index is set to that subkey.  Otherwise,
1358 *         the subkey index remains at the same location as before the call.
1359 *
[169]1360 * @ingroup regfiIteratorLayer
[167]1361 */
[238]1362_EXPORT()
[207]1363bool regfi_iterator_find_subkey(REGFI_ITERATOR* i, const char* name);
[150]1364
[184]1365
[168]1366/** Sets the internal value index to the first value referenced by the current
[200]1367 *  key.
[167]1368 *
[168]1369 * @param i the iterator
[167]1370 *
[200]1371 * @return True if the current key has any values, false otherwise.
[168]1372 *
[169]1373 * @ingroup regfiIteratorLayer
[167]1374 */
[238]1375_EXPORT()
[199]1376bool regfi_iterator_first_value(REGFI_ITERATOR* i);
[167]1377
1378
[168]1379/** Returns the currently indexed value.
[167]1380 *
[168]1381 * @param i the iterator
[167]1382 *
[168]1383 * @return A newly allocated value structure for the currently referenced value,
1384 *         or NULL on failure.  Newly allocated values must be freed with
[185]1385 *         @ref regfi_free_record.
[168]1386 *
[169]1387 * @ingroup regfiIteratorLayer
[167]1388 */
[238]1389_EXPORT()
[203]1390const REGFI_VK* regfi_iterator_cur_value(REGFI_ITERATOR* i);
[167]1391
1392
[200]1393/** Increments the internal value index to the next value in the value-list.
[167]1394 *
[168]1395 * @param i the iterator
[167]1396 *
[200]1397 * @return True if another value should exist, false otherwise.
[168]1398 *
[169]1399 * @ingroup regfiIteratorLayer
[167]1400 */
[238]1401_EXPORT()
[199]1402bool regfi_iterator_next_value(REGFI_ITERATOR* i);
[167]1403
1404
[168]1405/** Searches for a value with a given name under the current key.
[167]1406 *
[207]1407 * @param i     the iterator
1408 * @param name  value name to search for
[167]1409 *
[168]1410 * @return True if such a value was found, false otherwise.  If a value is
1411 *         found, the current value index is set to that value.  Otherwise,
1412 *         the value index remains at the same location as before the call.
1413 *
[169]1414 * @ingroup regfiIteratorLayer
[167]1415 */
[238]1416_EXPORT()
[207]1417bool regfi_iterator_find_value(REGFI_ITERATOR* i, const char* name);
[80]1418
[167]1419
[249]1420/** Returns the full path where the iterator is currently located as a list
1421 *  of NK records
1422 *
1423 * @param i     the iterator
1424 *
1425 * @return An array of NK record pointers terminated by a NULL pointer. 
1426 *         This array may be passed directly to regfi_free_record to free
1427 *         the entire array. 
1428 *
1429 * @note In order to use an element of the array independently from the
1430 *       array (that is, to hold a pointer to an individual NK record while
1431 *       freeing the remaining array), callers must first use
1432 *       regfi_reference_record on the elements to be kept.
1433 *
1434 * @ingroup regfiIteratorLayer
1435 */
1436_EXPORT()
1437const REGFI_NK** regfi_iterator_cur_path(REGFI_ITERATOR* i);
1438
1439
[168]1440/******************************************************************************/
1441/**
[169]1442 * @defgroup regfiGlueLayer Glue Layer: Logical Data Structure Loading
[168]1443 */
1444/******************************************************************************/
1445
[215]1446/** Loads a key and associated data structures given a file offset.
[168]1447 *
1448 * XXX: finish documenting
1449 *
[169]1450 * @ingroup regfiGlueLayer
[168]1451 */
[238]1452_EXPORT()
[203]1453REGFI_NK* regfi_load_key(REGFI_FILE* file, uint32_t offset, 
[215]1454                         REGFI_ENCODING output_encoding, 
1455                         bool strict);
[168]1456
1457
1458/** Loads a value at a given file offset alng with associated data structures.
1459 *
1460 * XXX: finish documenting
1461 *
[169]1462 * @ingroup regfiGlueLayer
[168]1463 */
[238]1464_EXPORT()
[203]1465REGFI_VK* regfi_load_value(REGFI_FILE* file, uint32_t offset, 
[201]1466                               REGFI_ENCODING output_encoding, 
1467                               bool strict);
[168]1468
1469
1470/** Loads a logical subkey list in its entirety which may span multiple records.
1471 *
1472 * XXX: finish documenting
1473 *
[169]1474 * @ingroup regfiGlueLayer
[168]1475 */
[238]1476_EXPORT()
[201]1477REGFI_SUBKEY_LIST* regfi_load_subkeylist(REGFI_FILE* file, uint32_t offset,
1478                                         uint32_t num_keys, uint32_t max_size,
1479                                         bool strict);
[168]1480
1481
1482/** Loads a valuelist.
1483 *
1484 * XXX: finish documenting
1485 *
[169]1486 * @ingroup regfiGlueLayer
[168]1487 */
[238]1488_EXPORT()
[201]1489REGFI_VALUE_LIST* regfi_load_valuelist(REGFI_FILE* file, uint32_t offset, 
1490                                       uint32_t num_values, uint32_t max_size,
1491                                       bool strict);
[127]1492
[168]1493
1494/** Loads a data record which may be contained in the virtual offset, in a
1495 *  single cell, or in multiple cells through big data records.
1496 *
1497 * XXX: finish documenting
1498 *
[169]1499 * @ingroup regfiGlueLayer
[168]1500 */
[238]1501_EXPORT()
[201]1502REGFI_BUFFER regfi_load_data(REGFI_FILE* file, uint32_t voffset,
1503                             uint32_t length, bool data_in_offset,
1504                             bool strict);
[157]1505
[168]1506
1507/** Loads the data associated with a big data record at the specified offset.
1508 *
1509 * XXX: finish documenting
1510 *
[169]1511 * @ingroup regfiGlueLayer
[168]1512 */
[238]1513_EXPORT()
[201]1514REGFI_BUFFER regfi_load_big_data(REGFI_FILE* file, uint32_t offset, 
1515                                 uint32_t data_length,uint32_t cell_length,
1516                                 range_list* used_ranges,
1517                                 bool strict);
[168]1518
1519
1520/** Given raw data, attempts to interpret the data based on a specified registry
1521 *  data type.
1522 *
1523 * XXX: finish documenting
1524 *
[169]1525 * @ingroup regfiGlueLayer
[168]1526 */
[238]1527_EXPORT()
[201]1528bool regfi_interpret_data(REGFI_FILE* file, 
1529                          REGFI_ENCODING string_encoding,
1530                          uint32_t type, REGFI_DATA* data);
[168]1531
1532
1533
[146]1534/* These are cached so return values don't need to be freed. */
[168]1535
1536/** Loads an "sk" security record at the specified offset.
1537 *
1538 * XXX: finish documenting
1539 *
[169]1540 * @ingroup regfiGlueLayer
[168]1541 */
[238]1542_EXPORT()
[203]1543const REGFI_SK* regfi_load_sk(REGFI_FILE* file, uint32_t offset,
[201]1544                                  bool strict);
[146]1545
1546
[206]1547
1548
[168]1549/** Retrieves the HBIN data structure stored at the specified offset.
1550 *
1551 * XXX: finish documenting
1552 *
[169]1553 * @ingroup regfiGlueLayer
[168]1554 */
[238]1555_EXPORT()
[201]1556const REGFI_HBIN* regfi_lookup_hbin(REGFI_FILE* file, uint32_t offset);
[168]1557
1558
1559
1560/******************************************************************************/
1561/**
[169]1562 * @defgroup regfiParseLayer Parsing Layer: Direct Data Structure Access
[168]1563 */
1564/******************************************************************************/
1565
[238]1566_EXPORT()
[201]1567REGFI_FILE* regfi_parse_regf(REGFI_RAW_FILE* file_cb, bool strict);
[80]1568
[238]1569_EXPORT()
[201]1570REGFI_HBIN* regfi_parse_hbin(REGFI_FILE* file, uint32_t offset, 
1571                             bool strict);
[99]1572
[201]1573
[168]1574/** Parses an NK record at the specified offset
[99]1575 *
[168]1576 * @param file     the registry file structure
1577 * @param offset   the offset of the cell (not the record) to be parsed.
1578 * @param max_size the maximum size the NK cell could be. (for validation)
1579 * @param strict   if true, rejects any malformed records.  Otherwise,
1580 *                 tries to minimally validate integrity.
1581 *
1582 * @return A newly allocated NK record structure, or NULL on failure.
1583 *
[169]1584 * @ingroup regfiParseLayer
[99]1585 */
[238]1586_EXPORT()
[203]1587REGFI_NK* regfi_parse_nk(REGFI_FILE* file, uint32_t offset,
[201]1588                             uint32_t max_size, bool strict);
[99]1589
[139]1590
[168]1591/** Parses a single cell containing a subkey-list record.
1592 *
1593 * XXX: finish documenting
1594 *
[169]1595 * @ingroup regfiParseLayer
[168]1596 */
[238]1597_EXPORT()
[201]1598REGFI_SUBKEY_LIST* regfi_parse_subkeylist(REGFI_FILE* file, uint32_t offset,
1599                                          uint32_t max_size, bool strict);
[103]1600
[111]1601
[168]1602/** Parses a VK (value) record at the specified offset
1603 *
1604 * XXX: finish documenting
1605 *
[169]1606 * @ingroup regfiParseLayer
[168]1607 */
[238]1608_EXPORT()
[203]1609REGFI_VK* regfi_parse_vk(REGFI_FILE* file, uint32_t offset, 
[201]1610                             uint32_t max_size, bool strict);
[168]1611
1612
1613/** Parses an SK (security) record at the specified offset
1614 *
1615 * XXX: finish documenting
1616 *
[169]1617 * @ingroup regfiParseLayer
[168]1618 */
[238]1619_EXPORT()
[203]1620REGFI_SK* regfi_parse_sk(REGFI_FILE* file, uint32_t offset, 
[201]1621                             uint32_t max_size, bool strict);
[168]1622
1623
1624/** Retrieves information on all cells in the registry hive which are
1625 *  currently in the unallocated status. 
1626 *
1627 * The unallocated status is determined based soley on the cell length sign.
1628 *
1629 * XXX: finish documenting
1630 *
[169]1631 * @ingroup regfiParseLayer
[168]1632 */
[238]1633_EXPORT()
[201]1634range_list* regfi_parse_unalloc_cells(REGFI_FILE* file);
[101]1635
[111]1636
[168]1637/** Helper function to parse a cell
1638 *
1639 * XXX: finish documenting
1640 *
[169]1641 * @ingroup regfiParseLayer
[168]1642 */
[238]1643_EXPORT()
[201]1644bool regfi_parse_cell(REGFI_RAW_FILE* file_cb, uint32_t offset,
1645                      uint8_t* hdr, uint32_t hdr_len,
1646                      uint32_t* cell_length, bool* unalloc);
[126]1647
[157]1648
[168]1649/** Parses a classname cell
1650 *
1651 * XXX: finish documenting
1652 *
[169]1653 * @ingroup regfiParseLayer
[168]1654 */
[238]1655_EXPORT()
[201]1656uint8_t* regfi_parse_classname(REGFI_FILE* file, uint32_t offset,
1657                               uint16_t* name_length, 
1658                               uint32_t max_size, bool strict);
[157]1659
1660
[168]1661/** Parses a single-cell data record
1662 *
1663 * XXX: finish documenting
1664 *
[169]1665 * @ingroup regfiParseLayer
[168]1666 */
[238]1667_EXPORT()
[201]1668REGFI_BUFFER regfi_parse_data(REGFI_FILE* file, uint32_t offset,
1669                              uint32_t length, bool strict);
[127]1670
[150]1671
[168]1672/** Parses a "little data" record which is stored entirely within the
1673 *  provided virtual offset.
1674 *
1675 * XXX: finish documenting
1676 *
[169]1677 * @ingroup regfiParseLayer
[168]1678 */
[238]1679_EXPORT()
[201]1680REGFI_BUFFER regfi_parse_little_data(REGFI_FILE* file, uint32_t voffset, 
1681                                     uint32_t length, bool strict);
[150]1682
[168]1683
1684/******************************************************************************/
[215]1685/*    Private (and undocumented) Functions                                    */
[168]1686/******************************************************************************/
[226]1687int64_t               regfi_raw_seek(REGFI_RAW_FILE* self, 
1688                                     uint64_t offset, int whence);
[178]1689ssize_t               regfi_raw_read(REGFI_RAW_FILE* self, 
1690                                     void* buf, size_t count);
[238]1691_EXPORT()
[226]1692uint64_t              regfi_seek(REGFI_RAW_FILE* file_cb, 
1693                                 uint64_t offset, int whence);
[238]1694_EXPORT()
[178]1695uint32_t              regfi_read(REGFI_RAW_FILE* file_cb, 
1696                                 uint8_t* buf, uint32_t* length);
1697
[238]1698_EXPORT()
[135]1699const char*           regfi_type_val2str(unsigned int val);
[238]1700_EXPORT()
[135]1701int                   regfi_type_str2val(const char* str);
[127]1702
[238]1703_EXPORT()
[135]1704char*                 regfi_get_sacl(WINSEC_DESC* sec_desc);
[238]1705_EXPORT()
[135]1706char*                 regfi_get_dacl(WINSEC_DESC* sec_desc);
[238]1707_EXPORT()
[135]1708char*                 regfi_get_owner(WINSEC_DESC* sec_desc);
[238]1709_EXPORT()
[135]1710char*                 regfi_get_group(WINSEC_DESC* sec_desc);
1711
[168]1712REGFI_SUBKEY_LIST*    regfi_merge_subkeylists(uint16_t num_lists, 
[135]1713                                              REGFI_SUBKEY_LIST** lists,
1714                                              bool strict);
[168]1715REGFI_SUBKEY_LIST*    regfi_load_subkeylist_aux(REGFI_FILE* file, uint32_t offset,
1716                                                uint32_t max_size, bool strict,
1717                                                uint8_t depth_left);
1718void                  regfi_add_message(REGFI_FILE* file, uint16_t msg_type, 
[138]1719                                        const char* fmt, ...);
[206]1720REGFI_NK*             regfi_copy_nk(const REGFI_NK* nk);
1721REGFI_VK*             regfi_copy_vk(const REGFI_VK* vk);
[238]1722_EXPORT()
[168]1723int32_t               regfi_calc_maxsize(REGFI_FILE* file, uint32_t offset);
1724int32_t               regfi_conv_charset(const char* input_charset, 
[161]1725                                         const char* output_charset,
[168]1726                                         uint8_t* input, char* output, 
1727                                         uint32_t input_len, uint32_t output_max);
[238]1728_EXPORT()
[159]1729REGFI_DATA*           regfi_buffer_to_data(REGFI_BUFFER raw_data);
[146]1730
[168]1731/* XXX: move to base API and document */
[238]1732_EXPORT()
[168]1733void                  regfi_unix2nt_time(REGFI_NTTIME* nt, time_t t);
[238]1734_EXPORT()
[219]1735double                regfi_nt2unix_time(const REGFI_NTTIME* nt);
[168]1736
1737
[238]1738_EXPORT()
[203]1739void regfi_interpret_keyname(REGFI_FILE* file, REGFI_NK* nk, 
[172]1740                             REGFI_ENCODING output_encoding, bool strict);
[238]1741_EXPORT()
[203]1742void regfi_interpret_valuename(REGFI_FILE* file, REGFI_VK* vk, 
[172]1743                               REGFI_ENCODING output_encoding, bool strict);
1744
[238]1745_EXPORT()
[202]1746void regfi_init();
[172]1747
[202]1748
[78]1749#endif  /* _REGFI_H */
Note: See TracBrowser for help on using the repository browser.