#define BUFFER_LEN         200
#define REG_STR_LEN        100
#define NUM_LOG_CONF_TYPES 4
#define MAX_STR_LEN        300

typedef DWORD NEXTRET;

#define NR_SUCCESS 0x00000000
#define NR_DONE    0x00000001  // no more configurations
#define NR_INVALID 0x00000002  // invalid previous configuration

//
// Structures
//

//
// Stores information about a device's resource descriptors
//
typedef struct _RES_DES_DATA
{
   struct _RES_DES_DATA *Next;
   struct _RES_DES_DATA *Prev;

   PMEM_RESOURCE pmresMEMResource;
   PIO_RESOURCE  piresIOResource;
   PDMA_RESOURCE pdresDMAResource;
   PIRQ_RESOURCE pqresIRQResource;
} RES_DES_DATA, *PRES_DES_DATA;


//
// Stores registry and resource information about a device
//
typedef struct _DEV_INFO
{
   struct _DEV_INFO *Next;
   struct _DEV_INFO *Prev;

   TCHAR szDevNodeID  [ MAX_PATH ];
   TCHAR szDescription[ MAX_PATH ];
   TCHAR szHardwareID [ MAX_PATH ];
   TCHAR szService    [ MAX_PATH ];
   TCHAR szClass      [ MAX_PATH ];
   TCHAR szManufacturer[ MAX_PATH ];
   TCHAR szConfigFlags [ MAX_PATH ];
   TCHAR szFriendlyName[ MAX_PATH ];

   PRES_DES_DATA prddForcedResDesData;
   PRES_DES_DATA prddAllocResDesData;
   PRES_DES_DATA prddBasicResDesData;
   PRES_DES_DATA prddBootResDesData;

   DEVNODE dnParent;

   RES_DES_DATA rddOrigConfiguration;
   BOOL boolSavedOrigConfiguration;

   BOOL boolConfigurable;
   BOOL boolDisabled;

} DEV_INFO, *PDEV_INFO;
void CollectDevData();

BOOL ParseEnumerator(IN PTCHAR szEnumBuffer);

BOOL GetDevNodeInfoAndCreateNewDevInfoNode(IN DEVNODE dnDevNode,
                                           IN PTCHAR  szDevNodeID,
                                           IN PTCHAR  szEnumBuffer);

BOOL CopyRegistryLine(IN DEVNODE   dnDevNode,
                      IN ULONG     ulPropertyType,
                      IN PDEV_INFO pdiDevInfo);

BOOL CopyRegDataToDevInfoNode(IN OUT PDEV_INFO pdiDevInfo,
                              IN     ULONG     ulPropertyType,
                              IN     PTCHAR    szRegData);


BOOL InitializeInfoNode(IN PDEV_INFO pdiDevInfo,
                        IN PTCHAR    szDevNodeID,
                        IN DEVNODE   dnDevNode);

void RecordFriendlyName(IN PDEV_INFO pdiDevInfo);

BOOL SaveAndDeletePreviousForcedLogConf(IN  LOG_CONF  lcLogConf,
                                        OUT PDEV_INFO pdiDevInfo);

BOOL GetResDesList(IN OUT PDEV_INFO pdiDevInfo,
                   IN     LOG_CONF  lcLogConf,
                   IN     ULONG     ulLogConfType);

BOOL ProcessResDesInfo(IN OUT PRES_DES_DATA prddResDesData,
                       IN     RES_DES       rdResDes,
                       IN     RESOURCEID    ridResourceID);

BOOL UpdateDeviceList();

void DeleteResDesDataNode(IN PRES_DES_DATA prddTmpResDes);

BOOL RecreateResDesList(IN OUT PDEV_INFO pdiTmpDevInfo,
                        IN     ULONG     ulLogConfType);

void Cleanup();