#ifndef __DGRAPH_H__
#define __DGRAPH_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include <mach/mach.h>
#include <CoreFoundation/CoreFoundation.h>
typedef struct dgraph_entry_t {
char is_kernel_component;
char * filename;
unsigned int dependencies_capacity;
unsigned int num_dependencies;
struct dgraph_entry_t ** dependencies;
char * expected_kmod_name;
UInt32 expected_kmod_vers;
kmod_info_t * kmod_info;
int do_load; vm_address_t loaded_address;
vm_address_t kernel_alloc_address;
unsigned long kernel_alloc_size;
vm_address_t kernel_load_address;
unsigned long kernel_load_size;
unsigned long kernel_hdr_size;
unsigned long kernel_hdr_pad;
int need_cleanup; kmod_t kmod_id;
} dgraph_entry_t;
typedef struct {
unsigned int capacity;
unsigned int length;
dgraph_entry_t ** graph;
dgraph_entry_t ** load_order;
dgraph_entry_t * root;
} dgraph_t;
typedef enum {
dgraph_error = -1,
dgraph_invalid = 0,
dgraph_valid = 1
} dgraph_error_t;
dgraph_error_t dgraph_init(dgraph_t * dgraph);
dgraph_error_t dgraph_init_with_arglist(
dgraph_t * dgraph,
int expect_addresses,
const char * dependency_delimiter,
const char * kernel_dependency_delimiter,
int argc,
char * argv[]);
void dgraph_free(
dgraph_t * dgraph,
int free_graph);
dgraph_entry_t * dgraph_find_root(dgraph_t * dgraph);
int dgraph_establish_load_order(dgraph_t * dgraph);
void dgraph_verify(char * tag, dgraph_t * dgraph);
void dgraph_print(dgraph_t * dgraph);
void dgraph_log(dgraph_t * depgraph);
dgraph_entry_t * dgraph_find_dependent(dgraph_t * dgraph, const char * filename);
dgraph_entry_t * dgraph_add_dependent(
dgraph_t * dgraph,
const char * filename,
const char * expected_kmod_name,
UInt32 expected_kmod_vers,
vm_address_t load_address,
char is_kernel_component);
int dgraph_add_dependency(
dgraph_t * dgraph,
dgraph_entry_t * current_dependent,
const char * filename,
const char * expected_kmod_name,
UInt32 expected_kmod_vers,
vm_address_t load_address,
char is_kernel_component);
#ifdef __cplusplus
}
#endif
#endif __DGRAPH_H__