windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/buildhive/file.h

161 lines
3.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
file.h
Abstract:
Contains the input file abstraction
Author:
Mike Cirello
Vijay Jayaseelan (vijayj)
Revision History:
03 March 2001 :
Rewamp the whole source to make it more maintainable
(particularly readable)
--*/
#pragma once
#include "BuildHive.h"
#include "RegWriter.h"
#include <setupapi.hpp>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include "msg.h"
#include <libmsg.h>
using namespace std;
//
// Registry Mapper
//
class RegistryMapper {
public:
//
// member functions
//
void AddEntry(const std::wstring &Key, const std::wstring &Value);
void AddSection(Section<WCHAR> &MapSection);
bool GetMappedRegistry(const std::wstring &Key, std::wstring &Registry);
static void AddWorker(SectionValues<WCHAR> &Values, PVOID ContextData);
friend std::ostream& operator<<(std::ostream& os, RegistryMapper &rhs);
protected:
//
// data members
//
std::map< std::wstring, std::wstring > KeyToRegistryMap;
};
//
// Input file abstraction
//
class File {
public:
//
// constructor & destructor
//
File(PCTSTR pszTargetFile, bool bModify);
virtual ~File();
//
// member functions
//
void AddInfSection(PCTSTR fileName, PCTSTR section, PCTSTR action, bool Prepend = false);
void ProcessNlsRegistryEntries(void);
DWORD ProcessSections();
static DWORD SaveAll();
DWORD Cleanup();
//
// inline methods
//
RegWriter& GetRegWriter() { return regWriter; }
PCTSTR GetTarget() { return targetFile.c_str(); }
RegistryMapper* SetRegistryMapper(RegistryMapper *RegMapper) {
RegistryMapper *OldMapper = CurrentRegMapper;
CurrentRegMapper = RegMapper;
return OldMapper;
}
RegistryMapper* GetRegistryMapper() { return CurrentRegMapper; }
private:
//
// data members
//
wstring targetFile;
bool modify;
int luid;
TCHAR wKey[1024];
StringList infList;
HandleList handleList;
HINF hFile;
SP_INF_INFORMATION infInfo;
RegWriter regWriter;
RegistryMapper *CurrentRegMapper;
//
// static data
//
static TCHAR targetDirectory[1024];
static FileList files;
static int ctr;
//
// methods
//
File* GetFile(PCTSTR fileName,bool modify);
DWORD AddRegNew(PCTSTR section,HINF h);
DWORD AddRegExisting(PCTSTR section,HINF h);
DWORD DelRegExisting(PCTSTR section,HINF h);
DWORD AddSection(PCTSTR pszSection,HINF hInfFile);
DWORD DelSection(PCTSTR SectionName, HINF InfHandle);
DWORD SetDirectory(PCTSTR pszSection,HINF hInfFile);
DWORD GetFlags(PCTSTR buffer);
void ProcessNlsRegistryEntriesForSection(InfFileW &ConfigInf, InfFileW &IntlInf,
InfFileW &FontInf,const std::wstring &SectionName);
void ProcessNlsRegistryEntriesForLanguage(InfFileW &ConfigInf, InfFileW &IntlInf,
InfFileW &FontInf,const std::wstring &Language);
void ProcessNlsRegistryEntriesForLangGroup(InfFileW &ConfigInf, InfFileW &IntlInf,
InfFileW &FontInf,const std::wstring &LanguageGroup);
};
//
// Determines if the given file (or directory) is present
//
template <class T>
bool
IsFilePresent(const std::basic_string<T> &FileName) {
bool Result = false;
if (sizeof(T) == sizeof(CHAR)) {
Result = (::_access((PCSTR)FileName.c_str(), 0) == 0);
} else {
Result = (::_waccess((PCWSTR)FileName.c_str(), 0) == 0);
}
return Result;
}