You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.6 KiB
137 lines
3.6 KiB
|
|
typedef std::vector<String_t> StringVector_t;
|
|
|
|
VOID ThrowLastWin32Error();
|
|
VOID Throw(PCWSTR);
|
|
|
|
class BuildFlavor_t;
|
|
class Error_t;
|
|
class FindFirstFileError_t;
|
|
class DelayloadTool_t;
|
|
class File_t;
|
|
class Image_t;
|
|
|
|
class Error_t
|
|
{
|
|
public:
|
|
};
|
|
|
|
class FindFirstFileError_t : public Error_t
|
|
{
|
|
public:
|
|
HRESULT m_hresult;
|
|
DWORD m_dwLastError;
|
|
String_t m_strParameter;
|
|
};
|
|
|
|
VOID
|
|
CollectDirectoryPathsNonRecursively(
|
|
const String_t& directory,
|
|
StringVector_t& paths
|
|
);
|
|
|
|
typedef BOOL (CALLBACK * PFN_COLLECTION_FILE_PATHS_RECURSIVELY_FILTER)(PVOID FilterContext, PCWSTR Directory, WIN32_FIND_DATAW * wfd);
|
|
|
|
VOID
|
|
CollectFilePathsRecursivelyHelper(
|
|
const String_t& directory,
|
|
StringVector_t& paths,
|
|
PFN_COLLECTION_FILE_PATHS_RECURSIVELY_FILTER Filter,
|
|
PVOID FilterContext,
|
|
WIN32_FIND_DATAW& wfd
|
|
);
|
|
|
|
VOID
|
|
CollectFilePathsRecursively(
|
|
const String_t& directory,
|
|
StringVector_t& paths,
|
|
PFN_COLLECTION_FILE_PATHS_RECURSIVELY_FILTER Filter = NULL,
|
|
PVOID FilterContext = NULL
|
|
);
|
|
|
|
class DelayloadTool_t
|
|
{
|
|
private:
|
|
typedef DelayloadTool_t This_t;
|
|
DelayloadTool_t(const DelayloadTool_t&);
|
|
VOID operator=(const DelayloadTool_t&);
|
|
public:
|
|
|
|
~DelayloadTool_t()
|
|
{
|
|
m_XmlWriter.Release();
|
|
m_XmlAttributes.Release();
|
|
}
|
|
|
|
DelayloadTool_t() { }
|
|
|
|
typedef String_t FilePath_t;
|
|
typedef std::vector<FilePath_t> FilePaths_t;
|
|
|
|
VOID ProcessBuild(const BuildFlavor_t& b);
|
|
VOID ProcessFile(const FilePath_t& root, const FilePath_t& f);
|
|
VOID Main(const StringVector_t& args);
|
|
|
|
F::CXmlWriter m_XmlWriter;
|
|
F::CXmlAttributes m_XmlAttributes;
|
|
std::vector<BYTE> m_HeadersBuffer;
|
|
ULONG m_OffsetToPe;
|
|
PIMAGE_SECTION_HEADER m_HintSection;
|
|
CFileStream m_OutFileStream;
|
|
PIMAGE_OPTIONAL_HEADER32 m_OptionalHeader32;
|
|
PIMAGE_OPTIONAL_HEADER64 m_OptionalHeader64;
|
|
|
|
PIMAGE_NT_HEADERS GetNtHeaders() { return reinterpret_cast<PIMAGE_NT_HEADERS>(&m_HeadersBuffer[m_OffsetToPe]); }
|
|
PVOID GetMappedBase() { return &m_HeadersBuffer[0]; }
|
|
SIZE_T GetSizeOfPointer() { return (m_OptionalHeader32 ? 4 : m_OptionalHeader64 ? 8 : ~0); }
|
|
|
|
String_t ReadOneDelayload(HANDLE FileHandle);
|
|
};
|
|
|
|
#define GET_OPTIONAL_HEADER_FIELD(o32, o64, f) ((o32) ? (o32)->f : (o64)->f)
|
|
|
|
VOID DelayloadToolAssertFailed(const char* Expression, const char* File, unsigned long Line);
|
|
VOID DelayloadToolInternalErrorCheckFailed(const char* Expression, const char* File, unsigned long Line);
|
|
String_t NumberToString(ULONG Number, PCWSTR Format = L"0x%lx");
|
|
String_t GetLastErrorString();
|
|
String_t RemoveOptionChar(const String_t& s);
|
|
VOID __cdecl Error(const wchar_t* s, ...);
|
|
String_t GetEnv(PCWSTR s);
|
|
String_t FindLatestReleaseOnServer(const String_t& Server);
|
|
BOOL DelayloadTool_Filter(PVOID FilterContext, PCWSTR Directory, WIN32_FIND_DATAW * wfd);
|
|
|
|
class BuildFlavor_t
|
|
{
|
|
public:
|
|
WCHAR Name[12];
|
|
WCHAR Processor[8];
|
|
WCHAR ChkOrFre[8];
|
|
WCHAR ReleaseServer[12]; // or "local"
|
|
String_t * ActualRoot;
|
|
};
|
|
|
|
class File_t
|
|
{
|
|
public:
|
|
String_t m_FullPath;
|
|
String_t m_RelativePath;
|
|
String_t m_LeafPath;
|
|
String_t m_Error;
|
|
};
|
|
|
|
class Delayload_t
|
|
{
|
|
public:
|
|
String_t m_LeafPath;
|
|
};
|
|
|
|
class Image_t : public File_t
|
|
{
|
|
public:
|
|
std::vector<Delayload_t> m_Delayloads;
|
|
};
|
|
|
|
VOID SeekTo(HANDLE FileHandle, ULONG64 Offset);
|
|
VOID SeekForward(HANDLE FileHandle, ULONG64 Offset);
|
|
VOID SeekBackward(HANDLE FileHandle, LONG64 Offset);
|
|
VOID Read(HANDLE FileHandle, VOID * Buffer, ULONG BytesToRead);
|