#ifndef GLOBALS_H
#define GLOBALS_H

//Use alpha to build axp version.  can use w/ internal or sb flags.  
//use sb or internal to build those specific versions.  Default is external.
//#define INTERNAL
//#define SB
//#define ALPHA
#define NOCHKUPGRD

#include <windows.h>
#include <dbt.h>
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include "cfgmgr32.h"
#include <objbase.h>
#include <objidl.h>
#include <shlobj.h>
#include <setupapi.h>
#include <tchar.h>
//#include <e:\root\dev\inc16\setupx.h>

//#define BRYANPARSE

//#define NOCREDE
//#define LOWORD(l)   ((WORD) (l)) 

#define ENUM_SUCCESS            0
#define ENUM_SIBLINGFAILURE     1
#define ENUM_CHILDFAILURE       2
#define ENUM_POSTFAILURE        3
#define ENUM_GENFAILURE         4

#define PLATFORM_9X 0
#define PLATFORM_NT4 1
#define PLATFORM_NT5 2

#define REG_SUCCESS TRUE
#define REG_FAILURE FALSE

#define SYSP_MAX_STR_LEN 1024

//#define szLogFile "c:\\windows\\desktop\\logger.csv"

BOOL LogString(char *szFile, char *szString, ...);
void DebugOutf(char *szFormat, ...);
int EnumerateDevices(DEVNODE dnDevNodeTraverse, int j, DEVNODE dnParentNode);
DWORD EnumerateClasses(ULONG ulIndex);
HRESULT ResolveIt(HWND hwnd, LPCSTR lpszLinkFile, LPSTR lpszPath);

DWORD GetClassDevs(CHAR *szClassName);
extern BOOL g_WalkStartMenu;
//BOOL WalkStartMenu;
//TCHAR g_WindowsDirectory[];

//HWND g_MainWindow;


class kLogFile
{
public:
   BOOL LogString(TCHAR *szString, ...);
   BOOL InitFile(TCHAR *szTempFile, TCHAR* szTempDir);
   kLogFile();
   ~kLogFile();
   TCHAR *szFile;
   BOOL StripCommas(TCHAR *szString);
   void ValidateString(PTCHAR pString, int dwLen);
   TCHAR *szLogDir;
private:
};

class kWin9xDevWalk
{
public:
   int Go();
   kLogFile *LogProc;
   kWin9xDevWalk(kLogFile *Proc);
   BOOL LoadResourceFile(PSTR FilePath,PSTR ResName);
   void AppendToLogFile(PTCHAR szFile);
   ~kWin9xDevWalk();
private:
};

class kNT5DevWalk
{
public:
   int Go();
   kLogFile *LogProc;
   kNT5DevWalk(kLogFile *Proc);
   BOOL LoadResourceFile(PSTR FilePath,PSTR ResName);
   void AppendToLogFile(PTCHAR szFile);
   ~kNT5DevWalk();
private:
};

/*
class kWin9xAppWalk
{
public:
   WORD wStartMenuLen;
   DWORD dwCurrentKey;
   HKEY hkeyRoot;
   BOOL bRegStat;
   char szRootKeyString[1024]; 
   BOOL Begin(WORD dwPlatform);
   BOOL NextKey(WORD wPlatform);
   BOOL Walk(WORD wPlatform);
   BOOL GetUninstallValues(WORD wPlatform, char* szName);
   kWin9xAppWalk(kLogFile *Proc, HWND hIn);
   kLogFile *LogProc;
   HWND hMainWnd;
   BOOL WalkDir(char *szTempPath, char *szFile);
   BOOL WalkStartMenu();
   HRESULT ResolveIt(LPCSTR lpszLinkFile, LPSTR lpszPath);
   BOOL EndsInLnk(char *szFile);
   void GetAppVer(LPSTR pszAppName);
private:
};
*/

class kNT5AppWalk
{
public:
   WORD wStartMenuLen;
   DWORD dwCurrentKey;
   HKEY hkeyRoot;
   BOOL bRegStat;
   char szRootKeyString[1024]; 
   BOOL Begin();
   BOOL NextKey();
   BOOL Walk();
   BOOL GetUninstallValues(char* szName);
   kNT5AppWalk(kLogFile *Proc, HWND hIn);
   kLogFile *LogProc;
   HWND hMainWnd;
   BOOL WalkDir(char *szTempPath, char *szFile);
   BOOL WalkStartMenu();
   HRESULT ResolveIt(LPCSTR lpszLinkFile, LPSTR lpszPath);
   BOOL EndsInLnk(char *szFile);
   void GetAppVer(LPSTR pszAppName);

//   BOOL GetNetStrings();
private:
};

class kNT5NetWalk
{
public:
   WORD wStartMenuLen;
   DWORD dwCurrentKey;
   DWORD dwLevel2Key;
   HKEY hkeyRoot;
   char szRootKeyString[1024]; 
   kLogFile *LogProc;
   HWND hMainWnd;

   kNT5NetWalk(kLogFile *Proc, HWND hIn);
   BOOL Begin();
   BOOL Walk();
   BOOL SearchSubKeys(char *szName);
   BOOL GetKeyValues(char* szName);
private:
};

class kNT4DevWalk
{
public:
   WORD wStartMenuLen;
   DWORD dwCurrentKey;
   DWORD dwLevel2Key;
   HKEY hkeyRoot;
   char szRootKeyString[1024]; 
   kLogFile *LogProc;
   HWND hMainWnd;

   kNT4DevWalk(kLogFile *Proc, HWND hIn);
   BOOL Begin();
   BOOL Walk();
   BOOL SearchSubKeys(char *szName);
   BOOL GetKeyValues(char* szName);
private:
};

typedef UINT (CALLBACK* LPFNDLLFUNC1)(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER);
typedef UINT (CALLBACK* LPFNDLLFUNC2)(LPTSTR, UINT);

class CLASS_GeneralAppWalk
{
public:
        BOOL OpenRegistry(void);
        BOOL GetUninstallValues(TCHAR *KeyName);
        BOOL NextKey(void);
        BOOL Walk(void);
        CLASS_GeneralAppWalk(kLogFile *LogProc, HWND hIn);
        BOOL WalkStartMenu(void);
        BOOL WalkDir(TCHAR *TempPath, TCHAR *File);
        BOOL EndsInLnk(TCHAR *File);
        HRESULT ResolveIt(LPCSTR LinkFile, LPSTR Path);
        BOOL GetAppVer(LPSTR AppName);
        BOOL GetCurrentWinDir(void);
        TCHAR g_WindowsDirectory[MAX_PATH];

private:
        HKEY HandleToUninstallKeyRoot;
        kLogFile *LogProc;
        HWND gHandleToMainWindow;
        DWORD CurrentKey;
        TCHAR RootKeyString[1024];
        WORD StartMenuLen;

};

typedef enum {
        Win95,
        Win98,
        NT4,
        Win2000,
        Whistler,
        Unknown
        } ENUM_OS_VERSION;



class CLASS_GeneralInfo
{
public:
        CLASS_GeneralInfo(kLogFile *LogProc, HWND hIn);
        void GetCurrentWindowsDirectory(void);
        void DetermineOS(void);
        BOOL InitLogFile(void);
        BOOL FillInArguments(void);
        BOOL DetermineArgumentValidity(void);
        void WriteVersions(void);
        void DetermineCommandLine(void);
        BOOL CopyInput(void);
        void GetUUID(void);
        void WriteArguments(void);
        void WriteFreeDiskSpace(void);
        void WriteVolumeType(void);
        void WriteMemorySize(void);
        void WriteOSVersion(void);

/*
        WriteDevices
        WriteApps
*/
        void InitHelpers(void);
        void AbuseOtherApps(void);
        BOOL Go(void);
        void ChangeSpaces(TCHAR *Input);
        BOOL ReadInFileInfo(TCHAR *FileName);
        void WriteGeneralInfo(void);
        BOOL AutoRun;
        BOOL RunMinimized;


private:
        HWND gHandleToMainWindow;
        kLogFile *LogProc;
        TCHAR WindowsDirectory[MAX_PATH]; //no trailing "\"
        ENUM_OS_VERSION OSVersion;
        TCHAR Corporation[1024];
        TCHAR Email[1024];
        TCHAR Manufacturer[1024];
        TCHAR Model[1024];
        TCHAR NumComp[1024];
        TCHAR SiteID[1024];
        WORD SiteIDIndex;
        TCHAR Profile[1024];
        TCHAR BetaID[1024];
        TCHAR MachineType[1024];
        WORD MachineTypeIndex;
        TCHAR OriginalMachineUUID[1024];
        TCHAR szRegFile[1024];
        TCHAR PlatformExtension[12];
        BOOL RunChkupgrd;
        BOOL RunDevdump;
        void CatLogFile(TCHAR *szFile);
        BOOL LoadResourceFile(PSTR FilePath,PSTR ResName);
        BOOL OverWrite;
        BOOL UseComputerName;

};


#endif //GLOBALS_H